@@ -38,7 +38,8 @@ Istio 安全功能提供了强大的身份、强大的策略、透明的 TLS 加
38
38
- 零信任网络:在不受信任的网络上构建安全解决方案
39
39
40
40
请访问我们的[ 双向 TLS 迁移] ( /zh/docs/tasks/security/authentication/mtls-migration/ ) 相关文章,
41
- 开始在已部署的服务中使用 Istio 安全功能。请访问我们的[ 安全任务] ( /zh/docs/tasks/security/ ) ,
41
+ 开始在已部署的服务中使用 Istio 安全功能。
42
+ 请访问我们的[ 安全任务] ( /zh/docs/tasks/security/ ) ,
42
43
以获取有关使用安全功能的详细说明。
43
44
44
45
## 高层架构 {#high-level-architecture}
@@ -54,9 +55,9 @@ Istio 中的安全性涉及多个组件:
54
55
55
56
- Sidecar 和边缘代理作为[ 策略执行点] ( https://csrc.nist.gov/glossary/term/policy_enforcement_point ) (PEP)
56
57
以保护客户端和服务器之间的通信安全。
57
- - 一组 Envoy 代理扩展,用于管理遥测和审计
58
+ - 一组 Envoy 代理扩展,用于管理遥测和审计。
58
59
59
- 控制面处理来自 API server 的配置 ,并且在数据面中配置 PEP。
60
+ 控制面处理来自 API 服务器的配置 ,并且在数据面中配置 PEP。
60
61
PEP 用 Envoy 实现。下图显示了架构。
61
62
62
63
{{< image width="75%"
@@ -76,7 +77,7 @@ PEP 用 Envoy 实现。下图显示了架构。
76
77
审计谁在什么时间访问了什么,根据他们使用的工作负载向客户收费,
77
78
并拒绝任何未能支付账单的客户访问工作负载。
78
79
79
- Istio 身份模型使用经典的 ` service identity ` (服务身份)来确定一个请求源端的身份。
80
+ Istio 身份模型使用经典的 ` Service Identity ` (服务身份)来确定一个请求源端的身份。
80
81
这种模型有极好的灵活性和粒度,可以用服务身份来标识人类用户、单个工作负载或一组工作负载。
81
82
在没有服务身份的平台上,Istio 可以使用其它可以对服务实例进行分组的身份,例如服务名称。
82
83
@@ -88,17 +89,17 @@ Istio 身份模型使用经典的 `service identity`(服务身份)来确定
88
89
Istio 服务帐户或 GCP 服务帐户。自定义服务帐户引用现有服务帐户,
89
90
就像客户的身份目录管理的身份一样。
90
91
91
- ## 身份和证书管理 {#PKI }
92
+ ## 身份和证书管理 {#pik }
92
93
93
94
Istio PKI 使用 X.509 证书为每个工作负载都提供强大的身份标识。
94
95
` istio-agent ` 与每个 Envoy 代理一起运行,与 ` istiod `
95
96
一起协作来自动化的进行大规模密钥和证书轮换。下图显示了这个机制的运行流程。
96
97
97
98
{{< tip >}}
98
- 译者注:这里用 ` istio-agent ` 来表述,是因为下图及对图的相关解读中反复用到了 "Istio agent "
99
- 这个术语,这样的描述更容易理解。另外,在实现层面,` istio-agent ` 是指 Sidecar 容器中的
100
- ` pilot-agent ` 进程,它有很多功能,这里不表,
101
- 只特别提一下:它通过 Unix socket 的方式在本地提供 SDS 服务供 Envoy 使用,
99
+ 译者注:这里用 ` istio-agent ` 来表述,是因为下图及对图的相关解读中反复用到了 "Istio Agent "
100
+ 这个术语,这样的描述更容易理解。另外,在实现层面,
101
+ ` istio-agent ` 是指 Sidecar 容器中的 ` pilot-agent ` 进程,它有很多功能,这里不表,
102
+ 只特别提一下:它通过 Unix 套接字的方式在本地提供 SDS 服务供 Envoy 使用,
102
103
这个信息对了解 Envoy 与 SDS 之间的交互有意义。
103
104
{{< /tip >}}
104
105
@@ -116,6 +117,54 @@ Istio 通过以下流程提供密钥和证书:
116
117
1 . ` istio-agent ` 通过 Envoy SDS API 将从 ` istiod ` 收到的证书和密钥发送给 Envoy。
117
118
1 . ` istio-agent ` 监控工作负载证书的过期时间。上述过程会定期重复进行证书和密钥轮换。
118
119
120
+ ## 集群信任包 ` ClusterTrustBundle ` {#clustertrustbundle}
121
+
122
+ ` ClusterTrustBundle ` 是 Kubernetes 自定义资源定义 (CRD),
123
+ 旨在帮助管理集群范围内的受信任证书颁发机构 (CA) 捆绑包。
124
+ 它主要用于在整个集群范围内分发和信任公共 X.509 证书。
125
+ 此概念在组件和工作负载需要验证由非标准或私有 CA 签名的 TLS 证书的环境中尤其有用。
126
+ Istio 在最近的版本中增加了对此的实验性支持,使服务信任管理更加轻松。
127
+
128
+ ### 启用该功能 {#enabling-the-feature}
129
+
130
+ 要在 Istio 中使用 ` ClusterTrustBundle ` ,
131
+ 必须在安装过程中设置一个标志来启用它。具体方法如下:
132
+
133
+ 1 . 确保您的 Kubernetes 集群为 1.27 或更高版本,
134
+ [ 并且已启用 ` ClusterTrustBundles ` ] ( https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests/#cluster-trust-bundles ) 。
135
+
136
+ 1 . 将其添加到您的 Istio 配置中
137
+
138
+ {{< text yaml >}}
139
+ values:
140
+ pilot:
141
+ env:
142
+ ENABLE_CLUSTER_TRUST_BUNDLE_API: "true"
143
+ {{< /text >}}
144
+
145
+ ### 创建和使用 ClusterTrustBundles {#creating-and-using-clustertrustbundles}
146
+
147
+ 您可以创建 ` ClusterTrustBundles ` 作为 Kubernetes 资源,例如:
148
+
149
+ {{< text yaml >}}
150
+ apiVersion: certificates.k8s.io/v1alpha1
151
+ kind: ClusterTrustBundle
152
+ metadata:
153
+ name: my-trust-bundle
154
+ spec:
155
+ trustBundle |
156
+ -----BEGIN CERTIFICATE-----
157
+ <这里是您的根证书>
158
+ -----END CERTIFICATE-----
159
+ {{< /text >}}
160
+
161
+ 一旦创建,Istio 控制平面将使用这些来验证安全通信中的证书,例如双向 TLS(mTLS)。
162
+
163
+ ### 重要说明 {#important-notes}
164
+
165
+ - 这是实验性功能,因此预计未来版本会发生变化。
166
+ - 确保 Istio 服务帐户具有访问 ` ClusterTrustBundles ` 的正确权限,否则可能会遇到错误。
167
+
119
168
## 认证 {#authentication}
120
169
121
170
Istio 提供两种类型的认证:
@@ -136,12 +185,12 @@ Istio 提供两种类型的认证:
136
185
- [ Firebase Auth] ( https://firebase.google.com/docs/auth/ )
137
186
- [ Google Auth] ( https://developers.google.com/identity/protocols/OpenIDConnect )
138
187
139
- 在所有情况下,Istio 都通过自定义 Kubernetes API 将认证策略存储在 ` Istio config store ` 。
188
+ 在所有情况下,Istio 都通过自定义 Kubernetes API 将认证策略存储在 ` Istio Config Store ` 。
140
189
{{< gloss >}}Istiod{{< /gloss >}} 使每个代理保持最新状态,
141
- 并在适当时提供密钥。此外,Istio 的认证机制支持宽容模式(permissive mode ),
190
+ 并在适当时提供密钥。此外,Istio 的认证机制支持宽容模式(Permissive Mode ),
142
191
以帮助您在强制实施前了解策略更改将如何影响您的安全状况。
143
192
144
- ### 双向 TLS 认证 {#mutual-TLS -authentication}
193
+ ### 双向 TLS 认证 {#mutual-tls -authentication}
145
194
146
195
Istio 通过客户端和服务器端 PEP 建立服务到服务的通信通道,
147
196
PEP 被实现为 [ Envoy 代理] ( https://www.envoyproxy.io/ ) 。
@@ -152,8 +201,10 @@ PEP 被实现为 [Envoy 代理](https://www.envoyproxy.io/)。
152
201
1 . 客户端 Envoy 与服务器端 Envoy 开始双向 TLS 握手。在握手期间,
153
202
客户端 Envoy 还做了[ 安全命名] ( /zh/docs/concepts/security/#secure-naming ) 检查,
154
203
以验证服务器证书中显示的服务帐户是否被授权运行目标服务。
155
- 1 . 客户端 Envoy 和服务器端 Envoy 建立了一个双向的 TLS 连接,Istio 将流量从客户端 Envoy 转发到服务器端 Envoy。
156
- 1 . 服务器端 Envoy 授权请求。如果获得授权,它将流量转发到通过本地 TCP 连接的后端服务。
204
+ 1 . 客户端 Envoy 和服务器端 Envoy 建立了一个双向的 TLS 连接,
205
+ Istio 将流量从客户端 Envoy 转发到服务器端 Envoy。
206
+ 1 . 服务器端 Envoy 授权请求。如果获得授权,
207
+ 它将流量转发到通过本地 TCP 连接的后端服务。
157
208
158
209
Istio 将 ` TLSv1_2 ` 作为最低支持的 TLS 版本为客户端和服务器配置了如下的加密套件:
159
210
@@ -171,7 +222,7 @@ Istio 将 `TLSv1_2` 作为最低支持的 TLS 版本为客户端和服务器配
171
222
172
223
#### 宽容模式 {#permissive-mode}
173
224
174
- Istio 双向 TLS 具有一个宽容模式(permissive mode ),
225
+ Istio 双向 TLS 具有一个宽容模式(Permissive Mode ),
175
226
允许服务同时接受纯文本流量和双向 TLS 流量。这个功能极大地提升了双向 TLS 的入门体验。
176
227
177
228
在运维人员希望将服务移植到启用了双向 TLS 的 Istio 上时,
@@ -189,8 +240,8 @@ Istio 双向 TLS 具有一个宽容模式(permissive mode),
189
240
190
241
#### 安全命名 {#secure-naming}
191
242
192
- 服务器身份(Server identity )被编码在证书里,
193
- 但服务名称(service name )通过服务发现或 DNS 被检索。
243
+ 服务器身份(Server Identity )被编码在证书里,
244
+ 但服务名称(Service Name )通过服务发现或 DNS 被检索。
194
245
安全命名信息将服务器身份映射到服务名称。身份 ` A ` 到服务名称 ` B `
195
246
的映射表示"授权 ` A ` 运行服务 ` B ` "。控制平面监视 ` apiserver ` ,
196
247
生成安全命名映射,并将其安全地分发到 PEP。
@@ -250,8 +301,7 @@ Istio 将这两种认证类型以及凭证中的其他声明(如果适用)
250
301
[ TLS 设置参考文档] ( /zh/docs/reference/config/networking/destination-rule/#TLSSettings ) 中有更多这方面的信息。
251
302
252
303
和其他的 Istio 配置一样,可以用 ` .yaml ` 文件的形式来编写认证策略,使用 ` kubectl `
253
- 应用策略。下面例子中的认证策略要求:与带有 ` app: reviews ` 标签的工作负载的传输层认证,
254
- 必须使用双向 TLS:
304
+ 应用策略。下面例子中的认证策略要求:与带有 ` app: reviews ` 标签的工作负载的传输层认证,必须使用双向 TLS:
255
305
256
306
{{< text yaml >}}
257
307
apiVersion: security.istio.io/v1
@@ -269,18 +319,18 @@ spec:
269
319
270
320
#### 策略存储 {#policy-storage}
271
321
272
- Istio 将网格范围的策略存储在根命名空间。这些策略使用一个空的 selector
322
+ Istio 将网格范围的策略存储在根命名空间。这些策略使用一个空的 ` selector `
273
323
应用到网格中的所有工作负载。具有命名空间范围的策略存储在相应的命名空间中。
274
324
它们仅适用于其命名空间内的工作负载。如果您配置了 ` selector ` 字段,
275
325
则认证策略仅适用于与您配置的条件匹配的工作负载。
276
326
277
- 对等认证策略和请求认证策略用 kind 字段区分,
327
+ 对等认证策略和请求认证策略用 ' kind' 字段区分,
278
328
分别是 ` PeerAuthentication ` 和 ` RequestAuthentication ` 。
279
329
280
330
#### Selector 字段 {#selector-field}
281
331
282
332
对等认证策略和请求认证策略使用 ` selector ` 字段来指定该策略适用的工作负载的标签。
283
- 以下示例显示适用于带有 ` app: product-page ` 标签的工作负载的策略的 selector 字段:
333
+ 以下示例显示适用于带有 ` app: product-page ` 标签的工作负载的策略的 ` selector ` 字段:
284
334
285
335
{{< text yaml >}}
286
336
selector:
@@ -293,7 +343,7 @@ selector:
293
343
因此,` selector ` 字段可帮助您指定策略的范围:
294
344
295
345
- 网格范围策略:为根命名空间指定的策略,不带或带有空的 ` selector ` 字段。
296
- - 命名空间范围的策略:为非root命名空间指定的策略 ,不带有或带有空的 ` selector ` 字段。
346
+ - 命名空间范围的策略:为非 root 命名空间指定的策略 ,不带有或带有空的 ` selector ` 字段。
297
347
- 特定于工作负载的策略:在常规命名空间中定义的策略,带有非空 ` selector ` 字段。
298
348
299
349
对等认证策略和请求认证策略对 ` selector ` 字段遵循相同的层次结构原则,
@@ -461,7 +511,10 @@ Istio 按以下顺序检查层中的匹配策略:`CUSTOM`、`DENY`,
461
511
462
512
下图详细显示了策略优先级:
463
513
464
- {{< image width="50%" link="./authz-eval.svg" caption="授权策略优先级">}}
514
+ {{< image width="50%"
515
+ link="./authz-eval.svg"
516
+ caption="授权策略优先级"
517
+ >}}
465
518
466
519
当您将多个授权策略应用于同一工作负载时,Istio 会累加地应用它们。
467
520
@@ -628,7 +681,7 @@ spec:
628
681
requestPrincipals: [ "* "]
629
682
{{< /text >}}
630
683
631
- 下面的示例拒绝到 ` /admin ` 路径且不带请求主体的请求 :
684
+ 下面的示例拒绝发送到 ` /admin ` 路径且不带请求体的请求 :
632
685
633
686
{{< text yaml >}}
634
687
apiVersion: security.istio.io/v1
@@ -653,9 +706,9 @@ spec:
653
706
#### ` allow-nothing ` 、` deny-all ` 和 ` allow-all ` 策略 {#allow-nothing-deny-all-and-allow-all-policy}
654
707
655
708
以下示例显示了不匹配任何内容的 ` ALLOW ` 策略。如果没有其他 ` ALLOW ` 策略,
656
- 请求将因" 默认拒绝" 行为被始终拒绝。
709
+ 请求将因“ 默认拒绝” 行为被始终拒绝。
657
710
658
- 请注意," 默认拒绝" 行为仅适用于工作负载随着 ` ALLOW `
711
+ 请注意,“ 默认拒绝” 行为仅适用于工作负载随着 ` ALLOW `
659
712
操作至少有一个授权策略的情况。
660
713
661
714
{{< tip >}}
@@ -674,7 +727,8 @@ spec:
674
727
{{< /text >}}
675
728
676
729
以下示例显示了显式拒绝所有访问的 ` DENY ` 策略。
677
- 即使有另一个 ` ALLOW ` 策略允许请求,但由于 ` DENY ` 策略优先于 ` ALLOW ` 策略,所以将始终拒绝请求。
730
+ 即使有另一个 ` ALLOW ` 策略允许请求,但由于 ` DENY `
731
+ 策略优先于 ` ALLOW ` 策略,所以将始终拒绝请求。
678
732
如果您要临时禁用对工作负载的所有访问,可以使用此策略。
679
733
680
734
{{< text yaml >}}
@@ -711,7 +765,7 @@ spec:
711
765
您还可以使用 ` when ` 部分指定其他条件。
712
766
例如,下面的 ` AuthorizationPolicy ` 定义包括以下条件:
713
767
` request.headers [version] ` 是 ` v1 ` 或 ` v2 ` 。
714
- 在这种情况下,key 是 ` request.headers [version] ` ,
768
+ 在这种情况下,` key ` 是 ` request.headers [version] ` ,
715
769
它是 Istio 属性 ` request.headers ` (这是个字典)中的一项。
716
770
717
771
{{< text yaml >}}
@@ -786,12 +840,11 @@ spec:
786
840
methods: [ "GET", "POST"]
787
841
{{< /text >}}
788
842
789
- ### 在普通 TCP 协议上使用 Istio 授权 {#using-Istio -authorization-on-plain-TCP -protocols}
843
+ ### 在普通 TCP 协议上使用 Istio 授权 {#using-istio -authorization-on-plain-tcp -protocols}
790
844
791
845
Istio 授权支持工作负载使用任意普通 TCP 协议,如 MongoDB。
792
846
在这种情况下,您可以按照与 HTTP 工作负载相同的方式配置授权策略。
793
- 不同之处在于某些字段和条件仅适用于 HTTP 工作负载。
794
- 这些字段包括:
847
+ 不同之处在于某些字段和条件仅适用于 HTTP 工作负载。这些字段包括:
795
848
796
849
- 授权策略对象 ` source ` 部分中的 ` request_principals ` 字段
797
850
- 授权策略对象 ` operation ` 部分中的 ` hosts ` 、` methods ` 和 ` paths ` 字段
@@ -822,7 +875,7 @@ spec:
822
875
ports: [ "27017"]
823
876
{{< /text >}}
824
877
825
- ### 对双向 TLS 的依赖 {#dependency-on-mutual-TLS }
878
+ ### 对双向 TLS 的依赖 {#dependency-on-mutual-tls }
826
879
827
880
Istio 使用双向 TLS 将某些信息从客户端安全地传递到服务器。
828
881
在使用授权策略中的以下任何字段之前,必须先启用双向 TLS:
0 commit comments