版本 1.15

使用 Anthos Service Mesh 和 Anthos Config Management 增强应用的安全性

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本教程介绍如何改进集群和应用的安全状况。假设您是平台管理员,您的组织正在使用 Anthos Service Mesh 管理其网店的应用,Anthos Service Mesh 是一套工具,可帮助您监控和管理可靠的服务网格。您需要负责确保网格和应用的安全。

您可以使用 Anthos Config Management 的 Policy ControllerConfig Sync 防止配置错误并自动验证 Anthos Service Mesh 政策。Policy Controller 支持为您的集群强制执行完全可编程的政策。Policy Controller 还附带一个默认的限制条件模板库,您可以将该库与 Anthos Service Mesh 安全软件包搭配使用,以审核网格安全漏洞的合规性并了解是否符合最佳做法。 Config Sync 使用一组集中式 Kubernetes 声明式配置文件来持续协调集群的状态。通过搭配使用 Policy Controller 和 Config Sync,您可以持续对 Anthos Service Mesh 政策配置实施限制条件

下图简要展示了在本教程中 Anthos Service Mesh、Policy Controller 和 Config Sync 如何协同工作来管理和保护您在本教程中使用的入站流量网关Online Boutique 示例应用

展示您为本教程创建的架构的示意图

目标

  • 创建 Google Kubernetes Engine (GKE) 集群并向舰队注册集群。
  • 在集群上安装 Policy Controller、Config Sync 和 Anthos Service Mesh。
  • 将 Config Sync 配置为同步多个代码库
  • 应用使用 Config Sync 部署配置、应用和 Istio 资源的最佳实践。
  • 使用 Config Sync 部署集群配置、Online Boutique 示例应用和入站流量网关。
  • 利用 Policy Controller 的 Anthos Service Mesh 政策捆绑包来强制执行以下安全方面的最佳实践:
    • 确保网格中的所有工作负载都具有自动 Sidecar 注入。
    • 加密网格中的所有流量。
    • 保证网格中的所有工作负载都具有精细的访问权限控制。

费用

本教程使用 Google Cloud 的以下收费组件:

  • GKE
  • Anthos。Anthos 的账单涵盖 Anthos Service Mesh 和 Anthos Config Management 组件的账单。

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

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

准备环境

在本部分中,您将准备环境,以便安装 Anthos Service Mesh、Policy Controller 和 Config Sync:

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

  2. 升级到最新版本的 Google Cloud CLI:

    gcloud components update
    
  3. 要存储您在本教程中创建的文件,请使用环境变量创建目录:

    WORK_DIR=~/asm-acm-tutorial-dir
    mkdir $WORK_DIR
    
  4. 如需简化本教程的其余部分,请创建以下环境变量:

    PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    CLUSTER=asm-acm-tutorial
    CLUSTER_ZONE=us-east4-a
    PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')
    

    PROJECT_ID 替换为您要用于本教程的项目 ID。

    如果系统要求您授权 Cloud Shell,请点击授权以完成操作。

  5. 启用本教程所需的 API:

    gcloud services enable \
        mesh.googleapis.com \
        anthos.googleapis.com
    

    此操作可能需要超过一分钟才能完成。

设置 GKE 集群

在本部分中,您将创建一个 GKE 集群,然后将其注册到舰队。Environ 是 Google Cloud 的概念,用于以逻辑方式组织集群和其他资源,让您可以使用和管理多集群功能,并在您的所有系统中应用一致的政策。

您在本部分创建的集群是您在上面安装 Anthos Service Mesh、Policy Controller 和 Config Sync 的集群。它还是您部署 Online Boutique 示例应用所在的集群。

如需设置您的集群,请完成以下步骤:

  1. 创建 GKE 集群:

    gcloud container clusters create ${CLUSTER} \
        --zone ${CLUSTER_ZONE} \
        --machine-type=e2-standard-4 \
        --num-nodes 4 \
        --workload-pool ${PROJECT_ID}.svc.id.goog \
        --labels mesh_id=proj-${PROJECT_NUMBER}
    

    此操作可能需要五分钟以上才能完成。

    输出内容类似如下:

    kubeconfig entry generated for asm-acm-tutorial.
    NAME: asm-acm-tutorial
    LOCATION: us-east4-a
    MASTER_VERSION: 1.21.10-gke.2000
    MASTER_IP: 34.85.159.120
    MACHINE_TYPE: e2-standard-4
    NODE_VERSION: 1.21.10-gke.2000
    NUM_NODES: 4
    STATUS: RUNNING
    
  2. 向舰队注册集群:

    gcloud container fleet memberships register ${CLUSTER} \
        --project=${PROJECT_ID} \
        --gke-cluster=${CLUSTER_ZONE}/${CLUSTER} \
        --enable-workload-identity
    

    输出类似于以下内容:

    kubeconfig entry generated for asm-acm-tutorial.
    Waiting for membership to be created...done.
    Created a new membership [projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial] for the cluster [asm-acm-tutorial]
    Generating the Connect Agent manifest...
    Deploying the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]...
    Deployed the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect].
    Finished registering the cluster [asm-acm-tutorial] with the Fleet.
    

探索代码库

在下面的安装部分中,您将应用 Anthos Config Management 清单 acm-config.yaml。此清单将集群配置为从 Anthos Config Management 示例代码库的 asm-acm-tutorial 文件夹进行同步。此文件夹包含完成本教程其余部分所需的所有配置文件。

为了简化本教程,请使用 sed 命令更新 acm-config.yaml。使用 acm-config.yaml 文件时,Config Sync 会部署本教程的每个步骤所需的清单。通过更新这个文件,您可以专注于概念以及确保集群、网格和应用安全的流程,而无需重复操作文件和重复运行 git 命令。

如需利用 Config Sync 的同步多个代码库功能,请使用以下资源:

  • root-sync 作为 RootSync 代码库,包含集群中的所有配置(包括 RepoSyncsConstraintsClusterRoleRoleBindings)以及某些系统命名空间(如 istio-system)中包含的资源。
  • ingress-gateway 作为第一个 RepoSync,包含在本教程中部署入站流量网关并逐步确保其安全所需的所有资源。
  • online-boutique 作为第二个 RepoSync,包含在本教程中部署 Online Boutique 应用并逐步确保其安全所需的所有资源。

安装 Policy Controller、Config Sync 和代管式 Anthos Service Mesh

现在您已创建并注册集群,接下来可以在集群上安装 Config Sync、Policy Controller 和 Anthos Service Mesh,并将集群配置为从默认 RootSync 的配置进行同步:

  1. 在舰队中启用 Anthos Config Management:

    gcloud beta container fleet config-management enable
    
  2. 在舰队中启用 Anthos Service Mesh。

    gcloud container fleet mesh enable
    
  3. 启用 Anthos Service Mesh 自动管理功能,让 Google 应用推荐的代管式 Anthos Service Mesh 配置:

    gcloud container fleet mesh update \
        --management automatic \
        --memberships ${CLUSTER}
    
  4. 如需安装和配置 Config Sync 和 Policy Controller,请创建以下 Anthos Config Management 清单:

    cat <<EOF > $WORK_DIR/acm-config.yaml
    applySpecVersion: 1
    spec:
      policyController:
        enabled: true
        templateLibraryInstalled: true
        referentialRulesEnabled: true
      configSync:
        enabled: true
        sourceFormat: unstructured
        syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
        syncBranch: main
        secretType: none
        policyDir: asm-acm-tutorial/root-sync/init
    EOF
    

    如需详细了解 Anthos Config Management 配置字段,请参阅 gcloud apply spec 字段

  5. 应用此文件:

    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    应用此文件后,Policy Controller 和 Config Sync 会安装到您的集群上。接下来,Config Sync 会开始将默认 RootSync 的所有配置同步到您的集群。这些配置会安装并配置以下关键组件:

  6. 要确保成功安装 Policy Controller 和 Config Sync,请查看 Anthos Config Management 的状态:

    gcloud beta container fleet config-management status
    

    输出内容类似如下:

    Name: asm-acm-tutorial
    Status: SYNCED
    Last_Synced_Token: 4b3384d
    Sync_Branch: main
    Last_Synced_Time: 2022-05-04T21:32:58Z
    Policy_Controller: INSTALLED
    Hierarchy_Controller: PENDING
    

    如果您在 StatusPolicy_Controller 行中看到 PENDINGNOT_INSTALLED,请等待几分钟,然后再次运行 gcloud beta container fleet config-management status

  7. 要确保 Anthos Service Mesh 成功安装,请描述其状态:

    gcloud container fleet mesh describe
    

    输出内容类似如下:

    createTime: '2022-09-13T23:12:56.477042921Z'
    membershipSpecs:
      projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
          dataPlaneManagement:
            details:
            - code: OK
              details: Service is running.
            state: ACTIVE
        state:
          code: OK
          description: |-
            Revision(s) ready for use: asm-managed.
            All Canonical Services have been reconciled successfully.
          updateTime: '2022-09-14T00:19:10.571552206Z'
    name: projects/PROJECT_ID/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-09-14T00:19:14.135113118Z'
    

    如果您看到的是 state.code: ERROR 而不是 state.code: OK,请等待几分钟,然后再次运行 gcloud container fleet mesh describe。 在继续学习本教程之前,您需要确保 servicemesh.controlPlaneManagement.details.code 字段具有 REVISION_READY 值。

部署入站流量网关和示例应用

在本部分中,您将部署 Online Boutique 示例应用入站网关以管理入站流量。

  1. 部署 Online Boutique 示例应用和入站网关。

    以下命令使用 sed 更新 acm-config.yaml 清单,以使 Config Sync 部署入站网关和示例应用部署所需的资源。

    sed -i "s,root-sync/init,root-sync/deployments,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    请注意此步骤可能需要几分钟时间才能完成。

  2. 查看 RootSync 和两个 RepoSyncs 的 Config Sync 状态:

    gcloud alpha anthos config sync repo describe
    

    输出类似于以下内容:

    getting 3 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deployments@main",
        "status": "SYNCED"
      },
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/deployments@main",
        "status": "SYNCED"
      },
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/deployments@main",
        "status": "SYNCED"
      }
    ]
    

    如果您看到的是 status: RECONCILING 而不是 status: SYNCED,请等待几分钟,然后再次运行 gcloud alpha anthos config sync repo describe

    如需仅查看一个代码库的信息,您可以使用 --sync-name--sync-namespace 标志。如需详细查看代管式资源,请添加 --managed-resources 标志。如需了解详情,请参阅跨多个集群查看 Config Sync 状态

  3. 等待入站网关的公共 IP 地址完成预配:

    until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
    
  4. 获取入站网关的公共 IP 地址:

    EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
    
  5. 通过浏览器访问此 IP 地址,以验证 Online Boutique 应用是否已成功部署:

    echo http://${EXTERNAL_IP}
    

实施政策以保护您的网格

在以下部分中,您将利用 Policy Controller 通过创建限制条件Anthos Service Mesh 政策包强制执行政策。

强制执行边车代理注入

在本部分中,您将强制执行政策,以确保网格中的所有工作负载都启用了自动边车注入

  1. 如需强制执行边车代理注入,请应用限制条件。

    以下命令使用 sed 更新 acm-config.yaml 文件,以使 Config Sync 部署关联的资源。

    sed -i "s,root-sync/deployments,root-sync/enforce-sidecar-injection,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    上述命令会部署以下资源:

  2. 查看 RootSync 的 Config Sync 状态:

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

    输出类似于以下内容:

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-sidecar-injection@main",
        "status": "SYNCED"
      }
    ]
    

    如果您看到的是 status: RECONCILING 而不是 status: SYNCED,请等待几分钟,然后再次运行 gcloud alpha anthos config sync repo describe

  3. 验证 Constraints 是否已创建:

    kubectl get constraints
    

    政策控制器可能需要几分钟时间来评估这些限制条件。如果 TOTAL-VIOLATIONS 列中未显示值,请等待片刻并再次运行 kubectl get constraints

    输出类似于以下内容:

    NAME                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    podsidecarinjectionannotation.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
    
    NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
    

    由于我们正确设置了 NamespacesPods,因此这些 Constraints 存在 0 TOTAL-VIOLATIONS

  4. 如需查看这些 Constraints 的工作方式,请尝试在集群中创建一个不包含 labelannotationNamespace

    kubectl create namespace test
    

    输出类似于以下错误:

    Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [namespace-sidecar-injection-label] you must provide labels: {"istio-injection"}
    

强制执行流量加密

在本部分中,您将强制执行政策,以确保网格中的所有流量都已加密

  1. 如需强制执行流量加密,请应用限制条件。

    以下命令使用 sed 更新 acm-config.yaml 文件,以使 Config Sync 部署关联的资源。

    sed -i "s,root-sync/enforce-sidecar-injection,root-sync/enforce-strict-mtls,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    上述命令会部署以下资源:

  2. 查看 RootSync 的 Config Sync 状态:

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

    输出类似于以下内容:

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-strict-mtls@main",
        "status": "SYNCED"
      }
    ]
    

    如果您看到的是 status: RECONCILING 而不是 status: SYNCED,请等待几分钟,然后再次运行 gcloud alpha anthos config sync repo describe

  3. 运行以下命令以详细了解 PeerAuthentication 违规行为:

    kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}'  | jq
    

    输出类似于以下内容:

    [
      {
        "enforcementAction": "deny",
        "group": "constraints.gatekeeper.sh",
        "kind": "AsmPeerAuthnMeshStrictMtls",
        "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication",
        "name": "mesh-level-strict-mtls",
        "version": "v1beta1"
      }
    ]
    
  4. 通过在 istio-system 中部署 PeerAuthentication 来解决此问题。如需阻止网格中的所有服务接受明文流量,请设置 mTLS 模式设为 STRICT 的网格级 PeerAuthentication 政策。部署政策时,控制层面会自动预配 TLS 证书,以便工作负载可以相互进行身份验证。

    以下命令使用 sed 更新 acm-config.yaml 文件,以使 Config Sync 部署关联的资源。

    sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    上述命令会在 istio-system 命名空间中部署以下 STRICT mTLS PeerAuthentication。这会将 mTLS STRICT 应用于整个网格:

    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
      name: default
    spec:
      mtls:
        mode: STRICT
  5. 查看 RootSync 的 Config Sync 状态:

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

    输出类似于以下内容:

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-strict-mtls@main",
        "status": "SYNCED"
      }
    ]
    

    如果您看到的是 status: RECONCILING 而不是 status: SYNCED,请等待几分钟,然后再次运行 gcloud alpha anthos config sync repo describe

  6. 验证 Constraints 是否已创建:

    kubectl get constraints
    

    请注意,可能需要几分钟时间使 Policy Controller 评估这些 Constraints。等待并再次运行此 kubectl get constraints 命令,直到您在每行的 TOTAL-VIOLATIONS 列下获取值。

    输出类似于以下内容:

    NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
    NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls   deny                 0
    NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled   deny                 0
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls   deny                 0
    NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
    

强制执行精细的访问权限控制

在本部分中,您将强制执行政策,以确保网格中的所有工作负载都具有精细的访问权限控制

  1. 如需强制执行精细的访问权限控制,请应用限制条件。

    以下命令使用 sed 更新 acm-config.yaml 文件,以使 Config Sync 部署关联的资源。

    sed -i "s,root-sync/fix-strict-mtls,root-sync/enforce-authorization-policies,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    上述命令会部署以下资源:

  2. 查看 RootSync 的 Config Sync 状态:

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

    输出类似于以下内容:

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-authorization-policies@main",
        "status": "SYNCED"
      }
    ]
    

    如果您看到的是 status: RECONCILING 而不是 status: SYNCED,请等待几分钟,然后再次运行 gcloud alpha anthos config sync repo describe

  3. 运行以下命令以详细了解关联的违规行为:

    kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}'  | jq
    

    输出类似于以下内容:

    [
      {
        "enforcementAction": "deny",
        "group": "constraints.gatekeeper.sh",
        "kind": "AsmAuthzPolicyDefaultDeny",
        "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy",
        "name": "default-deny-authorization-policies",
        "version": "v1beta1"
      }
    ]
    
  4. 通过在 istio-system 命名空间中部署 AuthorizationPolicy 来解决此问题。

    以下命令使用 sed 更新 acm-config.yaml 文件,以使 Config Sync 部署关联的资源。

    sed -i "s,root-sync/enforce-authorization-policies,root-sync/fix-default-deny-authorization-policy,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    上述命令会在 istio-system 命名空间中部署以下全部拒绝 AuthorizationPolicy

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: deny-all
    spec:
      {}
  5. 查看 RootSync 的 Config Sync 状态:

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

    输出类似于以下内容:

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-default-deny-authorization-policy@main",
        "status": "SYNCED"
      }
    ]
    

    如果您看到的是 status: RECONCILING 而不是 status: SYNCED,请等待几分钟,然后再次运行 gcloud alpha anthos config sync repo describe

  6. 验证 Constraints 是否已创建:

    kubectl get constraints
    

    请注意,可能需要几分钟时间使 Policy Controller 评估这些 Constraints。等待并再次运行此 kubectl get constraints 命令,直到您在每行的 TOTAL-VIOLATIONS 列下获取值。

    输出类似于以下内容:

    NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
    NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
    NAME                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies   deny                 0
    NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls   deny                 0
    NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled   deny                 0
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls   deny                 0
    NAME                                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicyenforcesourceprincipals.constraints.gatekeeper.sh/authz-source-principals-not-all   deny                 0
    
  7. 通过浏览器访问 Online Boutique 应用:

    echo http://${EXTERNAL_IP}
    

    您应该会收到错误 RBAC: access denied,该错误确认默认拒绝 AuthorizationPolicy 会应用于整个网格。

  8. 通过在 asm-ingressonlineboutique 命名空间中部署更精细的 AuthorizationPolicies 来解决此问题。

    以下命令使用 sed 更新 acm-config.yaml 文件,以使 Config Sync 部署关联的资源。

    sed -i "s,root-sync/fix-default-deny-authorization-policy,root-sync/deploy-authorization-policies,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    上述命令会部署以下资源:

  9. 查看 RootSync 和两个 RepoSyncs 的 Config Sync 状态:

    gcloud alpha anthos config sync repo describe
    

    输出类似于以下内容:

    getting 3 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deploy-authorization-policies@main",
        "status": "SYNCED"
      },
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/authorization-policies@main",
        "status": "SYNCED"
      },
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/authorization-policies@main",
        "status": "SYNCED"
      }
    ]
    

    如果您看到的是 status: RECONCILING 而不是 status: SYNCED,请等待几分钟,然后再次运行 gcloud alpha anthos config sync repo describe

    如需仅查看一个代码库的信息,您可以使用 --sync-name--sync-namespace 标志。此外,如需详细查看代管式资源,您可以添加 --managed-resources 标志。如需了解详情,请参阅跨多个集群查看 Config Sync 状态

  10. 再次通过浏览器访问 Online Boutique 应用:

    echo http://${EXTERNAL_IP}
    

    如果等待几分钟,您现在应该会看到网站再次按预期成功运行。

查看 Anthos 安全功能的状态

您可以在 Google Cloud 控制台中查看 Anthos 安全功能的状态,包括身份验证和授权政策。

  1. 在 Google Cloud 控制台中,前往 Anthos Security 页面。

    前往 Anthos Security

    政策摘要显示应用安全的状态,包括服务访问权限控制 (AuthorizationPolicies) 和 mTLS。

  2. 点击政策审核以查看集群和两个命名空间(asm-ingressonlineboutique)的工作负载政策状态。

    服务访问权限控制mTLS 状态卡片提供简要概览。

    服务访问权限控制和 mTLS 状态的简要概览

    工作负载列表显示每个工作负载的服务访问权限控制和 mTLS 状态。

    每个工作负载及其服务访问权限控制和 mTLS 状态的详细列表

现在,您已使用 Policy Controller 和 Config Sync 保护了集群和网格。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

    删除 Cloud 项目:

    gcloud projects delete PROJECT_ID

逐个删除资源

要逐个删除资源,请执行以下操作:

  1. 从舰队中取消注册集群:

    gcloud container fleet memberships unregister ${CLUSTER} \
        --project=${PROJECT_ID} \
        --gke-cluster=${CLUSTER_ZONE}/${CLUSTER}
    

    输出内容类似如下:

    kubeconfig entry generated for asm-acm-tutorial.
    Waiting for membership to be deleted...done.
    Deleting membership CR in the cluster...done.
    Deleting namespace [gke-connect] in the cluster...done.
    
  2. 删除集群:

    gcloud container clusters delete ${CLUSTER} \
        --zone ${CLUSTER_ZONE}
    

    在看到系统提示时按 y。此命令可能需要五分钟以上才能完成。

    输出内容类似如下:

    Deleting cluster asm-acm-tutorial...done.
    Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-east4-a/clusters/asm-acm-tutorial].
    
  3. 删除您创建的文件:

    rm -r $WORK_DIR
    

后续步骤