文章目录
- 1.docker安全的理解
- 1)linux内核的命名空间机制提供的容器隔离安全
- 2)linux控制组机制
- 3)linux内核的命名空间隔离的安全
- 4)控制组资源控制的安全
- 2.容器的资源控制
- 1)CPU限额
- 2)内存限制
- 3)容器内资源控制,会自动计算
- 3.docker安全加固
- 设置特权级运行的容器
- 设置容器白名单
- 安全加固的思路
1.docker安全的理解
评估Docker的安全性时,主要考虑以下几个方面:
- Linux内核的命名空间机制提供的容器隔离安全 :
通过Linux namespace来实现的隔离,但不是完全隔离,只是对安全问题来说的。
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间。 - Linux控制组机制对容器资源的控制能力安全。:
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合,能够提供很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。且不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。 - Linux内核的能力机制所带来的操作权限安全
- Docker程序(特别是服务端)本身的抗攻击性。
- 其他安全增强机制对容器安全性的影响。
1)linux内核的命名空间机制提供的容器隔离安全
2)linux控制组机制
[root@server12 ~]# docker run -d --name demo nginx
[root@server12 ~]# docker inspect demo|grep Pid
"Pid": 3863,
"PidMode": "",
"PidsLimit": null,
3)linux内核的命名空间隔离的安全
#容器就是一个特殊的进程
4)控制组资源控制的安全
[root@server12 ns]# cd /sys/fs/cgroup/
[root@server12 cgroup]# cd cpu/docker/
[root@server12 docker]# ls
[root@server12 docker]# cd 24153aebd9f6408cd54dd649e9fbc1991e54af3ce7bf38c9995e76887abd5fdc
[root@server12 24153aebd9f6408cd54dd649e9fbc1991e54af3ce7bf38c9995e76887abd5fdc]# cat tasks
3863
3919
[root@server12 24153aebd9f6408cd54dd649e9fbc1991e54af3ce7bf38c9995e76887abd5fdc]# cat cpu.shares
1024
[root@server12 24153aebd9f6408cd54dd649e9fbc1991e54af3ce7bf38c9995e76887abd5fdc]# cat cpu.cfs_period_us
2.容器的资源控制
1)CPU限额
[root@server12 cpu]# cd docker/
[root@server12 docker]# pwd
/sys/fs/cgroup/cpu/docker
[root@server12 docker]# ls
cgroup.clone_children cpuacct.usage_percpu cpu.shares
cgroup.event_control cpu.cfs_period_us cpu.stat
cgroup.procs cpu.cfs_quota_us notify_on_release
cpuacct.stat cpu.rt_period_us tasks
cpuacct.usage cpu.rt_runtime_us
[root@server12 docker]# cat cpu.cfs_period_us#CPU时间100000
[root@server12 docker]# docker run --help|grep cpu
[root@server12 docker]# docker run -it --rm --cpu-quota 20000 ubuntu#20%
root@5f0341552d2d:/# dd if=/dev/zero of=/dev/null &
[1] 9
另开一个shell监控top,CPU占用
#关一个cpu,留一个cpu用,使之出现争抢的效果
[root@server12 docker]# cd /sys/devices/system/cpu/
[root@server12 cpu]# ls
cpu0 isolated modalias offline possible present uevent
cpuidle kernel_max nohz_full online power smt vulnerabilities
cd cpu1/
echo 0 > online
[root@server12 cpu]# docker run -it --rm ubuntu
root@21b61f7b5866:/# dd if=/dev/zero of=/dev/null &
[1] 9
#ctrl+p+q
root@21b61f7b5866:/# [root@server12 cpu]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21b61f7b5866 ubuntu "/bin/bash" 33 seconds ago Up 31 seconds loving_chebyshev
[root@server12 cpu]# docker run -it --rm ubuntu
root@e84802289cf8:/# dd if=/dev/zero of=/dev/null &
[1] 9
#看top各50%
root@e84802289cf8:/# exit
[root@server12 cpu]# docker run --help|grep cpu
[root@server12 cpu]# docker run --rm --cpu-shares 512 ubuntu
[root@server12 cpu]# docker run -it --rm --cpu-shares 512 ubuntu
root@ea83d0afa54d:/# dd if=/dev/zero of=/dev/null &
[1] 9
#看top,争抢资源的优先权512,第二个进程争抢25%
2)内存限制
%%%操作系统交换工具,当物理内存不够时使用的应急手段
[root@server12 cpu]# cd /sys/fs/cgroup/memory/
[root@server12 memory]# mkdir x1
[root@server12 x1]# yum install -y libcgroup-tools.x86_64
[root@server12 x1]# ls
%%内存+swap一共给200M,#avaolable=free+buff/cache
[root@server12 x1]# echo 209715200 > memory.limit_in_bytes
[root@server12 x1]# echo 209715200 > memory.memsw.limit_in_bytes
[root@server12 x1]# cd /dev/shm
[root@server12 shm]# df
tmpfs 1023544 0 1023544 0% /dev/shm
[root@server12 shm]# free -m
total used free shared buff/cache available
Mem: 1999 194 1164 16 640 1622
Swap: 2047 0 2047
[root@server12 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300##内存子系统x1的bigfile直接消耗系统内存,bigfile不可共享
Killed#只给用200M,多了不让用
[root@server12 shm]# free -m
total used free shared buff/cache available
Mem: 1999 194 1164 16 640 1423
Swap: 2047 0 2047
[root@server12 shm]# du -h bigfile#只给用200M,多了不让用
199M
[root@server12 shm]# rm -fr bigfile
[root@server12 shm]# useradd wxh
[root@server12 ~]# vim /etc/cgrules.conf
最后一行添加
wxh memory x1/
[root@server12 ~]# systemctl start cgred.service
[root@server12 ~]# su - wxh
[wxh@server12 ~]$ dd if=/dev/zero of=bigfile bs=1M count=200
Killed#不能超过200M
[wxh@server12 shm]$ free -m
total used free shared buff/cache available
Mem: 1999 200 953 214 845 1417
Swap: 2047 0 2047
[wxh@server12 shm]$ du -h bigfile
199M bigfile
[wxh@server12 shm]$ exit
logout
[root@server12 shm]# vim /etc/cgrules.conf #删除最后一行wxh,重启服务,就不受大小限制
[root@server12 shm]# systemctl restart cgred.service
[root@server12 shm]# su - wxh
Last login: Thu Jan 28 19:14:43 +08 2021 on pts/0
[wxh@server12 ~]$ cd /dev/shm/
[wxh@server12 shm]$ ls
bigfile
[wxh@server12 shm]$ dd if=/dev/zero of=bigfile bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 0.786068 s, 267 MB/s
[wxh@server12 shm]$ rm -fr bigfile
3)容器内资源控制,会自动计算
[root@server12 shm]# docker run --help |grep memory
[root@server12 shm]# docker run -d --name demo --memory 200M --memory-swap 200M nginx
[root@server12 ~]# cd /sys/fs/cgroup/memory/docker/
[root@server12 docker]# ls
f305b8af8799d94ae14316fa847057bbcad163f022de1287e3121341c8f08f5e
[root@server12 docker]# cd f305b8af8799d94ae14316fa847057bbcad163f022de1287e3121341c8f08f5e
[root@server12 f305b8af8799d94ae14316fa847057bbcad163f022de1287e3121341c8f08f5e]# ls
[root@server12 f305b8af8799d94ae14316fa847057bbcad163f022de1287e3121341c8f08f5e]# cat memory.limit_in_bytes
209715200
[root@server12 f305b8af8799d94ae14316fa847057bbcad163f022de1287e3121341c8f08f5e]# cat memory.memsw.limit_in_bytes
209715200
[root@server12 shm]# docker rm -f loving_chebyshev
loving_chebyshev
[root@server12 shm]# docker run -it --device-write-bps /dev/vda:30MB ubuntu
root@1bde4226e5a8:/# dd if=/dev/zero of=bigfile bs=1M count=100 oflag=direct#oflag直连
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.31855 s, 31.6 MB/s
3.docker安全加固
[root@zhenji file_recv]# scp lxcfs-2.0.5-3.el7.centos.x86_64.rpm root@192.168.100.242:
[root@server12 ~]# ls
convoy convoy.tar.gz lxcfs-2.0.5-3.el7.centos.x86_64.rpm nginx.tar registry.tar
[root@server12 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y
[root@server12 ~]# lxcfs /var/lib/lxcfs &
[1] 5871
[root@server12 ~]# hierarchies:
0: fd: 6: memory
1: fd: 7: cpuset
2: fd: 8: hugetlb
3: fd: 9: freezer
4: fd: 10: perf_event
5: fd: 11: pids
6: fd: 12: blkio
7: fd: 13: net_prio,net_cls
8: fd: 14: devices
9: fd: 15: cpuacct,cpu
10: fd: 16: name=systemd
[root@server12 ~]# cd /var/lib/lxcfs/
[root@server12 lxcfs]# ls
cgroup proc
[root@server12 lxcfs]# cd proc/
[root@server12 proc]# ls
cpuinfo diskstats meminfo stat swaps uptime
[root@server12 proc]# cd ..
[root@server12 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
root@1f0012a71234:/# free -m
设置特权级运行的容器
#--privileged=true全开,相当于超级用户,有风险
[root@server12 ~]# docker run -it --rm --privileged=true busybox
/ # ip addr
/ # ip addr add 172.17.0.10/24 dev eth0
/ # ping 172.17.0.10
/ # ip addr del 172.17.0.10/24 dev eth0
#ctrl+p+q退出
/ # [root@server12 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79a67874924c busybox "sh" About a minute ago Up About a minute peaceful_elion
78b117347940 nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 80/tcp demo
[root@server12 ~]# docker inspect 79a67874924c|grep Privileged
"Privileged": true,
[root@server12 ~]# docker rm -f 79a67874924c
79a67874924c
[root@server12 ~]# docker rm -f 78b117347940
设置容器白名单
#--cat-add #设置容器白名单。更安全一些
[root@server12 ~]# docker run -it --rm --cap-add=NET_ADMIN busybox
/ # ip link set down dev eth0
/ # ip addr
/ # ip link set up dev eth0
/ # ip addr
#ctrl+p+q退出
[root@server12 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7b0a02d5d33 busybox "sh" About a minute ago Up About a minute great_austin
[root@server12 ~]# docker inspect e7b0a02d5d33|grep CapAdd
"CapAdd": [
安全加固的思路
- 保证镜像的安全:
使用安全的基础镜像
删除镜像中的setuid和setgid权限
启用Docker的内容信任
最小安装原则
对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
容器使用非root用户运行 - 保证容器的安全
对docker宿主机进行安全加固
限制容器之间的网络流量
配置Docker守护程序的TLS身份验证
启用用户命名空间支持(userns-remap)
限制容器的内存使用量
适当设置容器CPU优先级