Docker容器安全性
一、前言
一、简介
Docker容器的安全性,主要依赖于Linux系统自身,考虑Docker的安全性时,主要有:
Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面
1、Linux内核的命名空间机制提供的容器隔离安全
2、Linux控制组机制对容器资源的控制能力安全
3、Linux内核的能力机制所带来的操作权限安全
4、Docker程序(特别是服务端)本身的抗攻击性
5、其他安全增强机制对容器安全性的影响
1、命名空间隔离的安全
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间。
2、控制组资源控制的安全
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。
3、内核能力机制
能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。
4、Docker服务端防护
使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。
将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。
5、其他安全特性
在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置。
使用一些有增强安全特性的容器模板。
用户可以自定义更加严格的访问控制机制来定制安全策略。
在文件系统挂载到容器内部时,可以通过配置只读模式来避免容器内的应用通过文件系统破坏外部环境,特别是一些系统运行状态相关的目录。
————————————————
版权声明:本文为CSDN博主「是大姚呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44310047/article/details/119084971
二、系统资源调节中心
Linux Cgroups 的全称是 Linux Control Group,在/sys/fs/cgroup中有许多的子目录,分别控制每个资源,/sys/fs/cgroup/memory/下的这些变量是是物理机全局的控制
二、内存Memory
一、内存的查看
1、查看进程文件
运行一个docker,其进程为4162
进入4162进程,可以查看到其下的多个文件
这个进程包括ns,mem等内容
2、查看内存
在/sys/fs/cgroup中有许多的子目录,分别控制每个资源,我们进入到memory文件夹下,看到docker目录
可以查看到刚才运行的进程
进入刚才建立的进程,查看内存限制
3、设置内存限制
新运行一个demo程序,使用-m进行内存限制。进入cggroup管理里面查看次进程的内存,发现内存被限制在了200M。
二、内存的限制
设置内存为200M,内存的单位是字节,故200x1024x1024=209715200
注意此部分只限制了内存,swap不会参与进来
[root@server1 memory] yum install libcgroup-tools.x86_64 下载管理资源的工具
[root@server1 memory] cd /sys/fs/cgroup/memory 进入内存界面
[root@server1]memory] mkdir x1 创建x1新文件,其会继承父文件的内容
[root@server1 memory] cd x1/
[root@server1 x1] ls
[root@server1 x1] echo 209715200 > memory.limit_in_bytes 设置其内存为200M
切换到/dev/shm/目录下,该目录是一个在内存中的目录,向里面拷贝文件会直接占用内存
[root@server1 x1] cd /dev/shm/ 进入此界面进行测试
[root@server1 shm] cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=100 制造一个一直占用内存的进程大小为100x1
[root@server1 shm] cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=200 制造一个一直占用内存的进程大小为200x1
结果如下:当内存超过或等于200M的时候直接杀死进程
测试完成后删除测试文件,否则会持续占用内存。
三、cpu的限制
一、第一种方法
在cup目录下新建下x2目录,控制cup的算力为原来的十分之一
[root@server1 ~] cd /sys/fs/cgroup/cpu
[root@server1 cpu] mkdir x2
[root@server1 cpu] cd x2 具有继承性,建立x2文件进行实验
[root@server1 x2] 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@server1 x2] cat cpu.shares
1024 内存大小为1024
[root@server1 x2] echo 100 > cpu.shares 给予100,约为cpu算力的百分之10
为做对比,制造出两个dd进程,将第二个进程的id写如cup控制目录
因为3702进程设置总的算力为100,3703并没有进行限制,因此结果发现cup使用率约为9:1
结束后fg唤回程序
二、第二种方法
cpu限制为十分之二
方法同上
[root@server1 x2] dd if=/dev/zero of=/dev/null &
[1] 3735
[root@server1 x2] echo 3735 > tasks
[root@server1 x2] top
四、io
不使用文件缓存,直接用设备的输入输出
以rel7文件创建一个镜像,用–device-write-bps
限制写设备的bps速度为30M。
docker run -it —rm -device-write-bps /dev/vda:30MB rel7 bash
在镜像里面的oflag=direct
表示,不通过内存到io设备,直接接入io设备,此时可以看到用了6.6秒,如果没有这个oflag=direct参数,速度就很快。
五、安全加固
一、利用LXCFS增强docker容器隔离性和资源可见性
[root@server1 lxcfs] yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm %安装插件
[root@server1 lxcfs] lxcfs /var/lib/lxcfs & %运行
[root@server1 lxcfs] docker run -it -m 256m \ %创建容器,内存限制为256MB
-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
结果显示总共只有256的内存
二、设置特权级运行的容器
不加–privileged=true这个参数,无法关闭eth0,加了–privileged=true这个参数后,就可以关闭了
三、设置容器白名单:–cap-add
但是上面是权限都给,有点不放心,我们想做到需要什么给什么,而不是直接都给。
加入–cap-add=NET_ADMIN这个参数,就可以控制网络ip的添加和删除了
没给权限则不能修改网络
四、其他安全加固的思路
使用安全的基础镜像
删除镜像中的setuid和setgid权限
启用Docker的内容信任
最小安装原则
对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
容器使用非root用户运行