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

理解docker安全

Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
(1)Linux内核的命名空间机制提供的容器隔离安全
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间。

(2)Linux控制组机制对容器资源的控制能力安全。
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。

(3)Linux内核的能力机制所带来的操作权限安全
能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。

(4)Docker程序(特别是服务端)本身的抗攻击性。
使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。
将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。
这些子进程只允许在特定范围内进行操作。

(5)其他安全增强机制对容器安全性的影响。
在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安全检查;并且通过地址随机化机制来避免恶意探测等。
启用该特性不需要Docker进行任何配置。

(6)使用一些有增强安全特性的容器模板。
用户可以自定义更加严格的访问控制机制来定制安全策略。
在文件系统挂载到容器内部时,可以通过配置只读模式来避免容器内的应用通过文件系统破坏外部环境,
特别是一些系统运行状态相关的目录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

容器资源控制

在这里插入图片描述

在这里插入图片描述
(1)打开docker并检测cgroup是否开启,查看cgroup子系统的层级路径
在这里插入图片描述
(2)建立一个CPU控制族群
首先进入cpu子系统对应的层级路径下:cd /sys/fs/cgroup/cpu
通过新建文件夹创建一个cpu控制族群:mkdir x2,即新建了一个cpu控制族群:x2
新建x2之后,可以看到目录下自动建立了相关的文件,这些文件是伪文件

[root@server1 cgroup]# pwd
/sys/fs/cgroup
[root@server1 cgroup]# cd cpu
[root@server1 cpu]# mkdir x1        ##新建x2目录
[root@server1 cpu]# cd x1/
[root@server1 x1]# ll     ##目录里自动生成相关文件

在这里插入图片描述
(3)测试限制cpu的使用
我们的测试示例主要用到cpu.cfs_period_us和cpu.cfs_quota_us两个文件。
cpu.cfs_period_us:cpu分配的周期(微秒),默认为100000。
cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。
如果设为20000,表示占用20000/100000=20%的CPU。

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

在这里插入图片描述

(4)测试

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

在这里插入图片描述
在这里插入图片描述
(5)创建一个容器,并限制cpu的使用

[root@server1 x1]# echo 2123 > tasks    ##dd命令的进程号
[root@server1 x1]# fg
dd if=/dev/zero of=/dev/null
^C456424541+0 records in
456424541+0 records out
233689364992 bytes (234 GB) copied, 201.225 s, 1.2 GB/s
[root@server1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server1 x1]# docker run -it --name vm1 --cpu-quota=20000 ubuntu
root@9431d483af1e:/# dd if=/dev/zero of=/dev/null

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

注意:假如在创建容器时不做限制,那么占用率会达到100%
在这里插入图片描述
在这里插入图片描述
另示例:cpu优先级
(1)安装cgroup
在这里插入图片描述
(2)禁用一个核

在这里插入图片描述
(3)当有一个跑时,占满
在这里插入图片描述
在这里插入图片描述
(4)在跑一个,各占一半
在这里插入图片描述
在这里插入图片描述
(5)修改优先级
在这里插入图片描述
(6)跑进程
在这里插入图片描述
在这里插入图片描述
(7)修改文件抢更多的资源
在这里插入图片描述
在这里插入图片描述
(8)取消进程此时cat tasks看的时候没有内容
在这里插入图片描述
在这里插入图片描述
(9)删除x1

在这里插入图片描述

在这里插入图片描述
(1)创建
在这里插入图片描述
(2)修改内存限制文件
在这里插入图片描述

(3)消耗内存
在这里插入图片描述
在这里插入图片描述
(3)设置swap也不让用

在这里插入图片描述
(4)cgroup设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(1)首先可以查看一下分区,确定写入的位置
在这里插入图片描述
(2)限制
在这里插入图片描述
由上图可见,我们对容器IO限制奏效,至于在演示操作中,为什么第二次的写入速度如此之快
这取决于参数【oflag=direct】,它的意思是指:读写数据采用直接IO方式

docker安全加固

上面用cgroup设置内存限制为200M,显示2G,现在去让它正常显示
在这里插入图片描述
在这里插入图片描述
(1)上传包并安装
在这里插入图片描述
(2)运行打入后台
在这里插入图片描述

(3)分配256M
在这里插入图片描述
在这里插入图片描述
容器内对磁盘分区

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值