参加 2021 年 DevOps 现状问卷调查,塑造软件安全的未来,让我们了解您的想法。

设置 Binary Authorization for Anthos clusters on VMware

本文档介绍如何设置 Binary Authorization for Anthos clusters on VMware (GKE On-Prem)。然后向您展示如何配置示例 Binary Authorization 政策。

准备工作

  1. 您必须安装和配置 Anthos clusters on VMware 1.4 或更高版本,以及管理员和用户集群。您的用户集群必须向 Connect 注册。

  2. Binary Authorization 服务使用可通过常规互联网连接访问的公共 IP 地址。为 HTTPS 配置 Anthos clusters on VMware 防火墙规则,以允许用户集群访问端点 binaryauthorization.googleapis.com

  3. 如果您想使用集中式 Cloud Audit Logs 查看审核日志条目(包括来自 Binary Authorization for Anthos clusters on VMware 的日志条目),您必须在用户集群配置中配置 Cloud Audit Logs,然后再创建用户集群。

  4. 您必须按照以下步骤启用 Binary Authorization API:

    1. 转到 Google Cloud Console。

      启用 API

    2. 在项目下拉列表中,选择您的 Connect 项目。您可以在用户集群配置文件的 gkeConnect 部分中找到此 Google Cloud 项目。这是将您的用户集群连接到 Google Cloud 的 Cloud 项目。

设置 Binary Authorization for Anthos clusters on VMware

在本部分中,您将在用户集群中设置 Binary Authorization for Anthos clusters on VMware。

指定安装环境变量

如需指定环境变量,请执行以下操作:

  1. 使用 SSH 连接到 Anthos clusters on VMware 管理员工作站

  2. 指定您的 Connect 项目:

    export PROJECT_ID=PROJECT_ID
    

    PROJECT_ID 替换为用户集群配置文件的 gkeConnect 部分中的 Cloud 项目。

  3. 指定用户集群的 kubeconfig 文件的路径:

    export KUBECONFIG=PATH
    

    PATH 替换为用户集群 kubeconfig 文件的路径。

  4. 为 Binary Authorization API 访问服务帐号选择一个名称:

    export SA_NAME=SERVICE_ACCOUNT_NAME
    

    SERVICE_ACCOUNT_NAME 替换为您选择的服务帐号名称。Binary Authorization 模块使用此服务帐号访问 Binary Authorization API。

  5. 指定您在本指南后面要下载的服务帐号密钥文件的路径:

    export SA_JSON_PATH=SA_KEY_FILE_PATH
    

    SA_KEY_FILE_PATH 替换为服务帐号的 JSON 密钥文件的路径。

在用户集群中安装 Binary Authorization 模块

如需安装 Binary Authorization 模块,请执行以下操作:

  1. gcloud command-line tool 设置默认项目:

    gcloud config set project ${PROJECT_ID}
    
  2. 创建 Binary Authorization API 访问服务帐号:

    gcloud iam service-accounts create ${SA_NAME}
    
  3. binaryauthorization.policyEvaluator 角色授予您的 Connect 项目中的 Binary Authorization API 访问服务帐号:

    gcloud projects add-iam-policy-binding ${PROJECT_ID}\
      --member serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com\
      --role roles/binaryauthorization.policyEvaluator
    
  4. 创建工作目录:

    1. 创建名为 binauthz 的目录。

    2. 切换到目录。

  5. 下载 manifest.yaml 文件,该文件用于在 Anthos clusters on VMware 用户集群中安装 Binary Authorization 模块:

    gsutil cp gs://gke-on-prem-release/binauthz/manifest-0.2.1.yaml .
    
  6. binauthz-system 命名空间创建 YAML 文件。

    将以下内容复制到名为 namespace.yaml 的文件中:

    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        control-plane: binauthz-controller
      name: binauthz-system
    
  7. 在用户集群中创建命名空间:

    kubectl apply -f namespace.yaml
    

    您将看到类似如下所示的输出:

    namespace/binauthz-system created
    
  8. 下载该服务帐号的 JSON 密钥文件:

    gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    
  9. 将服务帐号密钥作为 Kubernetes Secret 保存到用户集群中:

    kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}
    
  10. 在用户集群中安装 Binary Authorization 模块:

    kubectl apply -f manifest-0.2.1.yaml
    
  11. 验证 Deployment 是否已创建:

    kubectl get pod --namespace binauthz-system
    

    您会看到列出的 Pod binauthz-module-deployment-*StatusRunning 且有 1/1 个 Pod 准备就绪,类似于如下输出:

NAME                                          READY   STATUS    RESTARTS   AGE
binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s

使用 Binary Authorization for Anthos clusters on VMware

本部分介绍如何设置和使用 Binary Authorization 政策。

在每个示例中,您都需要配置政策,然后通过尝试在 Anthos clusters on VMware 用户集群中部署容器映像来测试该政策。

全部允许

本部分演示了一个成功案例。您可以配置 Binary Authorization 政策,以使容器映像满足该政策并部署。

在 Google Cloud 中,执行以下操作:

Google Cloud Console

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

转到 Binary Authorization

  1. 请务必选择 Connect 项目 ID。

  2. 点击修改政策

  3. 项目默认规则下,选择允许所有映像

  4. 点击保存政策

命令行

  1. 为您的 Connect 项目设置 PROJECT_ID。您可以在用户集群配置文件的 gkeConnect 字段中找到此项目 ID。

    export PROJECT_ID=PROJECT_ID
    

    设置默认的 Google Cloud 项目。

    gcloud config set project ${PROJECT_ID}
    
  2. 将 YAML 格式的政策文件导出到本地系统:

    gcloud container binauthz policy export  > policy.yaml
    

    您的 YAML 文件如下所示:

    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/<var>PROJECT_ID</var>/policy
    
  3. 修改 policy.yaml

  4. evaluationMode 设置为 ALWAYS_ALLOW

  5. 如果文件中包含 requireAttestationsBy 块,请删除此块。

  6. 保存文件。

  7. 导入 policy.yaml,如下所示:

    gcloud container binauthz policy import policy.yaml
    

在 Anthos clusters on VMware 上执行以下操作:

  1. 为 Pod 创建清单文件。

    将以下内容保存到名为 pod.yaml 的文件中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. 创建 Pod:

    kubectl apply -f pod.yaml
    

    您会看到 Pod 已成功部署。

  3. 删除 Pod:

    kubectl delete -f pod.yaml
    

全都不允许

本部分演示了失败案例。在本部分中,您将配置默认政策以禁止部署容器映像。

在 Google Cloud 中,执行以下操作:

Google Cloud Console

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

转到 Binary Authorization

  1. 确保您的 Connect 项目处于选中状态。

  2. 点击修改政策

  3. 项目默认规则下,选择禁止所有映像

  4. 点击保存政策

命令行

  1. PROJECT_ID 设置为您的 Connect 项目 ID。

    export PROJECT_ID=PROJECT_ID
    
  2. 设置默认 Cloud 项目。

    gcloud config set project ${PROJECT_ID}
    
  3. 导出 YAML 格式的政策文件:

    gcloud container binauthz policy export  > policy.yaml
    
  4. 修改 policy.yaml

  5. evaluationMode 设置为 ALWAYS_DENY

  6. 如果文件中包含 requireAttestationsBy 块,请删除此块。

  7. 保存文件。

  8. 导入 policy.yaml,如下所示:

    gcloud container binauthz policy import policy.yaml
    

在 Anthos clusters on VMware 上执行以下操作:

  1. 为 Pod 创建清单文件。

    将以下内容保存到名为 pod.yaml 的文件中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. 创建 Pod:

    kubectl apply -f pod.yaml
    

您会看到 Pod 已被阻止部署。输出如下所示:

Error from server (VIOLATES_POLICY): error when creating "pod.yaml": admission webhook "binaryauthorization.googleapis.com" denied the request: Denied by default admission rule. Overridden by evaluation mode

获取用户集群资源 ID

本部分介绍如何为用户集群编写集群资源 ID。在 Binary Authorization 政策中,您可以创建针对集群的规则。这些规则基于集群 ID 与针对集群的资源 ID 关联。

您可以按如下方式获取资源 ID:

Google Cloud Console

  1. Cloud Console 中,转到 Anthos 集群页面。

    转到集群

  2. 为 Anthos clusters on VMware 选择 Connect 项目 ID。您可以在用户集群配置文件的 gkeConnect 部分中找到此项目 ID。

  3. Anthos 管理的集群名称列下找到您的集群 ID。

  4. 如需创建资源 ID,请将前缀 global. 添加到集群 ID,使资源 ID 采用以下格式:global.CLUSTER_ID

命令行工具

  1. 使用 SSH 连接到 Anthos clusters on VMware 管理员工作站。

  2. 在管理员工作站上,运行以下命令:

    kubectl get membership -o yaml
    
  3. 从输出的 spec.owner.id 字段中获取集群 ID。示例输出如下所示:

    apiVersion: v1
    items:
    - apiVersion: hub.gke.io/v1
      kind: Membership
      ...
      spec:
        owner:
          id: //gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/my-cluster-id
    

    在示例输出中,集群 ID 为 my-cluster-id

  4. 如需创建资源 ID,请将前缀 global. 添加到集群 ID。在该示例中,资源 ID 为 global.my-cluster-id

您可以在定义集群专用规则时使用此资源 ID。了解如何使用 Google Cloud Console命令行工具设置针对集群的规则。

清除数据

  1. 以下代码示例展示了如何停用网络钩子:

    kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configuration
    
  2. 以下代码示例展示了如何重新启用网络钩子:

    kubectl apply -f manifest-0.2.1.yaml
    
  3. 以下代码示例展示了如何删除与 Binary Authorization 相关的所有资源:

    kubectl delete -f manifest-0.2.1.yaml
    kubectl delete namespace binauthz-system
    

后续步骤