快速入门

本快速入门介绍了如何在 Binary Authorization 中配置和测试简单的政策。

在本快速入门中,您将查看和测试默认政策,然后配置政策,以拒绝将 Container Registry 中的所有容器映像部署到 Google Kubernetes Engine (GKE) 集群。这并不是实际的政策。在实际的政策中,您通常需要环境中的证明者提供证明,然后才能部署容器映像。

请参阅通过 CLI 开始使用通过控制台开始使用,了解篇幅更长的介绍如何为政策配置必需证明的教程。

准备工作

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

    转到“项目选择器”

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

  4. 安装并初始化 Cloud SDK
  5. 安装 kubectl

启用必需的 API

为 GKE、Container Analysis 和 Binary Authorization 启用 API:

gcloud

  1. 设置 gcloud 命令使用的默认 Google Cloud 项目:

    PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    

    其中,PROJECT_ID 是您的项目的名称。

  2. 启用必需的 API:

    gcloud services enable \
        container.googleapis.com \
        containeranalysis.googleapis.com \
        binaryauthorization.googleapis.com
    

控制台

启用必需的 API:

启用 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

控制台

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

    转到 GKE 页面

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

  2. 点击创建集群

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

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

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

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

  6. 点击可用性、网络、安全性及其他功能

  7. 安全性部分,选择启用 Binary Authorization

    “启用 Binary Authorization”选项

  8. 点击创建

默认政策

默认情况下,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"
  }
}

控制台

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

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

    转到“Binary Authorization”页面

    控制台会显示政策详情。

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

  2. 点击配置政策,或者,如果存在政策,则点击修改政策

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

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

测试政策

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

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

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
    

控制台

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

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

    转到 GKE 页面

  2. 点击部署

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

  3. 选择现有容器映像

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

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

  5. 点击继续

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

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

  7. 点击部署

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

kubectl

如需验证映像是否已部署,请运行以下命令:

kubectl get pods

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

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

控制台

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

转到 GKE 页面

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

部署成功消息的屏幕截图

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

kubectl

如需删除部署,请运行以下命令:

kubectl delete deployment hello-server

控制台

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

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

    转到 GKE 页面

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

  3. 点击删除

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

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

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"
    

控制台

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

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

    转到“Binary Authorization”页面

  2. 点击修改政策

  3. 选择禁止所有映像

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

  4. 点击保存政策

重新测试政策

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

kubectl

部署映像:

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

控制台

部署映像:

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

    转到 GKE 页面

  2. 点击部署

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

  3. 选择现有容器映像

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

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

  5. 点击继续

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

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

  7. 点击部署

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

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 工作负载页面。

转到 GKE 页面

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

部署失败消息的屏幕截图

清理

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

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

gcloud

如需删除集群,请运行以下命令:

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

控制台

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

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

    转到 GKE 页面

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

后续步骤