• 调试授权
    • 确保授权功能已经正确启用
    • 检查 Pilot 的工作状态
    • 确认 Pilot 正确的将策略分发给了代理服务器
    • 确认策略在代理服务器中正确执行
    • 相关内容

    调试授权

    这篇文章展示了调试 Istio 授权功能的过程。

    如果能够按照报告错误的说明生成集群状态存档,会对调试过程产生很大帮助

    确保授权功能已经正确启用

    ClusterRbacConfig 是一个集群级的单例 CRD,用于控制全局的授权功能。

    • 运行下面的命令来列出现存的 ClusterRbacConfig
    1. $ kubectl get clusterrbacconfigs.rbac.istio.io --all-namespaces
    • 这里应该只有一个 ClusterRbacConfig 实例,其名称应该是 default。否则 Istio 会禁用授权功能并忽略所有策略。
    1. NAMESPACE NAME AGE
    2. default default 1d
    • 如果上面步骤中出现了不止一个的 ClusterRbacConfig 实例,请删除其它的 ClusterRbacConfig,保证集群之中只有一个名为 defaultClusterRbacConfig

    检查 Pilot 的工作状态

    Pilot 负责对授权策略进行转换,并将其传播给 Sidecar。下面的的步骤可以用于确认 Pilot 是否能够正常工作:

    • 运行下列命令,导出 Pilot 的 ControlZ
    1. $ kubectl port-forward $(kubectl -n istio-system get pods -l istio=pilot -o jsonpath='{.items[0].metadata.name}') -n istio-system 9876:9876
    • 正常情况下应该看到如下输出:
    1. Forwarding from 127.0.0.1:9876 -> 9876
    • 用浏览器打开 http://127.0.0.1:9876/scopez/,浏览 ControlZ 页面。

    • rbac 输出级别修改为 debug

    • 在步骤 1 中打开的终端窗口中输入 Ctrl+C,终止端口转发进程。

    • 输出 Pilot 日志,在其中搜索 rbac

    你可能需要先删除并重建授权策略,以保证调试日志能够根据这些策略正常生成。

    1. $ kubectl logs $(kubectl -n istio-system get pods -l istio=pilot -o jsonpath='{.items[0].metadata.name}') -c discovery -n istio-system | grep rbac
    • 检查输出:

      • 没有出现错误。
      • 出现 "built filter config for …" 消息,意味着为目标服务生成了过滤器。
    • 例如你可能会看到类似这样的内容:
    1. 2018-07-26T22:25:41.009838Z debug rbac building filter config for {sleep.foo.svc.cluster.local map[app:sleep pod-template-hash:3326367878] map[destination.name:sleep destination.namespace:foo destination.user:default]}
    2. 2018-07-26T22:25:41.009915Z info rbac no service role in namespace foo
    3. 2018-07-26T22:25:41.009957Z info rbac no service role binding in namespace foo
    4. 2018-07-26T22:25:41.010000Z debug rbac generated filter config: { }
    5. 2018-07-26T22:25:41.010114Z info rbac built filter config for sleep.foo.svc.cluster.local
    6. 2018-07-26T22:25:41.182400Z debug rbac building filter config for {productpage.default.svc.cluster.local map[pod-template-hash:2600844901 version:v1 app:productpage] map[destination.name:productpage destination.namespace:default destination.user:bookinfo-productpage]}
    7. 2018-07-26T22:25:41.183131Z debug rbac checking role app2-grpc-viewer
    8. 2018-07-26T22:25:41.183214Z debug rbac role skipped for no AccessRule matched
    9. 2018-07-26T22:25:41.183255Z debug rbac checking role productpage-viewer
    10. 2018-07-26T22:25:41.183281Z debug rbac matched AccessRule[0]
    11. 2018-07-26T22:25:41.183390Z debug rbac generated filter config: {policies:<key:"productpage-viewer" value:<permissions:<and_rules:<rules:<or_rules:<rules:<header:<name:":method" exact_match:"GET" > > > > > > principals:<and_ids:<ids:<any:true > > > > > }
    12. 2018-07-26T22:25:41.184407Z info rbac built filter config for productpage.default.svc.cluster.local

    说明 Pilot 生成了:

    • 针对 sleep.foo.svc.cluster.local 的配置是空的,原因是没有符合条件的策略可以使用,结果是 Istio 缺省情况下,会禁止所有对这一服务的访问。

    • productpage.default.svc.cluster.local 的配置让 Istio 放行所有针对该服务的 GET 访问。

    确认 Pilot 正确的将策略分发给了代理服务器

    Pilot 负责向代理服务器分发授权策略。下面的步骤用来确认 Pilot 的分发工作状态。

    这里的命令假设用户已经部署了 Bookinfo,否则的话应该将 "-l app=productpage" 部分根据实际情况进行替换。

    • 运行下面的命令,获取 productpage 服务的代理配置信息:
    1. $ kubectl exec $(kubectl get pods -l app=productpage -o jsonpath='{.items[0].metadata.name}') -c istio-proxy -- curl localhost:15000/config_dump -s
    • 校验日志内容:

      • 日志中包含了一个 envoy.filters.http.rbac 过滤器,会针对进入请求执行授权策略。
      • 授权策略更新之后,Istio 会据此更新过滤器。
    • 后续输出表明,productpage 的代理服务器启用了 envoy.filters.http.rbac 过滤器,这个过滤器允许任何人通过 GET 方法进行访问。shadow_rules 没有生效,可以安全忽略。
    1. {
    2. "name": "envoy.filters.http.rbac",
    3. "config": {
    4. "rules": {
    5. "policies": {
    6. "productpage-viewer": {
    7. "permissions": [
    8. {
    9. "and_rules": {
    10. "rules": [
    11. {
    12. "or_rules": {
    13. "rules": [
    14. {
    15. "header": {
    16. "exact_match": "GET",
    17. "name": ":method"
    18. }
    19. }
    20. ]
    21. }
    22. }
    23. ]
    24. }
    25. }
    26. ],
    27. "principals": [
    28. {
    29. "and_ids": {
    30. "ids": [
    31. {
    32. "any": true
    33. }
    34. ]
    35. }
    36. }
    37. ]
    38. }
    39. }
    40. },
    41. "shadow_rules": {
    42. "policies": {}
    43. }
    44. }
    45. },

    确认策略在代理服务器中正确执行

    代理是授权策略的最终实施者。下面的步骤帮助用户确认代理的工作情况:

    这里的命令假设用户已经部署了 Bookinfo,否则的话应该将 "-l app=productpage" 部分根据实际情况进行替换。

    • 在代理中打开授权调试日志:
    1. $ kubectl exec $(kubectl get pods -l app=productpage -o jsonpath='{.items[0].metadata.name}') -c istio-proxy -- curl -X POST localhost:15000/logging?rbac=debug -s
    • 检查输出内容是否包含如下内容:
    1. active loggers:
    2. ... ...
    3. rbac: debug
    4. ... ...
    • 在浏览器中打开 productpage,以便生成日志。

    • 用命令输出代理日志:

    1. $ kubectl logs $(kubectl get pods -l app=productpage -o jsonpath='{.items[0].metadata.name}') -c istio-proxy
    • 检查日志内容:

      • 输出日志中可能包含 enforced allowed 或者 enforced denied,表示请求被允许或者拒绝。

      • 授权策略需要从请求中获取数据。

    • 下面的输出表示,有请求 productpageGET 请求被策略放行。

    shadow denied 没有实际效果,可以忽略。

    1. ...
    2. [2018-07-26 20:39:18.060][152][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:79] checking request: remoteAddress: 10.60.0.139:51158, localAddress: 10.60.0.93:9080, ssl: uriSanPeerCertificate: spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account, subjectPeerCertificate: O=, headers: ':authority', '35.238.0.62'
    3. ':path', '/productpage'
    4. ':method', 'GET'
    5. 'upgrade-insecure-requests', '1'
    6. 'user-agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    7. 'dnt', '1'
    8. 'accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
    9. 'accept-encoding', 'gzip, deflate'
    10. 'accept-language', 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'
    11. 'x-forwarded-for', '10.60.0.1'
    12. 'x-forwarded-proto', 'http'
    13. 'x-request-id', 'e23ea62d-b25d-91be-857c-80a058d746d4'
    14. 'x-b3-traceid', '5983108bf6d05603'
    15. 'x-b3-spanid', '5983108bf6d05603'
    16. 'x-b3-sampled', '1'
    17. 'x-istio-attributes', 'CikKGGRlc3RpbmF0aW9uLnNlcnZpY2UubmFtZRINEgtwcm9kdWN0cGFnZQoqCh1kZXN0aW5hdGlvbi5zZXJ2aWNlLm5hbWVzcGFjZRIJEgdkZWZhdWx0Ck8KCnNvdXJjZS51aWQSQRI/a3ViZXJuZXRlczovL2lzdGlvLWluZ3Jlc3NnYXRld2F5LTc2NjY0Y2NmY2Ytd3hjcjQuaXN0aW8tc3lzdGVtCj4KE2Rlc3RpbmF0aW9uLnNlcnZpY2USJxIlcHJvZHVjdHBhZ2UuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbApDChhkZXN0aW5hdGlvbi5zZXJ2aWNlLmhvc3QSJxIlcHJvZHVjdHBhZ2UuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbApBChdkZXN0aW5hdGlvbi5zZXJ2aWNlLnVpZBImEiRpc3RpbzovL2RlZmF1bHQvc2VydmljZXMvcHJvZHVjdHBhZ2U='
    18. 'content-length', '0'
    19. 'x-envoy-internal', 'true'
    20. 'sec-istio-authn-payload', 'CkVjbHVzdGVyLmxvY2FsL25zL2lzdGlvLXN5c3RlbS9zYS9pc3Rpby1pbmdyZXNzZ2F0ZXdheS1zZXJ2aWNlLWFjY291bnQSRWNsdXN0ZXIubG9jYWwvbnMvaXN0aW8tc3lzdGVtL3NhL2lzdGlvLWluZ3Jlc3NnYXRld2F5LXNlcnZpY2UtYWNjb3VudA=='
    21. , dynamicMetadata: filter_metadata {
    22. key: "istio_authn"
    23. value {
    24. fields {
    25. key: "request.auth.principal"
    26. value {
    27. string_value: "cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
    28. }
    29. }
    30. fields {
    31. key: "source.principal"
    32. value {
    33. string_value: "cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
    34. }
    35. }
    36. }
    37. }
    38. [2018-07-26 20:39:18.060][152][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:88] shadow denied
    39. [2018-07-26 20:39:18.060][152][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:98] enforced allowed
    40. ...

    相关内容

    基于 Istio 的 Micro-Segmentation 授权

    描述 Istio 的授权功能以及如何在各种用例中使用它。

    HTTP 服务的访问控制

    展示为 HTTP 服务设置基于角色的访问控制方法。

    TCP 服务的访问控制

    展示如何为 TCP 服务设置基于角色的访问控制。

    安全

    描述 Istio 的授权与鉴权功能。

    鉴权过程中的宽容模式

    展示宽容模式的的鉴权过程。

    基于组和列表类型声明的授权

    有关如何在 Istio 中配置基于组的授权和配置列表类型声明的授权的教程。