使用 RBAC 网络过滤器阻止 Envoy 代理中的入口或出口 to/from 服务
Using RBAC Network Filter to block ingress or egress to/from service in Envoy Proxy
我想尝试在 Envoy 代理中配置一个过滤器,以根据某些 IP、主机名、路由 table 等来阻止服务的入口和出口。
我已经搜索了文档,发现它是可行的。但是没有得到任何关于它的用法的例子。
有人可以指出一些如何完成的例子吗?
此页面上有一个配置示例:
https://www.envoyproxy.io/docs/envoy/latest/api-v2/config/rbac/v2alpha/rbac.proto
- 但这是针对服务帐户的,就像在 Kubernetes 中一样。
最接近我想要的,我可以在这个页面看到这里:
https://www.envoyproxy.io/docs/envoy/latest/configuration/network_filters/rbac_filter#statistics
- 提到,"The filter supports configuration with either a safe-list (ALLOW) or block-list (DENY) set of policies based on properties of the connection (IPs, ports, SSL subject)."
- 但它没有说明如何操作。
我想到了这样的事情:
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
但我无法应用此网络过滤器。所有配置都给我配置错误。
我会推荐 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*")
有关流量管理和拒绝以及White/Black列表的更多信息,请参见Istio文档。
我也可以推荐你这个 istio-workshop published by szihai.
这是特使团队在他们的 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
我想尝试在 Envoy 代理中配置一个过滤器,以根据某些 IP、主机名、路由 table 等来阻止服务的入口和出口。
我已经搜索了文档,发现它是可行的。但是没有得到任何关于它的用法的例子。
有人可以指出一些如何完成的例子吗?
此页面上有一个配置示例: https://www.envoyproxy.io/docs/envoy/latest/api-v2/config/rbac/v2alpha/rbac.proto
- 但这是针对服务帐户的,就像在 Kubernetes 中一样。
最接近我想要的,我可以在这个页面看到这里: https://www.envoyproxy.io/docs/envoy/latest/configuration/network_filters/rbac_filter#statistics
- 提到,"The filter supports configuration with either a safe-list (ALLOW) or block-list (DENY) set of policies based on properties of the connection (IPs, ports, SSL subject)."
- 但它没有说明如何操作。
我想到了这样的事情:
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
但我无法应用此网络过滤器。所有配置都给我配置错误。
我会推荐 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*")
有关流量管理和拒绝以及White/Black列表的更多信息,请参见Istio文档。 我也可以推荐你这个 istio-workshop published by szihai.
这是特使团队在他们的 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