服务网格ASM集成了开放策略代理(OPA)插件,通过OPA定义访问控制策略,可以使您的应用实现细粒度的访问控制。v1.8.6.41及以上版本的ASM还支持通过配置ConfigMap将OPA策略自动推送到容器中,实现动态更新OPA策略。本文介绍如何在ASM中实现动态更新OPA策略。
前提条件
- 已创建ASM实例,且ASM实例为v1.8.6.41-gb1d8f288-aliyun及以上版本。具体操作,请参见创建ASM实例。
- 已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群。
- 添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
背景信息
作为由CNCF托管的一个孵化项目,开放策略代理(OPA)是一个策略引擎,可用于为您的应用程序实现细粒度的访问控制。OPA作为通用策略引擎,可以与微服务一起部署为独立服务。为了保护应用程序,必须先授权对微服务的每个请求,然后才能对其进行处理。为了检查授权,微服务对OPA进行API调用,以确定请求是否被授权。

步骤一:启用OPA插件
步骤二:设置ConfigMap
服务网格ASM支持动态更新OPA策略,您可以配置包含
openpolicyagent.org/policy=rego
标签的ConfigMap,该策略会被自动推送到所有命名空间中注入了OPA代理容器的Pod。移除该ConfigMap时,策略也会从Pod中移除。
注意
- OPA定义一个Pod的OPA策略时,只允许有一条
default allow
字段。如果多个OPA策略相关的ConfigMap生效于一个Pod,且每个策略中都定义了default allow
字段,则多条default allow
字段会导致动态更新失败。 - OPA代理容器启动时需要依赖名为opa-policy的ConfigMap。如果该ConfigMap被删除,相应的OPA策略也会在OPA代理容器中被移除。重建该ConfigMap并不会使之生效,只能重建Pod。
步骤三:注入OPA代理
部署示例应用Bookinfo到ASM实例,确认每个Pod都注入了OPA代理。
- 部署示例应用Bookinfo到ASM实例,请参见部署应用到ASM实例。
- 定义相应的Istio虚拟服务和入口网关,请参见定义Istio资源。
- 检查每个应用是否都注入OPA代理。
步骤四:验证使用OPA定义访问控制策略是否成功。
- 执行以下命令,可以看到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定义访问控制策略是成功的。
步骤五:动态更新OPA策略
步骤六:验证动态更新OPA策略是否成功
执行以下命令,可以看到guest1被授予了admin角色,此时可以使用/productpage和/v1/api/products访问应用。
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 200 OK
在没有更新OPA策略之前,guest1只能使用带有/productpage的URL访问应用,但不能使用带有/v1/api/products的URL访问应用。更新OPA策略之后,guest1可以使用带有/productpage和/v1/api/products的URL访问应用。说明动态更新OPA策略成功。