Запрет развертывания с помощью двоичной аутентификации

1. Введение

Бинарная авторизация — это механизм контроля безопасности на этапе развертывания, который гарантирует, что в Google Kubernetes Engine (GKE) или Cloud Run развертываются только доверенные образы контейнеров. С помощью бинарной авторизации вы можете потребовать, чтобы образы были подписаны доверенными центрами сертификации в процессе разработки, а затем обеспечить проверку подписи при развертывании. Внедрение проверки позволяет получить более жесткий контроль над вашей средой контейнеров, гарантируя, что в процесс сборки и выпуска будут интегрированы только проверенные образы.

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

Конвейер аттестации авторизации бинарных файлов Cloud Build. **Рисунок 1.** Конвейер Cloud Build, создающий аттестацию бинарной авторизации.

В этом конвейере:

  1. Код для сборки образа контейнера загружается в репозиторий исходного кода, например, Cloud Source Repositories .
  2. Инструмент непрерывной интеграции (CI) Cloud Build выполняет сборку и тестирование контейнеров.
  3. В процессе сборки образ контейнера отправляется в Container Registry или другой реестр, хранящий собранные образы.
  4. Сервис управления ключами в облаке (Cloud Key Management Service) , обеспечивающий управление ключами для криптографической пары ключей , подписывает образ контейнера. Полученная подпись затем сохраняется в новом созданном аттестационном документе.
  5. Во время развертывания аттестатор проверяет аттестацию, используя открытый ключ из ключевой пары. Бинарная авторизация обеспечивает соблюдение политики , требуя подписанных аттестаций для развертывания образа контейнера.

В этой лабораторной работе вы сосредоточитесь на инструментах и ​​методах обеспечения безопасности развернутых артефактов. Основное внимание уделяется артефактам (контейнерам) после их создания, но до развертывания в конкретной среде.

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

  • Подписание изображений
  • Правила приема
  • Подписание отсканированных изображений
  • Авторизация подписанных изображений
  • Заблокированные неподписанные изображения

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 долларов США .

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

В 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 .

a37eb2ed54b9c2eb.png

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

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

208aa5ebc53ff2b3.png

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

API бинарной авторизации использует концепции «подтверждающих лиц» и «подтверждающих лиц», но их реализация осуществляется с помощью соответствующих примечаний и событий в API анализа контейнеров.

63a701bd0057ea17.png

Создать примечание аттестатора

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

919f997db0ffb881.png

Создать заметку

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:

ed05d438c79b654d.png

Создать аттестатора

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

1e3af7c177f7a311.png

Прежде чем использовать этот аттестатор, ваш центр сертификации должен создать пару криптографических ключей, которые можно использовать для подписи образов контейнеров. Это можно сделать с помощью сервиса управления ключами 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

Создание подписанного подтверждения

На этом этапе у вас настроены функции, позволяющие подписывать образы. Используйте созданный ранее аттестатор для подписи образа контейнера, с которым вы работали.

858d7e6feeb6f159.png

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

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"

Разрешить все политики

Сначала проверьте состояние политики по умолчанию и возможность развертывания любого образа.

  1. Пересмотрите существующую политику.
gcloud container binauthz policy export
  1. Обратите внимание, что для параметра принудительного применения установлено значение ALWAYS_ALLOW

evaluationMode: ALWAYS_ALLOW

  1. Разверните пример, чтобы убедиться, что вы можете развернуть что угодно.
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
  1. Убедитесь, что развертывание прошло успешно.
kubectl get pods

Вы увидите следующий результат.

161db370d99ffb13.png

  1. Удалить развертывание
kubectl delete pod hello-server

Политика «Отказать во всем»

Теперь обновите политику, чтобы запретить все изображения.

  1. Экспортируйте текущую политику в редактируемый файл.
gcloud container binauthz policy export  > policy.yaml
  1. Изменить политику

В текстовом редакторе измените параметр 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 , которая указывает, что все поды, не соответствующие этому правилу, должны быть заблокированы для запуска в кластере.

Инструкции по созданию более сложных политик см. в документации по бинарной авторизации .

657752497e59378c.png

  1. Откройте Терминал, примените новую политику и подождите несколько секунд, пока изменения вступят в силу.
gcloud container binauthz policy import policy.yaml
  1. Попытка развертывания тестовой рабочей нагрузки
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
  1. Развертывание завершается с ошибкой, выдавая следующее сообщение.
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

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

Прежде чем перейти к следующему разделу, обязательно отмените изменения в политике.

  1. Изменить политику

В текстовом редакторе измените параметр 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
  1. Примените отмененную политику.
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.

  1. Ознакомьтесь с этапом подписания ниже.

Только для ознакомления. Копирование запрещено.

#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'
  1. Создайте файл 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, чтобы использовать авторизацию бинарных файлов для проверки наличия подписи образа по результатам сканирования уязвимостей, прежде чем разрешить его запуск.

d5c41bb89e22fd61.png

Обновить политику 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. Теперь, вместо того чтобы правило по умолчанию отклоняло все изображения, оно сначала проверяет ваш аттестатор на наличие подтверждений.

822240fc0b02408e.png

Загрузите новую политику в систему бинарной авторизации:

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. Поздравляем!

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

Что мы рассмотрели:

  • Подписание изображений
  • Правила приема
  • Подписание отсканированных изображений
  • Авторизация подписанных изображений
  • Заблокированные неподписанные изображения

Что дальше:

Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий эти ресурсы, либо сохраните проект и удалите отдельные ресурсы.

Удаление проекта

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

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