快速入门:全部允许和全部禁止

本快速入门介绍了如何在 Binary Authorization 政策中配置和测试基本规则

在本快速入门中,您将查看并配置政策中的默认规则。默认规则允许部署所有映像;您可以通过在 Google Kubernetes Engine (GKE) 集群上部署一个容器映像来对此进行测试。之后,您可以将默认规则设置为禁止部署所有映像并尝试部署一个映像进行测试。

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Artifact Registry, Binary Authorization API。

    启用 API

  5. 安装并初始化 Cloud SDK
  6. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  7. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  8. 启用 Artifact Registry, Binary Authorization API。

    启用 API

  9. 安装并初始化 Cloud SDK
  10. 安装 kubectl

创建启用了 Binary Authorization 的集群

现在,创建一个启用了 Binary Authorization 的 GKE 集群。这是您希望运行已部署的容器映像的集群。

Google Cloud Console

  1. 转到 Cloud Console 中的 GKE 集群页面。

    转到 GKE

    控制台会显示 Google Cloud 项目中的 GKE 集群列表。

  2. 点击创建集群

  3. 名称字段中输入 test-cluster

    标准集群模板中的“名称”字段

  4. 位置类型选项中选择区域

  5. 区域下拉列表中选择 us-central1-a

  6. 点击安全链接以显示安全面板。

  7. 安全性面板上,选中启用 Binary Authorization 复选框。

    “启用 Binary Authorization”选项

  8. 点击创建

gcloud

运行 gcloud container clusters create,并启用 --enable-binauthz 标志。

gcloud container clusters create \
    --enable-binauthz \
    --zone us-central1-a \
    test-cluster

默认政策

默认情况下,Binary Authorization 政策会配置为允许部署所有容器映像。

Cloud Console

如需查看默认政策,请执行以下操作:

  1. 转到 Cloud Console 中的 Binary Authorization 页面。

    转到 Binary Authorization

    控制台会显示政策详情。

    显示默认规则的“政策”标签页的屏幕截图

  2. 点击修改政策

  3. 项目默认规则中,已选中允许所有映像选项。

    选择默认规则类型的选项的屏幕截图

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"
  }
}

测试政策

您可以通过尝试将示例容器映像部署到集群来测试政策。

在本快速入门中,您可以使用 Container Registry 内位于路径 gcr.io/google-samples/hello-app 中的示例容器映像。这是一个由 Google 创建的公共容器映像,其中包含一个“Hello, World!”示例应用。

Cloud Console

如需测试政策,请执行以下操作:

  1. 转到 Cloud Console 中的 GKE 集群页面。

    转到 GKE

  2. 点击部署

    控制台会提示您输入部署详情。

  3. 选择现有容器映像

    “创建部署”页面的屏幕截图

  4. 输入 gcr.io/google-samples/hello-app:1.0 作为容器映像路径。

  5. 点击继续

    “配置部署”页面的屏幕截图

  6. 应用名称字段中输入 hello-server

  7. 点击部署

kubectl

如需测试政策,请执行以下操作:

  1. 更新本地 kubeconfig 文件:

    gcloud container clusters get-credentials \
        --zone us-central1-a \
        test-cluster
    

    这可以提供访问 GKE 中的集群所需的凭据和端点信息。

  2. 部署映像:

    kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
    

现在,验证 Binary Authorization 是否允许部署:

Cloud Console

如需验证映像是否已部署,请转到 Cloud Console 中的 GKE 工作负载页面。

转到 GKE

部署的工作负载带有绿色图标,表明映像已成功部署。

部署成功消息的屏幕截图

kubectl

如需验证映像是否已部署,请执行以下操作:

kubectl get pods

该命令会输出类似于以下内容的消息,表示部署成功:

NAME                            READY     STATUS    RESTARTS   AGE
hello-server-579859fb5b-h2k8s   1/1       Running   0          1m

请务必删除该部署,以便继续执行下一步:

Cloud Console

如需删除部署,请执行以下操作:

  1. 返回 Cloud Console 中的 GKE 工作负载页面。

    转到 GKE

  2. 选择 test-server 工作负载。

  3. 点击删除

kubectl

如需删除部署,请执行以下操作:

kubectl delete deployment hello-server

将政策配置为禁止所有映像

现在,将政策修改为阻止(而不是允许)部署所有映像。

Cloud Console

如需修改政策,请执行以下操作:

  1. 返回 Cloud Console 中的 Binary Authorization 页面。

    转到 Binary Authorization

  2. 点击修改政策

  3. 选择禁止所有映像

    选择默认规则类型的选项的屏幕截图

  4. 点击保存政策

gcloud

如需修改政策,请执行以下操作:

  1. 导出 YAML 格式的政策文件:

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. 在文本编辑器中,将 evaluationModeALWAYS_ALLOW 更改为 ALWAYS_DENY

    YAML 格式的政策文件应如下所示:

    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: ALWAYS_DENY
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    name: projects/PROJECT_ID/policy
    
  3. 将 YAML 格式的政策文件重新导入 Binary Authorization:

    gcloud container binauthz policy import /tmp/policy.yaml
    

REST API

如需修改政策,请执行以下操作:

  1. 创建一个使用更新后的政策的 JSON 格式的文本文件:

    cat > /tmp/policy.json << EOM
    {
      "name": "projects/${PROJECT_ID}/policy",
      "globalPolicyEvaluationMode": "ENABLE",
      "defaultAdmissionRule": {
        "evaluationMode": "ALWAYS_DENY",
        "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
      }
    }
    EOM
    
  2. 将更新后的政策发送到 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"
    

重新测试政策

同样,可通过将示例容器映像部署到集群来测试政策。这次,Binary Authorization 会阻止映像的部署。

Cloud Console

部署映像:

  1. 转到 Cloud Console 中的 GKE 集群页面。

    转到 GKE

  2. 点击部署

    控制台会提示您输入部署详情。

  3. 选择现有容器映像

    “创建部署”页面的屏幕截图

  4. 输入 gcr.io/google-samples/hello-app:1.0 作为容器映像路径。

  5. 点击继续

    “配置部署”页面的屏幕截图

  6. 应用名称字段中输入 hello-server

  7. 点击部署

kubectl

部署映像:

kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080

您现在可以验证政策是否被阻止:

Cloud Console

如需验证映像是否未部署,请执行以下操作:

返回 Cloud Console 中的 GKE 工作负载页面。

转到 GKE

容器映像的工作负载带有红色图标,表明未能部署该映像。

部署失败消息的屏幕截图

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 POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Denied by always_deny admission rule

在此输出中:

  • POD_NAME:Pod 的名称。
  • IMAGE_NAME:映像的名称。
  • ATTESTOR_NAME:证明者的名称。

清理

为避免系统因本页中使用的资源向您的 Google Cloud 帐号收取费用,请按照以下步骤操作。

删除您在 GKE 中创建的集群:

控制台

如需删除集群,请执行以下操作:

  1. 转到 Cloud Console 中的 GKE 集群页面。

    转到 GKE

  2. 选择 test-cluster 集群,然后点击删除

gcloud

如需删除集群,请执行以下操作:

gcloud container clusters delete \
    --zone=us-central1-a \
    test-cluster

后续步骤