本快速入门介绍了如何在 Binary Authorization 中配置和测试简单的政策。
在本快速入门中,您将查看和测试默认政策,然后配置政策,以拒绝将 Container Registry 中的所有容器映像部署到 Google Kubernetes Engine (GKE) 集群。这并不是实际的政策。在实际的政策中,您通常需要环境中的证明者提供证明,然后才能部署容器映像。
请参阅通过 CLI 开始使用或通过控制台开始使用,了解篇幅更长的介绍如何为政策配置必需证明的教程。
准备工作
- 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能。
- 安装并初始化 Cloud SDK。
- 安装
kubectl
。
启用必需的 API
为 GKE、Container Analysis 和 Binary Authorization 启用 API:
gcloud
设置
gcloud
命令使用的默认 Google Cloud 项目:PROJECT_ID=PROJECT_ID gcloud config set project ${PROJECT_ID}
其中,PROJECT_ID 是您的项目的名称。
启用必需的 API:
gcloud services enable \ container.googleapis.com \ containeranalysis.googleapis.com \ binaryauthorization.googleapis.com
控制台
启用必需的 API:
此操作可能需要几分钟时间才能完成。
创建启用了 Binary Authorization 的集群
现在,创建一个启用了 Binary Authorization 的 GKE 集群。这是您希望运行已部署的容器映像的集群:
gcloud
运行 gcloud container clusters create
,并启用 --enable-binauthz
标志。
gcloud container clusters create \ --enable-binauthz \ --zone us-central1-a \ test-cluster
控制台
转到 Cloud Console 中的 GKE 集群页面。
控制台会显示 Google Cloud 项目中的 GKE 集群列表。
点击创建集群。
在名称字段中输入
test-cluster
。在位置类型选项中选择区域。
从区域下拉列表中选择
us-central1-a
。点击可用性、网络、安全性及其他功能。
在安全性部分,选择启用 Binary Authorization。
点击创建。
默认政策
默认情况下,Binary Authorization 政策会配置为允许部署所有容器映像。
gcloud
如需查看默认政策,请导出 YAML 格式的政策文件:
gcloud container binauthz policy export
默认情况下,该文件包含以下内容:
admissionWhitelistPatterns: - namePattern: gcr.io/google_containers/* - namePattern: gcr.io/google-containers/* - namePattern: k8s.gcr.io/* - namePattern: gke.gcr.io/* - namePattern: gcr.io/stackdriver-agents/* globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_ALLOW enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
REST API
如需查看默认政策,请以 JSON 格式检索:
curl \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "x-goog-user-project: ${PROJECT_ID}" \ "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"
REST API 会返回以下内容:
{ "name": "projects/PROJECT_ID/policy", "admissionWhitelistPatterns": [ { "namePattern": "gcr.io/google_containers/*" }, { "namePattern": "gcr.io/google-containers/*" }, { "namePattern": "k8s.gcr.io/*" }, { "namePattern": "gke.gcr.io/*" }, { "namePattern": "gcr.io/stackdriver-agents/*" } ], "globalPolicyEvaluationMode": "ENABLE", "defaultAdmissionRule": { "evaluationMode": "ALWAYS_ALLOW", "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG" } }
控制台
如需查看默认政策,请执行以下操作:
转到 Google Cloud Console 中的 Binary Authorization 页面。
控制台会显示政策详情。
点击配置政策,或者,如果存在政策,则点击修改政策。
在项目默认规则中,已选中允许所有映像选项。
测试政策
您可以通过尝试将示例容器映像部署到集群来测试政策。
在本快速入门中,您可以使用 Container Registry 内位于路径 gcr.io/google-samples/hello-app
中的示例容器映像。这是一个由 Google 创建的公共容器映像,其中包含一个 Hello, World! 示例应用。
kubectl
如需测试政策,请执行以下操作:
更新本地
kubeconfig
文件:gcloud container clusters get-credentials \ --zone us-central1-a \ test-cluster
这可以提供访问 GKE 中的集群所需的凭据和端点信息。
部署映像:
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
控制台
如需测试政策,请执行以下操作:
转到 Cloud Console 中的 GKE 集群页面。
点击部署。
控制台会提示您输入部署详情。
选择现有容器映像。
输入
gcr.io/google-samples/hello-app:1.0
作为容器映像路径。点击继续。
在应用名称字段中输入
hello-server
。点击部署。
现在,验证 Binary Authorization 是否允许部署:
kubectl
如需验证映像是否已部署,请运行以下命令:
kubectl get pods
该命令会输出类似于以下内容的消息,表示部署成功:
NAME READY STATUS RESTARTS AGE hello-server-579859fb5b-h2k8s 1/1 Running 0 1m
控制台
如需验证映像是否已部署,请转到 Google Cloud Console 中的 GKE 工作负载页面。
部署的工作负载带有绿色图标,表明映像已成功部署。
请务必删除该部署,以便继续执行下一步:
kubectl
如需删除部署,请运行以下命令:
kubectl delete deployment hello-server
控制台
如需删除部署,请执行以下操作:
返回 Google Cloud Console 中的 GKE 工作负载页面。
选择
test-server
工作负载。点击删除。
将政策配置为禁止所有映像
现在,将政策修改为阻止(而不是允许)部署所有映像。
gcloud
如需修改政策,请执行以下操作:
导出 YAML 格式的政策文件:
gcloud container binauthz policy export > /tmp/policy.yaml
在文本编辑器中,将
evaluationMode
从ALWAYS_ALLOW
更改为ALWAYS_DENY
。YAML 格式的政策文件应如下所示:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_DENY enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
将 YAML 格式的政策文件重新导入 Binary Authorization:
gcloud container binauthz policy import /tmp/policy.yaml
REST API
如需修改政策,请执行以下操作:
创建一个使用更新后的政策的 JSON 格式的文本文件:
cat > /tmp/policy.json << EOM { "name": "projects/${PROJECT_ID}/policy", "globalPolicyEvaluationMode": "ENABLE", "defaultAdmissionRule": { "evaluationMode": "ALWAYS_DENY", "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG" } } EOM
将更新后的政策发送到 REST API:
curl -X PUT \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "x-goog-user-project: ${PROJECT_ID}" \ --data-binary @/tmp/policy.json \ "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"
控制台
如需修改政策,请执行以下操作:
返回 Google Cloud Console 中的 Binary Authorization 页面。
点击修改政策。
选择禁止所有映像。
点击保存政策。
重新测试政策
同样,可通过将示例容器映像部署到集群来测试政策。这次,Binary Authorization 会阻止映像的部署。
kubectl
部署映像:
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
控制台
部署映像:
转到 Cloud Console 中的 GKE 集群页面。
点击部署。
控制台会提示您输入部署详情。
选择现有容器映像。
输入
gcr.io/google-samples/hello-app:1.0
作为容器映像路径。点击继续。
在应用名称字段中输入
hello-server
。点击部署。
您现在可以验证政策是否被阻止:
kubectl
如需验证映像是否未部署,请运行以下命令:
kubectl get pods
该命令会输出以下消息,表明该映像未部署:
No resources found.
您可以进一步了解部署详情:
kubectl get event --template \ '{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}{{.message}}{{"\n"}}{{end}}'
这表明政策不允许进行该部署:
FailedCreate:Error creating: pods "hello-server-579859fb5b-lvfgd" is forbidden: image policy webhook backend denied one or more images: Denied by default admission rule. Overridden by evaluation mode
控制台
如需验证映像是否未部署,请执行以下操作:
返回 Google Cloud Console 中的 GKE 工作负载页面。
容器映像的工作负载带有红色图标,表明未能部署该映像。
清理
为避免系统因本快速入门中使用的资源向您的 Google Cloud 帐号收取费用,请按照以下步骤操作。
删除您在 GKE 中创建的集群:
gcloud
如需删除集群,请运行以下命令:
gcloud container clusters delete \ --zone=us-central1-a \ test-cluster
控制台
如需删除集群,请执行以下操作:
转到 Cloud Console 中的 GKE 集群页面。
选择
test-cluster
集群,然后点击删除。