我一直在测试 istio (1.6( 授权策略,并想确认以下内容:
- 我是否可以使用 k8s 服务名称,如下所示,其中
httpbin.bar
是部署/工作负载 httpbin 的服务名称:
- to:
- operation:
hosts: ["httpbin.bar"]
- 我有以下规则;仅允许从
foo
命名空间中的服务帐户sleep
访问httpbin.bar
服务。
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: whitelist-httpbin-bar
namespace: bar
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/foo/sa/sleep"]
- to:
- operation:
hosts: ["httpbin.bar"]
我设置了 2 个服务;httpbin.bar
和privatehttpbin.bar
.我的假设是它会阻止对privatehttpbin.bar
的访问,但事实并非如此。附带说明一下,我故意避免添加selector.matchLabels
因为据我所知,该规则应该只对httpbin.bar
成功。
文档指出:
当至少有一个源、操作和条件与请求匹配时,就会发生匹配。
根据这里。
我解释说 AND 逻辑将适用于source
和operation
.
如果我能找出为什么这可能不起作用,或者我的理解需要纠正,我将不胜感激。
对于AuthorizationPolicy
对象,命名空间栏中有两个规则:
- 允许来自
foo
命名空间的任何请求;服务帐户sleep
到任何服务。 - 允许任何请求
httpbin
服务;从任何命名空间,使用任何服务帐户。
所以这是一个OR,你正在申请。
如果要应用 AND;这意味着允许来自命名空间foo
与服务帐户sleep
的任何请求与服务httpbin
通信,则需要在命名空间栏中应用以下规则:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: whitelist-httpbin-bar
namespace: bar
rules:
- from:
- source:
principals: ["cluster.local/ns/foo/sa/sleep"]
to: # <- remove the dash (-) from here
- operation:
hosts: ["httpbin.bar"]
关于第一点 您可以通过 k8s 服务名称指定主机名。因此,主机字段可以接受 httpbin.bar。
关于第二点, 根据这里,
授权策略范围(目标(由 "元数据/命名空间"和一个可选的"选择器"。
"元数据/命名空间"告诉策略应用哪个命名空间。如果已设置 对于根命名空间,该策略适用于网格中的所有命名空间。
因此,授权策略whitelist-httpbin-bar
适用于命名空间foo
中的工作负载。但是,要授权的服务httpbin
和privatehttpbin
位于bar
命名空间中。因此,您的授权策略不会限制对这些服务的访问。
如果工作负载没有 ALLOW 策略,请允许请求。
上述条件使请求有效。
希望这有帮助。