配置授权政策高级功能

Cloud Service Mesh 授权政策可为网格中的工作负载提供网格、命名空间和工作负载级别的访问权限控制。本页详细介绍如何配置 Cloud Service Mesh 授权政策高级功能,包括试运行模式和拒绝日志记录。本页面中介绍的功能假定您已熟悉授权政策概览中所述的基本授权政策概念。

试运行模式

Cloud Service Mesh 授权政策支持试运行模式,可让您使用真实生产流量测试授权政策,而无需强制执行。 通过试运行模式,您可以在强制执行授权政策之前,更好地了解其效果。这有助于降低因授权政策错误而导致生产流量中断的风险。

您可以在授权政策中使用 "istio.io/dry-run": "true" 注解将其更改为试运行模式。

试运行模式示例

以下示例 deny-path-headers 显示将 dry-run 注解设置为 "true 的政策。授权政策拒绝对路径 headers 的请求,并允许所有其他请求。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-path-headers
  annotations:
    "istio.io/dry-run": "true"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

当您在试运行模式下应用授权政策时,Cloud Service Mesh 会将强制执行结果记录到 Cloud Logging 中,但不会强制执行政策。系统始终允许请求,您可以查看日志浏览器以确定授权政策是否按预期工作。

试运行日志记录详情

通过试运行模式应用一项授权政策后,您可以在日志浏览器中查看该政策的结果。

  1. 转到日志浏览器。在以下网址中,请将 PROJECT_ID 替换为您的项目 ID:

    https://console.cloud.google.com/logs/query?project=PROJECT_ID
    
  2. 查询构建器字段中,输入查询,以查找试运行模式授权政策。在以下查询中,请将 NAMESPACE 替换为您的命名空间:

    logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver" labels.destination_namespace="NAMESPACE" labels.dry_run_result="AuthzDenied"
    
  3. 点击运行查询

  4. 根据需要调整时间范围。

以下屏幕截图显示了应用示例 deny-path-headers 政策之后,日志浏览器内的流量日志中的试运行标签:

图片

除了 Istio 试运行结果之外,试运行模式还支持 ALLOWDENY 授权政策。Cloud Service Mesh 会将试运行结果存储在 Cloud Logging 内的如下标签中:

  • dry_run_result:试运行结果为“AuthzAllowed”或“AuthzDenied”。
  • dry_run_policy_name:做出试运行决策的匹配授权政策的命名空间和名称。
  • dry_run_policy_rule:做出试运行决策的匹配授权政策规则的索引。

下表显示了日志中为试运行模式下的授权政策记录的详细信息:

在试运行模式下应用的授权政策 匹配结果 试运行结果 Cloud Logging
仅有 DENY 政策 不匹配 已允许 dry_run_result:“AuthzAllowed”
匹配 已拒绝 dry_run_result:“AuthzDenied”
dry_run_policy_name
dry_run_policy_rule
仅有 ALLOW 政策 不匹配 已拒绝 dry_run_result:“AuthzDenied”
匹配 已允许 dry_run_result:“AuthzAllowed”
dry_run_policy_name
dry_run_policy_rule
ALLOWDENY 政策 均不匹配 已拒绝 dry_run_result:“AuthzDenied”
仅匹配 DENY 政策 已拒绝 dry_run_result:“AuthzDenied”
dry_run_policy_name
dry_run_policy_rule
仅匹配 ALLOW 政策 已允许 dry_run_result:“AuthzAllowed”
dry_run_policy_name
dry_run_policy_rule
两个政策均匹配 已拒绝 dry_run_result:“AuthzDenied”
dry_run_policy_name
dry_run_policy_rule

如果您确定试运行结果无问题,则可以使用以下方法之一停用试运行模式:

  • 完全移除试运行注解;或者

  • 将试运行注解的值更改为 false

应用停用了试运行模式的政策后,Cloud Service Mesh 会强制执行该政策。

拒绝日志记录

如果政策不允许,则授权政策会拒绝请求。对于 HTTP(包括 gRPC)协议,请求将被拒绝并显示状态代码 403。对于非 HTTP 协议,连接将直接终止。Cloud Logging 流量日志包含额外的信息,有助于理解流量被拒绝的原因。例如,日志会指示授权政策所拒绝的请求数,这有助于您确定哪个政策规则导致了后端应用出现拒绝事件。

在以下示例中,dry-run 注解被设置为 "false。当您应用 DENY 授权政策时,Cloud Service Mesh 会强制执行它。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-path-headers
  annotations:
    "istio.io/dry-run": "false"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

应用 DENY 授权政策后,您可以在日志浏览器中查看该政策的结果。

  1. 转到日志浏览器。在以下网址中,请将 PROJECT_ID 替换为您的项目 ID:

    https://console.cloud.google.com/logs/query?project=PROJECT_ID
    
  2. 查询构建器字段中,输入查询以查找 DENY 授权政策。在以下查询中,请将 NAMESPACE 替换为您的命名空间:

    logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver" labels.destination_namespace="NAMESPACE" labels.response_details="AuthzDenied"
    
  3. 点击运行查询

  4. 根据需要调整时间范围。

以下屏幕截图显示了在应用示例 deny-path-headers 政策以强制执行政策后,日志浏览器中的一个日志条目。您可以通过查看标签来判断授权政策是否为 403 错误负责:

图片

日志浏览器流量日志包括以下拒绝授权的标签:

  • response_details:如果拒绝是由授权政策导致的,则将设置为“AuthzDenied”。
  • policy_name:包含导致拒绝的授权 DENY 政策的命名空间和名称。该值的格式为 <Namespace>.<Name>,例如 foo.deny-path-headers 表示 foo 命名空间中的授权政策 deny-path-headers
  • policy_rule:包含导致拒绝的授权政策内规则的索引,例如 0 表示该政策内的第一条规则。

后续步骤

如需获取服务网格中所有授权政策的列表,请运行以下命令:

kubectl get authorizationpolicy --all-namespaces

如果存在授权政策,则可以使用 kubectl delete 将其删除:

kubectl delete authorizationpolicy -n NAMESPACE AUTH_POLICY_NAME

如需详细了解如何获取流量日志,请参阅访问日志