赞
踩
外部授权过滤器调用授权服务检查收到的请求是否被授权。授权过滤器可以是网络过滤器也可以是HTTP过滤器。如果网络过滤器判定请求未授权,则会关闭链接;如果HTTP过滤器判定请求未授权,则会返回403状态码。
外部授权过滤器最好放在过滤器链的最前面,在其他过滤器处理请求前先鉴权。
如果外部服务不可访问,那么将通过可用过滤器中的failure_mode_allow配置项来决定请求是否被授权。如果该项设置为true,那么请求会被允许。默认值是false。
流量上下文通过下面列出的服务传递给外部授权服务。发给授权服务器的请求内容通过CheckRequest定义。
attribute是描述网络中活动的元数据。比如HTTP请求的大小,响应的状态码。
每个属性都有一个类型和名称,在逻辑上定义为属性上下文的原始信息(proto message)字段。属性上下文是一组独立属性,这些独立属性由Envoy授权系统支持。
{
"source": "{...}",
"destination": "{...}",
"request": "{...}",
"context_extensions": "{...}",
"metadata_context": "{...}"
}
Peer中的信息描述了处理网络请求的节点的属性。节点可以是发送、转发或接收请求的服务或应用程序。服务peer应根据需要填写服务、主体和标签。
{
"address": "{...}",
"service": "...",
"labels": "{...}",
"principal": "...",
"certificate": "..."
}
代表网络请求,比如http请求。
{
"time": "{...}",
"http": "{...}"
}
描述http请求的属性。HTTP/1.x,HTTP/2,gRPC 都视为HTTP请求。
{
"id": "...",
"method": "...",
"headers": "{...}",
"path": "...",
"host": "...",
"scheme": "...",
"query": "...",
"fragment": "...",
"size": "...",
"protocol": "...",
"body": "...",
"raw_body": "..."
}
外部授权网络过滤器和HTTP过滤器会使用授权服务请求信息。
{
"attributes": "{...}"
}
拒绝请求时的HTTP响应属性。
{
"status": "{...}",
"headers": [],
"body": "..."
}
允许请求时的HTTP响应属性。
{
"headers": [],
"headers_to_remove": [],
"dynamic_metadata": "{...}",
"response_headers_to_add": []
}
x-envoy-auth-headers-to-remove: one-auth-header, another-auth-header
。仅用于gRPC和网络授权服务。
{
"status": "{...}",
"denied_response": "{...}",
"ok_response": "{...}",
"dynamic_metadata": "{...}"
}
gRPC授权服务过滤器配置示例:
http_filters:
- name: envoy.filters.http.ext_authz
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
grpc_service:
envoy_grpc:
cluster_name: ext-authz
# Default is 200ms; override if your server needs e.g. warmup time.
timeout: 0.5s
include_peer_certificate: true
clusters: - name: ext-authz type: static typed_extension_protocol_options: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions explicit_http_config: http2_protocol_options: {} load_assignment: cluster_name: ext-authz endpoints: - lb_endpoints: - endpoint: address: socket_address: address: 127.0.0.1 port_value: 10003 # This timeout controls the initial TCP handshake timeout - not the timeout for the # entire request. connect_timeout: 0.25s
此过滤器的一个功能是将HTTP请求正文作为检查请求的一部分发送到已配置的gRPC授权服务器。
下面是一个实例配置:http_filters: - name: envoy.filters.http.ext_authz typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz grpc_service: envoy_grpc: cluster_name: ext-authz with_request_body: max_request_bytes: 1024 allow_partial_message: true pack_as_bytes: true
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
请注意,默认情况下,check request将HTTP请求体作为UTF-8字符串携带,并填充body字段。要将请求体打包为字节,需要将pack_as_bytes字段设置为true。实际上,raw_body字段将被设置,body字段将为空。
HTTP授权服务过滤器配置示例:
http_filters:
- name: envoy.filters.http.ext_authz
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
http_service:
server_uri:
uri: 127.0.0.1:10003
cluster: ext-authz
timeout: 0.25s
failure_mode_allow: false
include_peer_certificate: true
clusters:
- name: ext-authz
connect_timeout: 0.25s
type: logical_dns
lb_policy: round_robin
load_assignment:
cluster_name: ext-authz
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 10003
虚拟主机和路由筛选器配置示例。在本例中,我们在虚拟主机上添加了其他上下文,并禁用了/static前缀路由的筛选器。
route_config: name: local_route virtual_hosts: - name: local_service domains: ["*"] typed_per_filter_config: envoy.filters.http.ext_authz: "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute check_settings: context_extensions: virtual_host: local_service routes: - match: { prefix: "/static" } route: { cluster: some_service } typed_per_filter_config: envoy.filters.http.ext_authz: "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute disabled: true - match: { prefix: "/" } route: { cluster: some_service }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。