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…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...