文章目录

  • 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,

docker容器安全风险 docker 容器安全_2d

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

docker容器安全风险 docker 容器安全_docker_02

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占用

docker容器安全风险 docker 容器安全_2d_03

#关一个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%

docker容器安全风险 docker 容器安全_docker_04

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%

docker容器安全风险 docker 容器安全_docker容器安全风险_05

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/

docker容器安全风险 docker 容器安全_ubuntu_06

[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

docker容器安全风险 docker 容器安全_ubuntu_07

[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

docker容器安全风险 docker 容器安全_docker容器安全风险_08

[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

docker容器安全风险 docker 容器安全_2d_09

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

docker容器安全风险 docker 容器安全_ubuntu_10

设置特权级运行的容器
#--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退出

docker容器安全风险 docker 容器安全_docker容器安全风险_11

/ # [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

docker容器安全风险 docker 容器安全_2d_12

设置容器白名单
#--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": [

docker容器安全风险 docker 容器安全_docker_13

安全加固的思路
  • 保证镜像的安全:
    使用安全的基础镜像
    删除镜像中的setuid和setgid权限
    启用Docker的内容信任
    最小安装原则
    对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
    容器使用非root用户运行
  • 保证容器的安全
    对docker宿主机进行安全加固
    限制容器之间的网络流量
    配置Docker守护程序的TLS身份验证
    启用用户命名空间支持(userns-remap)
    限制容器的内存使用量
    适当设置容器CPU优先级