1. Введение

Программные уязвимости — это слабые места, которые могут привести к случайному сбою системы или предоставить злоумышленникам возможность скомпрометировать ваше программное обеспечение. Анализ контейнеров предоставляет два вида сканирования операционной системы для поиска уязвимостей в контейнерах:
- API сканирования по запросу позволяет вручную сканировать образы контейнеров на наличие уязвимостей операционной системы, локально на вашем компьютере или удаленно в Container Registry или Artifact Registry.
- API сканирования контейнеров позволяет автоматизировать обнаружение уязвимостей операционной системы, выполняя сканирование каждый раз при загрузке образа в реестр контейнеров или реестр артефактов. Включение этого API также позволяет сканировать языковые пакеты на наличие уязвимостей в Go и Java.
API сканирования по запросу позволяет сканировать образы, хранящиеся локально на вашем компьютере, или удаленно в Container Registry или Artifact Registry. Это дает вам детальный контроль над контейнерами, которые вы хотите сканировать на наличие уязвимостей. Вы можете использовать сканирование по запросу для сканирования образов в вашем конвейере CI/CD, прежде чем решить, следует ли сохранять их в реестре.
Что вы узнаете
В этой лабораторной работе вы:
- Создавайте образы с помощью Cloud Build.
- Используйте реестр артефактов для контейнеров.
- Используйте автоматизированное сканирование уязвимостей.
- Настройка сканирования по запросу
- Добавить сканирование изображений в CICD в Cloud Build
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он останется неизменным на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить весь проект. Новые пользователи 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.
Для работы 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.
- Откройте Cloud Build в консоли Cloud.
- Нажмите на сборку, чтобы просмотреть её содержимое.
4. Реестр артефактов для контейнеров
Создать репозиторий реестра артефактов
В этой лабораторной работе вы будете использовать Artifact Registry для хранения и сканирования изображений. Создайте репозиторий с помощью следующей команды.
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. Автоматизированное сканирование уязвимостей
Сканирование артефактов запускается автоматически каждый раз, когда вы загружаете новый образ в реестр артефактов или реестр контейнеров. Информация об уязвимостях постоянно обновляется по мере обнаружения новых уязвимостей. В этом разделе вы просмотрите образ, который вы только что создали и загрузили в реестр артефактов, и изучите результаты сканирования уязвимостей.
Просмотреть подробности изображения
После завершения предыдущего процесса сборки просмотрите образ и результаты поиска уязвимостей на панели мониторинга Реестра артефактов.
- Откройте реестр артефактов в облачной консоли.
- Нажмите на ссылку artifact-scanning-repo, чтобы просмотреть содержимое.
- Нажмите на подробности изображения
- Перейдите по ссылке, чтобы просмотреть последнюю версию вашего изображения.
- После завершения сканирования перейдите на вкладку «Уязвимости» для изображения.
На вкладке «Уязвимости» вы увидите результаты автоматического сканирования только что созданного вами образа.

Автоматическое сканирование включено по умолчанию. Чтобы узнать, как включить/выключить автоматическое сканирование, изучите параметры реестра артефактов.
6. Сканирование по запросу
Существует множество сценариев, когда перед загрузкой образа в репозиторий может потребоваться выполнить сканирование. Например, разработчик контейнеров может просканировать образ и исправить проблемы, прежде чем загрузить код в систему контроля версий. В приведенном ниже примере вы соберете и проанализируете образ локально, прежде чем применять полученные результаты.
Создать образ
На этом этапе вы будете использовать локальный Docker для сборки образа в локальном кэше.
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.
Для работы 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
Проверка ошибки сборки
Отправленная вами сборка завершится неудачей, поскольку образ содержит КРИТИЧЕСКИЕ уязвимости.
Просмотрите информацию о сбое сборки на странице «История сборок в облаке» .
Устраните уязвимость
Обновите Dockerfile, чтобы использовать базовый образ, не содержащий критических уязвимостей.
Для использования образа Debian 10 замените файл Dockerfile с помощью следующей команды.
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
Обзор успешной сборки
Отправленная вами сборка будет успешно завершена, поскольку обновленный образ не содержит критических уязвимостей.
Просмотрите информацию об успешном завершении сборки на странице « История сборок в облаке» .
Просмотрите результаты сканирования.
Проверьте корректность изображения в реестре артефактов.
- Откройте реестр артефактов в облачной консоли.
- Нажмите на ссылку artifact-scanning-repo, чтобы просмотреть содержимое.
- Нажмите на подробности изображения
- Перейдите по ссылке, чтобы просмотреть последнюю версию вашего изображения.
- Нажмите на вкладку «Уязвимости», чтобы увидеть изображение.
8. Поздравляем!
Поздравляем, вы завершили практическое занятие!
Что мы рассмотрели:
- Создание образов с помощью Cloud Build
- Реестр артефактов для контейнеров
- Автоматизированное сканирование уязвимостей
- Сканирование по запросу
- Сканирование в режиме CICD с помощью Cloud Build
Что дальше:
- Обеспечение безопасности развертывания образов в Cloud Run и Google Kubernetes Engine | Документация Cloud Build
- Быстрый старт: Настройка политики бинарной авторизации с помощью GKE | Google Cloud
Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий эти ресурсы, либо сохраните проект и удалите отдельные ресурсы.
Удаление проекта
Самый простой способ избежать выставления счетов — удалить проект, созданный для этого урока.
—
Последнее обновление: 21.03.2023