docker run:--privileged=true选项解析(特权模式:赋予容器几乎与主机相同的权限)

2023-09-18 21:01:37

Docker的–privileged=true选项

Docker在创建和运行容器时,提供了许多命令行参数来自定义容器的行为。其中之一就是--privileged=true选项。此选项提供了对主机系统资源更深层次的访问权限。本文将详细解析这个选项,并探索它的用途和可能带来的风险。

1. Docker 容器的安全性

1.1 Linux Namespace 和 Capabilities

在理解--privileged=true选项之前,首先需要了解Docker容器的安全模型。Docker使用Linux namespace和capabilities来实现容器隔离和限制权限1

  • Linux Namespace:Docker利用namespace技术,使得每个容器都有其自己的进程、网络、挂载、用户ID等独立的空间2。这保证了容器与容器之间以及容器与主机之间的隔离性。

  • Capabilities:Linux capabilities允许将传统的root权限分割成多个不同的能力,例如CAP_NET_ADMIN能力允许操作网络配置,CAP_CHOWN能力允许改变文件所有权3。Docker默认情况下会赋予容器一些必要的capabilities,但不包括全部的能力,从而降低了被攻击的风险。

docker run --cap-add=SYS_PTRACE --rm -it ubuntu

Docker 通过 --cap-add--cap-drop 两个参数,可以灵活地添加或删除容器的 capabilities。

上面--cap-add=SYS_PTRACE的意思就是:给容器添加 SYS_PTRACE 权限,允许容器内的进程可以 ptrace 和 debug 其他进程。

1.2 限制和权限

在默认情况下,Docker对容器的权限进行了严格的限制,只提供了有限的capabilities。此外,许多系统级别的操作(例如挂载文件系统、修改内核参数等)都是被禁止的。这种安全模型使得Docker可以在不牺牲安全性的前提下,实现轻量级的虚拟化。

然而,在某些情况下,我们可能需要赋予容器更多的权限。例如,如果我们需要在容器中运行一些需要特权的服务(如网络设备管理、硬件设备接口等),那么默认的权限可能就不够用了。这时候,--privileged=true选项就派上了用场。

2. Docker的–privileged=true选项

2.1 --privileged=true的作用

当使用--privileged=true选项运行容器时,Docker会赋予容器几乎与主机相同的权限4。具体来说,这个选项做了以下两件事情:

  • 给容器添加了所有的capabilities
  • 允许容器访问主机的所有设备
docker run --privileged=true -it ubuntu

这意味着在一个privileged容器中,我们可以做很多平时不能做的事情,例如加载内核模块、直接操作硬件设备等。

2.2 --privileged=true的风险

尽管--privileged=true选项为容器提供了强大的功能,但它也带来了一些严重的安全隐患。由于privileged容器具有几乎与主机相同的权限,所以如果容器被恶意代码控制,那么攻击者就可以轻易地突破容器的边界,对主机进行任意操作5

因此,我们需要谨慎地使用--privileged=true选项,只在真正需要的情况下才启用它。在可能的情况下,我们应该尽量使用其他更细粒度的权限控制手段,例如通过--cap-add--device参数来分别添加必要的capabilities或设备访问权限。

# 添加单个capability
docker run --cap-add=NET_ADMIN -it ubuntu

# 添加设备访问权限
docker run --device=/dev/sda:/dev/xvdc -it ubuntu

3. 结论

Docker的--privileged=true选项提供了强大的功能,使得我们可以在容器中执行一些需要特权的操作。然而,这个选项也带来了严重的安全隐患,可能导致容器突破边界,对主机进行任意操作。因此,我们需要谨慎地使用这个选项,只在必要的情况下才启用它,并尽量使用其他更细粒度的权限控制手段。

参考链接:


  1. Docker Security | Docker Documentation ↩︎

  2. Namespaces overview | Linux Kernel Documentation ↩︎

  3. Capabilities | Linux man page ↩︎

  4. Runtime privilege and Linux capabilities | Docker Documentation ↩︎

  5. Understand the risks of running Docker containers with --privileged flag ↩︎

更多推荐

【AI视野·今日NLP 自然语言处理论文速览 第三十五期】Mon, 18 Sep 2023

AI视野·今日CS.NLP自然语言处理论文速览Mon,18Sep2023Totally51papers👉上期速览✈更多精彩请移步主页DailyComputationandLanguagePapers"MergeConflicts!"ExploringtheImpactsofExternalDistractorstoP

小白带你学习ceph分布式存储

目录一、概述1、分布式存储系统2、特点2、1统一存储2、2高扩展性2、3可靠性强2、4高性能二、组件1.Monitor2.OSD3.MDS4.Object5.PG6.RADOS7.Libradio8.CRUSH9.RBD10.RGW11.CephFS三、架构图1、文件上传2、文件存储前四、部署1、环境拓扑2、准备工作3

【Robotframework+python】实现http接口自动化测试

前言下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了bug,所以需要一遍遍回归case,过程一直手工去执行,苦不堪言。所以,对于即将开始的http接口测试需求,立马花了两天时

Openresty(二十二)ngx.balance和balance_by_lua终结篇

一灰度发布铺垫①init_by_lua*init_by_luainit_by_lua_block特点:在openresty'start'、'reload'、'restart'时执行,属于'masterinit'阶段机制:nginx'master'主进程'加载配置文件'时,运行全局LuaVM级别上的参数指定的'Lua代码

操作系统备考学习 day4 (2.1.7 - 2.2.4)

操作系统备考学习day4二、进程与线程2.1进程与线程2.1.7线程的状态与转换2.2处理机调度2.2.1调度的概念、层次2.2.2进程调度的时机切换与过程调度的方式2.2.3调度器、闲逛进程2.2.4调度算法的评价指标二、进程与线程2.1进程与线程2.1.7线程的状态与转换线程的状态与转换线程的组织与控制2.2处理机

使用亚马逊云服务器在 G4 实例上运行 Android 应用程序

随着Android应用程序和游戏变得越来越丰富,其中有些甚至比PC上的软件更易于使用和娱乐,因此许多人希望能够在云上运行Android游戏或应用程序,而在EC2实例上运行Android的解决方案可以让开发人员更轻松地测试和运行Android应用程序。在这篇博客文章中,我们将展示如何使用NICEDCV在Anbox中运行A

【JDK 8-Lambda】3.1 Java高级核心玩转 JDK8 Lambda 表达式

一、什么是函数式编程?二、什么是lambda表达式?1.先看两个示例A.【创建线程】B.【数组排序-降序】2.lambda表达式特性A.使用场景(前提):B.语法(params)->expressionC.参数列表D.方法体F.好处一、什么是函数式编程?将一个函数(也称“行为”)作为一个参数进行传递面向对象编程是对数据

【Redis】Redis 的学习教程(十一)之使用 Redis 实现分布式锁

1.分布式锁概念在多线程环境下,为了保证数据的线程安全,锁保证同一时刻,只有一个可以访问和更新共享数据。在单机系统我们可以使用synchronized锁、Lock锁保证线程安全。synchronized锁是Java提供的一种内置锁,在单个JVM进程中提供线程之间的锁定机制,控制多线程并发。只适用于单机环境下的并发控制。

解决Nacos配置刷新导致定时器停止执行的问题

1.问题描述我使用了一个定时器类来执行某个任务,并且使用Nacos作为配置中心来管理定时器的配置。我发现当Nacos配置发生变化时,定时器实例会停止执行任务,导致任务无法按预期执行。2.原先的实现方式以下是我原先的代码实现方式:@Component@RefreshScope@RequiredArgsConstructo

英飞凌TC3xx--深度手撕HSM安全启动(四)--TC3xx HSM使能和配置技巧

上一章,我们简单聊了下英飞凌TC3xx的HSM的系统框架、相关UCB、Host和HSM通信模块。今天着重分析HSM的使能。1.系统引入HSM的思考为什么要增加HSM信息安全方面考虑,系统的安全启动、ECU之间安全数据的交互、ECU内部的敏感信息保存TC3xx使能HSM后,HSM的代码应该存放在哪里?在上一章,我们了解到

C++的移动构造和移动赋值运算符

右值引用右值引用(rvaluereferences)是一种新的用于绑定右值的引用类型。那么什么是右值?右值通常是编译器生成的用于表达式计算的临时变量或常量。目前来说,我们还不能安全地使用引用变量来绑定右值。从编译原理上讲,右值是只存在于表达式计算时的未命名值。下面这一表达式产生了一个右值:x+(y*z);//AC++e

热文推荐