

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Pod 安全上下文
<a name="windows-security"></a>

 **Pod 安全策略 (PSP)** 和 P **od 安全标准 (PSS)** 是在 Kubernetes 中强制执行安全的两种主要方式。请注意，从 Kubernetes v1.21 起， PodSecurityPolicy 它已被弃用，并将在 v1.25 中移除，Pod 安全标准 (PSS) 是 Kubernetes 推荐的未来强制安全性的方法。

Pod 安全策略 (PSP) 是 Kubernetes 中用于实现安全策略的原生解决方案。PSP 是一种集群级别的资源，用于控制 Pod 规范中对安全敏感的方面。使用 Pod 安全策略，您可以定义 Pod 必须满足的一组条件才能被集群接受。PSP 功能从 Kubernetes 的早期就已推出，旨在阻止在给定集群上创建配置错误的 pod。

[有关 Pod 安全策略的更多信息，请参阅 Kubernetes 文档。](https://kubernetes.io/docs/concepts/policy/pod-security-policy/)根据 [Kubernetes 弃用政策](https://kubernetes.io/docs/reference/using-api/deprecation-policy/)，旧版本将在该功能弃用九个月后停止获得支持。

另一方面，Pod 安全标准 (PSS) 是推荐的安全方法，通常使用安全上下文实现，被定义为 Pod 清单中 Pod 和容器规范的一部分。PSS 是 Kubernetes 项目团队为解决 Pods 安全相关的最佳实践而定义的官方标准。它定义了诸如基准（限制性最低，默认）、特权（非限制）和限制（最严格）之类的策略。

我们建议从基准配置文件开始。PSS 基准配置文件在安全性和潜在摩擦之间取得了稳固的平衡，需要最少的例外清单，它是工作负载安全的良好起点。如果您目前正在使用 PSP，我们建议您切换到 PSS。[有关 PSS 策略的更多详细信息可以在 Kubernetes 文档中找到。](https://kubernetes.io/docs/concepts/security/pod-security-standards/)这些政策可以通过多种工具来执行，包括 [OPA和 [Ky](https://kyverno.io/) verno的](https://www.openpolicyagent.org/)工具。[例如，Kyverno在此处提供了PSS策略的完整集合。](https://kyverno.io/policies/pod-security/)

安全上下文设置允许用户授予选择进程的权限、使用程序配置文件将功能限制为单个程序、允许权限升级、筛选系统调用等。

在安全上下文方面，Kubernetes 中的 Windows Pod 与标准 Linux-based 工作负载有一些局限性和区别。

Windows 使用每个容器的 Job 对象和系统命名空间筛选器来包含容器中的所有进程，并提供与主机的逻辑隔离。如果没有命名空间过滤，就无法运行 Windows 容器。这意味着无法在主机的上下文中声明系统权限，因此特权容器在 Windows 上不可用。

以下`windowsOptions`是唯一记录在案的 [Windows 安全上下文选项](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#windowssecuritycontextoptions-v1-core)，其余则是常规[安全上下文选项](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#securitycontext-v1-core) 

如需查看 Windows 与 linux 中支持的安全上下文属性的列表，请参阅[此处](https://kubernetes.io/docs/setup/production-environment/windows/_print/#v1-container)的官方文档。

Pod 特定的设置适用于所有容器。如果未指定，则 PodSecurityContext 将使用中的选项。如果同时在 SecurityContext 和中设置 PodSecurityContext，则中指定的值优 SecurityContext 先。

例如，Pod 和容器的运行AsUserName 设置（Windows 选项）与运行设置大致等同于 Linux-specific 运行AsUser 设置，在以下清单中，Pod 特定的安全上下文应用于所有容器

```
apiVersion: v1
kind: Pod
metadata:
  name: run-as-username-pod-demo
spec:
  securityContext:
    windowsOptions:
      runAsUserName: "ContainerUser"
  containers:
  - name: run-as-username-demo

  nodeSelector:
    kubernetes.io/os: windows
```

而在下文中，容器级别的安全上下文会覆盖 pod 级别的安全上下文。

```
apiVersion: v1
kind: Pod
metadata:
  name: run-as-username-container-demo
spec:
  securityContext:
    windowsOptions:
      runAsUserName: "ContainerUser"
  containers:
  - name: run-as-username-demo
    ..
    securityContext:
        windowsOptions:
            runAsUserName: "ContainerAdministrator"
  nodeSelector:
    kubernetes.io/os: windows
```

运行AsUserName 字段可接受值的示例： ContainerAdministrator、、NT AUTHORITY\\ N ContainerUser ETWORK SERVICE、NT AUTHORITY\\ LOC

通常使用适用于 Windows pod 的容器来运行容 ContainerUser 器是个好主意。用户不在容器和主机之间共享，但在容器中 ContainerAdministrator 确实具有其他权限。请注意，有一些用户名[限制](https://kubernetes.io/docs/tasks/configure-pod-container/configure-runasusername/#windows-username-limitations)需要注意。

何时使用的一个很好的例子 ContainerAdministrator 是设置 PATH。你可以使用 USER 指令来做到这一点，如下所示：

```
USER ContainerAdministrator
RUN setx /M PATH "%PATH%;C:/your/path"
USER ContainerUser
```

另请注意，机密以明文形式写在节点的卷上（与 linux 上的 tmpfs/in-memory 相比）。这意味着你必须做两件事
+ 使用文件 ACL 保护机密文件的位置
+ 使用卷级加密 [BitLocker](https://docs.microsoft.com/en-us/windows/security/information-protection/bitlocker/bitlocker-how-to-deploy-on-windows-server) 