docker的安全配置

一、理解Docer安全

1.Docker容器的安全性,很大程度上依赖于Linux系统自身

评估Docker的安全性时,主要考虑以下几个方面:

(1)Linux内核的命名空间机制提供的容器隔离安全
(2)Linux控制组机制对容器资源的控制能力安全。
(3)Linux内核的能力机制所带来的操作权限安全
(4)Docker程序(特别是服务端)本身的抗攻击性。
(5)其他安全增强机制对容器安全性的影响。

2.命名空间隔离的安全

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

3.控制组资源控制的安全

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

4.内核能力机制

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

5.Docker服务端防护

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

6.其他安全特性

(1)在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安
全检查;并且通过地址随机化机制来避免恶意探测等。启用该特
性不需要Docker进行任何配置。
(2)使用一些有增强安全特性的容器模板。
(3)用户可以自定义更加严格的访问控制机制来定制安全策略。
(4)在文件系统挂载到容器内部时,可以通过配置只读模式来避免容
器内的应用通过文件系统破坏外部环境,特别是一些系统运行状
态相关的目录。

二、容器资源控制

容器资源的控制主要是通过cgroup来进行的,它的全称是的全称是 Linux Control Group,给用户暴露出来的操作接口是文件系统,它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
执行此命令查看:mount -t cgroup
在这里插入图片描述

1.cpu限额
因为我们一般不直接修改cpu目录中的参数,在cpu的目录下新建一个目录,进入目录后可以看到自动给我们生
成了与cpu父级进程中相同的文件,我们可以通过修改这个目录中的文件使设定生效

dd if=/dev/zero of=/dev/null &			##吃掉cpu的所有资源
注意:即使是双核,一个被占满的情况下另一个也不会帮忙处理,但是在三核的情况下就会发生资源的争抢
echo 20000 > cpu.cfs_quota_us 		##限制cpu的资源上限
echo 2099 > tasks					##把进程的pid写入文件

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

cpu的限额需要再容器启动时直接添加参数设定,我们可以通过--help来查看相关参数
docker run --help | grep cpu
docker run -it --name vm1 --cpu-period=100000 --cpu-quota 20000 ubuntu
##表示在period设定的时间内,以微秒为单位,设定cpu的占用上限为20%
dd if=/dev/zero of=/dev/null &	##在进入容器后执行此命令占用容器的所有资源
##ctrl+p+q将容器打入后台,top查看cpu的占用情况

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

2.内存占用控制
首先安装一个cgroup软件,本机使用的是:libcgroup-tools-0.41-11.el7.x86_64,可以直接通过yum安装
cd /sys/fs/cgroup/memory/			##进入cgroup内存控制
mkdir x2							##和cpu一样建立一个子进程来控制容器服务
用dd来建立文件测试是否限制为300M,可以发现这样并没有真正的隔离起来,我们的设定没有生效

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

使用libcgroup来管理:
yum install libcgroup-tools.x86_64 -y
cgexec -g memory:x2 dd if=/dev/zero of=file bs=1M count=300		##创建文件时使我们x2里的内存限制生效

在这里插入图片描述

限制容器内存的占用:
docker run -it --memory 200M --memory-swap=200M --name vm1 ubuntu	##创建容器,限制内存为200M,进入后crtl+p+q 
													##打入后台运行后查看docker里的内存文件

在这里插入图片描述

限制普通用户的内存使用:
先设置x2文件,再修改etc下的配置文件

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

3.block IO限制
--device-write-bps限制写设备的bps,限制读写速度
目前的block IO限制只对direct IO有效。(不使用文件缓存)
在创建容器时加上这个参数,oflag=direct 不经过缓存,直接写磁盘
docker run -it --name vm2 --device-write-bps /dev/vda:10MB ubuntu

在这里插入图片描述

4.容器状态的查看和修改
docker container pause vm1		##暂停vm1,可以在文件中查看到状态的改变

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

三、docker安全加固

1.利用LXCFS增强docker容器隔离性和资源可见性

先下载lxcfs的安装包,本机使用的是lxcfs-2.0.5-3.el7.centos.x86_64.rpm,下载之后直接yum安装即可

yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y
lxcfs /var/lib/lxcfs/ &				##检测设备情况

在这里插入图片描述

把本机的数据目录挂载过去并指定文件的权限,再设定内存与swap分区的大小
docker run -it --name vm1 --memory 300MB --memory-swap 300MB \
> -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
> -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
> -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
> -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
> -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
> -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
> ubuntu

在这里插入图片描述

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

有的时候我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。
用一个false的vm1容器和一个true的vm2容器来做对比

docker run -it --name vm1 ubuntu
docker run -it --name vm2 --privileged=true ubuntu
docker inspect vm2 | grep Pri		##查看privileged的状态

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

3.设置容器白名单:–cap-add

–privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker 提供了权限白名单的机制,使用–cap-add添加必要的权限。

docker run -it --cap-add=NET_ADMIN --name vm1 ubuntu 

capabilities手册地址:
http://man7.org/linux/man-pages/man7/capabilities.7.html

在这里插入图片描述

4.安全加固的思路

(1)保证镜像的安全
a.使用安全的基础镜像
b.删除镜像中的setuid和setgid权限
c.启用Docker的内容信任
d.最小安装原则
e.对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
f.容器使用非root用户运行

(2)保证容器的安全
a. 对docker宿主机进行安全加固
b. 限制容器之间的网络流量
c. 配置Docker守护程序的TLS身份验证
d. 启用用户命名空间支持
e. 限制容器的内存使用量
f. 适当设置容器CPU优先级

5.docker的安全遗留问题

主要的内核子系统都没有命名空间,如:
(1). SELinux
(2). cgroup
(3). 在/sys下的文件系统
(4). /proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus

设备没有命名空间:
(1). /dev/mem
(2). /dev/sd*文件系统设备
(3). 内核模块

如果你能沟通或攻击的其中之一作为特权的过程中,你可以拥有自
己的系统。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值