授权控制

Envoy 提供强大的授权控制功能,确保只有经过授权的用户能够访问特定资源。

RBAC 过滤器

基本配置

http_filters:
- name: envoy.filters.http.rbac
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.filters.http.rbac.v3.RBAC
    stat_prefix: rbac
    rules:
      action: ALLOW
      policies:
        "service-reader":
          permissions:
          - any: true
          principals:
          - authenticated:
              principal_name:
                exact: "cluster.local/ns/default/sa/reader"
        "service-writer":
          permissions:
          - any: true
          principals:
          - authenticated:
              principal_name:
                exact: "cluster.local/ns/default/sa/writer"

基于路径的授权

- name: envoy.filters.http.rbac
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.filters.http.rbac.v3.RBAC
    stat_prefix: rbac
    rules:
      action: ALLOW
      policies:
        "api-reader":
          permissions:
          - header:
              name: ":path"
              string_match:
                prefix: "/api/read"
          principals:
          - authenticated:
              principal_name:
                exact: "cluster.local/ns/default/sa/api-reader"
        "api-writer":
          permissions:
          - header:
              name: ":path"
              string_match:
                prefix: "/api/write"
          principals:
          - authenticated:
              principal_name:
                exact: "cluster.local/ns/default/sa/api-writer"

基于角色的访问控制

角色定义

policies:
  "admin-role":
    permissions:
    - any: true
    principals:
    - authenticated:
        principal_name:
          exact: "cluster.local/ns/default/sa/admin"
  "user-role":
    permissions:
    - header:
        name: ":method"
        string_match:
          exact: "GET"
    - header:
        name: ":path"
        string_match:
          prefix: "/api/users"
    principals:
    - authenticated:
        principal_name:
          exact: "cluster.local/ns/default/sa/user"
  "guest-role":
    permissions:
    - header:
        name: ":path"
        string_match:
          prefix: "/public"
    principals:
    - any: true

条件授权

policies:
  "conditional-access":
    permissions:
    - any: true
    principals:
    - authenticated:
        principal_name:
          exact: "cluster.local/ns/default/sa/conditional"
    condition:
      call_expr:
        function: _==_
        args:
        - call_expr:
            function: _[_]
            args:
            - call_expr:
                function: _[_]
                args:
                - call_expr:
                    function: metadata
                    args:
                    - string_value: "filter_metadata"
                - string_value: "envoy.filters.http.rbac"
            - string_value: "condition_key"
        - string_value: "condition_value"

基于 IP 的访问控制

IP 白名单

policies:
  "ip-whitelist":
    permissions:
    - any: true
    principals:
    - direct_remote_ip:
        address_prefix: "192.168.1.0"
        prefix_len: 24
    - direct_remote_ip:
        address_prefix: "10.0.0.0"
        prefix_len: 8

IP 黑名单

policies:
  "ip-blacklist":
    permissions:
    - any: true
    principals:
    - not_id:
        direct_remote_ip:
          address_prefix: "192.168.1.100"
          prefix_len: 32

基于请求头的授权

自定义头部授权

policies:
  "header-based-auth":
    permissions:
    - any: true
    principals:
    - header:
        name: "x-api-key"
        string_match:
          exact: "valid-api-key"
    - header:
        name: "x-user-role"
        string_match:
          exact: "admin"

组合条件授权

policies:
  "complex-auth":
    permissions:
    - header:
        name: ":method"
        string_match:
          exact: "POST"
    - header:
        name: ":path"
        string_match:
          prefix: "/api/admin"
    principals:
    - and_ids:
        ids:
        - header:
            name: "x-api-key"
            string_match:
              exact: "admin-key"
        - header:
            name: "x-user-role"
            string_match:
              exact: "admin"
        - authenticated:
            principal_name:
              exact: "cluster.local/ns/default/sa/admin"

动态授权

基于元数据的授权

policies:
  "metadata-based":
    permissions:
    - any: true
    principals:
    - metadata:
        filter: "envoy.filters.http.rbac"
        path:
        - key: "user_role"
        value:
          string_match:
            exact: "admin"

授权统计

统计指标

RBAC 过滤器提供丰富的统计指标:

  • rbac.allowed:允许的请求数
  • rbac.denied:拒绝的请求数
  • rbac.shadow_allowed:影子模式允许的请求数
  • rbac.shadow_denied:影子模式拒绝的请求数

自定义统计

- name: envoy.filters.http.rbac
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.filters.http.rbac.v3.RBAC
    stat_prefix: custom_rbac
    rules:
      action: ALLOW
      policies:
        "custom-policy":
          permissions:
          - any: true
          principals:
          - authenticated:
              principal_name:
                exact: "cluster.local/ns/default/sa/custom"

最佳实践

1. 安全设计

  • 使用最小权限原则
  • 定期审查访问权限
  • 实施多层授权
  • 监控授权失败

2. 性能优化

  • 合理使用条件表达式
  • 避免复杂的授权规则
  • 使用缓存提高性能
  • 监控授权性能

3. 监控和调试

  • 启用授权日志
  • 监控授权统计
  • 设置授权告警
  • 定期审查策略

注意事项

  • 复杂的授权规则可能影响性能
  • 需要确保授权策略的一致性
  • 配置变更需要谨慎测试
  • 需要定期更新授权策略

授权控制是 Envoy 安全架构的重要组成部分,合理配置可以确保系统的安全性。

文章导航

章节完成

恭喜完成本章节!下一章节即将开始。下一章节:可观测性与日志

章节概览