【问题标题】:Using RBAC Network Filter to block ingress or egress to/from service in Envoy Proxy使用 RBAC 网络过滤器阻止 Envoy 代理中服务的入口或出口
【发布时间】:2018-10-09 02:44:04
【问题描述】:

我想尝试在 Envoy 代理中配置一个过滤器,以根据某些 IP、主机名、路由表等来阻止服务的入口和出口。

我已经搜索了文档并认为这是可能的。但没有得到任何例子,它的用法。

有人能举出一些例子吗?

我想出了这样的事情:

network_filters:
   - name: service-access
     config: 
        rules: 
           action: ALLOW
           policies:
             "service-access":
                 principals:
                    source_ip: 192.168.135.211
                 permissions:
                    - destination_ip: 0.0.0.0
                    - destination_port: 443

但我无法应用此网络过滤器。所有配置都给我配置错误。

【问题讨论】:

    标签: kubernetes envoyproxy


    【解决方案1】:

    我会推荐Istio。您可以设置一个Rule,它将拒绝所有不是来自192.168.0.1 IP 的流量。

    apiVersion: "config.istio.io/v1alpha2"
    kind: denier
    metadata:
      name: denyreviewsv3handler
    spec:
      status:
        code: 7
        message: Not allowed
    ---
    apiVersion: "config.istio.io/v1alpha2"
    kind: checknothing
    metadata:
      name: denyreviewsv3request
    spec:
    ---
    apiVersion: "config.istio.io/v1alpha2"
    kind: rule
    metadata:
      name: denyreviewsv3
    spec:
      match: source.ip != ip("192.168.0.1")
      actions:
      - handler: denyreviewsv3handler.denier
        instances: [ denyreviewsv3request.checknothing ]
    

    您可以匹配Attribute Vocabulary中指定的其他属性,例如阻止curl命令match: match(request.headers["user-agent"], "curl*")

    更多关于Traffic ManagementDenials and White/Black Listing 的信息可以在Istio 文档中找到。 我也可以向你推荐这个由szihai 发布的istio-workshop

    【讨论】:

    • 是的,Istio 是最可能的解决方案,但我们的 kubernetes 集群管理员不允许安装 Istio 或任何其他服务网格,例如 Ambassador、Linkerd 或类似工具。
    • 也许不使用特使,使用 kubernetes 网络策略就足够了? kubernetes.io/docs/concepts/services-networking/…
    【解决方案2】:

    这是 envoy 团队在他们的 guthub 问题中给我的完整 rbac 过滤器配置。不过还没有测试过。

    static_resources:
          listeners:
          - name: "ingress listener"
            address:
              socket_address:
                address: 0.0.0.0
                port_value: 9001
            filter_chains:
              filters:
              - name: envoy.http_connection_manager
                config:
                  codec_type: auto
                  stat_prefix: ingress_http
                  route_config:
                    name: local_route
                    virtual_hosts:
                    - name: local_service
                      domains:
                      - "*"
                      routes:
                      - match:
                          prefix: "/"  
                        route:
                          cluster: local_service
                        per_filter_config:
                          envoy.filters.http.rbac:
                            rbac:
                              rules:
                                action: ALLOW
                                policies:
                                  "per-route-rule":
                                    permissions:
                                    - any: true
                                    principals:
                                    - any: true
                  http_filters:
                  - name: envoy.filters.http.rbac 
                    config: 
                      rules: 
                        action: ALLOW
                        policies:
                          "general-rules":
                            permissions:
                            - any: true
                            principals:
                            - any: true
                  - name: envoy.router
                    config: {}
                  access_log:
                    name: envoy.file_access_log
                    config: {path: /dev/stdout}
    
          clusters:
          - name: local_service
            connect_timeout: 0.250s
            type: static
            lb_policy: round_robin
            http2_protocol_options: {}
            hosts:
            - socket_address:
                address: 127.0.0.1
                port_value: 9000
    
        admin:
          access_log_path: "/dev/null"
          address:
            socket_address:
              address: 0.0.0.0
              port_value: 8080
    

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2015-04-01
      • 2023-03-15
      • 1970-01-01
      • 2011-05-06
      相关资源
      最近更新 更多