博客搬家,原地址:https://langzi989.github.io/2016/12/29/docker防止fork炸弹/

在开发过程中,我们使用了docker作为容器来进行编程语言代码的评测,以用于防止有害代码破坏宿主物理机器,但是在昨天发现docker还是会受fork炸弹的影响将宿主物理机器挂掉。针对这个问题,我在docker官网找到了相关的解决方法,记录分享并以备之后再次遇到此类问题可以很快找到解决方案。
当前解决方案只适用于docker1.1版本及之后(通过docker.io进行安装,sudo apt install docker.io)。
解决方案的思想就是:在启动docker的时候给其加上启动选项–pids-limit来限制cgroup中的fork的进程的最大数,我这里限制的30,可以根据自己的需求去限制。

docker run -it --pids-limit 30 Ubuntu:14.04

上述方法即可防止fork炸弹。
以下内容转载自http://blog.csdn.net/thinkhy/article/details/50995720

Docker容器与安全

Docker能否大规模用于生产环境,尤其是公有云环境,就在于Docker是否能提供安全的环境。本文将总结《Docker容器与容器云》一书3.9节『Docker与容器安全』的主要内容,包括Docker现有安全机制、存在的安全问题以及Docker安全增强三个方面。

1. Docker的安全机制

1.1 Docker daemon安全

  • Docker向外界服务提供了四种通信方式,默认是以Unix域套接字的方式来与客户端通信,这种方式较TCP形式更为安全。
  • Docker也提供了TLS传输层安全协议,通过–tlsverify(安全传输校验),–tlscacert(信任证书)、–tlskey(服务器或者客户端秘钥)、–tlscert(证书位置)来配置。

1.2 镜像安全

  • Docker registry镜像库访问控制

    • Docker daemon第一次启动时,通过公网(Amazon CDN)载入official.json包,饮食公共image和用户image的目录以及数字签名信息。
    • official.json在Docker daemon启动时加载到MemoryGraph,MemoryGraph用于存储公钥以及命名之间的授权映射,默认授权节点对授权空间有读写权限。
  • 镜像校验和

    • 镜像校验和用来保证镜像的完整性,以预防可能出现的镜像破环。
    • 目前Docker对于镜像校验和和验证失败不采取任何措施,仅输出警告信息

1.3 内核安全

  • 内核为容器提供了两种技术cgroup和namespace,分别对容器进行资源限制和资源隔离。

    • 容器本质是进程,cgroup用来限制容器的资源使用量,避免单个容器耗尽系统资源。
  • namespace用来隔离容器与宿主机,以及不同的容器。
    • Docker目前仅完整支持uts、ipc、pid、network、mount这5种ns,user ns尚未完全支持。
    • 系统资源未进行隔离,如/proc,/sys、SELinux、time、syslog、/dev设备信息等均未进行隔离。

1.4 容器之间的网络安全

  • Docker可通过iptabls设定规则实现禁止或允许容器之间的通信。

1.5 Docker容器Capability限制

  • 容器的行为通过Linux超级用户分组限制,具体包括了CHOWN、DAC_OVERRIDe、FSETID、FOWNER、MKNOD、NET_RAW、SETGID、SETUID、SETFCAP、SETPCAP、NET_BIND_SERVICE、SYS_CHROOT、KILL和AUDIT_WRITE。
  • Docker进程的Capability可通过docker run命令的参数进行配置

2. Docker安全问题

2.1 磁盘资源限制问题

  • Docker容器通过镜像层叠的方式来构建容器内的文件系统,本质上还是在宿主机文件系统的目录(/var/lib/docker)下存储文件。
  • 极有可能出现一个容器将宿主机上所有的磁盘空间耗尽,导致其它容器无法存储文件,所以有必要对容器的磁盘使用量进行限制。

2.2 容器逃逸问题

  • Docker使用操作系统进行虚拟化,共享内核、内存、CPU以及磁盘,易造成容器逃逸问题。
  • Docker1.0之后采用白名单来限制容器的能力,会给出默认的容器Capability清单,禁止容器拥有清单之外的Capability。

2.3 容器DoS攻击与流量限制问题

  • 公有云基于虚拟化技术实现,攻击数据包可能不需要通过物理网卡就可以攻击同一个宿主机下的其他容器,传统Dos预防措施无法适用容器之间的攻击。
  • 的Docker容器连接在网桥上,通过veth pari技术创建网卡,其一端在容器内命名为eth0,另一张网上驻留在宿主机环境之中。
  • 同一宿主机下所有容器共用一张物理网卡,如果一个容器抢占大部分带宽,会影响其它容器使用。

2.4 超级权限问题

  • docker run时加入–privileged参数能使容器获得所有的超级用户权限能力,并将所有的宿主机的所有设备挂载到容器内。

3. Docker安全的解决方案

3.1 SELinux

  • SELinux三种控制方式

    • Type Enforcement: 主要的访问控制机制。
    • Role-Based Access Control(RBAC):基于SELinux用户的权限控制手段。
    • Multi-Level Security(MLS): 多级分类安全,指定level标签。
  • 为什么要在Docker中使用SELinux
    • SELinux将所有进程和文件打上标签,而容器以进程方式运行,所以控制进程如何访问资源,也就是限制容器如何去访问资源。
    • SELinux策略是全局的,它不是针对具体用户设定,而是强制整个系统遵循。
    • 减少提权攻击风险。

3.2 user namespace

  • 容器的超级用户权限通过ns映射到宿主机是一个普通用户。
  • 容器被恶意程序攻击,所做的也就是这个普通用户的权限,而非宿主机的超级权限。

3.3 磁盘限额

  • Docker仅对Device Mapper文件系统的限额提供了–storage-opt参数进行限制。
  • cgroup没有对磁盘进行限制,Linux磁盘限额技术主要基于用户和文件系统。
  • 可能的解决方案
    • 所有用户共有宿主机的一块磁盘,限制用户在磁盘上的使用量来限定容器的磁盘使用量。
    • 选择支持目录限额的文件系统,如XFS。
    • Docker定期检查每一个容器磁盘使用量,会对性能造成影响。
    • 创建虚拟文件系统,些文件系统仅供某一个容器使用。

3.4 容器流量限制

  • Docker没对容器的网络带宽做限制。
  • 可以采用Traffic Controller容器对容器网卡流量进行限制,一定程序上减少容器Dos攻击危害。

3.5 GRSecurity内核安全增强工具

  • Docker容器共享宿主机的内存,在内存安全上存在不少问题,需要针对内存破坏做防御。
  • GRSecurity是一个对内核的安全扩展,通过智能访问控制来阻止内存破坏,预防0day漏洞。

3.6 fork炸弹

  • fork炸弹以极快速度创建大量进程,以此消耗系统资源,使系统无法运行新程序,现有进程运行速度放缓。
  • 容器本身在内核层面隔离性不足,fork bomb会给容器带来灾难性影响。
  • fork bomb受到社区关注(Issue 6479),但目前还没有完美解决方案。
  • Docker无法使用ulimit来限制forkbomb问题,因为一个宿主机用户可能同时启动多个容器,无法对每个容器做进程数的限制。
  1. 总结
    Docker自身已经提供了不少安全机制,但Docker目前仍然只适于运行可信应用程序(内部使用),如果需要运行任意代码,安全很难得到保证。在日常应用中,还可以通过SELinux、GRSecurity、seccomp等工具来增强容器安全。

docker防止fork炸弹相关推荐

  1. Linux的fork实现原理,【Linux】Fork炸弹详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序 ...

  2. linux bash Shell脚本经典之Fork炸弹解析:() { :|: };:

    众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序进行 模块化的高效开发与管理.于是产生了由于其 ...

  3. 经典的 Fork 炸弹解析

    转载自: http://blog.saymagic.cn/2015/03/25/fork-bomb.html 本文地址:https://linux.cn/article-5685-1.html Jar ...

  4. fork炸弹c语言能否运行,Fork炸弹简析和应对方法

    简述 第一次听到fork炸弹这种东西的时候以为是一个很神奇的破坏力惊人的高能脚本,然而稍微深入的了解了一下才发现这个玩意其实是个挺简单纯粹的东西,只是被一个叫Jaromil的家伙对他的精美包装给戏耍了 ...

  5. 制作一枚有针对性的fork炸弹

    恕我不再赘述bash实现的fork炸弹. 我们看看把一个内部调用了fork的平常的程序制作成一枚fork炸弹是多么的简单.先看代码: #include <stdio.h> #include ...

  6. Linux fork炸弹的分析

    作为Linux/Unix 系统上内核与用户之间的接口,shell由于使用方便.可交互能力强.具有强大的编程能力等特性而受到广泛的应用.bash(Bourne Again shell)是对 www.ga ...

  7. Linux fork炸弹以及预防办法

    fork炸弹是什么? fork炸弹以极快的速度创建大量进程(进程数呈以2为底数的指数增长趋势),并以此消耗系统分配予进程的可用空间使进程表饱和,而系统在进程表饱和后就无法运行新程序,除非进程表中的某一 ...

  8. Shell脚本经典之Fork炸弹

    众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序进行模块化的高效开发与管理.于是产生了由于其特 ...

  9. Docker安全性支持(使用Cgroups机制实现容器资源控制)

    前言 Docker作为最重视安全的容器技术之一,在很多方面都提供了强安全性的默认配置,其中包括:容器root用户的Capability能力限制.Seccomp系统调用过滤.Apparmor的 MAC ...

最新文章

  1. RxJava 在Android中的应用(一)
  2. epoll使用详解(精髓)
  3. python和tensorflow版本对应_详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
  4. 2011年2月--2011年7月数据库性能优化过程
  5. Ehcache介绍及整合Spring实现高速缓存
  6. ORA-01795: 列表中的最大表达式数为 1000
  7. Git 与 Github 基础(二)—— Git for Windows
  8. 组了个视频号的局,汇报下数据!
  9. OSG读取Tif格式的高程数据
  10. calibre部署指南:docker一键部署calibre在线书库
  11. 核心单词Word List 38
  12. yuv图片旋转180度,镜像水平翻转
  13. 聊聊小程序第三方登录
  14. 天线越大越好吗_路由器的天线是不是越多越好?告知你真实答案,很多人都买错了...
  15. Angular实战项目(1)
  16. 首届实时渲染3D动画创作大赛结果公布,看大奖英伟达A6000花落谁家
  17. sw运行很卡怎么办_怎样才能提高Solidworks的运行速度/SW运行慢怎么办?
  18. 不支持python数据类型_python不支持的数据类型有( )。_学小易找答案
  19. 简单容易的计算机音乐,简单易上手的小型音乐制作软件 1BITDRAGON 升级 2.0
  20. 蚂蚁 Service Mesh 大规模落地实践与展望

热门文章

  1. 微信小程序的家校通系统(家校联系)
  2. 【Linux】Linux私有组,主要组和附加组
  3. android stdio findViewById(R.id.报错
  4. 从零了解进程(操作系统定位,进程的概念,特征,虚拟地址)
  5. Python根据地名获取经纬度
  6. android友盟微信分享到朋友圈,2020年友盟分享到微信朋友圈
  7. java音乐_用JavaJFugue进行音乐编程
  8. 【周记】腾讯犀牛鸟「云开发」校园技术布道师养成计划
  9. 闹归闹,还是要说几件正事
  10. 神奇相机将照片变文字 超大相册搜图无压力