对授权策略配置失误可能会引起非预期的访问被拒绝或放行。您可以使用ASM授权策略试运行模式,在不影响正式环境的情况下验证授权策略的正确性和可靠性,降低生产环境出现问题的风险,确保授权策略的顺利部署和运行。
前提条件
已添加集群到ASM实例,且ASM实例版本为1.14及以上。关于如何升级实例,请参见升级ASM实例。
已创建名称为foo的示例命名空间并启用自动注入。具体操作,请参见管理全局命名空间。
背景信息
ASM授权策略支持为网格中的工作负载提供命名空间和工作负载级别的访问权限控制。由于授权策略属于流量管控能力,对授权策略的配置失误可能引起非预期的访问被拒绝或放行,这对网格管理人员的工作带来了很大挑战。一旦授权策略配置失误,可能导致正常业务访问被拒绝或应当被阻止的访问被放行。为此,ASM提供了授权策略试运行模式来解决此类问题。对授权策略启用试运行选项可以使授权策略在应用后并不实际阻止或放行流量,而是仅对策略的执行输出日志。网格管理人员可以通过该日志来判断对应策略的执行结果是否符合预期,并可以参考日志将策略调整至完全符合预期后,再关闭试运行模式,使授权策略真正生效。
本文示例将部署sleep和httpbin两个测试应用,整体流程如下:在sleep应用中通过curl访问httpbin应用,验证连通性后,在ASM中配置一个拒绝特定请求的授权策略并开启试运行模式,然后发起可以匹配授权策略拒绝条件的请求。此时因为已启用试运行模式,所以该请求不会被拒绝,同时Sidecar会输出试运行的执行日志,供网格管理人员确认该授权策略的执行情况。确认无误后,关闭该授权策略的试运行模式,使授权策略生效。
步骤一:部署测试应用sleep和httpbin并测试连通性
使用以下内容,创建sleep.yaml文件。
使用kubectl连接到集群,执行以下命令,在foo命名空间部署sleep应用。
关于如何使用kubectl连接到集群,请参见获取集群KubeConfig并通过kubectl工具连接集群。
kubectl apply -f sleep.yaml -n foo
使用以下内容,创建httpbin.yaml文件。
执行以下命令,在foo命名空间部署httpbin应用。
kubectl apply -f httpbin.yaml -n foo
执行以下命令,测试sleep应用和httpbin应用之间的连通性。
for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done
预期输出:
200 200 200 ...
可以看到从sleep应用所在的Pod中执行curl命令访问httpbin应用20次,返回值均为200,表明网络连接正常。
步骤二:创建授权策略并启用试运行模式
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 ,然后单击创建。
在创建页面,进行如下配置,然后单击创建。
步骤三:观察授权策略效果
执行以下命令,再次从sleep应用中访问httpbin应用。
for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done
预期输出:
200 200 200 ...
可以看到由于授权策略启用了试运行模式,所以请求仍然可以成功。
执行以下命令,将httpbin应用的Sidecar的RBAC日志级别调整为Debug。
kubectl exec "$(kubectl get pod -l app=httpbin -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- curl -X POST 127.0.0.1:15000/logging?rbac=debug
预期输出:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0active loggers: ... rbac: debug ... 100 1028 0 1028 0 0 1003k 0 --:--:-- --:--:-- --:--:-- 1003k
执行以下命令,从httpbin应用的Sidecar中筛选授权策略输出的试运行日志。
kubectl logs "$(kubectl -n foo -l app=httpbin get pods -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo | grep "shadow denied"
可以看到输出的拦截日志如下。
2023-12-20T03:58:47.107915Z debug envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130 shadow denied, matched policy ns[foo]-policy[test]-rule[0] thread=32 2023-12-20T03:58:48.800098Z debug envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130 shadow denied, matched policy ns[foo]-policy[test]-rule[0] thread=33 2023-12-20T03:58:50.420179Z debug envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130 shadow denied, matched policy ns[foo]-policy[test]-rule[0] thread=32
步骤四:关闭试运行模式
当您通过日志判断授权策略的执行结果符合预期后,可以关闭试运行模式,使授权策略真正生效。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在授权策略页面,找到步骤二创建的授权策略,在试运行模式列下关闭开关,然后在确认对话框,单击确认,关闭试运行模式。
使用以下命令,再次发起请求测试。
for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done
预期输出:
403 403 403 ...
可以看到因为授权策略已经生效,请求被拒绝,返回403代码。
测试完毕后,执行以下命令,恢复Sidecar的日志级别为Warning。
kubectl exec "$(kubectl get pod -l app=httpbin -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- curl -X POST 127.0.0.1:15000/logging?rbac=warning
预期输出:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0active loggers: ... rbac: warning ... 100 1028 0 1028 0 0 1003k 0 --:--:-- --:--:-- --:--:-- 1003k
相关文档
当您需要对集群中的工作负载进行访问控制和权限管理时,可以使用授权策略设置工作负载的访问条件(例如限制请求路径、方法和客户端IP等),确保只有符合要求的请求才能访问对应工作负载。具体操作,请参见为工作负载设置访问策略。
当您需要精细控制服务间的HTTP或TCP流量访问时,可以为流量设置授权策略。具体操作,请参见为HTTP流量设置授权策略和为TCP流量设置授权策略。
如果您需要对网格外服务进行授权控制,请参见对网格内服务访问外部网站进行授权控制和对网格内服务访问外部数据库进行授权控制。
您可以自定义ASM网关访问日志的内容,及时发现潜在的安全问题。具体操作,请参见生成和采集ASM网关访问日志。
您可以启用网格审计功能,记录或追溯不同用户的日常操作,也可以为网格资源操作配置审计告警,在重要资源变动时及时发出告警通知到告警联系人。具体操作,请参见使用KubeAPI操作审计和为网格资源操作配置审计告警。