使用OPA策略引擎实现访问控制 The provider name must match the extension provider defined in the mesh config. You can also replace this with sampleextauthzhttp to test the other external authorizer definition. name: opaextauthzgrpc rules: The rules specify when to trigger the external authorizer. to: operation: paths: ["/"] 5. 上面的配置中,我们通过workloadSelector指定对productpage应用进行访问授权,我们从sleep应用发起请求,访问productpage,此时采用默认OPA策略,请求总是被拒绝。 kubectl exec $(kubectl get pod l appsleep o jsonpath{.items..metadata.name} n default) c istioproxy n default curl user bob:password o /dev/null s w '%{httpcode}n' 403 6. 配置OPA策略:以下OPA策略定义了guest和admin角色,guest和admin可以使用GET方法访问/productpage路径,admin另外还可以使用GET方法访问/api/v1/products路径;外部访问时会先解析出用户名,获取用户角色,进一步获取用户访问权限,并与请求进行比对,满足条件则放过,否则拦截。 apiVersion: opacontroller.k8s.io/v1 kind: OpaPolicy metadata: name: objectpolicy namespace: default spec: policy: package istio.authz import input.attributes.request.http as httprequest import input.parsedpath allow { rolesforuser[r] requiredroles[r] } rolesforuser[r] { r : userroles[username][] } requiredroles[r] { perm : roleperms[r][] perm.method httprequest.method perm.path httprequest.path } username parsed { [, encoded] : split(httprequest.headers.authorization, " ") [parsed, ] : split(base64url.decode(encoded), ":") } userroles { "alice": ["guest"], "bob": ["admin"] } roleperms { "guest": [ {"method": "GET", "path": "/productpage"}, ], "admin": [ {"method": "GET", "path": "/productpage"}, {"method": "GET", "path": "/api/v1/products"}, ], } workloadSelector: labels: version: v1 7. 验证 以bob的身份访问/api/v1/products和/productpage,由于bob是admin权限,两个路径都可以访问,返回200。 kubectl exec $(kubectl get pod l appsleep o jsonpath{.items..metadata.name} n default) c istioproxy n default curl user bob:password o /dev/null s w '%{httpcode} n' 200 kubectl exec $(kubectl get pod l appsleep o jsonpath{.items..metadata.name} n default) c istioproxy n default curl user bob:password o /dev/null s w '%{httpcode}n' 200 以alice的身份访问/api/v1/products和/productpage,由于alice是guest权限,所以对/api/v1/products的访问会被拒绝,返回403;对/productpage的访问可以通过,返回200。 kubectl exec $(kubectl get pod l appsleep o jsonpath{.items..metadata.name} n default) c istioproxy n default curl user alice:password o /dev/null s w '%{httpcode }n' 403 kubectl exec $(kubectl get pod l appsleep o jsonpath{.items..metadata.name} n default) c istioproxy n default curl user alice:password o /dev/null s w '%{httpcode}n' 200 8. 修改OPA策略,给alice加上admin权限。 userroles { "alice": ["guest", "admin"], "bob": ["admin"] } 重新验证以alice身份访问/api/v1/products,返回200。 kubectl exec $(kubectl get pod l appsleep o jsonpath{.items..metadata.name} n default) c istioproxy n default curl user alice:password o /dev/null s w '%{httpcode}n' 200