特权端口禁止映射到容器内
描述
低于1024
的TCP/IP
端口号被认为是特权端口,由于各种安全原因,普通用户和进程不允许使用它们。
隐患分析
默认情况下,如果用户没有明确声明容器端口进行主机端口映射,Docker
会自动地将容器端口映射到主机上的49153-65535
中。
但是,如果用户明确声明它,Docker
可以将容器端口映射到主机上的特权端口。
这是因为容器使用不限制特权端口映射的NET_BIND_SERVICE Linux
内核功能来执行。
特权端口接收和发送各种敏感和特权的数据。允许Docker
使用它们可能会带来严重的影响
审计方式
通过执行以下命令列出容器的所有运行实例及其端口映射
```shell script
[root@localhost ~]# docker ps --quiet |xargs docker inspect --format '{{.Id}}:Ports={{.NetworkSettings.Ports}}' 7121e891641679fda571e67a0e9953d263feca2508b013c70ae2546f6336b1a0:Ports=map[6060/tcp:[map[HostIp:0.0.0.0 HostPort:6060]] 6061/tcp:
查看列表,并确保容器端口未映射到低于`1024`的主机端口号
### 修复建议
启动容器时,不要将容器端口映射到特权主机端口。另外,确保没有容器在`Docker`文件中特权端口映射声明
## 只映射必要的端口
### 描述
容器镜像的`Dockerfile`定义了在容器实例上默认要打开的端口。端口列表可能与在容器内运行的应用程序相关
### 隐患分析
一个容器可以运行在`Dockerfile`文件中为其镜像定义的端口,也可以任意传递运行时参数以打开一个端口列表。
此外,`Dockerfile`文件可能会进行各种更改,暴露的端口列表可能与在容器内运行的应用程序不相关。
推荐做法是不要打开不需要的端口
### 审计方式
```shell script
[root@localhost ~]# docker ps --quiet --all|xargs docker inspect --format '{{.Id}}:Ports={{.NetworkSettings.Ports}}'
83243cce85b85f9091b4c3bd7ff981762ff91c50e42ca36f2a5f47502ff00377:Ports=map[80/tcp:[map[HostIp:192.168.235.128 HostPort:18080]]]
748901568eafe1d3c21bb8e544278ed36af019281d485eb74be39b41ca549605:Ports=map[80/tcp:[map[HostIp:0.0.0.0 HostPort:8080]]]
3b8b371f5e800e25d85e7426020cb7088e6cccb5bd950ad269a185cadf6f7adc:Ports=map[]
5bf74b6014405acad5f724cb005b320a864528ac2dd48de1fbb0e37165befc71:Ports=map[]
0aede0130fd30b8cb40200aa9b61e84f0d911740617dda3dd707037655419854:Ports=map[]
cff4f40d63e7ba39cb013706f0c73351c3a99325adf606c715df63b8c81001be:Ports=map[]
查看列表,并确保映射的端口是容器真正需要的端口
参考文档
- Docker容器最佳安全实践白皮书(V1.0)
- Docker官方文档