基于角色的权限访问控制

基于角色的权限访问控制(RBAC)过滤器会检查传入请求是否是经过授权的。区别于外部授权的是,RBAC 过滤器的检查是发生在 Envoy 流程中的,是基于一系列来自于过滤器配置的策略。

RBAC 过滤器可以被配置成 网络过滤器,或者 HTTP 过滤器 或者同时配置成两者。如果请求被网络过滤器视为是未授权的,则连接将被关闭。如果请求被 HTTP 过滤器视为是未经授权的,则请求会被拒绝并返回 403(禁止)响应。

策略

RBAC 过滤器会基于一系列的 策略 来检查请求。一个策略包含一系列的 权限主体。权限说明了请求所做的动作,比如,HTTP 请求的方法和路径。主体则说明了下游客户端是如何识别请求的,比如,下游客户端证书的 URI SAN。如果策略的权限和主体同时被匹配,则说明这个策略被完全匹配。

影子(Shadow)策略

过滤器可以配置一个 影子策略,此策略除了会发出统计信息并记录结果外,没有任何其他作用。这种方式对于将规则应用在生产之前进行测试时是非常有用的。

条件

除了预定义的权限和主体外,策略或许会选择性的提供写在 通用表达语言 中的授权条件。这些条件说明了一些要匹配策略所必须要满足的一些条款。比如,如下的条件会检查请求的路径是否是以 /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

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)