服务网格ASM集成了开放策略代理(OPA)插件,通过OPA定义访问控制策略,可以使您的应用实现细粒度的访问控制。
背景信息
作为由
CNCF托管的一个孵化项目,
开放策略代理(OPA)是一个策略引擎,可用于为您的应用程序实现细粒度的访问控制。OPA作为通用策略引擎,可以与微服务一起部署为独立服务。为了保护应用程序,必须先授权对微服务的每个请求,然后才能对其进行处理。为了检查授权,微服务对OPA进行API调用,以确定请求是否被授权。

步骤一:启用OPA插件
- 登录ASM控制台。
- 在左侧导航栏,选择。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在基本信息页面单击右上角的功能设置。
- 在功能设置更新页面中选中启用OPA插件。
- 单击确定。
在基本信息页面可以看到OPA插件的状态变为开启。
步骤二:部署OPA配置项
部署业务Pod之前,需要部署OPA配置文件和OPA策略的配置项Configmap。
- 通过kubectl连接到ASM实例中新添加的ACK集群,执行以下命令,部署OPA配置文件。
kubectl apply -n {替换成实际的namespace} -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: opa-istio-config
data:
config.yaml: |
plugins:
envoy_ext_authz_grpc:
addr: :9191
path: istio/authz/allow
EOF
- 通过kubectl连接到ASM实例中新添加的ACK集群,执行以下命令,部署OPA策略。
kubectl apply -n {替换成实际的namespace} -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: opa-policy
data:
policy.rego: | ###以下为示例策略定义,需要替换成实际的策略定义。
package istio.authz
import input.attributes.request.http as http_request
default allow = false
allow {
roles_for_user[r]
required_roles[r]
}
roles_for_user[r] {
r := user_roles[user_name][_]
}
required_roles[r] {
perm := role_perms[r][_]
perm.method = http_request.method
perm.path = http_request.path
}
user_name = parsed {
[_, encoded] := split(http_request.headers.authorization, " ")
[parsed, _] := split(base64url.decode(encoded), ":")
}
user_roles = {
"guest1": ["guest"],
"admin1": ["admin"]
}
role_perms = {
"guest": [
{"method": "GET", "path": "/productpage"},
],
"admin": [
{"method": "GET", "path": "/productpage"},
{"method": "GET", "path": "/api/v1/products"},
],
}
EOF
- user_roles:为用户授予角色权限。本例设置guest1拥有guest角色权限,admin1拥有admin角色权限。
- role_perms:设置角色拥有的权限。本文设置guest角色可以通过/productpage访问应用,admin角色可以通过/productpage和/api/v1/products访问应用。
步骤三:注入OPA代理
部署示例应用Bookinfo到ASM实例,确认每个POD都注入了OPA代理。
- 部署示例应用Bookinfo到ASM实例,请参见部署应用到ASM实例。
- 定义相应的Istio虚拟服务和入口网关,请参见定义Istio资源。
- 检查每个应用是否都注入OPA代理。
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择。
- 在容器组页面,从命名空间下拉列表中选择default,单击目标应用容器组的名称。
在
容器页签下可以看到容器被注入了Sidecar代理(istio-proxy)和OPA代理(opa-istio)。依次检查每个应用的容器,确保每个容器都被注入了Sidecar代理和OPA代理。

执行结果
以上配置的OPA策略限制了对BookInfo的访问,定义如下所示。
- 执行以下命令,可以看到guest1被授予guest角色,并且可以使用带有/productpage的URL访问应用,但不能使用带有/v1/api/products的URL访问应用。
curl -X GET http://<入口网关服务的IP地址>/productpage --user guest1:password -I
预期输出:
HTTP/1.1 200 OK
curl -X GET http://<入口网关服务的IP地址>/api/v1/products --user guest1:password -I
预期输出:
HTTP/1.1 403 Forbidden
- 执行以下命令,可以看到admin1被授予admin角色,并且可以使用带有/productpage和/v1/api/products的URL访问应用。
curl -X GET http://<入口网关服务的IP地址>/productpage --user admin1:password -I
预期输出:
HTTP/1.1 200 OK
curl -X GET http://<入口网关服务的IP地址>/api/v1/products --user admin1:password -I
预期输出:
HTTP/1.1 200 OK
根据以上结果,可以看到OPA定义访问控制策略是成功的。