使用 Breakglass (GKE)

本页面介绍了如何使用 Binary Authorization 中的紧急访问权限功能。

准备工作

本指南假定您已设置 Binary Authorization

概览

您可以使用 Breakglass 来部署 Binary Authorization 经常阻止的容器映像。

紧急访问权限提供了一个“紧急安全舱口”,使您能够覆盖 Binary Authorization 的强制执行行为,并允许部署容器映像,包括原本要被政策禁止的容器映像。

此功能的实现与 Kubernetes 准入控制器规范中的建议一致。

使用 Breakglass 部署映像时,Breakglass 事件会自动记录到 Cloud Audit Logs 中。在 Cloud Audit Logs 中,您可以手动审核或自动触发提醒或其他下游事件。

如需启用 Breakglass,请使用 break-glass 政策标志向 podspec 添加相应标签。

演示紧急访问权限事件

本部分介绍如何使用 Breakglass 来部署映像,包括部署那些违反了 Binary Authorization 政策的映像。

更新 Binary Authorization 政策以拒绝所有部署请求

如需更新政策以禁止部署所有映像,请执行以下步骤:

Cloud Console

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

    转到 Binary Authorization

  2. 点击修改政策

  3. 修改政策页面的项目默认规则中,记下原始评估模式,然后点击禁止所有映像

  4. 点击保存政策

gcloud

  1. 如需保存当前项目中的现有政策,请执行以下命令:

    gcloud container binauthz policy export > SAVE_POLICY_YAML
    

    SAVE_POLICY_YAML 替换为导出文件的路径,例如 /tmp/save_policy.yaml

  2. 创建政策文件:

    cat > TEST_POLICY_YAML << EOM
    admissionWhitelistPatterns:
    defaultAdmissionRule:
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      evaluationMode: ALWAYS_DENY
    globalPolicyEvaluationMode: DISABLE
    EOM
    

    TEST_POLICY_YAML 替换为文件路径,例如 /tmp/policy.yaml

  3. 导入政策:

    gcloud container binauthz policy import TEST_POLICY_YAML
    

    TEST_POLICY_YAML 替换为文件路径,例如 /tmp/policy.yaml

默认情况下,所有映像现在都会被禁止部署。

尝试部署容器映像

虽然 Breakglass 是 Binary Authorization 中特有的功能,但您必须在 podspec 上更新相应标签才能启用该功能。为此,请执行以下命令:

  1. 创建 YAML 格式的配置文件。此文件包含创建 pod 所需的基本信息:

    cat > /tmp/create_pod.yaml << EOM
    apiVersion: v1
    kind: Pod
    metadata:
      name: breakglass-pod
    spec:
      containers:
      - name: container-name
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    EOM
    
  2. 使用 kubectl 创建 Pod:

    kubectl create -f /tmp/create_pod.yaml
    

    您会看到一条错误消息,表明该映像已被您的政策阻止。这条错误消息类似以下内容:

    Error from server (Forbidden): error when creating "/tmp/create_pod.yaml": pods "breakglass-pod" is forbidden: image policy webhook backend denied one or more images: Image gcr.io/google-samples/hello-app denied by Binary Authorization default
    admission rule. Denied by always_deny admission rule`.

启用紧急访问权限并重新部署

  1. 创建 YAML 格式的配置文件。

    以下命令将创建包含 break-glass 标签的文件以及创建 Pod 所需的其他信息:

    cat > /tmp/create_pod.yaml << EOM
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
      labels:
        image-policy.k8s.io/break-glass: "true"
    spec:
      containers:
      - name: container-name
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    EOM
    

    对于所有早期 Kubernetes 主实例,您可以通过将 alpha.image-policy.k8s.io/break-glass 添加到 annotations 节点来启用 Breakglass,如下所示:

    cat > /tmp/create_pod.yaml << EOM
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
      annotations:
         alpha.image-policy.k8s.io/break-glass: "true"
    spec:
      containers:
      - name: container-name
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    EOM
    
  2. 使用 kubectl 创建 pod:

    kubectl create -f /tmp/create_pod.yaml
    

    请注意输出:pod/pod-name created

在 Cloud Audit Logs 中查找 Breakglass 日志条目

Cloud Audit Logs 中查看 Breakglass 事件。

清理

  1. 删除 Pod:

      kubectl delete -f /tmp/create_pod.yaml
      

    验证您是否收到了如下所示的输出:pod "pod-name" deleted

  2. 重新导入原始政策。

      gcloud container binauthz policy import /tmp/policy_save.yaml