1. Введение
Уязвимости программного обеспечения — это слабые места, которые могут вызвать случайный сбой системы или предоставить злоумышленникам возможность скомпрометировать ваше программное обеспечение. Container Analysis предоставляет два вида сканирования ОС для поиска уязвимостей в контейнерах:
- API сканирования по требованию позволяет вручную сканировать образы контейнеров на наличие уязвимостей ОС либо локально на вашем компьютере, либо удаленно в реестре контейнеров или реестре артефактов.
- API сканирования контейнеров позволяет автоматизировать обнаружение уязвимостей ОС, сканируя каждый раз, когда вы отправляете образ в реестр контейнеров или реестр артефактов. Включение этого API также позволяет сканировать языковые пакеты на наличие уязвимостей Go и Java.
API сканирования по требованию позволяет сканировать изображения, хранящиеся локально на вашем компьютере, или удаленно в реестре контейнеров или реестре артефактов. Это дает вам детальный контроль над контейнерами, которые вы хотите сканировать на наличие уязвимостей. Вы можете использовать сканирование по требованию для сканирования изображений в конвейере CI/CD, прежде чем решить, следует ли хранить их в реестре.
Что вы узнаете
В этой лаборатории вы:
- Создание образов с помощью Cloud Build
- Используйте реестр артефактов для контейнеров
- Используйте автоматическое сканирование уязвимостей
- Настройка сканирования по требованию
- Добавьте сканирование изображений в CICD в Cloud Build.
2. Настройка и требования
Самостоятельная настройка среды
- Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .
- Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы можете обновить его в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID
). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он останется в силе на протяжении всего проекта. - К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
- Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Настройка среды
В Cloud Shell укажите идентификатор и номер вашего проекта. Сохраните их как переменные PROJECT_ID
и PROJECT_ID
.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
Включить службы
Включите все необходимые службы:
gcloud services enable \
cloudkms.googleapis.com \
cloudbuild.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
artifactregistry.googleapis.com \
containerscanning.googleapis.com \
ondemandscanning.googleapis.com \
binaryauthorization.googleapis.com
3. Создание образов с помощью Cloud Build
В этом разделе вы создадите автоматизированный конвейер сборки, который будет создавать образ контейнера, сканировать его и оценивать результаты. Если КРИТИЧЕСКИХ уязвимостей не обнаружено, образ будет отправлен в репозиторий. Если будут обнаружены КРИТИЧЕСКИЕ уязвимости, сборка завершится неудачно и будет завершена.
Предоставить доступ к учетной записи Cloud Build Service.
Cloud Build потребуются права для доступа к API сканирования по требованию. Обеспечьте доступ с помощью следующих команд.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Создать и перейти в рабочий каталог
mkdir vuln-scan && cd vuln-scan
Определите образец изображения
Создайте файл Dockerfile со следующим содержимым.
cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian9@sha256:ebffcf0df9aa33f342c4e1d4c8428b784fc571cdf6fbab0b31330347ca8af97a
# System
RUN apt update && apt install python3-pip -y
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
EOF
Создайте файл main.py со следующим содержимым.
cat > ./main.py << EOF
import os
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
name = os.environ.get("NAME", "Worlds")
return "Hello {}!".format(name)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF
Создайте конвейер Cloud Build
Следующая команда создаст в вашем каталоге файл cloudbuild.yaml, который будет использоваться для автоматического процесса. В этом примере шаги ограничены процессом сборки контейнера. Однако на практике в дополнение к шагам контейнера вы должны включать инструкции и тесты для конкретного приложения.
Создайте файл с помощью следующей команды.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
EOF
Запуск конвейера CI
Отправьте сборку на обработку
gcloud builds submit
Просмотрите детали сборки
После начала процесса сборки просмотрите ход выполнения на панели управления Cloud Build.
- Откройте облачную сборку в облачной консоли.
- Нажмите на сборку, чтобы просмотреть содержимое
4. Реестр артефактов для контейнеров
Создать репозиторий реестра артефактов
В ходе этой лабораторной работы вы будете использовать реестр артефактов для хранения и сканирования изображений. Создайте репозиторий с помощью следующей команды.
gcloud artifacts repositories create artifact-scanning-repo \
--repository-format=docker \
--location=us-central1 \
--description="Docker repository"
Настройте docker для использования ваших учетных данных gcloud при доступе к реестру артефактов.
gcloud auth configure-docker us-central1-docker.pkg.dev
Обновите конвейер Cloud Build.
Измените конвейер сборки, чтобы отправить полученный образ в реестр артефактов.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
# push to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
Запуск конвейера CI
Отправьте сборку на обработку
gcloud builds submit
5. Автоматическое сканирование уязвимостей.
Сканирование артефактов запускается автоматически каждый раз, когда вы отправляете новое изображение в реестр артефактов или реестр контейнеров. Информация об уязвимостях постоянно обновляется при обнаружении новых уязвимостей. В этом разделе вы просмотрите образ, который вы только что создали и отправили в реестр артефактов, и изучите результаты уязвимостей.
Просмотр сведений об изображении
После завершения предыдущего процесса сборки просмотрите образ и результаты поиска уязвимостей на панели мониторинга реестра артефактов.
- Откройте реестр артефактов в облачной консоли.
- Нажмите на репозиторий сканирования артефактов, чтобы просмотреть его содержимое.
- Нажмите на детали изображения
- Нажмите на последний дайджест вашего изображения.
- После завершения сканирования нажмите на вкладку уязвимостей для изображения.
На вкладке уязвимостей вы увидите результаты автоматического сканирования только что созданного образа.
Автоматическое сканирование включено по умолчанию. Изучите настройки реестра артефактов, чтобы узнать, как отключить или включить автоматическое сканирование.
6. Сканирование по требованию
Существуют различные сценарии, в которых вам может потребоваться выполнить сканирование перед отправкой образа в репозиторий. Например, разработчик контейнера может отсканировать изображение и исправить проблемы, прежде чем отправить код в систему управления версиями. В приведенном ниже примере вы создадите и проанализируете изображение локально, прежде чем действовать на основе результатов.
Создайте изображение
На этом этапе вы будете использовать локальный докер для создания образа в локальном кеше.
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .
Сканируйте изображение
После создания изображения запросите его сканирование. Результаты сканирования сохраняются на сервере метаданных. Задание завершается размещением результатов на сервере метаданных.
gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--format="value(response.scan)" > scan_id.txt
Просмотр выходного файла
Найдите минутку и просмотрите выходные данные предыдущего шага, которые были сохранены в файле scan_id.txt. Обратите внимание на расположение отчета о результатах сканирования на сервере метаданных.
cat scan_id.txt
Просмотр подробных результатов сканирования
Чтобы просмотреть фактические результаты сканирования, используйте команду list-vulnerabilities
в месте отчета, указанном в выходном файле.
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt)
Вывод содержит значительный объем данных обо всех уязвимостях в образе.
Пометить Критические проблемы
Люди редко используют данные, хранящиеся в отчете, напрямую. Обычно результаты используются автоматизированным процессом. Используйте команды ниже, чтобы прочитать детали отчета и зарегистрировать, если были обнаружены какие-либо КРИТИЧЕСКИЕ уязвимости.
export SEVERITY=CRITICAL
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi
Результатом этой команды будет
Failed vulnerability check for CRITICAL level
7. Сканирование в CICD с помощью Cloud Build.
Предоставить доступ к учетной записи Cloud Build Service.
Cloud Build потребуются права для доступа к API сканирования по требованию. Обеспечьте доступ с помощью следующих команд.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Обновите конвейер Cloud Build.
Следующая команда создаст в вашем каталоге файл cloudbuild.yaml, который будет использоваться для автоматического процесса. В этом примере шаги ограничены процессом сборки контейнера. Однако на практике в дополнение к шагам контейнера вы должны включать инструкции и тесты для конкретного приложения.
Создайте файл с помощью следующей команды.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
#Run a vulnerability scan at _SECURITY level
- id: scan
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
(gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--location us \
--format="value(response.scan)") > /workspace/scan_id.txt
#Analyze the result of the scan
- id: severity check
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
--format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi
#Retag
- id: "retag"
name: 'gcr.io/cloud-builders/docker'
args: ['tag', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
#pushing to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
Запуск конвейера CI
Отправьте сборку на обработку, чтобы проверить, что сборка прерывается при обнаружении уязвимости КРИТИЧЕСКОЙ серьезности.
gcloud builds submit
Обзор ошибки сборки
Только что отправленная вами сборка не удастся, поскольку образ содержит КРИТИЧЕСКИЕ уязвимости.
Просмотрите ошибку сборки на странице истории сборки Cloud .
Исправьте уязвимость
Обновите Dockerfile, чтобы использовать базовый образ, не содержащий КРИТИЧЕСКИХ уязвимостей.
Перезапишите файл Dockerfile, чтобы использовать образ Debian 10, с помощью следующей команды:
cat > ./Dockerfile << EOF
from python:3.8-slim
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app
EOF
Запустите процесс CI с хорошим изображением
Отправьте сборку на обработку, чтобы убедиться, что сборка завершится успешно, если не обнаружено критических уязвимостей.
gcloud builds submit
Обзор успеха сборки
Только что отправленная вами сборка будет успешной, поскольку обновленный образ не содержит КРИТИЧЕСКИХ уязвимостей.
Просмотрите успех сборки на странице истории сборки облака.
Просмотр результатов сканирования
Просмотрите хороший образ в реестре артефактов.
- Откройте реестр артефактов в облачной консоли.
- Нажмите на репозиторий сканирования артефактов, чтобы просмотреть его содержимое.
- Нажмите на детали изображения
- Нажмите на последний дайджест вашего изображения.
- Нажмите на вкладку уязвимостей, чтобы увидеть изображение.
8. Поздравляем!
Поздравляем, вы завершили работу над кодом!
Что мы рассмотрели:
- Создание образов с помощью Cloud Build
- Реестр артефактов для контейнеров
- Автоматическое сканирование уязвимостей
- Сканирование по требованию
- Сканирование в CICD с помощью Cloud Build
Что дальше:
- Защита развертывания образов в Cloud Run и Google Kubernetes Engine | Документация по облачной сборке
- Краткое руководство: настройка политики двоичной авторизации с помощью GKE | Google Облако
Очистить
Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий ресурсы, либо сохраните проект и удалите отдельные ресурсы.
Удаление проекта
Самый простой способ избавиться от выставления счетов — удалить проект, созданный вами для этого руководства.
—
Последнее обновление: 21.03.23.