Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何提升docker容器安全性

如何提升docker容器安全性

作者头像
字母哥博客
发布于 2020-09-23 03:36:58
发布于 2020-09-23 03:36:58
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

向您推荐

原创文章,转载请务必将下面这段话置于文章开头处。 本文转发自:字母哥博客,原文链接 http://www.zimug.com/463.html

Dcoker入门与实践系列文章

1.Docker的核心原理

Docker容器的的本质是宿主机上的进程.通过namespace实现资源隔离,cgroups实现资源的限制,通过写时复制的机制完成高效的文件操作.docker实现的核心技术-namespace 和 cgroups,其实并不是什么新技术,准确的说namespace 和 cgroups是linux的相关技术.docker对这种技术进行了封装,提高可操作性。

2.容器安全的痛点

容器经常拿来和虚拟机进行对比,容器的好处就不多说了!主要说说:容器的缺点-隔离性低导致的安全性较低. 通常来说,容器相比虚拟机还是不够安全的..

2.1为什么容器不够安全

这就要从虚拟机和容器的底层实现机制来对比,

  • 虚拟机在hypervisor的基础上构建虚拟操作系统,有自己的操作系统内核.容器与宿主机是共用同一个内核的.
  • 虚拟机也不是绝对安全的.找到HyperVisor的弱点,攻克SELinux控制,就可以攻破虚拟机,染指宿主机。但这是非常难的.
  • 容器的隔离技术使用的是namespace,但namesapce的资源隔离仅限于以下6个方面

namespace

隔离内容

内核版本

UTS

主机名与域名

Linux 2.6.19

IPC

信号量,消息队列和共享内存

Linux 2.6.19

PID

进程编号

Linux 2.6.24

Network

网络设备,网络栈,端口

始于Linux 2.6.24 完成于 Linux 2.6.29

Mount

文件挂载

Linux 2.4.19

User

用户用户组

始于 Linux 2.6.23 完成于 Linux 3.8

为提升安全性,您的linux内核请升级版本大于3.8 docker1.10开始支持User namespace,但不是默认开启的.《Docker 安全之用户资源隔离》

这6种资源隔离看上去比较完备,但是仍然有很多的资源没有隔离,比如:

  • SELinux
  • Cgroups
  • file systems under /sys
  • /proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
  • /dev/mem
  • /dev/sd* file system devices

这将宿主机的资源暴露给了容器的访问者,会导致安全问题!

同时笔者认为,docker容器安全的痛点也仅限于互联网公有云环境下。对于企业内部私有云也算不上痛点,通过对docker进行安全加固可以达到生产环境的安全级别的要求!欢迎批判!,第4章节,我们将看看如何提升docker容器安全!

3.docker容器安全也有自己的优势

容器的资源隔离程度相对虚拟机较低,与宿主机共享内核.导致容器的安全性低.那么是不是说容器相对于虚拟机,在安全性上完全没有自己的优势呢?

笔者认为,还是有的:

  1. 可以禁止SSH访问,防止很多正面攻击
  2. 容器暴露的端口有限,容器的本质是宿主机的进程,他只需要暴露非常有限的端口来提供服务.
  3. 可以利用容器云控制容器的生命周期,使其在不影响服务的情况下,尽可能的短命.攻击短生命周期的容器意义并不大.
  4. 容器的文件系统分层,镜像层是只读的,只有容器层可写.容器层文件的生命周期与容器相同(不是数据卷).

4.如何提升容器安全性

4.1 使用User namespace

User namespace是从docker1.10开始被支持,并且不是默认开启的.

docker 使用namespace进行资源隔离,其中一种是user namespace.user namespace主要隔离了安全相关的标识符和属性,包括用户ID,用户组Id,root目录,key(密钥)以及特殊权限.

默认的情况下,docker容器使用的root用户和宿主机的root用户是同一个用户,尽管可以限制容器内root用户的权限(capability),但本质上仍然和宿主机root用户是同一个用户.

有了user namespace之后,我们就可以将宿主机上的普通用户映射为容器的root用户,这样容器中的实际用户为普通用户权限,可以将容器的安全程度提高一个等级!

关于具体的实现步骤,请查看我的这篇文章: 《Docker 安全之用户资源隔离》

4.2 使用OpenSSL保护docker daemon

默认情况下,运行docker命令需要访问本地的Unix Socket.也可以通过HTTP的方式完成远程访问.

如果你需要以安全的方式在网络中访问docker,最好使用TLS,指定tlsverify参数,设置tlscacert参数指向一个可信的CA证书.在这种方式下,只有经过CA权限验证通过的客户端才能访问docker deamon.

具体内容请访问官网:《Protect the Docker daemon socket》

4.3 安全的组网方式

我们可以将容器的服务端口分为两种

  • 第一种:直接为用户提供服务的端口,如:web应用常用8080
  • 第二种:为其他应用的提供服务的端口.

笔者认为安全的组网方式就是:尽量不使用端口映射的方式将容器端口映射到宿主机.端口暴露的越少,安全性就越高.

什么是尽量?如何尽量?

我采用overlay的网络,或者叫应用层网络,覆盖网络,但这绝不是唯一的方法. docker 1.9为我们提供了官方的跨宿主机组网方式overlay(还有其他的网络工具也是这种方式).容器应用的网络构建于物理网络之上,在逻辑上又独立于物理网络.

举个例子:ZF的各个部门是都一个宿主机,容器(职能人员)之间可以跨宿主机沟通.部门级别之间的沟通是物理网络,各部门的职能人员之间的沟通是应用网络. 最后形成的沟通结论,对外发布,交给新闻发言人,这个新闻发言人是物理网络对外服务的接口.

同样: 对于第一种直接为用户提供服务的端口,可以采用端口映射的方式映射到宿主机,他就是发言人. 对于第二种端口的消息,应用网络内部处理,不对外发布。

实现方式可以参考:《基于consul的Docker-overlay跨多宿主机容器网络》

4.4 限制docker容器的capability

什么是capability?

简单地说,就是执行调用操作的权限.Linux将超级用户的权限进行分组,每一组代表了所能执行的系统调用操作. 如果是root用户,剥夺它的某些capability,那么它将无法调用对应的系统操作.如果是普通用户,对它赋予某些capability,它也可以完成某些超级用户才能做的系统调用. capability为系统的权限管理,提供了更加细粒度的权限划分.

容器默认拥有的capability(能力)包括:

  • CHOWN: 更改文件UID和GID的能力
  • DAC_OVERRIDE:忽略文件的读,写,执行访问权限的检查的能力
  • FOWNER:越过可执行文件的拥有者权限检查,执行操作的能力
  • FSETID:文件修改后保留setuid/setgid标志位
  • SETGID:改变进程组id的能力
  • SETUID:改变进程用户ID的能力
  • SETFCAP:向security.capability写入能力属性的能力
  • NET_RAW:创建RAW和PACKET套接字的能力
  • MKNOD:使用mknod创建特殊文件的能力
  • SYS_REBOOT:允许使用reboot或者kexec_load.kexec_load功能是加载新的内核作为reboot重新启动所需的内核
  • SYS_CHROOT:使用chroot的能力
  • KILL:越过权限检查,发送信号的能力
  • NET_BIND_SERVICE:绑定常用端口的能力(端口号小于1024)
  • AUDIT_WRITE:允许审计日志写入的能力

查看容器的capability(能力) 通过docker ps 和docker inspect 获得容器进程的id,查看容器的默认能力

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pscap |grep 165536
1411  19337 165536      top               chown, dac_override, fowner, fsetid, kill, setgid, setuid, setpcap, net_bind_service, net_raw, sys_chroot, mknod, audit_write, setfcap

移除容器的capability(能力) 使用--cap-drop移除能力,运行容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -it  --cap-drop SETGID --cap-drop SETUID ubuntu:14.04 top

通过docker ps 和docker inspect 获得容器进程的id,查看容器的现有能力.setuid和setgid的能力被移除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1411  19803 165536      top               chown, dac_override, fowner, fsetid, kill, setpcap, net_bind_service, net_raw, sys_chroot, mknod, audit_write, setfcap

为容器新增capability(能力) 使用--cap-add增加能力,运行容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -it  --cap-add SYS_TIME ubuntu:14.04 top

通过docker ps 和docker inspect 获得容器进程的id,查看容器的现有能力.新增了sys_time能力

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1411  20101 165536      top               chown, dac_override, fowner, fsetid, kill, setgid, setuid, setpcap, net_bind_service, net_raw, sys_chroot, sys_time, mknod, audit_write, setfcap

Linux都有哪些capability(能力)?

capabilities - overview of Linux capabilities

4.5 文件系统只读保护

Docker 可以设置容器的文件系统为只读模式.这样可以禁止,脚本注入方式的攻击,因为脚本无法保存.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run --rm -ti --read-only ubuntu bash

注意:此方法不能与user namespace 同时使用

……未完待续,欢迎持续关注我的博客!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-07-05),如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
业务迁移到容器云上的6个注意事项
在将业务迁移到容器云环境时,应该注意哪些事项呢?下文我们总结了6个注意事项,帮助您安全使用容器。
CNCF
2021/10/13
7830
[docker](九)docker -- 容器安全
Docker目前已经在安全方面做了一定的工作,包括Docker daemon在以TCP形式提供服务的同时使用传输层安全协议;在构建和使用镜像时会验证镜像的签名证书;通过cgroups及namespaces来对容器进行资源限制和隔离;提供自定义容器能力(capability)的接口;通过定义seccomp profile限制容器内进程系统调用的范围等。如果合理地实现上述安全方案,可以在很大程度上提高Docker容器的安全性。
baron
2019/12/03
2.5K0
Linux Capabilities 与容器的水乳交融
更多奇技淫巧欢迎订阅博客:https://fuckcloudnative.io 前言 该系列文章总共分为三篇: ?Linux Capabilities 入门教程:概念篇 ?Linux Capabili
米开朗基杨
2020/10/30
2.1K0
Linux Capabilities 与容器的水乳交融
Kubernetes对Container Capabilities的支持
Docker Container Capabilities 在docker run命令中,我们可以通过--cap-add和--cap-drop来给容器添加linux Capabilities。下面表格中的列出的Capabilities是docker默认给容器添加的,用户可以通过--cap-drop去除其中一个或者多个。 Docker’s capabilitiesLinux capabilitiesCapability Description SETPCAPCAP_SETPCAPModify pro
Walton
2018/04/16
4.2K0
Elastic Stack之 分析Elasticsearch查询语句实战。
1)、首先需要收集Elasticsearch集群的查询语句。   2)、然后分析查询语句的常用语句、响应时长等等指标。 2、分析Elasticsearch查询语句的功能,使用方案。
别先生
2021/01/21
9490
Elastic Stack之 分析Elasticsearch查询语句实战。
Docker安全入门与实战(一)
与其他介绍Docker的文章不同,由本文开启的系列文章将专注于Docker安全研究,一共分为6部分。
0xtuhao
2022/06/21
1.1K0
Docker安全入门与实战(一)
【云原生攻防研究】容器逃逸技术概览
近年来,容器技术持续升温,全球范围内各行各业都在这一轻量级虚拟化方案上进行着积极而富有成效的探索,使其能够迅速落地并赋能产业,大大提高了资源利用效率和生产力。随着容器化的重要甚至核心业务越来越多,容器安全的重要性也在不断提高。作为一项依然处于发展阶段的新技术,容器的安全性在不断地提高,也在不断地受到挑战。与其他虚拟化技术类似,在其面临的所有安全问题当中,「逃逸问题」最为严重——它直接影响到了承载容器的底层基础设施的保密性、完整性和可用性。
绿盟科技研究通讯
2020/02/25
3.3K0
【云原生攻防研究】容器逃逸技术概览
Linux Capabilities 入门:让普通进程获得 root 的洪荒之力
Linux 是一种安全的操作系统,它把所有的系统权限都赋予了一个单一的 root 用户,只给普通用户保留有限的权限。root 用户拥有超级管理员权限,可以安装软件、允许某些服务、管理用户等。
米开朗基杨
2019/10/29
9.8K0
Linux Capabilities 入门:让普通进程获得 root 的洪荒之力
Linux Capabilities 入门:如何管理文件的 capabilities?
上篇文章介绍了 Linux capabilities 的诞生背景和基本原理,本文将会通过具体的示例来展示如何查看和设置文件的 capabilities。
米开朗基杨
2019/11/14
4.5K0
Docker容器安全性分析
Docker是目前最具代表性的容器技术之一,对云计算及虚拟化技术产生了颠覆性的影响。本文对Docker容器在应用中可能面临的安全问题和风险进行了研究,并将Docker容器应用环境中的安全机制与相关解决方案分为容器虚拟化安全、容器安全管理、容器网络安全三部分进行分析。
FB客服
2019/12/23
2K0
Docker容器安全性分析
基于 Cilium 和 eBPF 检测容器逃逸
如果运行云原生工作负载均衡设施,则可以更好地保护我们的服务。毕竟,服务经常向公众暴露以及工作负载可能属于不同的租户。在这篇博文中,我将向大家展示访问我们的 Kubernetes 集群的攻击者如何进行容器逃逸:运行 Pod 以获得 root 权限,将 Pod 转义到主机上,并通过不可见的 Pod 和无文件执行来持续攻击。同时,我将向大家展示如何基于 Isovalent Cilium Enterprise 进行攻击检测。
Luga Lee
2021/11/19
8370
基于 Cilium 和 eBPF 检测容器逃逸
使用Falco检测Kubernetes安全问题简介
https://www.infracloud.io/blogs/introduction-kubernetes-security-falco/
CNCF
2021/01/26
1.5K0
linux和docker的capabilities介绍
在linux 2.2版本之前,当内核对进程进行权限验证的时候,可以将进程划分为两类:privileged(UID=0)和unprivilege(UID!=0)。其中privileged的进程拥有所有内核权限,而unprivileged则根据如可执行文件的权限(effective UID, effective GID,supplementary group等)进行判断。
charlieroro
2020/03/23
1.6K0
浅谈Docker隔离性和安全性
介绍 相信很多开发者都默认Docker这样的容器是一种沙盒(sandbox)应用,也就是说他们可以用root权限在Docker中运行随便什么应用,而Docker有安全机制能保护宿主系统。 比如,有些人觉得Docker容器里面的进程跟虚拟机里面的进程一样安全;还有的人随便找个源就下载没有验证过的Docker镜像,看都不看内容就在宿主机器上尝试、学习和研究;还有一些提供PaaS服务的公司竟然允许用户向多租户系统中提交自己定制的Docker镜像。请注意,上述行为均是不安全的。 本文将介绍Docker的隔离性
FB客服
2018/02/06
3.4K0
浅谈Docker隔离性和安全性
如何在 OpenShift 中运行 Collabora Office
近期在尝试 office 文档在线编辑和预览的一些解决方案, 目前在使用Collabora Office, 但是Collabora的docker镜像在OpenShift中运行不起来, 一直提示Operation not permitted.
东风微鸣
2022/04/21
1.3K0
如何在 OpenShift 中运行 Collabora Office
04 . Docker安全与Docker底层实现
跟其他添加Docker容器的第三方工具一样(比如网络拓扑和文件系统共享),有很多类似的机制,在不改变Docker内核情况下就可以加固现有的容器.
iginkgo18
2020/09/27
1K0
04 . Docker安全与Docker底层实现
在Kubernetes中配置Container Capabilities
实际上这是配置对应的容器的 Capabilities,在我们使用 docker run 的时候可以通过 --cap-add 和 --cap-drop 命令来给容器添加 LinuxCapabilities。对于大部分同学可能又要疑问 LinuxCapabilities 是什么呢?
CNCF
2019/12/04
4.3K0
docker 非root用户修改mount到容器的文件出现“Operation not permitted
进入容器,在/mnt目录下进行修改文件属性的操作,出现如下错误(此时容器中的user id=0)
charlieroro
2020/03/24
5.3K0
浅谈Linux SECCOMP安全机制在容器中的使用
简单的文件复制代码,当seccomp功能打开的时候,代码执行到25行“open(argv[1], O_RDONLY)”时就会 退出,如图:
CNCF
2021/03/15
7.3K0
elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统
  刚从事开发那段时间不习惯输出日志,认为那是无用功,徒增代码量,总认为自己的代码无懈可击;老大的叮嘱、强调也都视为耳旁风,最终导致的结果是我加班排查问题,花的时间还挺长的,要复现问题、排查问题等,幸亏那是公司内部员工用的系统,时间长一点也没什么大问题,但是如果是针对客户的,时间就代表很多东西了,那造成的影响就非常大了。自那以后养成了输出日志的习惯。
青石路
2018/09/10
1.4K0
elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统
相关推荐
业务迁移到容器云上的6个注意事项
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验