Merge pull request #34808 from windsonsea/pspolicy

[zh-cn] improve security/pod-security-policy.md
pull/34804/head
Kubernetes Prow Robot 2022-07-04 19:22:46 -07:00 committed by GitHub
commit 10184d33bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 41 additions and 50 deletions

View File

@ -50,11 +50,11 @@ administrator to control the following:
-->
## 什么是 Pod 安全策略? {#what-is-a-pod-security-policy}
_Pod 安全策略Pod Security Policy_ 是集群级别的资源,它能够控制 Pod 规约
中与安全性相关的各个方面。
[PodSecurityPolicy](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritypolicy-v1beta1-policy)
**Pod 安全策略Pod Security Policy**是集群级别的资源,它能够控制 Pod
规约中与安全性相关的各个方面。
[PodSecurityPolicy](/zh-cn/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritypolicy-v1beta1-policy)
对象定义了一组 Pod 运行时必须遵循的条件及相关字段的默认值,只有 Pod 满足这些条件才会被系统接受。
Pod 安全策略允许管理员控制如下方面
Pod 安全策略允许管理员控制如下操作
<!--
| Control Aspect | Field Names |
@ -80,20 +80,20 @@ Pod 安全策略允许管理员控制如下方面:
| ----------------------------------- | --------------------------------- |
| 运行特权容器 | [`privileged`](#privileged) |
| 使用宿主名字空间 | [`hostPID`、`hostIPC`](#host-namespaces) |
| 使用宿主的网络和端口 | [`hostNetwork`, `hostPorts`](#host-namespaces) |
| 使用宿主的网络和端口 | [`hostNetwork``hostPorts`](#host-namespaces) |
| 控制卷类型的使用 | [`volumes`](#volumes-and-file-systems) |
| 使用宿主文件系统 | [`allowedHostPaths`](#volumes-and-file-systems) |
| 允许使用特定的 FlexVolume 驱动 | [`allowedFlexVolumes`](#flexvolume-drivers) |
| 分配拥有 Pod 卷的 FSGroup 账号 | [`fsGroup`](#volumes-and-file-systems) |
| 以只读方式访问根文件系统 | [`readOnlyRootFilesystem`](#volumes-and-file-systems) |
| 设置容器的用户和组 ID | [`runAsUser`, `runAsGroup`, `supplementalGroups`](#users-and-groups) |
| 限制 root 账号特权级提升 | [`allowPrivilegeEscalation`, `defaultAllowPrivilegeEscalation`](#privilege-escalation) |
| Linux 权能字Capabilities | [`defaultAddCapabilities`, `requiredDropCapabilities`, `allowedCapabilities`](#capabilities) |
| 设置容器的用户和组 ID | [`runAsUser`、`runAsGroup`、`supplementalGroups`](#users-and-groups) |
| 限制 root 账号特权级提升 | [`allowPrivilegeEscalation``defaultAllowPrivilegeEscalation`](#privilege-escalation) |
| Linux 权能字Capabilities | [`defaultAddCapabilities`、`requiredDropCapabilities`、`allowedCapabilities`](#capabilities) |
| 设置容器的 SELinux 上下文 | [`seLinux`](#selinux) |
| 指定容器可以挂载的 proc 类型 | [`allowedProcMountTypes`](#allowedprocmounttypes) |
| 指定容器使用的 AppArmor 模 | [annotations](#apparmor) |
| 指定容器使用的 seccomp 模 | [annotations](#seccomp) |
| 指定容器使用的 sysctl 模版 | [`forbiddenSysctls`,`allowedUnsafeSysctls`](#sysctl) |
| 指定容器使用的 AppArmor 模 | [annotations](#apparmor) |
| 指定容器使用的 seccomp 模 | [annotations](#seccomp) |
| 指定容器使用的 sysctl 模板 | [`forbiddenSysctls`、`allowedUnsafeSysctls`](#sysctl) |
<!--
## Enabling Pod Security Policies
@ -109,7 +109,7 @@ cluster.
Pod 安全策略实现为一种可选的[准入控制器](/zh-cn/docs/reference/access-authn-authz/admission-controllers/#podsecuritypolicy)。
[启用了准入控制器](/zh-cn/docs/reference/access-authn-authz/admission-controllers/#how-do-i-turn-on-an-admission-control-plug-in)即可强制实施
Pod 安全策略,不过如果没有授权认可策略之前即启用准入控制器 **将导致集群中无法创建任何 Pod**。
Pod 安全策略,不过如果没有授权认可策略之前即启用准入控制器**将导致集群中无法创建任何 Pod**。
<!--
Since the pod security policy API (`policy/v1beta1/podsecuritypolicy`) is
@ -117,8 +117,8 @@ enabled independently of the admission controller, for existing clusters it is
recommended that policies are added and authorized before enabling the admission
controller.
-->
由于 Pod 安全策略 API`policy/v1beta1/podsecuritypolicy`)是独立于准入控制器
来启用的,对于现有集群而言,建议在启用准入控制器之前先添加策略并对其授权。
由于 Pod 安全策略 API`policy/v1beta1/podsecuritypolicy`)是独立于准入控制器来启用的,
对于现有集群而言,建议在启用准入控制器之前先添加策略并对其授权。
<!--
## Authorizing Policies
@ -133,7 +133,7 @@ must be authorized to use the policy, by allowing the `use` verb on the policy.
PodSecurityPolicy 资源被创建时,并不执行任何操作。为了使用该资源,
需要对发出请求的用户或者目标 Pod
的[服务账号](/zh-cn/docs/tasks/configure-pod-container/configure-service-account/)授权,
通过允许其对策略执行 `use`允许其使用该策略。
通过允许其对策略执行 `use`作,以允许其使用该策略。
<!--
Most Kubernetes pods are not created directly by users. Instead, they are
@ -148,8 +148,8 @@ pod's service account (see [example](#run-another-pod)).
大多数 Kubernetes Pod 不是由用户直接创建的。相反,这些 Pod 是由
[Deployment](/zh-cn/docs/concepts/workloads/controllers/deployment/)、
[ReplicaSet](/zh-cn/docs/concepts/workloads/controllers/replicaset/)
或者经由控制器管理器模化的控制器创建。
赋予控制器访问策略的权限意味着对应控制器所创建的 *所有* Pod 都可访问策略。
或者经由控制器管理器模化的控制器创建。
赋予控制器访问策略的权限意味着对应控制器所创建的**所有** Pod 都可访问策略。
因此,对策略进行授权的优先方案是为 Pod 的服务账号授予访问权限
(参见[示例](#run-another-pod))。
@ -716,8 +716,7 @@ rolebinding "default:psp:unprivileged" created
Now if you give it a minute to retry, the replicaset-controller should
eventually succeed in creating the pod:
-->
现在如果你给 ReplicaSet 控制器一分钟的时间来重试,该控制器最终将能够
成功地创建 Pod
现在如果你给 ReplicaSet 控制器一分钟的时间来重试,该控制器最终将能够成功地创建 Pod
```shell
kubectl-user get pods --watch
@ -850,7 +849,7 @@ and `max`(inclusive). Defaults to no allowed host ports.
此类授权将允许 Pod 访问本地回路loopback设备、在本地主机localhost
上监听的服务、还可能用来监听同一节点上其他 Pod 的网络活动。
**HostPorts** -提供可以在宿主网络名字空间中可使用的端口范围列表。
**HostPorts** - 提供可以在宿主网络名字空间中可使用的端口范围列表。
该属性定义为一组 `HostPortRange` 对象的列表,每个对象中包含
`min`(含)与 `max`(含)值的设置。
默认不允许访问宿主端口。
@ -906,12 +905,12 @@ PodSecurityPolicy 并不限制可以被 `PersistentVolumeClaim` 所引用的
-->
**FSGroup** - 控制应用到某些卷上的附加用户组。
- *MustRunAs* - 要求至少指定一个 `range`
- **MustRunAs** - 要求至少指定一个 `range`
使用范围中的最小值作为默认值。所有 range 值都会被用来执行验证。
- *MayRunAs* - 要求至少指定一个 `range`
- **MayRunAs** - 要求至少指定一个 `range`
允许不设置 `FSGroups`,且无默认值。
如果 `FSGroup` 被设置,则所有 range 值都会被用来执行验证检查。
- *RunAsAny* - 不提供默认值。允许设置任意 `fsGroup` ID 值。
- **RunAsAny** - 不提供默认值。允许设置任意 `fsGroup` ID 值。
<!--
**AllowedHostPaths** - This specifies a list of host paths that are allowed
@ -1042,15 +1041,15 @@ spec:
**RunAsUser** - 控制使用哪个用户 ID 来运行容器。
- *MustRunAs* - 必须至少设置一个 `range`。使用该范围内的第一个值作为默认值。
- **MustRunAs** - 必须至少设置一个 `range`。使用该范围内的第一个值作为默认值。
所有范围值都会被验证检查。
- *MustRunAsNonRoot* - 要求提交的 Pod 具有非零 `runAsUser` 值,或在镜像中
- **MustRunAsNonRoot** - 要求提交的 Pod 具有非零 `runAsUser` 值,或在镜像中
(使用 UID 数值)定义了 `USER` 环境变量。
如果 Pod 既没有设置 `runAsNonRoot`,也没有设置 `runAsUser`,则该 Pod
会被修改以设置 `runAsNonRoot=true`,从而要求容器通过 `USER` 指令给出非零的数值形式的用户 ID。
此配置没有默认值。采用此配置时,强烈建议设置 `allowPrivilegeEscalation=false`
- *RunAsAny* - 没有提供默认值。允许指定任何 `runAsUser` 配置。
- **RunAsAny** - 没有提供默认值。允许指定任何 `runAsUser` 配置。
<!--
**RunAsGroup** - Controls which primary group ID the containers are run with.
@ -1063,11 +1062,11 @@ spec:
-->
**RunAsGroup** - 控制运行容器时使用的主用户组 ID。
- *MustRunAs* - 要求至少指定一个 `range` 值。第一个范围中的最小值作为默认值。
- **MustRunAs** - 要求至少指定一个 `range` 值。第一个范围中的最小值作为默认值。
所有范围值都被用来执行验证检查。
- *MayRunAs* - 不要求设置 `RunAsGroup`
- **MayRunAs** - 不要求设置 `RunAsGroup`
不过,如果指定了 `RunAsGroup` 被设置,所设置值必须处于所定义的范围内。
- *RunAsAny* - 未指定默认值。允许 `runAsGroup` 设置任何值。
- **RunAsAny** - 未指定默认值。允许 `runAsGroup` 设置任何值。
<!--
**SupplementalGroups** - Controls which group IDs containers add.
@ -1082,12 +1081,12 @@ spec:
-->
**SupplementalGroups** - 控制容器可以添加的组 ID。
- *MustRunAs* - 要求至少指定一个 `range` 值。第一个范围中的最小值用作默认值。
- **MustRunAs** - 要求至少指定一个 `range` 值。第一个范围中的最小值用作默认值。
所有范围值都被用来执行验证检查。
- *MayRunAs* - 要求至少指定一个 `range` 值。
- **MayRunAs** - 要求至少指定一个 `range` 值。
允许不指定 `supplementalGroups` 且不设置默认值。
如果 `supplementalGroups` 被设置,则所有 range 值都被用来执行验证检查。
- *RunAsAny* - 未指定默认值。允许为 `supplementalGroups` 设置任何值。
- **RunAsAny** - 未指定默认值。允许为 `supplementalGroups` 设置任何值。
<!--
### Privilege Escalation
@ -1129,7 +1128,7 @@ pods to request `allowPrivilegeEscalation` explicitly.
**DefaultAllowPrivilegeEscalation** - 为 `allowPrivilegeEscalation` 选项设置默认值。
不设置此选项时的默认行为是允许特权提升,以便运行 setuid 程序。
如果不希望运行 setuid 程序,可以使用此字段将选项的默认值设置为禁止,
同时仍然允许 Pod 显式地请求 `allowPrivilegeEscalation`
同时仍然允许 Pod 显式地请求 `allowPrivilegeEscalation`
<!--
### Capabilities
@ -1194,9 +1193,9 @@ specified.
-->
### SELinux
- *MustRunAs* - 要求必须配置 `seLinuxOptions`。默认使用 `seLinuxOptions`
- **MustRunAs** - 要求必须配置 `seLinuxOptions`。默认使用 `seLinuxOptions`
针对 `seLinuxOptions` 所给值执行验证检查。
- *RunAsAny* - 没有提供默认值。允许任意指定的 `seLinuxOptions` 选项。
- **RunAsAny** - 没有提供默认值。允许任意指定的 `seLinuxOptions` 选项。
<!--
### AllowedProcMountTypes
@ -1238,7 +1237,6 @@ Controlled via annotations on the PodSecurityPolicy. Refer to the
详情请参阅
[AppArmor 文档](/zh-cn/docs/tutorials/security/apparmor/#podsecuritypolicy-annotations)。
<!--
### Seccomp
@ -1261,7 +1259,7 @@ are:
相同的 PodSecurityPolicy 可以用于不同版本,进而控制如何应用对应的字段或注解。
**seccomp.security.alpha.kubernetes.io/defaultProfileName** -
注解用来指定为容器配置默认的 seccomp 模。可选值为:
注解用来指定为容器配置默认的 seccomp 模。可选值为:
<!--
- `unconfined` - Seccomp is not applied to the container processes (this is the
@ -1274,19 +1272,13 @@ are:
`--seccomp-profile-root` flag on the Kubelet. If the `--seccomp-profile-root`
flag is not defined, the default path will be used, which is
`<root-dir>/seccomp` where `<root-dir>` is specified by the `--root-dir` flag.
{{< note >}}
The `--seccomp-profile-root` flag is deprecated since Kubernetes
v1.19. Users are encouraged to use the default path.
{{< /note >}}
-->
- `unconfined` - 如果没有指定其他替代方案Seccomp 不会被应用到容器进程上
Kubernets 中的默认设置)。
- `runtime/default` - 使用默认的容器运行时模
- `docker/default` - 使用 Docker 的默认 seccomp 模。自 1.11 版本废弃。
- `runtime/default` - 使用默认的容器运行时模板。
- `docker/default` - 使用 Docker 的默认 seccomp 模板。自 1.11 版本废弃。
应改为使用 `runtime/default`
- `localhost/<路径名>` - 指定节点上路径 `<seccomp_root>/<路径名>` 下的一个文件作为其模
- `localhost/<路径名>` - 指定节点上路径 `<seccomp_root>/<路径名>` 下的一个文件作为其模
其中 `<seccomp_root>` 是通过 `kubelet` 的标志 `--seccomp-profile-root` 来指定的。
如果未定义 `--seccomp-profile-root` 标志,则使用默认的路径 `<root-dir>/seccomp`
其中 `<root-dir>` 是通过 `--root-dir` 标志来设置的。
@ -1309,8 +1301,8 @@ default cannot be changed.
-->
**seccomp.security.alpha.kubernetes.io/allowedProfileNames** - 指定可以为
Pod seccomp 注解配置的值的注解。取值为一个可用值的列表。
表中每项可以是上述各值之一,还可以是 `*`,用来表示允许所有的模
如果没有设置此注解,意味着默认的 seccomp 模是不可更改的。
表中每项可以是上述各值之一,还可以是 `*`,用来表示允许所有的模
如果没有设置此注解,意味着默认的 seccomp 模是不可更改的。
<!--
### Sysctl
@ -1357,6 +1349,5 @@ Refer to the [Sysctl documentation](/docs/tasks/administer-cluster/sysctl-cluste
- 参阅 [Pod 安全标准](/zh-cn/docs/concepts/security/pod-security-standards/)
了解策略建议。
- 阅读 [PodSecurityPolicy 参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritypolicy-v1beta1-policy)
- 阅读 [PodSecurityPolicy 参考](/zh-cn/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritypolicy-v1beta1-policy)
了解 API 细节。