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占用节点的网卡

k8s pod获取namespace_安全



定义Pod中容器占用节点端口的格式(其他省略):

spec:
  ports:
   - containerPort: 容器端口
     hostPort: 节点端口
     protocol: 端口对应的协议



1)本质:将宿主节点端口映射到Pod端口(不同于NodeProt类型的SVC);

2)两个占用宿主节点同一端口的Pod不可分配在一起;

//若不满足Pod需占用的节点端口,则Pod处于Pending状态



如:两个指定hostPort的Pod

k8s pod获取namespace_kubernetes_02

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可访问(被访问)限定

k8s pod获取namespace_安全_03



也可通过CIDR(Classless Inter-Domain Routing,无类别域间路由)指定IP端;



如:指定只有192.168.1.10/24IP端的客户流量可进站

ingress:
- from
  - ipBlock:
     cidr: IP端



若跨命名空间进站/出战,则需通过命名空间选择器指定:

如:实现可跨命名空间的进站访问

k8s pod获取namespace_容器_04

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

k8s pod获取namespace_Pod_05