Docker 容器隔离关键技术:Seccomp
Docker 容器隔离关键技术:Seccomp
在 Docker 容器中,Seccomp(Secure Computing Mode) 是一种内核安全机制,用来限制容器内的程序可以调用哪些系统调用(Syscalls)。通过列清单的方式,Seccomp 可以指定哪些系统调用被允许、被拒绝或需要特殊处理,从而增强容器的安全性。
什么是 Seccomp?
通俗比喻
想象你是一个公司安全管理员(宿主机),容器里的程序就像员工,而系统调用(Syscalls)就是员工用来操作外界资源的方式,比如:
- 打电话订货(文件操作)。
- 打电话开账户(网络操作)。
- 打电话调整公司系统(高权限操作)。
Seccomp 就是员工的“电话管理系统”:
- 只允许员工打某些“安全电话”(系统调用)。
- 拒绝任何“高风险电话”(例如直接改系统配置)。
- 如果电话违规,直接挂断或报警。
Seccomp 的作用
- 限制系统调用范围:Seccomp 通过列清单(白名单或黑名单)的方式,限制程序只能调用经过允许的系统调用。
- 增强容器安全性:减少恶意程序通过高风险系统调用(如
ptrace
或mount
)攻击宿主机。 - 减少攻击面:系统调用是与内核交互的关键接口,限制调用种类可以降低被攻击的可能性。
Seccomp 与 Capabilities 的关系
-
核心区别:
- Seccomp 限制的是容器内进程调用的“系统调用”(Syscalls)。
- Capabilities 限制的是容器的“权限”(如挂载、修改文件权限)。
比喻:
- Capabilities 是限制“容器能不能开某扇门”(权限)。
- Seccomp 是限制“容器能不能用某种工具”(系统调用)。
-
互相配合:
- Capabilities 可以禁用容器的高权限操作(如
CAP_SYS_ADMIN
禁用挂载权限)。 - Seccomp 则进一步限制具体的系统调用,即使拥有
CAP_SYS_ADMIN
权限,也可以通过禁止mount
调用来加强安全。
- Capabilities 可以禁用容器的高权限操作(如
Seccomp 在 Docker 中的使用
1. 默认 Seccomp 策略
Docker 默认启用了一个标准的 Seccomp 策略文件(default.json
),其特点是:
- 允许常用系统调用:如
read
、write
、open
。 - 禁止高风险系统调用:如
keyctl
(管理内核密钥)、create_module
(加载内核模块)、delete_module
(卸载内核模块)。 - 限制进程相关调用:如
ptrace
(调试进程)。
这种默认策略适合大多数容器任务,同时保证了安全性和功能性之间的平衡。
2. 自定义 Seccomp 策略
如果默认策略无法满足需求(如更严格的限制),可以使用自定义策略文件,以 JSON 格式定义:
{"defaultAction": "SCMP_ACT_ERRNO","syscalls": [{"names": ["read", "write", "exit", "sigreturn"],"action": "SCMP_ACT_ALLOW"},{"names": ["ptrace", "kexec_load"],"action": "SCMP_ACT_ERRNO"}]
}
SCMP_ACT_ALLOW
:允许调用。SCMP_ACT_ERRNO
:拒绝调用并返回错误。
运行容器时加载自定义策略:
docker run --security-opt seccomp=/path/to/custom-seccomp.json -it ubuntu
3. 禁用 Seccomp
某些情况下可能需要完全禁用 Seccomp(如调试容器):
docker run --security-opt seccomp=unconfined -it ubuntu
特权容器无法配置 Seccomp
什么是特权容器?
特权容器(Privileged Container)是 Docker 中一种特殊模式,启动时通过 --privileged
参数开启:
docker run --privileged -it ubuntu
特性:
- 拥有几乎所有的系统权限(类似于直接运行在宿主机上)。
- 访问宿主机的所有设备(如
/dev
)。 - 默认禁用 Seccomp、AppArmor 等安全机制。
为什么特权容器无法配置 Seccomp?
特权容器的权限设计初衷是为了绕过所有安全限制,因此它会自动禁用 Seccomp。即使尝试配置自定义 Seccomp 策略,也会被忽略。
安全风险
由于特权容器拥有宿主机级别的权限,攻击者可以轻易利用容器中的漏洞获取宿主机的控制权。建议仅在测试或特定需求场景中使用特权容器。
Seccomp 常见系统调用限制
系统调用 | 作用 | 默认策略 | 安全建议 |
---|---|---|---|
read | 读取文件或输入数据 | 允许 | 通常是安全的 |
write | 写入文件或输出数据 | 允许 | 通常是安全的 |
mount | 挂载文件系统 | 禁止 | 高风险,应禁用 |
umount | 卸载文件系统 | 禁止 | 高风险,应禁用 |
ptrace | 调试其他进程 | 禁止 | 高风险,应禁用 |
clone | 克隆当前进程 | 限制 | 根据任务需求谨慎允许 |
keyctl | 管理内核密钥 | 禁止 | 极高风险,应禁用 |
create_module | 加载内核模块 | 禁止 | 极高风险,应禁用 |
Seccomp 的优点
- 减少攻击面:
- 限制系统调用的种类,减少攻击者的利用路径。
- 增强隔离性:
- 即使容器被攻破,Seccomp 限制可以防止恶意程序滥用关键系统调用。
- 灵活性:
- 支持自定义策略,满足不同场景需求。
Seccomp 的局限性
- 特权容器无法使用:
- 特权容器(
--privileged
)直接绕过 Seccomp,无法配置任何策略。
- 特权容器(
- 需要配置策略:
- 默认策略可能无法满足所有场景,自定义策略需要理解系统调用。
- 依赖内核版本:
- Seccomp 是内核功能,某些旧版本内核可能不支持。
Seccomp 与 Capabilities 的对比
特性 | Seccomp | Capabilities |
---|---|---|
作用 | 限制系统调用(Syscalls)。 | 限制操作权限(Privileges)。 |
粒度 | 细粒度控制,指定允许或禁止的系统调用。 | 中粒度控制,按权限分配任务能力。 |
示例 | 禁止 ptrace 调试其他进程。 | 禁止 CAP_SYS_ADMIN 系统管理权限。 |
配合场景 | 禁止高风险的系统调用。 | 限制容器的高权限操作。 |
总结
Seccomp 是 Docker 容器的一项重要安全技术。它通过限制系统调用的范围,减少攻击面,提升容器的隔离性。尽管默认启用了标准策略,但 Seccomp 可以根据需求进行自定义,进一步加强容器的安全性。
重要注意:特权容器(--privileged
)默认禁用 Seccomp。由于特权容器本质上绕过了所有安全限制,使用时需极其谨慎。
相关文章:

Docker 容器隔离关键技术:Seccomp
Docker 容器隔离关键技术:Seccomp 在 Docker 容器中,Seccomp(Secure Computing Mode) 是一种内核安全机制,用来限制容器内的程序可以调用哪些系统调用(Syscalls)。通过列清单的方式,…...

【大模型】深度解析 NLP 模型5大评估指标及 应用案例:从 BLEU、ROUGE、PPL 到METEOR、BERTScore
在自然语言处理(NLP)领域,无论是机器翻译、文本生成,还是问答系统开发,模型性能评估指标始终是开发者绕不开的工具。BLEU、ROUGE、PPL(困惑度)、METEOR 和 BERTScore 是五个最具代表性的指标&am…...

LinuxC高级
gdb调试工具 gdb调试的作用 gdb用于调试代码中逻辑错误,而非语法错误 gdb调试流程 生成可以使用gdb调试的执行文件 gcc -g xxx.c ---> 生成的文件可以使用gdb调试 进入gdb工具 gdb 可执行文件 ---> 使用gdb工具开始调试可执行文件 r/run:运行代码 …...

实现PDF文档加密,访问需要密码
01. 背景 今天下午老板神秘兮兮的来问我,能不能做个文档加密功能,就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了,那必须可以。 需求:将pdf文档经过加密处理,客户下载pdf文档,打开文档需要…...

LangChain——加载知识库文本文档 PDF文档
文档加载 这涵盖了如何加载目录中的所有文档。 在底层,默认情况下使用 UnstructedLoader。需要安装依赖 pip install unstructuredpython导入方式 from langchain_community.document_loaders import DirectoryLoader我们可以使用 glob 参数来控制加载特定类型文…...

深度学习2:从零开始掌握PyTorch:数据操作不再是难题
文章目录 一、导读二、张量的定义与基本操作三、广播机制四、索引与切片五、内存管理六、与其他Python对象的转换本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,…...

MyBatis的if标签的基本使用
在MyBatis框架中,if标签用于在构建SQL语句时,根据参数条件判断的结果,动态地选择加入或不加where条件中。 一 常见使用 在使用MyBatis处理查询逻辑的时候,常用的是判断一些参数是否为空,列举常用的几种情况展示 1.1…...

【Azure Cache for Redis】Redis的导出页面无法配置Storage SAS时通过az cli来完成
问题描述 在Azure Redis的导出页面,突然不能配置Storage Account的SAS作为授权方式。 image.png 那么是否可以通过AZ CLI或者是Powershell来实现SAS的配置呢? 问题解答 可以的。使用 az redis export 可以实现 az redis export --container --prefix[--a…...

【微服务】Nacos
一、安装 1、官网地址:https://nacos.io/download/nacos-server/ 2、启动:找到bin目录下的startup.cmd双击启动,或者打开一个命令窗口输入: startup.cmd -m standalone双击启动后如下:可以访问控制台地址 访问后的…...

5、定义与调用函数
大家好,欢迎来到Python函数入门课程! 在编程中,函数就像一个可以重复使用的代码块,它接受输入(参数),执行特定的任务,并可能返回一个结果。想象一下,函数就像一个厨房里的搅拌机,你放入水果(参数),按下按钮(调用函数),它就会帮你制作出美味的果汁(返回值)。…...

Linux 网络编程之TCP套接字
前言 上一期我们对UDP套接字进行了介绍并实现了简单的UDP网络程序,本期我们来介绍TCP套接字,以及实现简单的TCP网络程序! 🎉目录 前言 1、TCP 套接字API详解 1.1 socket 1.2 bind 1.3 listen 1.4 accept 1.5 connect 2、…...

前海湾地铁的腾通数码大厦背后的临时免费停车点探寻
临时免费停车点:前海湾地铁的腾通数码大厦背后的桂湾大街,目前看不仅整条桂湾大街停了车,而且还有工地餐点。可能是这个区域还是半工地状态,故暂时还不会有罚单的情况出现。 中建三局腾讯数码大厦项目部A栋 广东省深圳市南山…...

OpenCV相机标定与3D重建(7)鱼眼镜头立体校正的函数stereoRectify()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::fisheye::stereoRectify 是 OpenCV 中用于鱼眼镜头立体校正的函数。该函数计算两个相机之间的校正变换,使得从两个相机拍摄的图像…...

前端如何获取unpkg的资源链接
在现代前端开发中,快速获取和使用npm包是一个常见需求。unpkg是一个全球性的CDN服务,它为npm上的每个包提供了快速访问。通过unpkg,你可以轻松地通过URL获取任何npm包的文件。本文将介绍如何获取unpkg的资源链接。 unpkg简介 unpkg是一个快…...

Flink 离线计算
文章目录 一、样例一:读 csv 文件生成 csv 文件二、样例二:读 starrocks 写 starrocks三、样例三:DataSet、Table Sql 处理后写入 StarRocks四、遇到的坑 <dependency><groupId>org.apache.flink</groupId><artifactId&…...

Git | 理解团队合作中Git分支的合并操作
合并操作 团队合作中Git分支的合并操作分支合并过程1.创建feature/A分支的过程2. 创建分支feature/A-COPY3.合并分支查看代码是否改变 团队合作中Git分支的合并操作 需求 假设团队项目中的主分支是main,团队成员A基于主分支main创建了feature/A,而我又在团队成员A创…...

C++多态的实现原理
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、类的继承 子类对象在创建时会首先调用父类的构造函数 父类构造函数执行结束后,执行子类的构造函数 当父类的构造函数有参数时,需要在子类的初始化列表中显式调用 Child(int i) : …...

[极客大挑战 2019]PHP--详细解析
信息搜集 想查看页面源代码,但是右键没有这个选项。 我们可以ctrlu或者在url前面加view-source:查看: 没什么有用信息。根据页面的hint,我们考虑扫一下目录看看能不能扫出一些文件. 扫到了备份文件www.zip,解压一下查看网站源代码…...

map用于leetcode
//第一种map方法 function groupAnagrams(strs) {let map new Map()for (let str of strs) {let key str ? : str.split().sort().join()if (!map.has(key)) {map.set(key, [])}map.get(key).push(str)} //此时map为Map(3) {aet > [ eat, tea, ate ],ant > [ tan,…...

CommonJS 和 ES Modules 的 区别
CommonJS 和 ES Modules 的 区别 1. CommonJS 和 ES Modules 区别?1.1 语法差异CommonJS:ES Modules: 1.2. 加载机制CommonJS:ES Modules: 1.3. 运行时行为CommonJS:ES Modules: 1.4. 兼容性和使用场景Com…...

科技为翼 助残向新 高德地图无障碍导航规划突破1.5亿次
今年12月03日是第33个国际残疾人日。在当下科技发展日新月异的时代,如何让残障人士共享科技红利、平等地参与社会生活,成为当前社会关注的热点。 中国有超过8500万残障人士,其中超过2400万为肢残人群,视力障碍残疾人数超过1700万…...

Flink四大基石之Time (时间语义) 的使用详解
目录 一、引言 二、Time 的分类及 EventTime 的重要性 Time 分类详述 EventTime 重要性凸显 三、Watermark 机制详解 核心原理 Watermark能解决什么问题,如何解决的? Watermark图解原理 举例 总结 多并行度的水印触发 Watermark代码演示 需求 代码演示ÿ…...

Spring WebFlux与Spring MVC
Spring WebFlux 是对 Spring Boot 项目中传统 Spring MVC 部分的一种替代选择,主要是为了解决现代 Web 应用在高并发和低延迟场景下的性能瓶颈。 1.WebFlux 是对 Spring MVC 的替代 架构替代: Spring MVC 使用的是基于 Servlet 规范的阻塞式模型…...

【深度学习基础】一篇入门模型评估指标(分类篇)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…...

D80【 python 接口自动化学习】- python基础之HTTP
day80 requests请求加入headers 学习日期:20241126 学习目标:http定义及实战 -- requests请求加入headers 学习笔记: requests请求加入headers import requestsurlhttps://movie.douban.com/j/search_subjects params{"type":…...

⽂件操作详解
⽬录 一 文件操作的引入 1 为什么使⽤⽂件? 2 什么是⽂件? 3 文件分类(1 从⽂件功能的⻆度来分类:程序⽂件/数据⽂件 2根据数据的组织形式:为⽂本⽂件/⼆进制⽂件) 二 ⽂件的打开和关闭 1 …...

双高(高比例新能源发电和高比例电力电子设备)系统宽频振荡研究现状
1 为什么会形成双高电力系统 (1)新能源发电比例增加 双碳计划,新能源革命,可再生能源逐步代替传统化石能源,未来新能源发电将成为最终能源需求的主要来源。 (2)电力电子设备数量增加 为了实…...

TorchMoji使用教程/环境配置(2024)
TorchMoji使用教程/环境配置(2024) TorchMoji简介 这是一个基于pytorch库,用于将文本分类成不同的多种emoji表情的库,适用于文本的情感分析 配置流程 从Anaconda官网根据提示安装conda git拉取TorchMoji git clone https://gi…...

使用 Python 中的 TripoSR 根据图像创建 3D 对象
使用 Python 中的 TripoSR 根据图像创建 3D 对象 1. 效果图2. 步骤图像到 3D 对象设置环境导入必要的库设置设备创建计时器实用程序上传并准备图像处理输入图像生成 3D 模型并渲染下载.stl 文件展示结果3. 源码4. 遇到的问题及解决参考这篇博客将引导如何使用Python 及 TripoSR…...

Spring 框架中AOP(面向切面编程)和 IoC(控制反转)
在 Spring 框架中,AOP(面向切面编程)和 IoC(控制反转)是两个核心概念,它们分别负责不同的功能。下面我将通过通俗易懂的解释来帮助你理解这两个概念。 IoC(控制反转) IoC 是 Inver…...