0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloud Build + Binary Authorization を使用した来歴の取得(Google Cloud)

0
Posted at

はじめに

近年、ソフトウェアサプライチェーン攻撃(SolarWinds事件、Codecov事件など)が増加し、「コンテナイメージが本当に信頼できるパイプラインで作られたものか」を検証することが、エンタープライズシステム運用において重要な課題となっています。

私自身、製造業・SCM領域の基幹システム開発において、Google Cloud をはじめとするクラウド基盤の導入・運用を支援してきた経験を踏まえ、今回は Google Cloud の Binary Authorization について、その仕組みと実際のハンズオン手順を整理してみたいと思います。

なお、Google Cloud を活用したシステム開発については、Udemy にて関連コースをリリースしておりますので、ご興味のある方はご覧ください。

1. Binary Authorization とは

Binary Authorization は、Google Cloud が提供する 「コンテナイメージのデプロイ時セキュリティ制御サービス」 です。Cloud Run、GKE、Anthos などへのデプロイ前に、「そのコンテナイメージが信頼できるソースから来たものか」をポリシーに基づいて検証し、不正なイメージのデプロイをブロックする仕組みを提供します。

主な目的は以下の通りです。

  • サプライチェーンの完全性確保:承認されていない(=社内のCIパイプラインを通っていない)イメージのデプロイを防止する。
  • ガバナンスの強化:本番環境にデプロイされるイメージを、ポリシーで一元的に管理する。
  • 来歴(Provenance)の検証:イメージが「いつ・誰が・どのビルダーで」作成されたかを暗号学的に検証する。

仕組みとしては、信頼できるビルドシステム(例:Cloud Build)が、ビルド完了時にイメージに対して Attestation(証明書) を付与します。デプロイ時に Binary Authorization はこの Attestation の存在と署名を検証し、ポリシーに合致しなければデプロイをブロックします。

人間のオペレーションミスや悪意あるイメージ差し替えをシステム的に防止できる点が、Binary Authorization のメリットです。

2. ハンズオン:Cloud Build + Binary Authorization

ここからは、実際に Cloud Build でビルドしたイメージを、Binary Authorization のポリシー制御下で Cloud Run にデプロイする流れを示します。

2-1. 事前準備(初回のみ)

リージョンとプロジェクトIDを変数化し、必要なAPIを有効化します(東京リージョンを想定しています)。

REGION=asia-northeast1
PROJECT_ID=$(gcloud config get-value project)

gcloud services enable \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com \
  run.googleapis.com \
  binaryauthorization.googleapis.com \
  clouddeploy.googleapis.com

2-2. Artifact Registry リポジトリの作成

ビルドしたコンテナイメージの格納先となる Artifact Registry を作成します。

gcloud artifacts repositories create app-repo \
  --repository-format=docker \
  --location=$REGION

2-3. サンプルアプリの作成(依存なし・Cloud Run 対応)

検証用に、Python 標準ライブラリのみで動作する最小限の HTTP サーバを用意します。CAT コマンドで直接 CloudShell 上に作成します。

mkdir -p ~/cicd-lab && cd ~/cicd-lab

cat > ~/cicd-lab/main.py <<'EOF'
import os
from http.server import BaseHTTPRequestHandler, HTTPServer

class H(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type", "text/plain; charset=utf-8")
        self.end_headers()
        self.wfile.write(b"Hello from the CI/CD lab!\n")

HTTPServer(("", int(os.environ.get("PORT", "8080"))), H).serve_forever()
EOF

cat > ~/cicd-lab/Dockerfile <<'EOF'
FROM python:3.12-slim
WORKDIR /app
COPY main.py .
CMD ["python", "main.py"]
EOF

2-4. Cloud Build によるビルド

イメージ名を変数化し、--tag オプションでビルドからプッシュまでを一括実行します。

IMAGE=$REGION-docker.pkg.dev/$PROJECT_ID/app-repo/hello

cd ~/cicd-lab
gcloud builds submit --tag $IMAGE:v1 .

# 格納されたイメージを確認
gcloud artifacts docker images list $REGION-docker.pkg.dev/$PROJECT_ID/app-repo

2-5. cloudbuild.yaml によるビルドのパラメータ化

実運用では、ビルド構成を cloudbuild.yaml に切り出し、変数(substitutions)で制御するのが一般的です。

cat > ~/cicd-lab/cloudbuild.yaml <<'EOF'
steps:
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', '${_IMAGE}:${_TAG}', '.']
images:
  - '${_IMAGE}:${_TAG}'
substitutions:
  _IMAGE: 'IMAGE_PLACEHOLDER'
  _TAG: 'v2'
options:
  logging: CLOUD_LOGGING_ONLY
EOF

# _IMAGE 変数を実値で上書きして実行
gcloud builds submit --config cloudbuild.yaml \
  --substitutions=_IMAGE=$IMAGE,_TAG=v2 .

# 履歴の確認
gcloud builds list --limit=5

2-6. ビルド来歴(Provenance)の確認

Cloud Build は、ビルドしたイメージに対して自動的に来歴情報を生成します。これが Binary Authorization の検証材料となります。

DIGEST=$(gcloud artifacts docker images describe $IMAGE:v1 \
  --format="value(image_summary.digest)")

gcloud artifacts docker images describe $IMAGE@$DIGEST \
  --show-provenance --format=json

2-7. Binary Authorization ポリシーの設定

現在のポリシーをエクスポートしたうえで、「Cloud Build によって作成されたイメージ(built-by-cloud-build Attestor による証明があるもの)のみデプロイを許可する」ポリシーを定義します。

gcloud container binauthz policy export > /tmp/policy.yaml

cat << EOF > /tmp/policy.yaml
defaultAdmissionRule:
  evaluationMode: REQUIRE_ATTESTATION
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
  requireAttestationsBy:
    - projects/PROJECT_ID/attestors/built-by-cloud-build
name: projects/PROJECT_ID/policy
EOF

# PROJECT_ID を自身の環境に合わせて置換し、ポリシーを適用
sed -i "s/PROJECT_ID/$PROJECT_ID/g" /tmp/policy.yaml
gcloud container binauthz policy import /tmp/policy.yaml

各設定項目の意味は以下の通りです。

  • evaluationMode: REQUIRE_ATTESTATION:Attestation の存在を必須とする。
  • enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG:違反イメージのデプロイをブロックし、監査ログを残す。
  • requireAttestationsBy:信頼する Attestor(証明者)を指定。built-by-cloud-build は Google が提供するマネージドな Attestor で、Cloud Build 由来であることを保証する。

2-8. Cloud Run へのデプロイ(成功確認)

Cloud Build で作成したイメージは built-by-cloud-build の Attestation を持つため、ポリシーをパスしてデプロイが成功します。

gcloud run deploy binauthz-demo \
  --image=$IMAGE:v1 \
  --region=$REGION \
  --binary-authorization=default \
  --allow-unauthenticated

--binary-authorization=default を指定することで、デプロイ時に Binary Authorization のポリシー検証が有効になります。逆に、ローカル PC で docker build したような Attestation を持たないイメージをデプロイしようとすると、この段階でブロックされます。

3. おわりに

Binary Authorization は、単なる「セキュリティ機能」というより、 「ソフトウェアサプライチェーンに対するガバナンスをコード化するための仕組み」 と捉えるのが本質的だと考えています。

特に、法人向けの基幹システムやミッションクリティカルなシステムにおいては、「誰が・いつ・どのパイプラインで作ったイメージが本番環境にデプロイされたのか」を説明できることが極めて重要です。Binary Authorization は、この説明責任(アカウンタビリティ)をシステム的に担保するための強力な武器となります。

Cloud Build と組み合わせれば、ほぼ追加の設定なしで「承認済みパイプライン経由のイメージのみデプロイ可能」という状態を構築できますので、Google Cloud で本番システムを運用される方は、ぜひ一度検証されることをお勧めします。


プロフィール

[Maruchin Tech]
AWS、Google Cloud、製造業・SCM DXを専門とするUdemy講師・技術顧問。
新卒で日産自動車に入社。その後アクセンチュア、NTTデータを経て独立。
大手製造業の基幹システム刷新やDXプロジェクトにおいて、要件定義からアーキテクチャ設計までをリード。
現在は「現場で本当に使える技術と視点」をテーマに、エンジニア教育に従事。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?