本页介绍了如何在 Ambient Networking 上创建授权政策。
前提条件
在完成本文档中的步骤之前,您必须满足以下条件:
- 一个正在运行且已启用 Cloud Service Mesh Ambient Networking 的 GKE 集群。
- 已加入 Ambient Networking 的命名空间(例如
ambient-test),其中部署了示例客户端和服务器工作负载。 - 通过使用
GCPServerTLSPolicy(含mtlsMode: Strict)和GCPClientTLSPolicy,在客户端和服务器工作负载之间启用双向 TLS (mTLS)。与CLIENT_CERT_URI_SAN匹配的基于身份的GCPAuthzPolicy规则需要有效的 mTLS 才能提取客户端的 SPIFFE 身份。
如需了解详细的环境设置,请参阅准备 GKE Ambient Networking。
默认拒绝政策
默认情况下,GKE Ambient Authorization Policy API 允许所有流量,除非受到政策限制,这与标准 Kubernetes NetworkPolicy 行为一致。
借助 DENY_BY_DEFAULT 操作,您可以更改此默认行为。当应用于命名空间时,此政策会阻止该命名空间中工作负载的所有流量,除非 ALLOW 政策明确允许。
本页介绍了如何在 Cloud Service Mesh 中配置和使用 DENY_BY_DEFAULT,以便为工作负载建立默认安全态势。
限制
在应用 DENY_BY_DEFAULT 政策之前,请注意以下限制:
- 每个命名空间只能创建一项
DENY_BY_DEFAULT政策。 - 包含
DENY_BY_DEFAULT操作的政策不能定义任何规则。 - 使用此操作可设置命名空间范围的基准
matchLabels: {},以定位到所有 Pod。您无法使用DENY_BY_DEFAULT来设置每个 Pod 的限制。
设置默认拒绝授权政策
如需在命名空间中建立默认拒绝基准,并选择性地允许访问特定工作负载,请按以下步骤操作:
创建并应用一个
GCPAuthzPolicy,并将操作设置为DENY_BY_DEFAULT。cat <<EOF > deny-by-default-policy.yaml && kubectl apply -f deny-by-default-policy.yaml apiVersion: networking.gke.io/v1 kind: GCPAuthzPolicy metadata: name: deny-by-default-authz namespace: ambient-test spec: action: DENY_BY_DEFAULT enforcementLevel: L4 targetRefs: - group: "" kind: Pod selector: matchLabels: {} EOF输出类似于以下内容:
gcpauthzpolicy.networking.gke.io/deny-by-default-authz created此政策默认会阻止
ambient-test命名空间中工作负载的所有入站流量(东西向流量和入站流量)。它不会限制命名空间中工作负载的出站流量。如需选择性地允许流量,请创建并应用
ALLOW政策:cat <<EOF > allow-policy.yaml && kubectl apply -f allow-policy.yaml apiVersion: networking.gke.io/v1 kind: GCPAuthzPolicy metadata: name: allow-client-to-server namespace: ambient-test spec: action: ALLOW enforcementLevel: L4 targetRefs: - group: "" kind: Pod selector: matchLabels: app: server rules: - from: sources: - principals: - principalSelector: CLIENT_CERT_URI_SAN principal: type: Exact value: spiffe://PROJECT_ID.s3ns.svc.id.goog/ns/ambient-test/sa/client EOF将 PROJECT_ID 替换为您的项目 ID。
在控制器接受后,政策传播最多可能需要三分钟。等待 3 分钟,然后再继续操作。
测试从客户端到服务器的连接。它应该会成功,因为它与
ALLOW政策匹配。kubectl exec -it deploy/client -n ambient-test -- /bin/curl -fsLS server.ambient-test.svc.cluster.local测试从服务器到自身(或任何其他没有明确允许政策的工作负载)的连接。它应该会因
DENY_BY_DEFAULT政策而失败。kubectl exec -it deploy/server -n ambient-test -- /bin/curl -fsLS server.ambient-test.svc.cluster.local输出类似于以下内容:
curl: (52) Empty reply from server.
日志记录
当请求被授权政策拒绝时,节点代理会在 gke-ambient-node-proxy-accesslog 日志名称下向 Cloud Logging 写入访问日志条目。相应条目包含 JSON 载荷中的以下字段:
jsonPayload.error_details:- rbac_access_denied_matched_policy[none]
您可以使用 Cloud de Confiance 控制台中的 Logs Explorer 查看被拒连接的访问日志条目:
resource.type="k8s_container"
logName="projects/PROJECT_ID/logs/gke-ambient-node-proxy-accesslog"
jsonPayload.error_details=~"rbac_access_denied"
如需了解详情,请参阅验证流量是否经过身份验证和授权。
出站流量安全政策
如需检查和控制从 Ambient Networking 工作负载到外部端点或互联网的出站流量,您可以通过 Secure Web Proxy (SWP) 路由出站流量。
如需了解如何配置 GCPBackend 和 GCPEgressPolicy 资源,请参阅通过 Secure Web Proxy 路由环境出站流量。