其他分享
首页 > 其他分享> > Docker安全(使用Cgroups机制实现容器资源控制)

Docker安全(使用Cgroups机制实现容器资源控制)

作者:互联网

文章目录


https://www.cnblogs.com/wish123/p/5573098.html

前言

Linux内核Capability能力限制
1.Capabilities简单来说,就是指开放给进程的权限,比如允许进程可以访问网络、读取文件等。Docker容器本质上就是一个进程,默认情况下,Docker会删除必须的Capabilities外的所有Capabilities,可以在Linux手册页 中看到完整的可用Capabilities列表。Docker 0.6版本以后支持在启动参数中增加–privileged选项为容器开启超级权限。
2.Docker支持Capabilities对于容器安全意义重大,因为在容器中我们经常会以root用户来运行,使用Capability限制后,容器中的root比真正的root用户权限少得多。这就意味着,即使入侵者设法在容器内获取了root权限,也难以做到严重破坏或获得主机root权限。

当我们在docker run时指定了–privileded选项,Docker其实会完成两件事情:
1.获取系统root用户所有能力赋值给容器;
2.扫描宿主机所有设备文件挂载到容器内。

理解docker安全

命名空间隔离的安全

控制组资源控制的安全

内核能力机制

Docker服务端防护

其他安全特性

容器资源控制

CPU限制

[root@server2 ns]# systemctl start docker
[root@server2 ns]# mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

在这里插入图片描述

[root@server2 ~]# cd /sys/fs/cgroup/
[root@server2 cgroup]# pwd
/sys/fs/cgroup
[root@server2 cgroup]# cd cpu
[root@server2 cpu]# ls
cgroup.clone_children  cpuacct.usage         cpu.rt_runtime_us  release_agent
cgroup.event_control   cpuacct.usage_percpu  cpu.shares         system.slice
cgroup.procs           cpu.cfs_period_us     cpu.stat           tasks
cgroup.sane_behavior   cpu.cfs_quota_us      docker             user.slice
cpuacct.stat           cpu.rt_period_us      notify_on_release
[root@server2 cpu]# mkdir x2    ##新建x2目录
[root@server2 cpu]# cd x2/    
[root@server2 x2]# ll   #目录里自动生成相关文件

在这里插入图片描述

[root@server2 x2]# cat cpu.cfs_period_us 
100000
[root@server2 x2]# cat cpu.cfs_quota_us    ##默认为-1,表示不限制
-1
[root@server2 x2]# echo 20000 > cpu.cfs_quota_us  ##修改占用率为20%
[root@server2 x2]# cat cpu.cfs_quota_us 
20000

在这里插入图片描述

[root@server2 x2]# dd if=/dev/zero of=/dev/null &   ##开启任务。打入后台,然后使用【top】命令查看查看占用了百分之100
[1] 7269

在这里插入图片描述

[root@server2 x2]# echo 7269 > tasks   #dd的进程号
[root@server2 x2]# fg
dd if=/dev/zero of=/dev/null
^C284939879+0 records in
284939879+0 records out
145889218048 bytes (146 GB) copied, 125.765 s, 1.2 GB/s

[root@server2 x2]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
55812d272e99        ubuntu              "/bin/bash"         15 minutes ago      Up 15 minutes                           vm1
[root@server2 x2]# docker run -it --name vm2 --cpu-quota=20000 ubuntu
root@4df74ed95346:/# [root@server2 x2]# 
[root@server2 x2]# docker attach vm2
root@4df74ed95346:/# dd if=/dev/zero of=/dev/null &
[1] 15

在这里插入图片描述

[root@server2 x2]# docker run -it --name vm3 ubuntu
root@33da6039575f:/# dd if=/dev/zero of=/dev/null

在这里插入图片描述

内存限制

示例:
容器可用内存包括两个部分:物理内存和swap交换分区。
docker run -it --memory 200M --memory-swap=200M ubuntu
–memory设置内存使用限额
–memory-swap设置swap交换分区限额

[root@server2 ~]# yum install libcgroup-tools -y
[root@server2 ~]# cd /sys/fs/cgroup/memory/
[root@erver2 memory]# ls

[root@server2 memory]# cat memory.limit_in_bytes 
9223372036854771712    #数字太大,等同于没有限制。
[root@server2 memory]# cat memory.memsw.limit_in_bytes 
9223372036854771712
[root@server1 ~]# cd /sys/fs/cgroup/memory/
[root@server1 memory]# mkdir ##snow 创建目录snow,该目录的名字随意给。 ##在/sys/fs/cgroup/memory目录创建的目录,自动继承/sys/fs/cgroup/memory目录中的内容。创建该目录的目的是(1)为了演示容器的运行过程。因为一旦运行容器,就会在该目录下,生成一个docker目录, docker目录中会生成容器ID对应的目录,目录中memory目录下的内容继承于/sys/fs/cgroup/memeory目录下的内容。 ##(2)直接修改/sys/fs/cgroup/memory中的文件的内容,会报错。
[root@server1 memory]# echo 209715200 > memory.limit_in_bytes 
-bash: echo: write error: Invalid argument
[root@server1 memory]# cd snow/ 
[root@server1 snow]# echo 209715200 > memory.limit_in_bytes #设定最大占用内存为200M(209715200=200*1024*1024。209715200的单位为BB) 
[root@server1 snow]# echo 209715200 > memory.memsw.limit_in_bytes #因为最大占用内存数和最大占 用swap分区的内存数一样。表明最大可用内存为200M,可用swap为0M。即限制了内存+交换分区<=200M 
[root@server1 snow]# cat memory.limit_in_bytes 209715200 
[root@server1 snow]# cat memory.memsw.limit_in_bytes 209715200 
值的注意的是:/sys/fs/cgroup/memory目录中的文件,不能用vim进行编辑, 利用vim进行编辑,无法进行保存退出(即使使用"wq!",也不能保存退出。)

在这里插入图片描述
在这里插入图片描述

[root@server2 shm]# pwd
/dev/shm
[root@server2 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0959029 s, 1.1 GB/s
[root@server2 shm]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3791         285        2956         116         549        3154     #我们发现可用内存少了100M
Swap:           499           0         499
[root@server2 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file bs=1M count=400   #因为指定的文件的大小为400M超过了限制,所以显示Killed,这就是之前我们为目录设置的限制,其最多只能占用300M
Killed
[root@server2 shm]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3791         287        2755         315         748        2952
Swap:           499           0         499
[root@server2 shm]# du -sh file 
299M	file

在这里插入图片描述

在这里插入图片描述

[root@server2 ~]# docker run -it --name vm1 --memory 104857600 --memory-swap 104857600 ubuntu
root@55812d272e99:/# [root@server2 ~]#      ##利用ubuntu镜像运行容器vm1,指定内存+交换分区<100M。并使用Ctrl+p+q退出,即不要让容器停掉。

在这里插入图片描述

[root@server2 ~]# cd /sys/fs/cgroup/memory/docker/
[root@server2 docker]# ls
[root@server2 docker]# cd 55812d272e9989c571fecf38b05745e8330130677027144d913b0396e6ac74ac
[root@server2 55812d272e9989c571fecf38b05745e8330130677027144d913b0396e6ac74ac]# ls
[root@server2 55812d272e9989c571fecf38b05745e8330130677027144d913b0396e6ac74ac]# cat memory.limit_in_bytes 
104857600
[root@server2 55812d272e9989c571fecf38b05745e8330130677027144d913b0396e6ac74ac]# cat memory.memsw.limit_in_bytes
104857600
[root@server2 55812d272e9989c571fecf38b05745e8330130677027144d913b0396e6ac74ac]# cd
[root@server2 ~]# docker ps 

在这里插入图片描述

Block IO限制

docker run -it --device-write-bps /dev/sda:30MB ubuntu
–device-write-bps限制写设备的bps
目前的block IO限制只对direct IO有效(不能使用文件系统缓存)
[root@server2 ~]# docker run -it --rm --privileged=true ubuntu
root@a2996186323a:/# fdisk -l

Disk /dev/vda: 8589 MB, 8589934592 bytes
16 heads, 63 sectors/track, 16644 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0008af01

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048      411647      204800   83  Linux
/dev/vda2          411648    16777215     8182784   8e  Linux LVM

在这里插入图片描述

[root@server2 ~]# docker run -it --rm --device-write-bps /dev/vda:30M ubuntu
root@860272c843f0:/# dd if=/dev/zero of=file bs=1M count=300 oflag=direct
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 10.355 s, 30.4 MB/s   #用时约10s
root@860272c843f0:/# dd if=/dev/zero of=file bs=1M count=300             
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 0.337771 s, 931 MB/s   #用时不到1s

在这里插入图片描述

标签:容器,Cgroups,server2,cgroup,memory,Docker,root
来源: https://blog.csdn.net/even160941/article/details/98748796