Безопасный исходный код

1. Обзор

Методы обеспечения безопасности исходного кода — это набор практик, которые можно использовать для повышения безопасности исходного кода. Эти методы помогают выявлять и устранять уязвимости в исходном коде, предотвращать несанкционированный доступ к исходному коду и защищать исходный код от модификации.

К числу распространенных методов обеспечения безопасности исходного кода относятся:

  • Проверка кода на ошибки (линтинг): Линтинг — это процесс проверки исходного кода на наличие ошибок и стилистических недочетов. Он выполняется с помощью инструмента линтинга, который представляет собой программу, анализирующую исходный код и выявляющую потенциальные проблемы. Инструменты линтинга могут использоваться для проверки на наличие различных ошибок, включая синтаксические ошибки, семантические ошибки, ошибки стиля и уязвимости безопасности.
  • Статическое тестирование безопасности приложений (SAST): SAST — это тип тестирования безопасности, который анализирует исходный код, двоичный код или байт-код для выявления уязвимостей безопасности. Инструменты SAST могут использоваться для поиска уязвимостей в различных языках программирования, включая Go, Java, Python, C++ и C#.
  • Сканирование лицензий: Сканирование лицензий — это процесс идентификации лицензий сторонних программных компонентов, используемых в программном приложении. Это важно, поскольку помогает убедиться в соответствии приложения условиям лицензий, что может помочь избежать юридических проблем.

Эти методы могут быть использованы для повышения безопасности исходного кода на всех этапах жизненного цикла разработки программного обеспечения. Проверка синтаксиса (linting) может использоваться для выявления ошибок на ранних стадиях разработки, SAST (систематическое распознавание и анализ уязвимостей) — для обнаружения уязвимостей до компиляции или развертывания кода, а сканирование лицензий — для обеспечения соответствия приложения условиям лицензий.

Использование этих методов может помочь повысить безопасность исходного кода и снизить риск нарушений безопасности.

Что вы узнаете

В этой лабораторной работе основное внимание будет уделено инструментам и методам обеспечения безопасности исходного кода программного обеспечения.

  • Ворсинки
  • Статическое тестирование безопасности приложений
  • Сканирование лицензий

Все инструменты и команды, используемые в этой лабораторной работе, будут выполняться в оболочке Cloud Shell.

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он останется неизменным на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить редактор CloudShell

Данная лабораторная работа разработана и протестирована для использования с редактором Google Cloud Shell. Для доступа к редактору,

  1. Получите доступ к своему проекту Google по адресу https://console.cloud.google.com .
  2. В правом верхнем углу нажмите на значок редактора облачной оболочки.

8560cc8d45e8c112.png

  1. В нижней части вашего окна откроется новое окно.
  2. Нажмите кнопку «Открыть редактор».

9e504cb98a6a8005.png

  1. В начале редактора справа будет изображен исследователь, а в центре — сам редактор.
  2. В нижней части экрана также должна быть доступна панель терминала.
  3. Если терминал НЕ открыт, используйте комбинацию клавиш `Ctrl+`, чтобы открыть новое окно терминала.

Настройка среды

Для упрощения команд, используемых в этой лабораторной работе, установите переменную GOPATH в один каталог.

export GOPATH=$HOME/gopath

Создайте директорию для хранения нашей работы.

mkdir -p workspace
cd workspace

Клонируйте репозиторий исходного кода.

git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)

3. Удаление ворса

Проверка синтаксиса (линтинг) используется для выявления распространенных ошибок или дефектов, связанных со стилем кодирования. Линтинг способствует повышению безопасности, предоставляя единый синтаксический шаблон для различных команд, что приводит к ускорению проверки кода, обмену знаниями и повышению ясности кода.

Кроме того, проверка синтаксиса выявляет распространенные синтаксические ошибки, которые могут привести к распространенным уязвимостям, таким как неправильное или менее эффективное использование библиотек или основных API.

Установите инструмент для компоновки staticcheck

 go get honnef.co/go/tools/cmd/staticcheck@latest

Запустите Go-линтер (staticcheck) в корневом каталоге проекта.

 staticcheck

Просмотрите результат.

main.go:42:29: unnecessary use of fmt.Sprintf (S1039)

Ошибка возникает потому, что http.ListenAndServe() принимает строку, а текущий код использует Sprintf без передачи переменных в строку.

Проверьте статус завершения команды.

echo $?

В данном случае, поскольку команда привела к ошибке, код завершения будет равен 1 или больше. Это один из методов, который можно использовать в конвейере CI/CD для определения успешности/неудачи работы инструмента.

Отредактируйте файл main.go и исправьте код:

  • Закомментируйте строку ниже LINTING - Step 1 внутри метода main() , добавив косые черты в начале ( // ).
  • Раскомментируйте две строки непосредственно под LINTING - Step 2 внутри метода main() , удалив начальные косые черты.

Повторно запустите staticcheck в корневом каталоге проекта.

staticcheck

Команда не должна возвращать никаких результатов (т.е. пустую строку).

Проверьте статус завершения команды.

  echo $?

В данном случае, поскольку команда не привела к ошибке, код завершения будет равен нулю .

4. Статическое тестирование безопасности приложений

Статическое тестирование безопасности (AST) — обеспечивает статический анализ кода для выявления распространенных уязвимостей и недостатков ( CWE ).

Установите инструмент AST ( gosec ).

    export GOSEC_VERSION="2.15.0"
    curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | \
          sh -s -- -b $(go env GOPATH)/bin v${GOSEC_VERSION}

Запустите gosec с файлом политики, используя исходный код.

gosec -conf policies/gosec-policy.json -fmt=json ./...

Результат должен быть примерно таким:

{
    "Golang errors": {},
    "Issues": [
        {
            "severity": "HIGH",
            "confidence": "LOW",
            "cwe": {
                "ID": "798",
                "URL": "https://cwe.mitre.org/data/definitions/798.html"
            },
            "rule_id": "G101",
            "details": "Potential hardcoded credentials",
            "file": "/home/random-user-here/shift-left-security-workshop/labs/source-code-lab/main.go",
            "code": "31: \t// STEP 2: Change this and the reference below to something different (ie, not \"pawsword\" or \"password\")\n32: \tvar pawsword = \"im-a-cute-puppy\"\n33: \tfmt.Println(\"Something a puppy would use: \", username, pawsword)\n",
            "line": "32",
            "column": "6"
        }
    ],
    "Stats": {
        "files": 1,
        "lines": 89,
        "nosec": 0,
        "found": 1
    }
}

Инструмент выявил потенциальную проблему: Potential hardcoded credentials

5. Сканирование лицензий

Лицензии важны для безопасности, поскольку они могут юридически обязывать вас раскрывать исходный код, который вы, возможно, не хотите раскрывать. Эта концепция называется « копилефт »-лицензиями, которые требуют раскрытия исходного кода, если вы используете зависимости, распространяемые по этим лицензиям.

Установите golicense

mkdir -p /tmp/golicense
wget -O /tmp/golicense/golicense.tar.gz https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_linux_x86_64.tar.gz
pushd /tmp/golicense
tar -xzf golicense.tar.gz
chmod +x golicense
mv golicense $(go env GOPATH)/bin/golicense
popd

Соберите бинарный файл

go build

Выполните проверку лицензий с использованием текущего файла политики, который не разрешает лицензии "BSD-3-Clause".

golicense policies/license-policy.hcl hello-world

ПРИМЕЧАНИЕ. В противном случае это должно завершиться с аналогичным результатом:

 🚫 rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
 🚫 rsc.io/quote      BSD 3-Clause "New" or "Revised" License
 🚫 golang.org/x/text BSD 3-Clause "New" or "Revised" License

Измените файл политики policies/license-policy.hcl , переместив пункт "BSD-3-Clause" из списка deny в список allow .

Повторно запустите проверку лицензии.

golicense policies/license-policy.hcl hello-world

Примечание: это должно сработать с аналогичным результатом:

    ✅ rsc.io/quote      BSD 3-Clause "New" or "Revised" License
    ✅ rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
    ✅ golang.org/x/text BSD 3-Clause "New" or "Revised" License

6. Поздравляем!

Поздравляем, вы завершили практическое занятие!

Чему вы научились

  • Инструменты и методы для обеспечения безопасности исходного кода

Последнее обновление: 23.03.2023