集群节点与网络安全配置指南
立即解锁
发布时间: 2025-08-21 00:51:35 阅读量: 2 订阅数: 11 


Kubernetes实战:从入门到精通
# 集群节点与网络安全:Pod 安全策略与网络隔离
在容器化应用的部署和管理中,安全是至关重要的一环。本文将深入探讨如何通过 Pod 安全策略(PodSecurityPolicy)和网络策略(NetworkPolicy)来保障集群节点和网络的安全。
## 1. Pod 安全策略概述
Pod 安全策略是一种用于控制 Pod 安全相关特性的机制。它可以限制 Pod 的各种行为,如是否允许特权容器、容器运行的用户和组、允许使用的内核能力以及允许挂载的卷类型等。
### 1.1 限制特权容器
当启用了相关的 Pod 安全策略后,API 服务器将不再允许部署之前使用的特权 Pod。例如,执行以下命令部署特权 Pod 时会被拒绝:
```bash
$ kubectl create -f pod-privileged.yaml
Error from server (Forbidden): error when creating "pod-privileged.yaml":
pods "pod-privileged" is forbidden: unable to validate against any pod
security policy: [spec.containers[0].securityContext.privileged: Invalid
value: true: Privileged containers are not allowed]
```
同时,也不能部署想要使用主机的 PID、IPC 或网络命名空间的 Pod。并且,由于在策略中设置了 `readOnlyRootFilesystem` 为 `true`,所有 Pod 中的容器文件系统将为只读(容器只能写入卷)。
### 1.2 理解 runAsUser、fsGroup 和 supplementalGroups 策略
在之前的策略示例中,对于容器可以运行的用户和组没有任何限制,因为使用了 `RunAsAny` 规则。如果想要限制允许的用户或组 ID 列表,可以将规则更改为 `MustRunAs` 并指定允许的 ID 范围。
#### 1.2.1 使用 MustRunAs 规则
以下是一个示例,只允许容器以用户 ID 2 运行,并将默认文件系统组和补充组 ID 限制在 2 - 10 或 20 - 30 之间(包括边界值):
```yaml
runAsUser:
rule: MustRunAs
ranges:
- min: 2
max: 2
fsGroup:
rule: MustRunAs
ranges:
- min: 2
max: 10
- min: 20
max: 30
supplementalGroups:
rule: MustRunAs
ranges:
- min: 2
max: 10
- min: 20
max: 30
```
如果 Pod 规范尝试将这些字段设置为超出这些范围的值,API 服务器将不接受该 Pod。
#### 1.2.2 部署 runAsUser 超出策略范围的 Pod
尝试部署之前的 `pod-as-user-guest.yaml` 文件,该文件指定容器应以用户 ID 405 运行,API 服务器将拒绝该 Pod:
```bash
$ kubectl create -f pod-as-user-guest.yaml
Error from server (Forbidden): error when creating "pod-as-user-guest.yaml"
: pods "pod-as-user-guest" is forbidden: unable to validate against any pod
security policy: [securityContext.runAsUser: Invalid value: 405: UID on
container main does not match required range. Found 405, allowed: [{2 2}]]
```
#### 1.2.3 部署包含超出范围用户 ID 的容器镜像的 Pod
创建了一个 Node.js 应用的替代镜像,该镜像配置为容器以用户 ID 5 运行。其 Dockerfile 如下:
```Dockerfile
FROM node:7
ADD app.js /app.js
USER 5
ENTRYPOINT ["node", "app.js"]
```
将该镜像推送到 Docker Hub 为 `luksa/kubia-run-as-user-5`,部署使用该镜像的 Pod 时,API 服务器会接受该 Pod:
```bash
$ kubectl run run-as-5 --image luksa/kubia-run-as-user-5 --restart Never
pod "run-as-5" created
```
查看容器运行的用户 ID:
```bash
$ kubectl exec run-as-5 -- id
uid=2(bin) gid=2(bin) groups=2(bin)
```
可以看到,容器以用户 ID 2 运行,这是在 Pod 安全策略中指定的 ID。Pod 安全策略可以覆盖容器镜像中硬编码的用户 ID。
#### 1.2.4 使用 MustRunAsNonRoot 规则
对于 `runAsUser` 字段,还可以使用 `MustRunAsNonRoot` 规则。该规则可以防止用户部署以 root 用户运行的容器。要么容器规范必须指定 `runAsUser` 字段,且该字段不能为零(零是 root 用户的 ID),要么容器镜像本身必须以非零用户 ID 运行。
### 1.3 配置允许、默认和禁止的能力
容器可以以特权模式运行,也可以通过添加或删除 Linux 内核能力来定义更细粒度的权限配置。有三个字段会影响容器可以或不能使用的能力:
- `allowedCapabilities`:指定 Pod 作者可以在容器规范的 `securityContext.capabilities` 字段中添加的能力。
- `defaultAddCapabilities`:自动添加到每个部署的 Pod 容器中的能力。
0
0
复制全文
相关推荐










