在 GKE 上的 Envoy Sidecar 服务网格上设置服务安全

本页介绍了如何在 GKE 上的 Envoy Sidecar 服务网格上设置安全功能。

前提条件

首先,本指南假定您已完成以下操作:

在 GKE 上的边车上设置授权政策

本部分介绍如何在 GKE 上的 Cloud Service Mesh 边车上设置不同类型的授权政策

您必须先安装 GCPAuthzPolicy CustomResourceDefinition (CRD),然后才能创建授权政策:

curl https://github.com/GoogleCloudPlatform/gke-networking-recipes/blob/main/gateway-api/config/mesh/crd/experimental/gcpauthzpolicy.yaml \
| kubectl apply -f -

授权政策可对进入 Envoy 边车的流量强制执行访问权限控制。您可以对 Kubernetes 部署应用政策。部署应与授权政策位于同一命名空间中。

用于拒绝所有请求的授权政策

如果您的工作负载应仅进行出站调用(例如 cron 作业),您可以配置授权政策,以拒绝向该工作负载发送任何传入 HTTP 请求。以下示例会拒绝向工作负载 whereami 发送传入 HTTP 请求。

请按以下步骤创建并应用拒绝授权政策:

  1. 通过创建名为 deny-all-authz-policy.yaml 的文件创建拒绝政策:

    cat >deny-all-authz-policy.yaml <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: myworkload-authz
      namespace: sidecar-example
    spec:
    targetRefs:
    - kind: Deployment
      name: wherami
    httpRules:
    - to:
        operations:
        - paths:
          - type: Prefix
            value: "/"
    action: DENY
    EOF
    
  2. 应用政策:

    kubectl apply -f deny-all-authz-policy.yaml
    

用于允许请求的授权政策

您还可以配置允许政策,仅允许与特定条件匹配的请求,同时拒绝其余请求。以下示例在 whereami 上配置了授权政策,其中仅允许请求中包含 http 标头 x-user-role:adminGET 请求。

请按以下步骤创建并应用允许授权政策,删除之前创建的拒绝政策,然后再添加此政策以查看结果:

  1. 通过创建名为 allow-authz-policy.yaml 的文件创建自定义政策:

    cat >allow-authz-policy.yaml <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: myworkload-authz
      namespace: sidecar-example
    spec:
    targetRefs:
    - kind: Deployment
      name: whereami
    httpRules:
    - to:
        operations:
        - methods: ["GET"]
      when: "request.headers['x-user-role'] == 'admin'
    action: ALLOW
    EOF
    
  2. 应用政策:

    kubectl apply -f allow-authz-policy.yaml
    

用于根据规则拒绝请求的授权政策

以下示例会在工作负载 whereami 位于路径 /admin 时,拒绝对其发出的传入 HTTP GET 请求。

请按以下步骤创建并应用拒绝授权政策:

  1. 通过创建名为 deny-path-authz-policy.yaml 的文件创建拒绝政策:

    cat >deny-path-authz-policy.yaml <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: myworkload-authz
      namespace: sidecar-example
    spec:
    targetRefs:
    - kind: Deployment
      name: whereami
    httpRules:
    - to:
        operations:
        - paths:
          - type: Prefix
            value: "/admin"
          methods: ["GET"]
    action: DENY
    EOF
    
  2. 应用政策:

    kubectl apply -f deny-path-authz-policy.yaml