【K8s 精选】隔离 Pod 的安全策略
2021-10-15 本文已影响0人
熊本极客
网络策略负责限制出流量,Pod 安全策略负责 Pod 内限制系统的访问权限
1 网络策略
NetworkPolicy 的示例:
① ingress 入规则:允许以下 Pod 连接到 default
名字空间下的带有 role=db 标签的所有 Pod
的 6379 TCP 端口
② egress 出规则:允许名字空间 default
中所有自带标签 role=db 的 Pod
使用 TCP 协议 与 10.0.0.0/24 范围内的 IP 通信,只要目标端口介于 32000 和 32768 之间就可以。
piVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
# IP 地址范围为 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)
- ipBlock:
# CIDR 表示范围
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
# 带有 project=myproject 标签的所有名字空间中的 Pod
- namespaceSelector:
matchLabels:
project: myproject
# default 名字空间下带有 role=frontend 标签的所有 Pod
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 32000
endport: 32768
默认拒绝所有出站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
spec:
podSelector: {}
policyTypes:
- Egress
2 Pod 安全策略
Pod 安全性标准定义了三种不同的策略。
Profile | 作用 |
---|---|
Privileged | 有目的地开放且完全无限制的策略。通常针对由特权较高、受信任的用户所管理的系统级或基础设施级负载 |
Baseline | 便于常见的容器化应用采用,同时禁止已知的特权提升。针对的是应用运维人员和非关键性应用的开发人员 |
Restricted | 旨在实施当前保护 Pod 的最佳实践。针对运维人员和安全性很重要的应用的开发人员,以及不太被信任的用户 |
restricted 安全策略 模板如下:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted-security-policy
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default'
apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'
seccomp.security.alpha.kubernetes.io/defaultProfileName: 'runtime/default'
apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default'
spec:
privileged: false # Don't allow privileged pods!
# 不允许升级到 root 权限
allowPrivilegeEscalation: false
# 这与 allowPrivilegeEscalation 是多余的
# 必须从容器中去除的权能字。 所给的权能字会从默认权能字集合中去除,并且一定不可以添加
requiredDropCapabilities:
- ALL
# 允许的 volume 类型.
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
# Assume that persistentVolumes set up by the cluster admin are safe to use.
- 'persistentVolumeClaim'
# 控制是否 Pod 可以使用节点的网络名字空间。 此类授权将允许 Pod 访问本地回路(loopback)设备、在本地主机(localhost) 上监听的服务、还可能用来监听同一节点上其他 Pod 的网络活动。
hostNetwork: false
# 控制 Pod 容器是否可共享宿主上的 IPC 名字空间
hostIPC: false
# 控制 Pod 中容器是否可以共享宿主上的进程 ID 空间
hostPID: false
runAsUser:
# 允许在非 root 权限在运行 container
rule: 'MustRunAsNonRoot'
# 设置容器的 SELinux 上下文
seLinux:
rule: 'RunAsAny'
# 控制容器可以添加的组 ID
supplementalGroups:
# 要求至少指定一个 range 值。 第一个 range 中的最小值用作默认值。 所有 range 值都被用来执行验证检查。
rule: 'MustRunAs'
ranges:
# 禁止添加到 root 组
- min: 1
max: 65535
# 控制应用到某些卷上的附加用户组
fsGroup:
rule: 'MustRunAs'
ranges:
# 禁止添加到 root 组
- min: 1
max: 65535
# 以只读方式访问根文件系统
readOnlyRootFilesystem: false