Kubernetes(K8s)_11_安全机制
@
安全机制
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端
若跨命名空间进站/出战,则需通过命名空间选择器指定:
如:实现可跨命名空间的进站访问

如:续上,跨命名空间中的进站访问

                    
                
                
            
        
浙公网安备 33010602011771号