docker安全--及容器资源控制CPU,内存,硬盘,IO限制--及安全加固

1.docker 安全

docker 容器的安全很大程度上依赖 linux 本身,因为是共享宿主机内核
docker 安全评估主要考虑以下几个方面:
1)linux 内核的命名空间(namespace)机制提供的容器隔离安全
2)linux 控制组(cgroup)对容器资源的控制能力安全
3)linux 内核的能力机制所带来的操作系统安全
4)docker 程序(主要是服务器端)本身的抗攻击能力
5)其他安全增强机制的影响

1.1命名空间隔离安全:docker run 启动一个容器时,后台会为容器创建一个独立的命名空间,

这是最基础的隔离,让容器作为一个独立的个体存在
[root@server2 ~]# docker run -it --name vm1 ubuntu #运行一个容器
ctrl + p + q 退出,让容器保持运行
[root@server2 ~]# docker inspect vm1 | grep Pid #容器其实就是一个进程,查看他的
在这里插入图片描述

在这里插入图片描述
这种方式与传统虚拟机相比,隔离的不彻底,因为容器就是一个进程,那么多个容器就还是共用宿主机的内核
在 linux 内核中,有些资源和对象不能被 namespace 化,如:时间

1.2控制组资源控制安全: docker run 启动一个容器时,后台会为容器创建一个独立的控制组策略集合

[root@server2 ns]# mount -t cgroup ##可以看到被挂接到/sys/fs/cgroup
[root@server2 ns]# cd /sys/fs/cgroup/cpu/docker #docker 容器的 cpu 分配
在这里插入图片描述

1.3内核能力机制:是 linux 内核的一个强大特性,可提供细粒度的权限访问控制

大部分情况下,容器并不需要真正的 root 权限,只要少数能力即可
如下容器不能关闭网卡
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200528233613708.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjExOTg2OA==,size_16,color _FFFFFF,t_70)

1.4 docker 服务端的防护

确保只有可信的用户才能访问到 docker 服务;将容器的 root 用户
映射到本地主机的非 root 用户,减轻容器和主机之间因权限提升而引起的安全问题;允许
docker 服务端在非 root 权限下运行,利用安全可靠的子进程来代理执行需要特权的操作(子
进程只允许在特定范围内操作)

1.5其他安全特性

使用有增强安全特性的容器模板;用户可以定义更加严格的访问控制机制等
(比如文件系统挂载到容器内部时,设置只读)

2.容器资源控制

linux Cgroups:是限制一个进程组使用资源的上限,包括 cpu、内存、磁盘、带宽等
[root@server2 ~]# mount -t cgroup 看到都挂载在/sys/fs/cgroup 下,df 也可以看

2.1 cpu限制

在这里插入图片描述
[root@server1 ~]# cd /sys/fs/cgroup/
cd cpu
mkdir a1 # 发现a1目录下的目录是复制了上级目录
在这里插入图片描述
[root@server2 cpu]# cat cpu.rt_period_us
1000000
[root@server2 cpu]# cat a1/cpu.rt_period_us #可以看出子控制器和父级值是一样的,父
级是针对所有控制器,子控制器的值可修改,针对某进程
1000000
操作系统层面控制(也可以在容器内)
在这里插入图片描述
[root@server2 ~]# yum search cgroup ##查找 cgroup 命令行工具
[root@server2 ~]# yum install -y libcgroup-tools.x86_64
[root@server1 cpu]# cat cpu.cfs_period_us #cpu 调用周期,单位:微秒
100000
[root@server1 cpu]# cat cpu.cfs_quota_us #配额限制,-1 表示不限制
-1

[root@server1 a1]# echo 20000 > cpu.cfs_quota_us #表示 100000 微秒的周期内,
只能使用 20000,也就是 20%

验证:
[root@server1 a1]# dd if=/dev/zero of=/dev/null & #这是一个无限循环的进程,不会占用磁盘和 IO,只会消耗 cpu
查看top:CPU占用率99.0%和我们设置的不一样,是因为没有关联
在这里插入图片描述
[root@server2 a1]# echo 56536 > tasks ##让进程 id 和 tasks 关联

[root@server2 a1]# top ##再看,改变
在这里插入图片描述

再次查看:
在这里插入图片描述
[root@server1 a1]# docker run --help | grep cpu
[root@server1 a1]# docker run -it --name vm2 --cpu-period 100000 --cpu-quota 20000 ubuntu #和刚才限制一样
在这里插入图片描述
[root@server12~]# docker container attach vm2
root@43a2eb46a009:/# dd if=/dev/zero of=/dev/null &
在这里插入图片描述

2.2.内存限制

容器可用内存包括:物理内存、swap 分区(操作系统也是)
但是一旦切换到 swap 分区,性能就不能保证了,因为 swap 是物理硬盘,当然没有内存快
容器的资源限制很简单 docker run -it --memory 256M --memory-swap=256M ubuntu

操作系统层面的限制’ [root@server2 ~]# cd /sys/fs/cgroup/memory
[root@server2 a2]# cat memory.limit_in_bytes #内存限额,默认不限制
比如限制只能使用 256M 25610241024=268435456
[root@server2 a2]# echo 268435456 > memory.limit_in_bytes
测试
在这里插入图片描述

[root@server2 a2]# free -m
在这里插入图片描述
在这里插入图片描述
发现300M也可以截取
注意这里可用内存并没有减少,因为使用了 swap
'多出去的不能使用内存,所以使用了 swap

怎么彻底限制

[root@server2 shm]# cd /sys/fs/cgroup/memory/a2/
[root@server2 a2]# echo 268435456 > memory.memsw.limit_in_bytes
表示物理内存和 swap 一共不能超过 256M

写入时报错,因为 bigfile 占用了 swap
需要删除:[root@server1 shm]# rm -fr bigfile
在这里插入图片描述
[root@server2shm]# cgexec -g memory:a2 dd if=/dev/zero of=bigfile bs=1M count=400
cgexec 命令,可以直接在命令行控制资源组
Killed #限制成功
在这里插入图片描述

2.3 block io 限制:对系统磁盘读写的限制

先看文件系统层面的
[root@server1 ~]# cd /sys/fs/cgroup/blkio
#blkio.throttle.read_bps_device 每秒读的数据量
#blkio.throttle.read_iops_device 每秒的 io 操作次数

在这里插入图片描述
#docker 里也有相关参数
[root@server1 blkio]# docker run --help | grep device

‘测试每秒写入数据量为 1M’ [root@server1 blkio]# fdisk -l #看到当前使用磁盘为/dev/sda
[root@server1 blkio]# ll /dev/sda
brw-rw---- 1 root disk 8, 0 Aug 18 11:24 /dev/sda ##看到磁盘的主号和辅号(8 和 0)
在这里插入图片描述
[root@server1 ~]# cd /sys/fs/cgroup/blkio/a3
[root@server1 a3]# echo “8:0 1048576” > blkio.throttle.write_bps_device #1024* 1024 = 1048576
在这里插入图片描述
#测试
[root@server1 ~]# cgexec -g blkio:a3 dd if=/dev/zero of=testfile bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00393195 s, 2.7 GB/s #发现没有生效
在这里插入图片描述
'注意:目前 block io 限制只对 direct io 有效(不使用文件缓存)
'[root@server2 ~]# cgexec -g blkio:a3 dd if=/dev/zero of=testfile bs=1M count=10 oflag=direct
在这里插入图片描述
docker 中的 blockio 限制
[root@server1 ~]# docker run -it --name vm1 --device-write-bps /dev/sda:1MB
ubuntu #创建镜像
root@fbab1853b6ee:/# dd if=/dev/zero of=testfile bs=1M count=10 oflag=direct#限速
在这里插入图片描述
ctrl + p + q 退出
[root@server1 ~]# cd
/sys/fs/cgroup/blkio/docker/XXXX
8:0 1048576 ##看到和之前手动写入的一样
在这里插入图片描述

2.4 其他限制

[root@server2 ~]# cd /sys/fs/cgroup/freezer #管控系统进程暂停与恢复的
在这里插入图片描述

查看进程号
在这里插入图片描述
查看活跃状态
在这里插入图片描述
冻结

[root@server2 ~]# docker container pause vm1
[root@server2 ~]# ps ax

在这里插入图片描述
在这里插入图片描述
解除冻结

[root@server2 ~]# docker container unpause vm1

在这里插入图片描述

3.docker 安全加固

3.1 lxcfs 增强 docker 容器的隔离性和资源可见性

yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm

[root@server1 ~]# lxcfs /var/lib/lxcfs &
在这里插入图片描述
/var/lib/lxcfs 是 lxcfs 默认数据目录
cgroup proc #cgroup 是资源限制,proc 是系统信息
在这里插入图片描述
[root@server1 ~]# docker run -it --name vm2 -m 256M \ #创建容器,把相应的内容
挂载到容器内
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo
-v /var/lib/lxcfs/proc/stat:/proc/stat
-v /var/lib/lxcfs/proc/swaps:/proc/swaps
-v /var/lib/lxcfs/proc/uptime:/proc/uptime
ubuntu
root@b2c9c4c1a1e8:/# free -m ##这时候看到的就是 256M
在这里插入图片描述

3.2 设置特权级运行的容器:–privileged=true

#默认这个权限是被禁掉的
[root@server12~]# docker run -it --name vm3 --privileged=true ubuntu #成功添加
root@7794412d20e3:/# ip addr add 172.17.0.4/24 dev eth0
root@7794412d20e3:/# ip addr
在这里插入图片描述
默认情况下这个权限比较大,基本上接近宿主机的权限,为了防止用户的权限滥用,需要增加机制,只提供给容器必要的权限’ [root@server1 ~]# docker inspect vm3 | grep Pri “Privileged”: true, #表示特权权限已经开启,默认是 False
[root@server1 ~]# docker inspect vm2 | grep Pri #其他是 false
在这里插入图片描述

3.3 设置容器白名单: --cap-add

http://man7.org/linux/man-pages/man7/capabilities.7.html ##capability 权限查询

*[root@server2 ~]# docker run -it --name vm4  --cap-add=NET_ADMIN ubuntu  #可以控制网络,但其他不行

root@70691a17dc65:/# ip addr add 172.17.0.4/24 dev eth0
root@70691a17dc65:/# ip addr

在这里插入图片描述

[root@server1 ~]# docker inspect vm4 | grep Pri #特权关闭
在这里插入图片描述
docker inspect vm4 | grep Cap ##看不全
在这里插入图片描述

[root@server2 ~]# docker inspect vm4 | less
[root@server2 ~]# docker inspect -f {{.HostConfig.Privileged}} vm4 #查看指定字段的值
false
[root@server2 ~]# docker inspect -f {{.HostConfig.CapAdd}} vm4
[NET_ADMIN]

在这里插入图片描述

4.安全加固思路

1.保证镜像安全:使用安全的基础镜像;删除镜像中的 setuid 和 setgid 权限(suid、sgid);
启用 docker 内容信任(证书认证);最小安装原则;对镜像进行安全漏洞扫描,镜像安全扫描
器(Clair);容器使用非 root 运行
2.保证容器安全:对 docker 主机进行安全加固;限制容器之间的网络流量(某个容器流量升高,
会对其他容器或主机有影响);配置 docker 守护程序的 TLS 身份验证;启用用户命名空间支
持(userns-remap 参数,在容器第一次启动前就要加上,写在/etc/docker/daemon.json 文
件里,还需要对 docker 数据目录做权限配置 /var/lib/docker);限制容器内存使用量;适当
设置容器 CPU 优先级,/sys/fs/cgroup/cpu/cpu.shares 这个文件里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值