Docker安全
Linux内核的命名空间机制提供的容器隔离安全。
Linux控制组机制对容器资源的控制能力安全。
Linux内核的能力机制所带来的操作权限安全
Docker程序(特别是服务端)本身的抗攻击性。
其他安全增强机制对容器安全性的影响。
docker与系统共享内核,在宿主机上产生相应的进程 (Pid参数)
Linux Cgroups 限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
Linux Cgroups 给用户暴露出来的操作接口是文件系统。
它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
Docker进行CPU限额
cpu_period 和 cpu_quota 这两个参数需要组合使用,用来限制进程在长度为 cpu_period 的一段时间内,只能被分配到总量为 cpu_quota 的CPU 时间,以上设置表示20%的cpu时间。
--cpu-period=100000 设定CPU时间的大小
--cpu-quota=20000 以上CPU时间内,本进程占用的CPU时间(20000/100000)
/sys/fs/cgroup/cpu/cpu.cfs_period_us
/sys/fs/cgroup/cpu/cpu.cfs_quota_us
/sys/fs/cgroup/cpu/tasks:记录本目录下的限制的进程PID
创建新的测试目录(自动复制上层目录限制文件)
设置CPU限制(总时间为20000)
echo "20000" > cpu.cfs_quota_us
创建容器,将pid放入tasks中
docker run -it --name vm1 --cpu-quota 20000 ubuntu
在容器中执行以下测试命令
dd if=/dev/zero of=/dev/null &
ctrl+pq后台运行
添加Pid至tasks文件
echo "1566" > tasks
查看结果
删除测试目录
cgdelete cpu:test
Docker进行memory(内存)限额
memory+swap
yum install -y libcgroup-tools.x86_64
参数
指定内存 --memory 200M
指定swap分区 --memory-swap=200M
内存 /sys/fs/cgroup/memory/test/memory.limit_in_bytes 设置内存限制
swap /sys/fs/cgroup/memory/test/memory.memsw.limit_in_bytes 设置SWAP限制
查看参数内存信息
进入目录/sys/fs/cgroup/memory/,限制内存最大使用为300M
echo "314572800" > memory.limit_in_bytes
测试
cgexec -g memory:test dd if=/dev/zero of=test bs=1M count=400
发现swap被使用了100M
限制可用SWAP也为300M,再次创建,失败
设置对应的docker容器下的memory的内存相应的操作权限 (cgred服务)
新建用户student
设置其限制参数
systemctl start cgred.service
编辑 /etc/cgrules.conf
student memory test/
重新启动服务
systemctl restart cgred.service
切换至用户student
进入/dev/shm目录,开始写入
测试
dd if=/dev/zero of=/dev/shm/test bs=1M count=298M成功
大于298M全部失败,内存被限制在了300M左右
限制读写速度(/sys/fs/cgroup/blkio/)
--device-read-bps list 以byte为单位限制读速度
--device-read-iops list 以IO效率为单位限制读速度
--device-write-bps list 以byte为单位限制写速度
--device-write-iops list 以IO效率为单位限制读速度
设置限制
docker run -it --name vm3 --device-write-bps /dev/sda:10M ubuntu
测试
dd if=/dev/zero of=file bs=1M count=30 oflag=direct
利用文件冻结和启动文件
文件
利用LXCFS增强docker容器隔离性和资源可见性
原因:在运行容器时指定了容器的相应的内存大小及其相应的swap分区大小,但是在容器内查看时发现其使用率相应大小还是与宿主机相同,因此容器的隔离性不好
安装lxcfs,并指定目录
yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y
lxcfs /var/lib/lxcfs/ &
查看生成的文件
ll /var/lib/lxcfs/
指定参数生成容器
docker run -it -m 300m \
-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 \
--name ubuntu \
ubuntu
此时参数被严格限制
设置特权级运行的容器:–privileged=true
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。
设置容器白名单:–cap-add
–privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker 提供了权限白名单的机制,使用–cap-add添加必要的权限。
安全加固:
镜像:
安全的基础镜像
删除镜像中的SUID,SGID权限
启用Dokcer的内容信任
最小安装原则
使用Clair进行镜像安全扫描
使用非root用户运行容器
容器:
Docker主机进行安全加固
限制容器之间网络流量
配置Docker守护程序的TLS身份
启用用户命名空间的支持(userns-remap)
限制容器的内存使用量
适当设置CPU的优先级
Dokcer工具:
Docker Bench for Security
Clair
Cilium
Anchore