本文主要是介绍3.17 节点网络安全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1、pod使用宿主节点的linux命名空间
- 1.1 pod使用宿主节点网络命名空间
- 1.2 pod使用宿主节点的端口
- 1.3 pod使用宿主节点的PID和IPC命名空间
- 2、配置容器的安全性
- 2.1 使用指定用户运行容器
- 2.2 限制容器用root用户运行
- 2.3 容器获取宿主内核完整权限
- 2.4 为容器添加宿主内核功能
- 2.5容器中禁用内核功能
- 2.6 阻止对容器根文件写入
1、pod使用宿主节点的linux命名空间
linux支持6类命名空间:进程通信(IPC)命名空间、进程PID命名空间、网络命名空间、挂载命名空间、UTS命名空间、用户命名空间。pod通过命名空间与其他pod或宿主机默认命名空间隔离。每个pod有自己的命名空间,比如每个pod有自己的网络命名空间,有自己的PID命名空间,有自己的IPC命名空间(有自己的IPC空间,仅允许pod内部的进程进行通信)。
1.1 pod使用宿主节点网络命名空间
之前章节pod都有自己的虚拟IP,但是一些系统级别的pod需要在宿主节点的默认网络空间中运行,可以在pod -> spec中通过设置hostNetwork为true来实现。一旦pod使用宿主节点的网络接口,pod不再拥有自己的虚拟IP,如果pod中某一进程绑定了某端口,那么该端口就被直接绑定到了宿主节点的端口上。创建pod运行在宿主节点如下:
apiVersion: v1
kind: Pod
metadata:name: host-network-pod
spec:hostNetwork: true #使用宿主节点的网络命名空间containers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]
[root@k8s-master01 security]# kubectl exec host-network-pod ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:40:d3:7d:11 txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.137.10 netmask 255.255.255.0 broadcast 192.168.137.255ether 00:0c:29:85:c1:95 txqueuelen 1000 (Ethernet)RX packets 67899 bytes 31980563 (30.4 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 47534 bytes 6031278 (5.7 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450inet 10.244.1.0 netmask 255.255.255.255 broadcast 0.0.0.0ether b6:df:39:53:cd:d0 txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1 (Local Loopback)RX packets 63 bytes 4023 (3.9 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 63 bytes 4023 (3.9 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
容器运行与节点网络一直,ip地址都为192.168.137.10
1.2 pod使用宿主节点的端口
pod实现使用宿主节点的端口,而不使用宿主节点默认的命名空间,适用与流量发到节点的端口时,直接路由到pod中,不需其他中转。由于两个进程不能绑定到同一个节点,因此节点上只能调度一个使用宿主节点指定端口的pod。可以通过配置spec.containers.ports实现该功能。pod对应yaml文件如下:
apiVersion: v1
kind: Pod
metadata:name: host-port-pod
spec:containers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]ports:- containerPort: 80hostPort: 8000 #通过请求节点端口8000直接请求podprotocol: TCP
1.3 pod使用宿主节点的PID和IPC命名空间
与上述类似,可以设置hostPID使pod可以看到宿主节点的进程,否则pod只可以看到pod内部的进程;可以设置hostIPC可以使pod与宿主节点进程进行进程通信。创建pod的yaml文件如下:
apiVersion: v1
kind: Pod
metadata:name: host-PID-IPC-pod
spec:hostPID: truehostIPC: truecontainers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]
2、配置容器的安全性
除了以上pod使用宿主节点的名称空间,还可以通过设置pod.spec.containers.securityContext属性,配置整个pod或容器的安全属性。
2.1 使用指定用户运行容器
pod中容器运行使用的用户是做镜像时的用户,即在dockerfile文件中通过USER指定的用户,如果没有指定的话,运行容器默认使用的root用户。也可以在pod.spec.containers.securityContext.runAsUser中设置用户,会覆盖掉镜像中dockerfile中指定用户。
apiVersion: v1
kind: Pod
metadata:name: run-as-use-pod
spec:containers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]securityContext:runAsUser: 1002
2.2 限制容器用root用户运行
为防止通过root用户运行容器,可以设置pod.spec.containers.securityContext.runAsNonRoot,让容器以非root用户运行,如果dockerfile中没有指定USER用户,会默认用root用户运行,会导致容器创建失败,pod资源清单如下所示:
apiVersion: v1
kind: Pod
metadata:name: run-as-not-root-pod
spec:containers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]securityContext:runAsNonRoot: true
通过该描述文件创建pod后,因mycentos镜像中没有指定USER用户,导致pod创建 失败,如下所示:
[root@k8s-master01 security]# kubectl get pod
NAME READY STATUS RESTARTS AGE
run-as-not-root-pod 0/1 CreateContainerConfigError 0 6m4s
2.3 容器获取宿主内核完整权限
可以设置pod.spec.containers.securityContext.privileged属性来设置容器获取宿主节点完整内核权限,该类型的容器可以使用宿主节点上的所有设备。未设置该属性的,容器只能看到容器内部的设备,容器内部可以直接操作宿主机。如下所示
apiVersion: v1
kind: Pod
metadata:name: privileged-pod
spec:containers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]securityContext:privileged: true
2.4 为容器添加宿主内核功能
如若为容器赋予完整的宿主内核权限,则容器的权限非常高,一旦容器被黑客侵入便可以操作宿主节点。可以为容器设置指定的宿主内核权限。如下所示
apiVersion: v1
kind: Pod
metadata:name: add-privileged-pod
spec:containers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]securityContext:capabilities: #在容器内修改时间会修改宿主节点的时间add:- SYS_TIME
capabilities列表如下:
audit_control CAP_AUDIT_CONTROL
audit_write CAP_AUDIT_WRITE
chown CAP_CHOWN
dac_override CAP_DAC_OVERRIDE
dac_read_search CAP_DAC_READ_SEARCH
fowner CAP_FOWNER
fsetid CAP_FSETID
ipc_lock CAP_IPC_LOCK
ipc_owner CAP_IPC_OWNER
kill CAP_KILL
lease CAP_LEASE
linux_immutable CAP_LINUX_IMMUTABLE
mac_admin CAP_MAC_ADMIN
mac_override CAP_MAC_OVERRIDE
mknod CAP_MKNOD
net_admin CAP_NET_ADMIN
net_bind_service CAP_NET_BIND_SERVICE
net_broadcast CAP_NET_BROADCAST
net_raw CAP_NET_RAW
setfcap CAP_SETFCAP
setgid CAP_SETGID
setpcap CAP_SETPCAP
setuid CAP_SETUID
sys_admin CAP_SYS_ADMIN
sys_boot CAP_SYS_BOOT
sys_chroot CAP_SYS_CHROOT
sys_module CAP_SYS_MODULE
sys_nice CAP_SYS_NICE
sys_pacct CAP_SYS_PACCT
sys_ptrace CAP_SYS_PTRACE
sys_rawio CAP_SYS_RAWIO
sys_resource CAP_SYS_RESOURCE
sys_time CAP_SYS_TIME
sys_tty_config CAP_SYS_TTY_CONFIG
syslog CAP_SYSLOG
wake_alarm CAP_WAKE_ALARM
2.5容器中禁用内核功能
如若宿主节点目录或文件挂载到容器中,容器默认是可以修改文件所有者权限的,可以配置禁用容器的修改宿主文件所有者权限,如下所示
apiVersion: v1
kind: Pod
metadata:name: privileged-pod
spec:containers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]securityContext:capabilities: #禁止容器修改文件的所有者权限drop:- CHOWNvolumeMounts:- mountPath: /hello #挂载到容器位置name: hellovolumes:- name: hellohostPath:path: /root/hello #节点上位置
2.6 阻止对容器根文件写入
为防止对容器根目录写入,防止对根目录的攻击,可以通过securityContext.readOnlyRootFilesystem设置,阻止对容器根目录写入。如下所示
apiVersion: v1
kind: Pod
metadata:name: readonly-rootfilesystem-pod
spec:containers:- name: mycentosimage: softwarebird/mycentos:0.1imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]securityContext:readOnlyRootFilesystem: true # 阻止对容器根目录写入volumeMounts:- name: myvolumemountPath: /volumereadOnly: falsevolumes:- name: myvolumehostPath:path: /root/data #可以对挂在卷/root/data进行写入type: DirectoryOrCreate
参考《k8s in action》
这篇关于3.17 节点网络安全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!