Kubernetes(K8s)_11_安全机制
- 安全机制
- 命名空间
- 网络命名空间
- PID命名空间/IPC命名空间
- 安全上下文
- 容器级别
- Pod级别
- NetworkPolicy
- 创建NetworkPolicy
安全机制
Pod安全标准(Pod Security Standard):实现安全机制所遵循的标准
1)Pod安装标准中由以下3个策略组成:
策略名 | 说明 |
Privileged | 不受限制的策略 (提供最大权限,允许特权提升) |
Baseline | 限制性较弱的策略 (禁止特权提升,使用默认配置) |
Restricted | 限制性最强的策略 (遵循当前的保护Pod的最佳实践) |
命名空间
Kubernetes集群中通过以下3种命名空间实现各种资源类型的隔离
1)网络命名空间:每个Pod均有IP和端口;
2)PID命名空间:每个Pod拥有单独的进程树;
3)IPC命名空间:仅允许同一Pod内的进程可通信;
//进程间通信(Inter Process Communication,IPC)
//当Pod需操作节点级别的资源时,就需在节点的命名空间中运行
网络命名空间
定义Pod中容器使用宿主节点网卡的格式(其他省略):
spec:
hostNetwork: true
1)设置该选项后,Pod将使用节点的IP(Pod中的程序也会占用节点的端口);
2)控制平面组件均设置该选项;
如:Pod占用节点的网卡
定义Pod中容器占用节点端口的格式(其他省略):
spec:
ports:
- containerPort: 容器端口
hostPort: 节点端口
protocol: 端口对应的协议
1)本质:将宿主节点端口映射到Pod端口(不同于NodeProt类型的SVC);
2)两个占用宿主节点同一端口的Pod不可分配在一起;
//若不满足Pod需占用的节点端口,则Pod处于Pending状态
如:两个指定hostPort的Pod
PID命名空间/IPC命名空间
定义Pod中容器使用宿主节点的PID命名空间和IPC命名空间格式(其他省略):
spec:
hostPID: true
hostIPC: true
1)hostPID指定是否使用PID命名空间,hostIPC指定是否使用IPC命名空间;
2)使用宿主节点的PID命名空间,则可在容器中查看节点的进程;
3)使用宿主节点的IPC命名空间,则使用容器中的进程可和节点的进程通信;
安全上下文
通过安全上下文可指定以下内容:
1)容器中运行进程的用户(只可通过UID指定);
2)容器是否以root用户运行(容器的默认运行账户为镜像指定的);
3)是否以特权模式运行容器(对宿主节点内核拥有完全访问权限);
4)配置容器可调用宿主节点的内核功能(添加或禁用);
5)是否阻止容器进程写入到容器的根文件系统;
6)设置SELinux;
容器级别
通过spec.containers.securityContest配置容器的安全上下文:
spec:
containers:
securityContext:
runAsUser: 运行进程的用户(UID形式)
runAsNonRoot: 是否以root用户运行容器(ture或false)
privileged: 是否以特权模式运行容器(true或false)
capabilities:
add:
- 添加内核调用1
- 添加内核调用N
drop:
- 禁用内核调用1
- 禁用内核调用N
readOnlyRootFilesystem: 是否写入容器的根文件系统(true或false)
1)指定运行进程的用户必须通过用户的ID形式(不能使用用户名);
2)指定添加/禁用内核功能时,需省略该内核功能的“CAP_”前缀;
Pod级别
通过spec.securityContest配置容器的安全上下文:
spec:
securityConstext:
fsGroup: 主组
supplementalGroups: [附加组1,附加组2]
其他配置
1)主组和附加组需通过GID形式指定(不能使用组名);
2)Pod级别中也可指定容器级别的配置(但可能会被覆盖);
//上下文优先级:容器级别 > Pod级别
NetworkPolicy
NetworkPolicy:实现Pod网络隔离
1)NetworkPolicy属于Kubernetes的一种资源类型;
2)NetworkPolicy需指定可进站(ingress)或出站(egress);
3)通过标签选择器,使NetworkPolicy只对特定Pod作用;
//实现Pod只可访问特定的Pod(反之亦然)
//集群中是否拥有NetworkPolicy,取决于该集群的网络插件
创建NetworkPolicy
创建NetworkPolicy的格式:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: NetworkPolicy名
spec:
podSelector:
matchLabels:
标签名1: 值1
标签名N: 值N
ingress:
- from:
- podSelector:
matchLabels:
标签名1: 值1
标签名N: 值N
ports:
- port: 进站的端口
egress:
- to:
- podSelector:
matchLabels:
标签名1: 值1
标签名N: 值N
1)若标签选择器为空,则默认对命名空间中所有Pod起作用;
2)ingress中匹配成功的Pod可对标签选择器选定的Pod访问;
3)标签选择选定的Pod可访问egress中匹配成功的Pod;
//可仅指定ingress或egress
如:限定同一命名空间中Pod可访问(被访问)限定
也可通过CIDR(Classless Inter-Domain Routing,无类别域间路由)指定IP端;
如:指定只有192.168.1.10/24IP端的客户流量可进站
ingress:
- from
- ipBlock:
cidr: IP端
若跨命名空间进站/出战,则需通过命名空间选择器指定:
如:实现可跨命名空间的进站访问
如:续上,跨命名空间中的进站访问