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

1. Обзор

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

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

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

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

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

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

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

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

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

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

Самостоятельная настройка среды

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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

Эта лабораторная работа была разработана и протестирована для использования с редактором 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. Линтинг

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

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

Установите инструмент связывания staticcheck

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

Запустите Go Linter (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.23.