基于角色的权限访问控制¶
基于角色的权限访问控制(RBAC)过滤器会检查传入请求是否是经过授权的。区别于外部授权的是,RBAC 过滤器的检查是发生在 Envoy 流程中的,是基于一系列来自于过滤器配置的策略。
RBAC 过滤器可以被配置成 网络过滤器,或者 HTTP 过滤器 或者同时配置成两者。如果请求被网络过滤器视为是未授权的,则连接将被关闭。如果请求被 HTTP 过滤器视为是未经授权的,则请求会被拒绝并返回 403(禁止)响应。
策略¶
RBAC 过滤器会基于一系列的 策略 来检查请求。一个策略包含一系列的 权限 和 主体。权限说明了请求所做的动作,比如,HTTP 请求的方法和路径。主体则说明了下游客户端是如何识别请求的,比如,下游客户端证书的 URI SAN。如果策略的权限和主体同时被匹配,则说明这个策略被完全匹配。
条件¶
除了预定义的权限和主体外,策略或许会选择性的提供写在 通用表达语言 中的授权条件。这些条件说明了一些要匹配策略所必须要满足的一些条款。比如,如下的条件会检查请求的路径是否是以 /v1/ 开始的:
call_expr:
function: startsWith
args:
- select_expr:
operand:
ident_expr:
name: request
field: path
- const_expr:
string_value: /v1/
以下是语言运行时的一些属性:
属性 |
类型 |
描述 |
---|---|---|
request.path |
string |
URL 的路径部分 |
request.url_path |
string |
URL 的路径部分但没有查询字符 |
request.host |
string |
URL 的主机部分 |
request.scheme |
string |
URL 的 schema 部分 |
request.method |
string |
请求方法 |
request.headers |
string map |
所有的请求头 |
request.referer |
string |
引用请求头 |
request.useragent |
string |
用户代理请求头 |
request.time |
timestamp |
接受第一个字节的时间 |
request.duration |
duration |
请求的持续时间 |
request.id |
string |
请求 ID |
request.size |
int |
请求征文的大小 |
request.total_size |
int |
包含头的请求 |
request.protocol |
string |
请求协议,比如 “HTTP/2” |
response.code |
int |
HTTP 响应状态码 |
response.code_details |
string |
内部响应码详情(可更改) |
response.grpc_status |
int |
gRPC 响应状态码 |
response.headers |
string map |
所有响应头部 |
response.trailers |
string map |
所有响应尾部 |
response.size |
int |
响应正文大小 |
response.total_size |
int |
响应的总大小,包括头部和尾部的近似压缩大小 |
response.flags |
int |
除了标准响应码之外关于响应的额外信息 |
source.address |
string |
下游连接远端地址 |
source.port |
int |
下游连接远端端口 |
destination.address |
string |
下游连接本地地址 |
destination.port |
int |
下游连接的本地端口 |
metadata |
动态元数据 |
|
filter_state |
map string to bytes |
过滤器状态将数据名称映射到他们序列化的字符串值中 |
connection.mtls |
bool |
用来指示 TLS 是否被应用与下游连接和并显示对等证书 |
connection.requested_server_name |
string |
下游 TLS 连接中请求的服务器名称 |
connection.tls_version |
string |
下游 TLS 连接的 TLS 版本 |
connection.subject_local_certificate |
string |
下游 TLS 连接中本地证书中的主题字段 |
connection.subject_peer_certificate |
string |
下游 TLS 连接中对端证书中的主题字段 |
connection.dns_san_local_certificate |
string |
下游 TLS 连接中本地证书 SAN 字段中的第一个 DNS 入口 |
connection.dns_san_peer_certificate |
string |
下游 TLS 连接中对端证书 SAN 字段中的第一个 URI 入口 |
connection.uri_san_local_certificate |
string |
下游 TLS 连接中本地证书 SAN 字段中的第一个 URI 入口 |
connection.uri_san_peer_certificate |
string |
下游 TLS 连接中对端证书 SAN 字段中的第一个 URI 入口 |
connection.id |
uint |
下游连接 ID |
upstream.address |
string |
上游连接远端地址 |
upstream.port |
int |
上游连接远端端口 |
upstream.tls_version |
string |
上游 TLS 连接的 TLS 版本 |
upstream.subject_local_certificate |
string |
上游 TLS 连接中本地证书的主题字段 |
upstream.subject_peer_certificate |
string |
上游 TLS 连接中对端证书的主题字段 |
upstream.dns_san_local_certificate |
string |
上游 TLS 连接中本地证书 SAN 字段中的第一个 DNS 入口 |
upstream.dns_san_peer_certificate |
string |
上游 TLS 连接中对端证书 SAN 字段中的第一个 DNS 入口 |
upstream.uri_san_local_certificate |
string |
上游 TLS 连接中本地证书 SAN 字段中的第一个 URI 入口 |
upstream.uri_san_peer_certificate |
string |
上游 TLS 连接中对端证书 SAN 字段中的第一个 URI 入口 |
upstream.local_address |
string |
上游连接的本地地址 |
upstream.transport_failure_reason |
string |
上游传输失败原因,比如,证书验证失败 |
大部分属性都是可选项且提供基于属性类型的默认值。CEL 支持使用 has() 语法检查属性的存在,比如 has(request.referer)。