博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker安全篇
阅读量:3960 次
发布时间:2019-05-24

本文共 5274 字,大约阅读时间需要 17 分钟。

docker安全篇

理解docker安全

Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:

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

命名空间隔离的安全

  • 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
  • 与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
  • 容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
  • 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。[root@server2 30970]# docker run -d --name demo nginx[root@server2 ~]# docker inspect demo | grep Pid            "Pid": 30970,[root@server2 3]# cd /proc/30970/[root@server2 30970]# cd ns/[root@server2 ns]# lsipc  mnt  net  pid  user  uts

控制组资源控制的安全

  • 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
  • Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
  • 确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。[root@server2 ns]# cd /sys/fs/cgroup/[root@server2 cgroup]# ls[root@server2 cgroup]# cd cpu[root@server2 cpu]# ls[root@server2 cpu]# cd docker/[root@server2 docker]# lsb98f6dc220c0f70b520975a632810e4947e4a08e1fe744fda6043dd2faf89725  cpu.cfs_quota_us[root@server2 docker]# docker psb98f6dc220c0

内核能力机制

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

Docker服务端防护

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

其他安全特性

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

容器资源控制

Linux Cgroups 的全称是 Linux Control Group。

  • 是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
  • 对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。

Linux Cgroups 给用户暴露出来的操作接口是文件系统。

  • 它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
  • 执行此命令查看:mount -t cgroup
  • 在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。
  • 在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录)。
  • 控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定。
    在这里插入图片描述

cpu限额

cpu_period 和 cpu_quota 这两个参数需要组合使用,用来限制进程在长度为 cpu_period 的一段时间内,只能被分配到总量为 cpu_quota 的 CPU 时间,以下设置表示20%的cpu时间。

docker run -it --cpu-period=100000 --cpu-quota=20000 ubunturoot@b42d93b2364b:/# dd if=/dev/zero of=/dev/null &

在这里插入图片描述
可以再重新开一个终端,使用top查看一下cpu占用率是不是百分之二十

cpu优先级

当两个容器一起运行的时候,如果优先级一样,则各占cpu50%

测试两个cpu的争抢问题,如果你是两个cpu的话首先先关掉一个cpuecho 0 > /sys/devices/system/cpu/cpu1/online[root@server2 ~]# docker run -it --rm ubunturoot@d6cb959714c5:/# dd if=/dev/zero of=/dev/null &[1] 9        ctrl+p+q退出,然后重新开个交互                      root@d6cb959714c5:/# [root@server2 ~]# docker run -it --rm ubunturoot@5594429c2d0b:/# dd if=/dev/zero of=/dev/null

在这里插入图片描述

退出刚才第二次启用的交互,下面我们可以加一个限制cpu的参数,重新进去,再次查看top中cpu占用情况

[root@server2 ~]# docker run -it --rm  --cpu-shares 512 ubuntu     ##设置优先级,优先级比原来少了一半root@1ed8bb0e9c41:/# dd if=/dev/zero of=/dev/null

内存限制

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

限制使用内存

[root@server2 docker]# pwd/sys/fs/cgroup/memory/docker[root@server2 docker]# yum install -y libcgroup-tools.x86_64[root@server2 memory]# mkdir x1[root@server2 memory]# cd x1/[root@server2 x1]# cat memory.limit_in_bytes9223372036854771712[root@server2 x1]# free -m[root@server2 x1]# echo 209715200 > memory.limit_in_bytes[root@server2 x1]# cat memory.limit_in_bytes209715200=200*1024*1024[root@server2 x1]# cd /dev/shm/[root@server2 shm]# dd if=/dev/zero of=bigfile bs=1M count=100[root@server2 shm]# free -m

使用限制测试(刚才的工具)
没限制交换空间,虽然写进去了,但是使用了交换空间的内存
补充: 先设置内存,再设置交换分区,否则会出现报错。
在这里插入图片描述

用户级限制使用内存

我们测试总是输入命令cgexec 测试不太合适,这里使用规则文件测试。

Block IO限制

  • docker run -it --device-write-bps /dev/sda:30MB ubuntu
    写的速度限制在30M/s左右
  • –device-write-bps限制写设备的bps
  • 目前的block IO限制只对direct IO有效。(不使用文件缓存)

docker安全加固

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

[root@server2 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y[root@server2 ~]# lxcfs /var/lib/lxcfs &            ##运行[root@server2 lxcfs]# docker run  -it -m 256m \>       -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

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

  • 有的时候我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。
  • #docker run -it --name vm1 ubuntu bash
没有设置--privileged=true,其实是没有真正的root权限的[root@server2 ~]# docker run -it --rm --privileged=true busybox

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

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

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

#docker inspect -f {
{.HostConfig.Privileged}} vm1
false
#docker inspect -f {
{.HostConfig.CapAdd}} vm1
{[NET_ADMIN]}

安全加固的思路

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

保证容器的安全

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

docker安全的遗留问题

  • 主要的内核子系统都没有命名空间,如:
    SELinux
    cgroup
    在/sys下的文件系统
    /proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
  • 设备没有命名空间:
    /dev/mem
    /dev/sd*文件系统设备
    内核模块
  • 如果你能沟通或攻击的其中之一作为特权的过程中,你可以拥有自己的系统。

转载地址:http://zihzi.baihongyu.com/

你可能感兴趣的文章
我的软件工程之路(四)—半年总结
查看>>
Asp.Net+Jquery.Ajax详解5-$.getScript
查看>>
Asp.Net+Jquery.Ajax详解6-$.ajaxSetup
查看>>
什么是Dojo?与Jquery宏观对比,结果如何?
查看>>
Asp.Net+Jquery.Ajax详解8-核心$.ajax
查看>>
项目中一个用于导出word的方法
查看>>
测试Jsp 静态包含和动态包含
查看>>
简析几种常用的Web监听
查看>>
Web应用过滤器Fileter
查看>>
代理模式(Proxy)
查看>>
采用动态代理对事务进行封装
查看>>
Hibernate性能优化
查看>>
Spring核心ioc
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
Struts2+Spring3+Mybatis3开发环境搭建
查看>>
mongoDB入门必读(概念与实战并重)
查看>>
通俗易懂解剖jbpm4
查看>>
rsync
查看>>
makefile
查看>>
linux 文件权限
查看>>