docker安全:理解docker安全、容器资源控制、docker的安全加固
这里写自定义目录标题
一、理解docker安全
-
Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
Linux内核的命名空间机制提供的容器隔离安全
Linux控制组机制对容器资源的控制能力安全。
Linux内核的能力机制所带来的操作权限安全
Docker程序(特别是服务端)本身的抗攻击性。
其他安全增强机制对容器安全性的影响。 -
命名空间隔离的安全
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命 名空间。命名空间提供了最基础也最直接的隔离。
与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间。 -
控制组资源控制的安全
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分 享主机的内存、CPU、磁盘IO等资源。
确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。 -
内核能力机制
能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。 -
Docker服务端防护
使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。
将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。 -
其他安全特性
在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置。
使用一些有增强安全特性的容器模板。
用户可以自定义更加严格的访问控制机制来定制安全策略。
在文件系统挂载到容器内部时,可以通过配置只读模式来避免容器内的应用通过文件系统破坏外部环境,特别是一些系统运行状 态相关的目录。
二、容器资源控制
- 查看宿主机信息:
cat /proc/meminfo
- cgroup挂载点:
/sys/fs/cgroup
- 启动容器的位置:
[aaa@qq.com docker]# pwd
/sys/fs/cgroup/cpu/docker
[aaa@qq.com docker]# cat cpu.cfs_period_us cpu的时间段
100000
[aaa@qq.com docker]# cat cpu.cfs_quota_us -1表示在时间段内使用所给的所有cpu
-1
cpu控制
- 给容器进行cpu限额
[aaa@qq.com docker]# docker run -it --cpu-period=100000 --cpu-quota=20000 busyboxplus
[aaa@qq.com ada73e87c8cb5374f0deb31f0f5c0740283c1e73381787060f228462502847c1]# pwd
/sys/fs/cgroup/cpu/docker/ada73e87c8cb5374f0deb31f0f5c0740283c1e73381787060f228462502847c1
[aaa@qq.com ada73e87c8cb5374f0deb31f0f5c0740283c1e73381787060f228462502847c1]# cat cpu.cfs_period_us
100000
[aaa@qq.com ada73e87c8cb5374f0deb31f0f5c0740283c1e73381787060f228462502847c1]# cat cpu.cfs_quota_us
20000
dd if=/dev/zero of=/dev/null &
- 安装cgroup
[aaa@qq.com ~]# yum search cgroup
[aaa@qq.com ~]# yum install -y libcgroup-tools.x86_64
- 修改cpu的在线个数
[aaa@qq.com cpu]# pwd
/sys/devices/system/cpu
0表示1个cpu在线
[aaa@qq.com cpu]# cat online
0
修改cpu在线个数
[aaa@qq.com cpu]# echo 0 > online
- 控制cpu的优先级
[aaa@qq.com cpu]# pwd
/sys/fs/cgroup/cpu
创建x1控制器
[aaa@qq.com cpu]# cgcreate -g cpu:x1
[aaa@qq.com cpu]# cd x1/
[aaa@qq.com x1]# ls
cgroup.clone_children cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release
cgroup.event_control cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks
将优先级改为200
[aaa@qq.com cpu]# pwd
/sys/fs/cgroup/cpu
[aaa@qq.com cpu]# cat x1/cpu.shares
200
[aaa@qq.com cpu]# cgexec -g cpu:x1 dd if=/dev/zero of=/dev/null &
[aaa@qq.com cpu]# top
- 控制百分比
[aaa@qq.com x1]# pwd
/sys/fs/cgroup/cpu/x1
[aaa@qq.com x1]# cat cpu.cfs_quota_us
-1
[aaa@qq.com x1]# echo 20000 > cpu.cfs_quota_us
[aaa@qq.com x1]# cat cpu.cfs_quota_us
20000
[aaa@qq.com x1]# cgexec -g cpu:x1 dd if=/dev/zero of=/dev/null &
[1] 3710
[aaa@qq.com x1]# top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3710 root 20 0 107996 620 524 R 19.9 0.1 0:02.19 dd
- 删除x1控制器
[aaa@qq.com cpu]# cgdelete -g cpu:x1
内存控制
- 当物理内存不够使用时,使用swap交换分区
- memory控制器的位置
[aaa@qq.com memory]# pwd
/sys/fs/cgroup/memory
- 创建一个memory控制器
[aaa@qq.com memory]# cgcreate -g memory:x2
- 限制内存为200m
[aaa@qq.com memory]# cd x2/
[aaa@qq.com memory]# cat memory.limit_in_bytes
9223372036854771712
[aaa@qq.com x2]# echo 209715200 > memory.limit_in_bytes
[aaa@qq.com x2]# cat memory.limit_in_bytes
209715200
[aaa@qq.com shm]# pwd
/dev/shm
[aaa@qq.com shm]# cgexec -g memory:x2 dd if=/dev/zero of=bigfile bs=1M count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 0.22588 s, 1.4 GB/s
[aaa@qq.com shm]# free -m # 只允许用200
total used free shared buff/cache available
Mem: 991 140 420 210 430 493
Swap: 2047 103 1944
释放内存
[aaa@qq.com shm]# rm -f bigfile
[aaa@qq.com shm]# free -m
total used free shared buff/cache available
Mem: 991 138 619 12 233 692
Swap: 2047 0 2047
内存+swap空间总共限制200
[aaa@qq.com x2]# pwd
/sys/fs/cgroup/memory/x2
[aaa@qq.com x2]# echo 209715200 > memory.memsw.limit_in_bytes
[aaa@qq.com x2]# cat memory.limit_in_bytes
209715200
内存溢出
[aaa@qq.com shm]# cgexec -g memory:x2 dd if=/dev/zero of=bigfile bs=1M count=300
Killed
[aaa@qq.com shm]# free -m
total used free shared buff/cache available
Mem: 991 138 420 211 432 493
Swap: 2047 0 2047
[aaa@qq.com ~]# docker run --memory 200M --memory-swap 200M -it busyboxplus
io控制
[aaa@qq.com ~]# ll /etc/security/limits.conf # 可以控制但是不准确
-rw-r--r--. 1 root root 2422 Nov 4 2017 /etc/security/limits.conf
- 系统io限制位置
[aaa@qq.com blkio]# pwd
/sys/fs/cgroup/blkio
- 限制docker的吞吐量
# 读吞吐量和写吞吐量
[aaa@qq.com blkio]# docker run --help|grep bps
--device-read-bps list Limit read rate (bytes per second) from a device (default [])
--device-write-bps list Limit write rate (bytes per second) to a device (default [])
导出镜像并打包
[aaa@qq.com ~]# docker save ubuntu -o ubuntu.tar
[aaa@qq.com ~]# scp ubuntu.tar server2:/root/
导入镜像
[aaa@qq.com ~]# docker load -i ubuntu.tar
Loaded image: ubuntu:latest
[aaa@qq.com ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
[aaa@qq.com ~]# docker run --device-write-bps /dev/sda:10M -it ubuntu
# 每次1M100次,每秒限制10M
aaa@qq.com0fa5ed5ea93d:/# dd if=/dev/zero of=bigfile bs=1M count=100 oflag=direct # 直连io不过缓存
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 9.95116 s, 10.5 MB/s
三、docker的安全加固
- 删除停止的仓库
[aaa@qq.com ~]# docker container prune
- 利用lxcfx增强docker容器隔离性和资源可见性
[aaa@qq.com ~]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
默认存放数据目录
[aaa@qq.com ~]# cd /var/lib/lxcfs/
- 运行
[aaa@qq.com ~]# lxcfs /var/lib/lxcfs/ &
[1] 4420
[aaa@qq.com ~]# hierarchies:
0: fd: 5: memory
1: fd: 6: devices
2: fd: 7: hugetlb
3: fd: 8: cpuacct,cpu
4: fd: 9: cpuset
5: fd: 10: perf_event
6: fd: 11: blkio
7: fd: 12: pids
8: fd: 13: net_prio,net_cls
9: fd: 14: freezer
10: fd: 15: name=systemd
[aaa@qq.com lxcfs]# docker run -it -m 256m \
> -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
> -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
> -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
> -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
> -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
> -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
> ubuntu
aaa@qq.com:/# free -m
total used free shared buff/cache available
Mem: 256 3 252 12 0 252
Swap: 256 0 256
[aaa@qq.com docker]# pwd
/sys/fs/cgroup/memory/docker
[aaa@qq.com docker]# cat dfbfb925d658660af2f7196c2c2d6a5f3d2fae997a71611affb8c48e24395753/memory.limit_in_bytes
268435456
- 设置特权运行的容器
[aaa@qq.com docker]# docker run --privileged=true -it --rm ubuntu
# 可以看到fdisk的信息,得到了root的权限
aaa@qq.com7fb20f0b38b3:/# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
只开启控制网络的权限
[aaa@qq.com docker]# docker run -it --cap-add=NET_ADMIN --name vm1 busyboxplus
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
13: aaa@qq.com: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ip link set down dev eth0 # 关掉eth0
/ # ping 172.17.0.1 # 网络不可达
PING 172.17.0.1 (172.17.0.1): 56 data bytes
ping: sendto: Network is unreachable
/ # ip link set up dev eth0
/ # ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: seq=0 ttl=64 time=0.061 ms
- 安全加固的思路
- 保证容器的安全
- docker安全的遗留问题
- docker安全的顶尖开元工具
推荐阅读
-
生产环境中安全运行Docker容器
-
浅谈Docker安全机制内核安全与容器之间的网络安全 原创
-
优雅地实现安全的容器编排_-_Docker_Secrets wordpressmysql浏览器socket工作
-
对于Docker使用的一些安全配置建议
-
elk日志系统,docker-compose部署,以及给elk加个安全保障所遇到的种种问题
-
Docker开启远程安全访问的图文教程详解
-
centos7上实现docker的安全访问-基于CA认证
-
docker安全:理解docker安全、容器资源控制、docker的安全加固
-
Docker启用TLS实现安全配置的步骤
-
Docker对企业云安全产生的影响是怎样的?