1. Введение
Бинарная авторизация — это механизм контроля безопасности на этапе развертывания, который гарантирует, что в Google Kubernetes Engine (GKE) или Cloud Run развертываются только доверенные образы контейнеров. С помощью бинарной авторизации вы можете потребовать, чтобы образы были подписаны доверенными центрами сертификации в процессе разработки, а затем обеспечить проверку подписи при развертывании. Внедрение проверки позволяет получить более жесткий контроль над вашей средой контейнеров, гарантируя, что в процесс сборки и выпуска будут интегрированы только проверенные образы.
На следующей диаграмме показаны компоненты, входящие в состав системы авторизации бинарных файлов/облачной сборки:
**Рисунок 1.** Конвейер Cloud Build, создающий аттестацию бинарной авторизации.
В этом конвейере:
- Код для сборки образа контейнера загружается в репозиторий исходного кода, например, Cloud Source Repositories .
- Инструмент непрерывной интеграции (CI) Cloud Build выполняет сборку и тестирование контейнеров.
- В процессе сборки образ контейнера отправляется в Container Registry или другой реестр, хранящий собранные образы.
- Сервис управления ключами в облаке (Cloud Key Management Service) , обеспечивающий управление ключами для криптографической пары ключей , подписывает образ контейнера. Полученная подпись затем сохраняется в новом созданном аттестационном документе.
- Во время развертывания аттестатор проверяет аттестацию, используя открытый ключ из ключевой пары. Бинарная авторизация обеспечивает соблюдение политики , требуя подписанных аттестаций для развертывания образа контейнера.
В этой лабораторной работе вы сосредоточитесь на инструментах и методах обеспечения безопасности развернутых артефактов. Основное внимание уделяется артефактам (контейнерам) после их создания, но до развертывания в конкретной среде.
Что вы узнаете
- Подписание изображений
- Правила приема
- Подписание отсканированных изображений
- Авторизация подписанных изображений
- Заблокированные неподписанные изображения
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
Создать репозиторий реестра артефактов
В этой лабораторной работе вы будете использовать 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
Создайте и перейдите в рабочую директорию.
mkdir vuln-scan && cd vuln-scan
Определите пример изображения
Создайте файл с именем 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
Создайте файл с именем 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
Создайте и загрузите изображение в AR.
Используйте Cloud Build для сборки и автоматической отправки вашего контейнера в Artifact Registry.
gcloud builds submit . -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
3. Подписание изображений
Что такое аттестатор?
Астёр
- Этот человек/процесс отвечает за одно звено в цепочке доверия системы.
- Они хранят криптографический ключ и подписывают изображение, если оно проходит их процедуру утверждения.
- В то время как разработчик политики определяет политику на высоком, абстрактном уровне, проверяющий отвечает за конкретное обеспечение соблюдения какого-либо аспекта политики.
- Это может быть реальный человек, например, тестировщик или менеджер, или же бот в системе непрерывной интеграции.
- Безопасность системы зависит от их надежности, поэтому важно, чтобы их закрытые ключи хранились в безопасности.
Каждая из этих ролей может представлять отдельного человека или команду людей в вашей организации. В производственной среде управление этими ролями, скорее всего, будет осуществляться отдельными проектами Google Cloud Platform (GCP), а доступ к ресурсам будет распределяться между ними в ограниченном объеме с помощью Cloud IAM .

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

Помимо отслеживания уязвимостей, Container Analysis был разработан как универсальный API метаданных. Binary Authorization использует Container Analysis для связывания подписей с образами контейнеров, которые они проверяют.** Заметка Container Analysis используется для представления одного аттестатора, а записи создаются и связываются с каждым контейнером, одобренным этим аттестатором.
API бинарной авторизации использует концепции «подтверждающих лиц» и «подтверждающих лиц», но их реализация осуществляется с помощью соответствующих примечаний и событий в API анализа контейнеров.

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

Создать заметку
cat > ./vulnz_note.json << EOM
{
"attestation": {
"hint": {
"human_readable_name": "Container Vulnerabilities attestation authority"
}
}
}
EOM
Сохраните записку
NOTE_ID=vulnz_note
curl -vvv -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
--data-binary @./vulnz_note.json \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
Проверьте записку.
curl -vvv \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}"
Ваша заметка теперь сохранена в API анализа контейнеров.
Создание аттестатора
Аттестаторы используются для выполнения фактического процесса подписания изображения и прикрепляют к изображению экземпляр заметки для последующей проверки. Чтобы использовать аттестатор, необходимо также зарегистрировать заметку в системе Binary Authorization:

Создать аттестатора
ATTESTOR_ID=vulnz-attestor
gcloud container binauthz attestors create $ATTESTOR_ID \
--attestation-authority-note=$NOTE_ID \
--attestation-authority-note-project=${PROJECT_ID}
Подтверждение подлинности аттестатора
gcloud container binauthz attestors list
Обратите внимание, что в последней строке указано NUM_PUBLIC_KEYS: 0 ключи будут указаны на более позднем этапе.
Также обратите внимание, что Cloud Build автоматически создает аттестатор built-by-cloud-build в вашем проекте при запуске сборки, генерирующей образы. Таким образом, приведенная выше команда возвращает два аттестатора: vulnz-attestor и built-by-cloud-build . После успешной сборки образов Cloud Build автоматически подписывает их и создает для них аттестации.
Добавление роли IAM
Для просмотра примечаний к аттестации учетной записи службы Binary Authorization потребуются права доступа. Предоставьте доступ с помощью следующего вызова API.
PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" --format="value(projectNumber)")
BINAUTHZ_SA_EMAIL="service-${PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
cat > ./iam_request.json << EOM
{
'resource': 'projects/${PROJECT_ID}/notes/${NOTE_ID}',
'policy': {
'bindings': [
{
'role': 'roles/containeranalysis.notes.occurrences.viewer',
'members': [
'serviceAccount:${BINAUTHZ_SA_EMAIL}'
]
}
]
}
}
EOM
Используйте этот файл для создания политики IAM.
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
--data-binary @./iam_request.json \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"
Добавление ключа KMS
Прежде чем использовать этот аттестатор, ваш центр сертификации должен создать пару криптографических ключей, которые можно использовать для подписи образов контейнеров. Это можно сделать с помощью сервиса управления ключами Google Cloud (KMS) .
Сначала добавьте несколько переменных окружения для описания нового ключа.
KEY_LOCATION=global
KEYRING=binauthz-keys
KEY_NAME=codelab-key
KEY_VERSION=1
Создайте брелок для ключей.
gcloud kms keyrings create "${KEYRING}" --location="${KEY_LOCATION}"
Создайте новую пару асимметричных ключей подписи для аттестатора.
gcloud kms keys create "${KEY_NAME}" \
--keyring="${KEYRING}" --location="${KEY_LOCATION}" \
--purpose asymmetric-signing \
--default-algorithm="ec-sign-p256-sha256"
Ваш ключ должен отобразиться на странице KMS в консоли Google Cloud.
Теперь свяжите ключ с вашим аттестатором с помощью команды gcloud binauthz:
gcloud beta container binauthz attestors public-keys add \
--attestor="${ATTESTOR_ID}" \
--keyversion-project="${PROJECT_ID}" \
--keyversion-location="${KEY_LOCATION}" \
--keyversion-keyring="${KEYRING}" \
--keyversion-key="${KEY_NAME}" \
--keyversion="${KEY_VERSION}"
Если вы снова распечатаете список полномочий, то увидите зарегистрированный ключ:
gcloud container binauthz attestors list
Создание подписанного подтверждения
На этом этапе у вас настроены функции, позволяющие подписывать образы. Используйте созданный ранее аттестатор для подписи образа контейнера, с которым вы работали.
Аттестация должна включать криптографическую подпись, подтверждающую, что аттестатор проверил конкретный образ контейнера и что он безопасен для запуска в вашем кластере. Чтобы указать, какой образ контейнера следует аттестовать, необходимо определить его дайджест.
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:latest \
--format='get(image_summary.digest)')
Теперь вы можете использовать gcloud для создания аттестации. Команда просто принимает данные ключа, который вы хотите использовать для подписи, и конкретный образ контейнера, который вы хотите утвердить.
gcloud beta container binauthz attestations sign-and-create \
--artifact-url="${CONTAINER_PATH}@${DIGEST}" \
--attestor="${ATTESTOR_ID}" \
--attestor-project="${PROJECT_ID}" \
--keyversion-project="${PROJECT_ID}" \
--keyversion-location="${KEY_LOCATION}" \
--keyversion-keyring="${KEYRING}" \
--keyversion-key="${KEY_NAME}" \
--keyversion="${KEY_VERSION}"
В терминах анализа контейнеров это создаст новое событие и прикрепит его к заметке вашего аттестатора. Чтобы убедиться, что все прошло как ожидалось, вы можете перечислить свои аттестации.
gcloud container binauthz attestations list \
--attestor=$ATTESTOR_ID --attestor-project=${PROJECT_ID}
4. Правила приема
Бинарная авторизация — это функция GKE и Cloud Run, которая позволяет проверять правила перед запуском образа контейнера. Проверка выполняется при каждом запросе на запуск образа, будь то запрос из доверенного конвейера CI/CD или от пользователя, пытающегося развернуть образ вручную. Эта возможность позволяет более эффективно защитить среду выполнения, чем просто проверки с помощью конвейеров CI/CD.
Чтобы понять эту возможность, вам потребуется изменить политику GKE по умолчанию, чтобы установить строгое правило авторизации.
Создайте кластер GKE.
Создайте кластер GKE с включенной авторизацией бинарных файлов:
gcloud beta container clusters create binauthz \
--zone us-central1-a \
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
Разрешите Cloud Build развертывать приложения в этом кластере:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/container.developer"
Разрешить все политики
Сначала проверьте состояние политики по умолчанию и возможность развертывания любого образа.
- Пересмотрите существующую политику.
gcloud container binauthz policy export
- Обратите внимание, что для параметра принудительного применения установлено значение
ALWAYS_ALLOW
evaluationMode: ALWAYS_ALLOW
- Разверните пример, чтобы убедиться, что вы можете развернуть что угодно.
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
- Убедитесь, что развертывание прошло успешно.
kubectl get pods
Вы увидите следующий результат.

- Удалить развертывание
kubectl delete pod hello-server
Политика «Отказать во всем»
Теперь обновите политику, чтобы запретить все изображения.
- Экспортируйте текущую политику в редактируемый файл.
gcloud container binauthz policy export > policy.yaml
- Изменить политику
В текстовом редакторе измените параметр evaluationMode с ALWAYS_ALLOW на ALWAYS_DENY .
edit policy.yaml
Файл политики в формате YAML должен выглядеть следующим образом:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_DENY enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
Эта политика относительно проста. Строка globalPolicyEvaluationMode объявляет, что эта политика расширяет глобальную политику, определенную Google. Это позволяет запускать все официальные контейнеры GKE по умолчанию. Кроме того, политика объявляет правило по умолчанию (defaultAdmissionRule) , которое указывает, что все остальные поды будут отклонены . Правило допуска включает строку enforcementMode , которая указывает, что все поды, не соответствующие этому правилу, должны быть заблокированы для запуска в кластере.
Инструкции по созданию более сложных политик см. в документации по бинарной авторизации .

- Откройте Терминал, примените новую политику и подождите несколько секунд, пока изменения вступят в силу.
gcloud container binauthz policy import policy.yaml
- Попытка развертывания тестовой рабочей нагрузки
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
- Развертывание завершается с ошибкой, выдавая следующее сообщение.
Error from server (VIOLATES_POLICY): admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image gcr.io/google-samples/hello-app:1.0 denied by Binary Authorization default admission rule. Denied by always_deny admission rule
Восстановить политику, чтобы разрешить все.
Прежде чем перейти к следующему разделу, обязательно отмените изменения в политике.
- Изменить политику
В текстовом редакторе измените параметр evaluationMode с ALWAYS_DENY на ALWAYS_ALLOW .
edit policy.yaml
Файл политики в формате YAML должен выглядеть следующим образом:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_ALLOW enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
- Примените отмененную политику.
gcloud container binauthz policy import policy.yaml
5. Подписание отсканированных изображений
Вы включили подписание образов и вручную использовали аттестатор для подписи вашего тестового образа. На практике вам потребуется применять аттестации в автоматизированных процессах, таких как конвейеры CI/CD.
В этом разделе вы настроите Cloud Build для автоматической проверки образов.
Роли
Добавьте роль «Просмотрщик двоичных данных для авторизации» в учетную запись службы Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/binaryauthorization.attestorsViewer
Добавьте роль Cloud KMS CryptoKey Signer/Verifier в учетную запись службы Cloud Build (подписание на основе KMS):
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/cloudkms.signerVerifier
Добавьте роль "Участник, подключающий примечания к анализу контейнеров" к учетной записи службы Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/containeranalysis.notes.attacher
Предоставить доступ для учетной записи службы 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 вы будете использовать шаг пользовательской сборки. Google предоставляет этот шаг пользовательской сборки, который содержит вспомогательные функции для оптимизации процесса. Перед использованием код для шага пользовательской сборки необходимо скомпилировать в контейнер и отправить в Cloud Build. Для этого выполните следующие команды:
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
cd cloud-builders-community/binauthz-attestation
gcloud builds submit . --config cloudbuild.yaml
cd ../..
rm -rf cloud-builders-community
Добавьте этап подписания в файл cloudbuild.yaml.
На этом этапе вы добавите этап аттестации в свой конвейер Cloud Build.
- Ознакомьтесь с этапом подписания ниже.
Только для ознакомления. Копирование запрещено.
#Sign the image only if the previous severity check passes
- id: 'create-attestation'
name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
args:
- '--artifact-url'
- 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image'
- '--attestor'
- 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
- '--keyversion'
- 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'
- Создайте файл 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']
#Sign the image only if the previous severity check passes
- id: 'create-attestation'
name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
args:
- '--artifact-url'
- 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good'
- '--attestor'
- 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
- '--keyversion'
- 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good
EOF
Запустите сборку
gcloud builds submit
Просмотрите историю сборок в Cloud Build History.
Откройте консоль Cloud Console на странице «История сборок Cloud Build» и просмотрите последнюю сборку, а также успешное выполнение шагов сборки.
6. Авторизация подписанных изображений
В этом разделе вы обновите GKE, чтобы использовать авторизацию бинарных файлов для проверки наличия подписи образа по результатам сканирования уязвимостей, прежде чем разрешить его запуск.

Обновить политику GKE, введя требование о подтверждении подлинности документов.
Для того чтобы изображения были подписаны вашим аттестатором, добавьте параметр clusterAdmissionRules в политику GKE BinAuth.
В настоящее время в вашем кластере действует политика с одним правилом: разрешать контейнеры из официальных репозиториев и отклонять все остальные.
Перезапишите политику обновленной конфигурацией, используя приведенную ниже команду.
COMPUTE_ZONE=us-central1-a
cat > binauth_policy.yaml << EOM
defaultAdmissionRule:
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
evaluationMode: ALWAYS_DENY
globalPolicyEvaluationMode: ENABLE
clusterAdmissionRules:
${COMPUTE_ZONE}.binauthz:
evaluationMode: REQUIRE_ATTESTATION
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
requireAttestationsBy:
- projects/${PROJECT_ID}/attestors/vulnz-attestor
EOM
Теперь на диске должен появиться новый файл с именем updated_policy.yaml. Теперь, вместо того чтобы правило по умолчанию отклоняло все изображения, оно сначала проверяет ваш аттестатор на наличие подтверждений.

Загрузите новую политику в систему бинарной авторизации:
gcloud beta container binauthz policy import binauth_policy.yaml
Развернуть подписанный образ
Получите дайджест изображения для получения качественного изображения.
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:good \
--format='get(image_summary.digest)')
Используйте дайджест в конфигурации Kubernetes.
cat > deploy.yaml << EOM
apiVersion: v1
kind: Service
metadata:
name: deb-httpd
spec:
selector:
app: deb-httpd
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deb-httpd
spec:
replicas: 1
selector:
matchLabels:
app: deb-httpd
template:
metadata:
labels:
app: deb-httpd
spec:
containers:
- name: deb-httpd
image: ${CONTAINER_PATH}@${DIGEST}
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
EOM
Разверните приложение в GKE.
kubectl apply -f deploy.yaml
Просмотрите данные о рабочей нагрузке в консоли и отметьте успешное развертывание образа.
7. Заблокированные неподписанные изображения
Создать образ
На этом этапе вы будете использовать локальный Docker для сборки образа в локальном кэше.
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:bad .
Загрузите неподписанный образ в репозиторий.
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:bad
Получите дайджест изображения для некорректного изображения.
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:bad \
--format='get(image_summary.digest)')
Используйте дайджест в конфигурации Kubernetes.
cat > deploy.yaml << EOM
apiVersion: v1
kind: Service
metadata:
name: deb-httpd
spec:
selector:
app: deb-httpd
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deb-httpd
spec:
replicas: 1
selector:
matchLabels:
app: deb-httpd
template:
metadata:
labels:
app: deb-httpd
spec:
containers:
- name: deb-httpd
image: ${CONTAINER_PATH}@${DIGEST}
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
EOM
Попытка развертывания приложения в GKE.
kubectl apply -f deploy.yaml
Просмотрите данные о нагрузке в консоли и обратите внимание на ошибку, указывающую на отказ в развертывании:
No attestations found that were valid and signed by a key trusted by the attestor
8. Поздравляем!
Поздравляем, вы завершили практическое занятие!
Что мы рассмотрели:
- Подписание изображений
- Правила приема
- Подписание отсканированных изображений
- Авторизация подписанных изображений
- Заблокированные неподписанные изображения
Что дальше:
- Обеспечение безопасности развертывания образов в Cloud Run и Google Kubernetes Engine | Документация Cloud Build
- Быстрый старт: Настройка политики бинарной авторизации с помощью GKE | Google Cloud
Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий эти ресурсы, либо сохраните проект и удалите отдельные ресурсы.
Удаление проекта
Самый простой способ избежать выставления счетов — удалить проект, созданный для этого урока.
—
Последнее обновление: 21.03.2023

