当您需要实现动态的访问控制时,可以在ASM网关中接入OPA(Open Policy Agent)执行引擎,根据用户身份或请求内容定制授权策略,实时控制服务间的通信行为,有效防止未经授权的访问并降低数据泄露风险,加强网格应用的安全性。以入口网关访问httpbin应用为例,本文介绍如何在ASM网关上使用OPA执行引擎对到达网关的请求进行认证和鉴权。
前提条件
已添加Kubernetes托管版集群到ASM实例,且ASM实例版本为1.15.3.25及以上。具体操作,请参见添加集群到ASM实例和升级ASM实例。
已部署httpbin应用,且可以正常访问。具体操作,请参见部署httpbin应用。
default命名空间已开启Sidecar自动注入。具体操作,请参见配置Sidecar注入策略。
步骤一:部署OPA执行引擎
使用以下内容,创建asm-opa.yaml文件。
YAML文件部署了一个OPA Service、OPA Deployment和Secret。
Kind
说明
Deployment
镜像
registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static
请替换为您实际的集群地域。该OPA引擎默认打开了日志
--set=decision_logs.console=true
,方便进行调试。
Secret
Secret定义了OPA策略,含义如下:
如果请求路径是
health
,放行请求。如果请求的方法是
HEAD
,放行请求。如果用户名称是
alice
,放行请求。说明用户名称来自请求的
Authorization
Header,形式为Authorization: Basic ${用户名:密码字符串的base64编码}
。
使用ACK集群的KubeConfig,执行以下命令,部署OPA。
kubectl apply -f asm-opa.yaml
步骤二:使用ASM网关外部授权功能接入OPA执行引擎
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在入口网关页面,在需要接入OPA的网关右侧,单击网关安全。
在网关左侧导航栏,选择
。配置自定义授权服务相关信息。
在自定义授权服务配置向导,配置OPA作为网关的自定义授权服务,然后单击下一步。
在匹配规则配置向导,配置请求匹配规则,指定哪些请求需要经过OPA认证和授权,然后单击提交。
创建成功后,界面显示如下。
步骤三:对httpbin应用进行访问测试
执行以下命令,访问
/
路径。curl ${ASM网关IP}/ -I -X GET
预期输出:
HTTP/1.1 200 OK server: istio-envoy date: Tue, 25 Jul 2023 08:30:58 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2
预期输出表明该路径不需要鉴权,直接通过。
执行以下命令,未携带合法参数,访问
/status/201
路径。curl ${ASM网关IP}/status/201 -I -X GET
预期输出:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1
预期输出表明未携带合法参数,请求被拒绝。
执行以下命令,携带合法参数,访问
/status/201
路径。curl ${ASM网关IP}/status/201 -I -X GET --user alice:testpassword
预期输出:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:31:38 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3
预期输出表明携带合法参数,请求通过。
步骤四:更新OPA策略
调用OPA引擎的HTTP接口,更新OPA策略。
执行以下命令,要求只有bob用户才可以正常访问HTTP,之前的alice用户不能访问。
kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "bob" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }'
执行以下命令,使用bob用户访问httpbin。
curl ${ASM网关IP}/status/201 -I -X GET --user bob:testpassword
预期输出:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:32:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3
预期输出表明bob用户访问成功。
执行以下命令,使用alice用户访问httpbin。
curl ${ASM网关IP}/status/201 -I -X GET --user alice:testpassword
预期输出:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1
预期输出表明alice用户访问被禁止。