在 GKE 上无代理 gRPC 服务网格上设置服务安全

本页介绍了如何在 GKE 上为无代理 gRPC 服务网格设置安全功能。

前提条件

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

在无代理 gRPC 服务上设置授权政策。

本部分介绍了如何在 GKE 上的 Cloud Service Mesh 无代理 gRPC 服务上设置不同类型的授权政策

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

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

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

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

如果您的工作负载应仅进行出站调用(例如 cron 作业),您可以配置授权政策,以拒绝向该工作负载发送任何传入 HTTP 请求。以下示例会拒绝对 gRPC 服务 psm-grpc-server 的传入 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: default
    spec:
    targetRefs:
    - kind: Deployment
      name: psm-grpc-server
    httpRules:
    - to:
        operations:
        - paths:
          - type: Prefix
            value: "/"
    action: DENY
    EOF
    
  2. 应用政策:

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

用于允许请求的授权政策

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

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

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

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

    kubectl apply -f allow-authz-policy.yaml
    

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

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

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

  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: default
    spec:
    targetRefs:
    - kind: Deployment
      name: psm-grpc-server
    httpRules:
    - to:
        operations:
        - paths:
          - type: Prefix
            value: "/admin"
          methods: ["GET"]
    action: DENY
    EOF
    
  2. 应用政策:

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