服务公告

服务公告 > Linux命令 > 蓝易云:Linux安全Capabilities机制

蓝易云:Linux安全Capabilities机制

发布时间:2025-12-24 00:15

Linux Capabilities 机制:把“root 全权”拆成“最小特权”的权限颗粒度 ✅

传统模型里,进程要么是普通用户,要么拿到 UID 0(root)近乎“全权限”。这在安全治理上很昂贵:一旦程序被利用,攻击面会被“放大”。Capabilities 的核心价值是把超级权限拆成很多可控的“能力位”,让进程只拿到完成任务所需的那几项,从而把风险控制在边界内。(man7.org)


原理解释表:进程的 5 类能力集合(重点必须吃透)

集合 你可以把它理解成 作用要点
Effective “正在生效的权限” 内核做权限检查时主要看它 (man7.org)
Permitted “可用权限上限” 限制哪些能力允许进入 Effective (man7.org)
Inheritable “可传承意愿” 与文件能力结合,影响 exec 后继承 (man7.org)
Bounding set “硬上限天花板” 即使文件写了能力,超出天花板也拿不到 (man7.org)
Ambient “跨 exec 的随身能力” 用于让非特权程序在 exec 后仍保留部分能力(需满足规则) (lwn.net)

一句务实的话:**Effective=当前在用;Permitted=最多能用;Bounding=系统硬顶;Ambient=跨 exec 的便携包**。


工作流程图:一次 execve 后能力是怎么“算出来”的 🧠

Syntax error in textmermaid version 10.8.0
Parse error on line 2:
.../pA] --> B[执行 execve() 加载新程序] B --> C{ -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

要点依据:文件能力存放在扩展属性 security.capability;内核按规则组合计算,并受 Bounding/Ambient 等约束。(man7.org)


实战对比表:常见 Capability 与典型场景(少给、精给)🎯

业务需求 推荐能力 为什么不是直接 root
监听 80/443 这类低端口 CAP_NET_BIND_SERVICE 只解决“绑定端口”,不扩大到文件/内核全权
需要发 ICMP / 原始套接字(如 ping 类) CAP_NET_RAW 给 root 会把系统管理权也顺带送出去
调整系统时间 CAP_SYS_TIME 只放开时间相关能力
绕过文件读写权限检查(高风险) CAP_DAC_OVERRIDE 这是“越权读写”,必须极慎用
“啥都想管” CAP_SYS_ADMIN 它常被戏称“万能钥匙”,尽量别发放(真的会出事)(man7.org)

3 组高频命令:查看、授予、回收(每段都解释)

1)查看某个进程当前能力

cat /proc/1234/status | grep -E 'Cap(Prm|Eff|Inh|Bnd|Amb)'

解释:

  • /proc/1234/status:内核为 PID=1234 暴露的进程状态信息文件。
  • CapPrm/CapEff/CapInh/CapBnd/CapAmb:分别对应 Permitted/Effective/Inheritable/Bounding/Ambient 的位图(十六进制掩码)。
  • grep -E ...:只筛出能力相关字段,便于审计与排障(例如“为什么绑定不了 80”常能在这里定位到缺哪一位)。(man7.org)

2)给可执行文件授予“绑定低端口”能力(文件能力)

sudo setcap cap_net_bind_service=+ep /usr/local/bin/myapp

解释:

  • setcap:写入文件的 capability 扩展属性(落在 security.capability)。(man7.org)
  • cap_net_bind_service:允许绑定 1024 以下端口。
  • =+ep
    • e(Effective):执行时让该能力进入有效集;
    • p(Permitted):允许该能力成为可用上限;
  • /usr/local/bin/myapp:目标二进制。设置后,程序可用普通用户启动,但仍能绑定 80/443(达成“最小特权”)。

3)审计与回收:查有哪些文件被赋能、再撤销

getcap -r /usr/local/bin 2>/dev/null
sudo setcap -r /usr/local/bin/myapp

解释:

  • getcap -r:递归列出目录下所有带文件能力的目标,做资产盘点很高效。
  • 2>/dev/null:把无权限/不存在等错误输出丢弃,避免噪音影响审计结果。
  • setcap -r:移除该文件的 capability 扩展属性,相当于“收回授权”。

systemd 场景:把能力注入到服务,而不是改二进制(更“企业级”)🧱

[Service]
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

解释:

  • NoNewPrivileges=yes:进程及其子进程不能通过 exec 获得“新增特权”,是非常关键的防线。(freedesktop.org)
  • AmbientCapabilities=...:把能力以 Ambient 形式带给服务进程,适合“非 root 服务也要低端口”的场景。(freedesktop.org)
  • CapabilityBoundingSet=...:把“天花板”压到只剩这一项,哪怕程序想拿更多,也拿不到。(freedesktop.org)

一句话总结:用 systemd 做能力编排,更利于标准化、审计与回滚


落地建议:把 Capabilities 当作“权限预算表”来管理 💼

  1. 先定义“业务必须能力清单”,能 1 项就别给 2 项。
  2. 优先用 CapabilityBoundingSet + NoNewPrivileges 做双保险,再谈便利性。(freedesktop.org)
  3. 对 CAP_SYS_ADMIN 保持敬畏:它看起来省事,实际上是把风险 KPI 直接拉满。

如果你告诉我你的服务类型(Web、Agent、监控探针、容器内应用),我可以给你一份“最小能力模板 + systemd 沙箱基线”,直接拿去套用。

已经是第一篇啦!

下一篇: 服务器路由命令有哪些常用技巧?