不共享主机的UTS命令空间

描述

UTS命名空间提供两个系统标识符的隔离:主机名和NIS域名。 它用于设置在该名称空间中运行进程可见的主机名和域名。 在容器中运行的进程通常不需要知道主机名和域名。因此,名称空间不应与主机共享

隐患分析

与主机共享UTS命名空间提供了容器可更改主机的主机名。这是不安全的

审计方式

```shell script [root@localhost ~]# docker ps --quiet --all |xargs docker inspect --format '{{.Id}}:UTSMode={{.HostConfig.UTSMode}}' 3b8b371f5e800e25d85e7426020cb7088e6cccb5bd950ad269a185cadf6f7adc:UTSMode= 5bf74b6014405acad5f724cb005b320a864528ac2dd48de1fbb0e37165befc71:UTSMode= 0aede0130fd30b8cb40200aa9b61e84f0d911740617dda3dd707037655419854:UTSMode= d35fd7bd5e90e6aebc237368453361f632f775490da3c1d28011b9f7e43ff75c:UTSMode= cff4f40d63e7ba39cb013706f0c73351c3a99325adf606c715df63b8c81001be:UTSMode=

如果上述命令返回`host`,则意味着主机`UTS`名称空间与容器共享,是不符合要求的。
如果上述命令不返回任何内容,则主机的`UTS`名称空间不共享

### 修复建议

不要使用`--uts=host`参数启动容器。例如,不要启动如下容器:

```shell script
$ docker run -idt --uts=host alpine

不共享主机的进程命名空间

描述

进程ID(PID)命名空间隔离进程ID空间,这意味着不同PID命名空间中的进程可以具有相同的PID。这就是容器和主机之间的进程级隔离

隐患分析

PID名称空间提供了进程的隔离。PID命名空间删除了系统进程的视图,并允许重用包括PID的进程ID。 如果主机的PID名称空间与容器共享,它基本上允许容器内的进程查看主机上的所有进程。 这就打破了主机和容器之间进程级别隔离的优点。若访问容器最终可以知道主机系统上运行的所有进程,甚至可以从容器内杀死主机系统进程。 这可能是灾难性的。因此,不要将容器与主机的进程名称空间共享

审计方式

```shell script [root@localhost ~]# docker ps --quiet --all|xargs docker inspect --format '{{.Id}}:PidMode={{.HostConfig.PidMode}}' 3b8b371f5e800e25d85e7426020cb7088e6cccb5bd950ad269a185cadf6f7adc:PidMode= 5bf74b6014405acad5f724cb005b320a864528ac2dd48de1fbb0e37165befc71:PidMode= 0aede0130fd30b8cb40200aa9b61e84f0d911740617dda3dd707037655419854:PidMode= d35fd7bd5e90e6aebc237368453361f632f775490da3c1d28011b9f7e43ff75c:PidMode= cff4f40d63e7ba39cb013706f0c73351c3a99325adf606c715df63b8c81001be:PidMode=


如果上述命令返回`host`,则表示主机`PID`名称空间与容器共享,存在安全风险

### 修复建议

不要使用`--pid=host`参数启动容器。例如,不要启动一个容器,如下所示

````shell script
$ docker run -idt --pid=host centos
`

不共享主机的IPC命令空间

描述

IPC(POSIX / Sys IPC)命名空间提供命名共享内存段,信号量和消息队列的分离。因此主机上的IPC命名空间不应该与容器共享,并且应该保持独立。

隐患分析

IPC命名空间提供主机和容器之间的IPC分离。 如果主机的IPC名称空间与容器共享,它允许容器内的进程查看主机系统上的所有IPC。 这打破了主机和容器之间IPC级别隔离的好处。可通过访问容器操纵主机IPC。 这可能是灾难性的。 因此,不要将主机的IPC名称空间与容器共享

审计方式

```shell script [root@localhost ~]# docker ps --quiet --all|xargs docker inspect --format '{{.Id}}:IpcMode={{.HostConfig.IpcMode}}' 3b8b371f5e800e25d85e7426020cb7088e6cccb5bd950ad269a185cadf6f7adc:IpcMode=private 5bf74b6014405acad5f724cb005b320a864528ac2dd48de1fbb0e37165befc71:IpcMode=private 0aede0130fd30b8cb40200aa9b61e84f0d911740617dda3dd707037655419854:IpcMode=private d35fd7bd5e90e6aebc237368453361f632f775490da3c1d28011b9f7e43ff75c:IpcMode=private cff4f40d63e7ba39cb013706f0c73351c3a99325adf606c715df63b8c81001be:IpcMode=private


如果上述命令返回`host`,则意味着主机`IPC`命名空间与容器共享。

### 修复建议

不要使用`--ipc=host`参数启动容器。 例如,不要启动如下容器

```shell script
$ docker run -idt --ipc=host centos

说明

共享内存段用于加速进程间通信。 它通常被高性能应用程序使用。 如果这些应用程序被容器化为多个容器,则可能需要共享容器的IPC名称空间以实现高性能。 在这种情况下,您仍然应该共享容器特定的IPC命名空间而不是整个主机IPC命名空间。 可以将容器的IPC名称空间与另一个容器共享,如下所示:

shell script $ docker run -idt --ipc=container:e43299eew043243284 centos

参考文档

Copyright © weiliang 2021 all right reserved,powered by Gitbook本书发布时间: 2024-04-22 16:03:42

results matching ""

    No results matching ""