基于角色的访问控制 (RBAC) - HTTP

RBAC 用于检查传入请求是否已授权。

Envoy 支持 RBAC 的两种类型

此沙盒提供了一个 HTTP 请求 RBAC 的示例。

在示例中,仅当请求的 Referer 标头与正则表达式模式 https?://(www.)?envoyproxy.io/docs/envoy.* 匹配时才允许请求。

步骤 1:启动所有容器

更改到 examples/rbac 目录并启动 docker 组成。

$ pwd
envoy/examples/rbac
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps

Name             Command                          State   Ports
------------------------------------------------------------------------------------------------------------
rbac_backend_1   gunicorn -b 0.0.0.0:80 htt ...   Up      0.0.0.0:8080->80/tcp
rbac_envoy_1     /docker-entrypoint.sh /usr ...   Up      0.0.0.0:10000->10000/tcp, 0.0.0.0:10001->10001/tcp

步骤 2:使用 RBAC 拒绝上游服务

沙盒被配置为将端口 10000 代理到上游服务。

由于请求没有所需的标头,因此被拒绝,Envoy 拒绝连接,返回 HTTP 403 代码,内容为 RBAC: access denied

现在,使用 curl 向上游服务发出请求。

$ curl -si localhost:10000
HTTP/1.1 403 Forbidden
content-length: 19
content-type: text/plain
date: Thu, 28 Jul 2022 06:48:43 GMT
server: envoy

RBAC: access denied

步骤 3:使用 RBAC 授权上游服务

现在,我们可以使用设置了正确标头的另一个请求。

$ curl -si -H "Referer: https://envoy.k8s.ac.cn/docs/envoy" localhost:10000 | grep 200
HTTP/1.1 200 OK

步骤 4:通过管理员检查统计信息

沙盒使用 10001 端口配置了 Envoy 管理员。

检查管理员界面,我们现在应该看到 RBAC 统计信息已更新,一个请求被拒绝,另一个请求被允许

$ curl -s "https://127.0.0.1:10001/stats?filter=rbac"
http.ingress_http.rbac.allowed: 1
http.ingress_http.rbac.denied: 1
http.ingress_http.rbac.shadow_allowed: 0
http.ingress_http.rbac.shadow_denied: 0

另请参阅

基于角色的访问控制

了解有关使用 Envoy 的 RBAC 过滤器的更多信息。

RBAC 网络过滤器 API

Envoy 的 RBAC 网络过滤器的 API 和配置参考。

RBAC HTTP 过滤器 API

Envoy 的 RBAC HTTP 过滤器的 API 和配置参考。

Envoy 管理员快速入门指南

Envoy 管理员界面的快速入门指南。