Istio安全性( 四 )
授权Istio的授权功能为网格中的工作负载提供了网格 , 命名空间和工作负载范围的访问控制 。 这种控制级别具有以下优点:
- 工作负载到工作负载和最终用户工作负载授权 。
- 一个简单的API:它包括一个简单的AuthorizationPolicy CRD , 它易于使用和维护 。
- 灵活的语义:运维可以在Istio属性上定义自定义条件 , 并使用DENY和ALLOW动作 。
- 高性能:Istio授权在Envoy上本地执行 。
- 高兼容性:本机支持gRPC , HTTP , HTTPS和HTTP2 , 以及任何普通的TCP协议 。
文章插图
隐式启用您无需明确启用Istio的授权功能 。 只需将授权策略应用于工作负载即可实施访问控制 。 对于未应用授权策略的工作负载 , Istio不会强制执行允许所有请求的访问控制 。
授权策略支持ALLOW和DENY动作 。 拒绝策略优先于允许策略 。 如果将任何允许策略应用于工作负载 , 则默认情况下将拒绝对该工作负载的访问 , 除非策略中的规则明确允许 。 当您将多个授权策略应用于同一工作负载时 , Istio会将它们附加应用 。
授权策略要配置授权策略 , 请创建AuthorizationPolicy自定义资源 。 授权策略包括选择器 , 操作和规则列表:
- 选择器字段指定策略的目标
- 操作字段指定是允许还是拒绝请求
- 规则指定何时触发动作
- 规则中的from字段指定请求的来源
- 规则中的to字段指定请求的操作
- when字段指定应用规则所需的条件
apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata: name: httpbin namespace: foospec: selector:matchLabels:app: httpbinversion: v1 action: ALLOW rules: - from:- source:principals: ["cluster.local/ns/default/sa/sleep"]- source:namespaces: ["dev"]to:- operation:methods: ["GET"]when:- key: request.auth.claims[iss]values: [""]
以下示例显示了一个授权策略 , 如果源不是foo名称空间 , 该策略将拒绝请求:apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata: name: httpbin-deny namespace: foospec: selector:matchLabels:app: httpbinversion: v1 action: DENY rules: - from:- source:notNamespaces: ["foo"]
拒绝策略优先于允许策略 。 如果匹配允许策略的请求与拒绝策略匹配 , 则可以拒绝这些请求 。Istio首先评估拒绝政策 , 以确保允许政策不会绕过拒绝政策 。策略目标
您可以通过元数据/命名空间字段和可选的选择器字段来指定策略的范围或目标 。 策略适用于元数据/命名空间字段中的命名空间 。 如果将其值设置为根名称空间 , 则该策略将应用于网格中的所有命名空间 。 根命名空间的值是可配置的 , 默认值是 istio-system。 如果设置为任何其他命名空间 , 则该策略仅适用于指定的命名空间 。
您可以使用选择器字段来进一步限制策略以应用于特定工作负载 。 选择器使用标签选择目标工作负载 。 选择器包含{key:value}对的列表 , 其中key是标签的名称 。 如果未设置 , 则授权策略将与授权策略应用于同一命名空间中的所有工作负载 。
例如 , 允许读取策略允许使用默认命名空间中的 app:products 标签通过“ GET”和“ HEAD”访问工作负载 。
apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata:name: allow-readnamespace: defaultspec:selector:matchLabels:app: productsaction: ALLOWrules:- to:- operation:methods: ["GET", "HEAD"]
值匹配授权策略中的大多数字段都支持以下所有匹配模式:
- 完全匹配:即完整的字符串匹配 。
- 前缀匹配: "*" 结尾的字符串 。 例如 ,"test.abc.*" 匹配 "test.abc.com" 、 "test.abc.com.cn" 、 "test.abc.org" 等等 。
- 后缀匹配: "*" 开头的字符串 。 例如 ,"*.abc.com" 匹配 "eng.abc.com" 、 "test.eng.abc.com" 等等 。
- 存在匹配: * 用于指定非空的任意内容 。 您可以使用格式 fieldname: ["*"] 指定必须存在的字段 。 这意味着该字段可以匹配任意内容 , 但是不能为空 。 请注意这与不指定字段不同 , 后者意味着包括空的任意内容 。
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚
- V2X|V2X:确保未来道路交通数据交换的安全性
- OPPO在影像|出色影像带来亮眼成绩,OPPO手机用户成了抖音最活跃创作者?
- 欣赏:萌新作业-7号机
- Java安全之Javassist动态编程
- 为什么微信推荐这么快?
- 谁能“干掉”特斯拉?
- 你还在为账号安全性低而担忧吗,不妨试试这样设置密码
- 设计模式系列—单例设计模式
- 从底层理解this是什么