从Ubuntu安装Harbor故障到了解AppArmor 与 Seccomp的思考

news/2025/11/16 21:26:21/文章来源:https://www.cnblogs.com/chengshaoting/p/19229100

Ⅰ. 冲突:级联故障下的“表象迷惑”与MTTR损失

我们从一次 Harbor 镜像仓库的启动失败开始。在修复了初期由非标准 Unicode 字符导致的 YAML 解析错误后,系统并没有如期启动,反而陷入了更深层次的循环崩溃,最终在Harbor目录下的docker-compose.yml 文件中的各个组件下加入了 security_opt: - seccomp=unconfined 之后才将问题解决。

# Ubuntu 2204版本
# Docker version 20.10.7, build f0df350
# Docker Compose version v2.40.3
# Harbor.v2.13.2
# 以下为当时故障状态,通过docker-compose logs检查日志可看到明显报错
root@k8s-node1:~/harbor/harbor# docker-compose ps
NAME                IMAGE                                 COMMAND                   SERVICE       CREATED          STATUS                                     PORTS
harbor-core         goharbor/harbor-core:v2.13.2          "/harbor/entrypoint.…"   core          21 seconds ago   Restarting (2) 2 seconds ago               
harbor-db           goharbor/harbor-db:v2.13.2            "/docker-entrypoint.…"   postgresql    21 seconds ago   Up Less than a second (health: starting)   
harbor-jobservice   goharbor/harbor-jobservice:v2.13.2    "/harbor/entrypoint.…"   jobservice    21 seconds ago   Restarting (2) 3 seconds ago               
harbor-log          goharbor/harbor-log:v2.13.2           "/bin/sh -c /usr/loc…"   log           21 seconds ago   Up 15 seconds (health: starting)           127.0.0.1:1514->10514/tcp
harbor-portal       goharbor/harbor-portal:v2.13.2        "nginx -g 'daemon of…"   portal        21 seconds ago   Up 11 seconds (health: starting)           
nginx               goharbor/nginx-photon:v2.13.2         "nginx -g 'daemon of…"   proxy         21 seconds ago   Up 4 seconds (health: starting)            0.0.0.0:80->8080/tcp, [::]:80->8080
redis               goharbor/redis-photon:v2.13.2         "redis-server /etc/r…"   redis         21 seconds ago   Restarting (1) 1 second ago                
registry            goharbor/registry-photon:v2.13.2      "/home/harbor/entryp…"   registry      21 seconds ago   Up 12 seconds (health: starting)           
registryctl         goharbor/harbor-registryctl:v2.13.2   "/home/harbor/start.…"   registryctl   21 seconds ago   Restarting (2) 4 seconds ago 

1. 启动链的熔断点

故障的核心症状是多个服务因依赖失败而重启。

服务 依赖状态 核心错误日志 错误指向的层级
harbor-jobservice 依赖 core dial tcp ... connection refused L7/网络连接层
harbor-core 依赖 redis, postgresql (无明显启动日志) 依赖阻塞层
redis 无外部依赖 Fatal: Can't initialize Background Jobs. Error message: Operation not permitted 内核权限层(根源)
registryctl 依赖 log pthread_create failed 内核权限层(根源)

技术观察: 这是一个典型的“死亡依赖循环”。我们不能被顶层的 connection refused(网络问题)所迷惑。SRE 必须立即执行逆向熔断诊断,将目光锁定到没有任何外部依赖、却依然无法启动的底层服务——redis 和 Harbor 的 Go 核心组件。

2. SRE 权限诊断的第一原则

当日志中出现 Operation not permittedpthread_create failed 这类与 进程/线程初始化 直接相关的内核级错误时,我们必须跳出文件系统权限(ACL)的舒适区,进入 Linux 内核的强制访问控制(MAC) 诊断矩阵。

文件系统的拒绝是“权限不足”,内核行为的拒绝是“行为非法”。所有与进程/线程创建相关的底层错误,都是对 Seccomp 机制的隐式质询。

Ⅱ. 转折点:Seccomp vs AppArmor 的权力边界

要理解为什么 seccomp=unconfined 成为转折点,我们必须精确界定容器安全机制的两个权力维度。这是 SRE 在权限架构上的核心知识点。

机制名称 AppArmor (应用装甲) Seccomp (安全计算模式)
控制对象 资源(Resource):文件路径、网络接口、Capabilities 集合。 动作(Action):进程向内核发起的系统调用 (Syscall) 集合。
控制哲学 空间隔离:定义进程能在哪里活动。 行为过滤:定义进程能做什么
工作位置 内核 MAC 框架 内核系统调用过滤层(基于 BPF 机制)
您的 AppArmor 配置 确保容器不能越界读写宿主机目录,或以 Root 身份访问敏感文件。 不介入。
本次故障的焦点 不相关。 因为这不是文件或目录访问问题。 直接相关。 因为是 Go Runtime 和 Redis 试图执行特定动作被阻止。

seccomp=unconfined 规避的底层原理

Seccomp 规避的,是 Docker 默认 Profile 对 Go Runtime 和 Redis 启动所需的“必需系统调用”所做的阻塞。

1. Go Runtime 的 Syscall 陷阱

Harbor 的 corejobserviceregistryctl 都是 Go 语言编写。Go 采用 M-P-G(Machine-Processor-Goroutine)模型管理并发,当 Goroutine 数量激增或需要长时间 I/O 阻塞时,Go Runtime 会调用底层的 clone() 系统调用,创建新的 OS 级线程(M,Machine)来执行任务。

  • 被阻止的调用: Docker 的默认 Seccomp Profile 禁用了如 cloneclone3 等 syscall 的特定标志位,以及可能被滥用于容器逃逸的进程/线程控制调用。
  • 后果: Go Runtime 尝试通过 clone 创建新线程,但被 Seccomp 过滤器拒绝。其结果在应用层表现为:

典型错误:线程创建失败,导致程序无法启动

# 典型错误:线程创建失败,导致程序无法启动
registryctl | pthread_create failed (Operation not permitted)

2. Redis 的后台进程陷阱

Redis 作为单线程模型,其持久化操作(如 BGSAVE)依赖经典的 UNIX 机制:fork() 系统调用。

  • fork() 的本质: fork() 创建一个与父进程几乎完全相同的子进程。这个 syscall 的权限非常敏感。

  • 被阻止的后果: 默认 Seccomp 阻止或限制了 fork(),导致 Redis 无法创建子进程执行 BGSAVE 或 AOF 重写等后台任务,进而直接抛出致命错误,拒绝启动。

    redis | # Fatal: Can't initialize Background Jobs. Error message: Operation not permitted
    

    结论: 权限冲突不在于“谁能访问哪个文件”(AppArmor 的职责),而在于“谁被允许执行哪个底层动作”(Seccomp 的职责)。seccomp=unconfined 的作用,就是向内核宣告:“忽略默认的黑名单,允许这个容器执行任何系统调用。”

Ⅲ. 体系化解法:SRE 运维资产的“三级净化”飞轮

解决问题后,SRE 的任务是将临时性的规避转化为可复用、可指导新人的体系化方法论。我们将整个过程拆解为“三级净化”飞轮。

净化一级:配置资产的“防毒墙”工程

故障的第一阶段,被低级错误浪费了大量时间。

问题暴露点:

  1. 字符毒药: 在 YAML 注释或配置中引入了非 ASCII 或非标准 Unicode 字符(如 Emoji)。YAML 解析器对此极其敏感,直接报错 yaml: invalid Unicode character,阻止部署。
  2. 语法陷阱: 错误地将 security_opt 写为映射(map),而非 Docker Compose 期望的序列(list of strings)。
# ❌ 错误写法:被解析为 key: value map
security_opt:seccomp: unconfined # ✅ 正确写法:被解析为 list of strings
security_opt:- seccomp=unconfined

SRE 应对: 必须在 CI/CD 流程中引入 YAML Linter/Schema Validation。

配置文件的复杂性,是系统的技术债务。在 YAML 中,任何键值对或字符都必须被视为严格的工程输入,防止“字符毒药”污染。

净化二级:依赖的“逆向熔断”与根因穿透

在解决了配置问题后,SRE 必须使用分层诊断法。

方法:

  1. 从后往前看:jobservice (L7) 开始,向上追溯它的依赖 core
  2. 定位独立单元: 找到不依赖任何其他 Harbor 服务的单元,观察其日志。确定 redisregistryctl 为故障的起点。
  3. 内核穿透: 将错误信息从 L7 的“网络”/L4 的“连接”错误,穿透到 L1/L2 的“权限”/“Syscall”错误。

通过这种方式,我们确定了核心矛盾点在 Go Runtime 与 Seccomp 的兼容性上,而不是网络、数据库或业务逻辑。

净化三级:内核权限的“最小化白名单”重构

seccomp=unconfined 是一个高风险的技术债务。虽然解决了启动问题,但它使容器失去了对核心系统动作的过滤,让潜在的容器逃逸漏洞有了可乘之机。

SRE 终极目标: 移除 unconfined,构建定制化的 最小权限 Seccomp Profile

阶段 行动细节 关键技术收获
I. 行为审计 seccomp=unconfined 状态下,使用 strace -f 或更专业的 Syscall Auditor 工具(如 Falco 或 seccomp-tools)监控 rediscore 的启动过程。 捕获并记录所有启动阶段调用的系统调用列表(如 clone, fork, execve 等),这是构造白名单的“原材料”。
II. Profile 创建 基于审计结果,创建一个 Seccomp JSON 文件。该文件以白名单(Whitelisting)模式运行,仅允许 Redis 和 Go Runtime 必需的那些 Syscall。 相比于 Docker 的默认黑名单,定制化的白名单更加安全和精准,实现了真正的最小权限原则。
III. 策略固化 docker-compose.yml 中的配置替换为:security_opt: - seccomp:./custom-seccomp-harbor.json 彻底解除技术债务,将内核权限限制固化为 IaC 资产,确保下一次部署的安全性和确定性。

结语:从运维到工程的思维升华

这次 Harbor 故障,从表面的 YAML 语法错误、到中层的依赖阻塞、再到深层的内核权限冲突,是一次完美的 SRE 实战案例。它告诉我们,配置文件的每一行代码,不仅仅是启动参数,更是在与操作系统内核进行一场严肃的权限谈判

运维工程师的成长,就是将对底层技术的理解转化为对上层系统的控制力。

架构师的最终箴言: 容器化系统是现代 IT 的“军事禁区”。AppArmor 负责绘制边界,Seccomp 负责检查你的武器和行为。解决复杂故障的艺术,就是分清这两个“宪兵”的权力边界,并为你的应用争取最小可行而非最大放纵的运行权限。从 unconfined 的应急妥协,到定制化 Seccomp Profile 的最小化加固,是 SRE 从“救火队员”向“系统架构师”转变的必经之路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙应用开发实战:如何从0到1打造创新应用

以「往来记」为例,揭秘创新应用的构思、设计与实现全流程💡 引言:在成熟市场中寻找创新机会 在当今应用市场趋于饱和的环境下,很多开发者都在思考:如何做出真正有创新性的应用? 通过「往来记」这个项目的完整开…

什么是“组态路径”?

什么是“组态路径”?定义: 组态路径(Configuration Path)是指多个条件变量(因素)以特定组合方式共同作用,导致某一结果变量(如高风险感知)出现的因果路径。 📌 通俗解释: 它不是看“哪个因素最重要”,而是…

2025年11月防冻液厂家推荐榜:五家对比与性能评价一览

入冬前,设备管理者、暖通工程商、冷链物流运营方乃至新能源电池厂,都在为同一件事奔忙:把系统里的“血液”换成可靠的防冻液。零下突袭的寒潮、突发的政策抽检、客户对能耗与环保的双重要求,让“选错防冻液”成为停…

深入探索剖析 JVM 的启动过程

你可曾想过:当你在终端里敲下 java,在 main 方法真正运行之前,JVM 为了“创造一个可运行你的程序的宇宙”,到底经历了哪些步骤?从参数校验、系统资源探测,到选择垃圾回收器,再到类的加载、链接与初始化,这些看…

noip8多校2

11.1511.15 t1 赛时想假2.75h,敲了10k(咋做到的?不知道) 曼哈顿距离转切比雪夫距离。 详见 直接出结论: 将每个坐标 \((x,y)\) 变作 \((x+y,x−y)\) 后,原坐标的曼哈顿距离等于新坐标的切比雪夫距离。 证明: 拆式…

2025年11月防冻液厂家推荐排行:五家实力对比与选购指南

立冬之后,北方夜间温度已逼近冰点,南方昼夜温差也迅速拉大,工业循环冷却、空气能热泵、数据中心冷却、冷链物流、冰雪场馆制冰等场景陆续进入“防冻关键期”。大量工程商、设备运维方、物业后勤和经销商开始集中备货…

2025年11月防冻液厂家推荐对比:五家资质与性能全维度排行

进入11月,华北、华东集中供暖启动,西北、东北工业循环冷却系统面临-20℃以下考验,防冻液采购高峰随之到来。用户普遍面临三大痛点:一是低温粘度升高导致泵耗上升,二是缓蚀体系不匹配造成换热器点蚀,三是环保抽查…

2025年11月防冻液厂家推荐榜:五家主流对比与选购指南

入冬前,设备管理者最怕“一夜冻裂”。北方某数据中心去年因防冻液冰点不足,板式换热器爆裂,停机六小时,直接损失超三百万元;南方食品厂用劣质载冷剂,盘管穿孔,整库货物报废。用户此刻上网搜索“防冻液厂家”,核…

2025年11月冷媒剂厂家榜单:五强技术参数与口碑对比评测

如果你正在给新建冷库、数据中心或新能源电池产线挑选冷媒剂,大概率会被三个问题困住:一是“无腐蚀”口号满天飞,却拿不出第三方检测报告;二是低温型号不少,能在零下六十度仍保持低粘度的寥寥无几;三是厂家都说自…

2025年11月载冷剂厂家推荐榜:技术资质与口碑综合评测

进入2025年第四季度,冷链、数据中心、新能源电池、冰雪运动等温控场景对载冷剂的需求持续升温。用户普遍面临“配方不透明、腐蚀风险高、低温流动性差、环保认证缺失”四大痛点,同时希望一次性锁定“资质齐全、技术迭…

一对一 WebRTC 视频聊天

“最小可运行”的一对一 WebRTC 视频聊天示例(前端+信令服务器),完全按照你给出的 8 条信令流程图实现。 技术栈:前端:原生 JavaScript + socket.io-client 信令服务器:Node.js + socket.io + Express(80 端口…

2025年11月载冷剂厂家推荐榜:五强真实数据与场景化选型指南

进入2025年冬季,北方冷库、数据中心、新能源电池产线陆续进入满负荷运行,载冷剂作为二次冷媒的“血液”,其稳定性直接决定系统能耗与设备寿命。很多工程师在招标阶段发现:同样标注“食品级”或“低电导”的产品,现…

2025年11月载冷剂厂家榜单:性能参数与口碑综合评测

进入2025年第四季度,北方集中供暖启动、冷链物流旺季叠加新能源电池扩产,载冷剂采购需求集中爆发。很多项目工程师面临“三快一严”场景:快速选型、快速比价、快速交付,同时环保与安全审查趋严。用户普遍担心三点:…

20232313 2025-2026-1 《网络与系统攻防技术》实验五实验报告 - 20232313

1.实验内容基本实验内容如下:学会使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程 通过组合应…

【第7章 I/O编程与异常】Python文件操作与上下文管理器的深度解析(避坑指南)

从 C 到 Python:文件操作与上下文管理器的深度解析(避坑指南) 对于习惯了 C 语言手动管理资源的学习者,Python 的文件操作和上下文管理器常常带来认知混淆:为什么 C 必须手动 fopen/fclose,而 Python 能用 with …

2025年11月乙二醇厂家对比榜:五家主流厂商真实数据与选型要点

进入2025年第四季度,国内工业温控系统进入年度维保与新建项目并行的高峰期,乙二醇作为防冻液母液、载冷剂溶剂及工业传热介质的核心原料,采购量显著抬升。国家能源局11月最新统计显示,工业温控领域乙二醇月需求环比…

2025年11月乙二醇厂家对比榜:五强产品性能与合规资质全盘点

进入11月,北方工业循环与冷链系统陆续进入防冻液集中更换窗口,乙二醇作为载冷剂母液的需求陡增。用户普遍面临三大痛点:一是原料纯度与批次稳定性差异大,导致换热效率波动;二是资质文件繁杂,难以快速识别合规供应…

工业级时序数据库选型指南:技巧架构与场景化实践

工业级时序数据库选型指南:技巧架构与场景化实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

springboot生成前后端接口文档 - f

效果:图片中是访问接口文档的路径 一、基本配置 1.pom.xml中导入依赖:(根据需要的版本导入) <!-- swagger api文档 --><dependency><groupId>io.springfox</groupId><artifactId>sp…

20232429 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取信息。 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并查询获取该好友所在的具体地理位置。 (3)使用nmap开源…