目录
- [一. Capability简介](#一. Capability简介)
-
- [1.1 为什么需要 capability](#1.1 为什么需要 capability)
- [1.2 capability 的基本概念](#1.2 capability 的基本概念)
- [1.3 capability 的存储位置](#1.3 capability 的存储位置)
- [二. 实际应用场景](#二. 实际应用场景)
-
- [2.1 让普通用户程序绑定低端口](#2.1 让普通用户程序绑定低端口)
- [2.2 在caddy中的应用](#2.2 在caddy中的应用)
一. Capability简介
Linux 的 capability(能力)机制是一种比传统 UID/GID 更细粒度的权限控制方式。
1.1 为什么需要 capability
传统 Unix/Linux 权限模型下,进程只有两种状态:
- 普通进程:权限受限于其 UID
- 特权进程(root,UID=0):拥有所有权限
这种全有或全无的模式带来安全隐患:
- 一个只需要绑定 80 端口的程序必须拥有 root 权限
- 一旦该程序被攻破,攻击者就获得完整系统控制权
1.2 capability 的基本概念
Capability 将 root 的特权拆分成多个独立的、可单独授予或撤销的权限单元。例如:
CAP_NET_BIND_SERVICE:允许绑定 1024 以下的端口CAP_NET_RAW:允许使用原始套接字CAP_SYS_ADMIN:系统管理操作CAP_KILL:允许向任意进程发送信号
1.3 capability 的存储位置
- 每个进程有三组 capability 集合:
bash
+------------------+
| Effective (E) | 进程当前实际拥有的权限
+------------------+
| Permitted (P) | 进程可以获得的权限上限
+------------------+
| Inheritable (I) | 可以被继承的权限
+------------------+
- 对于可执行文件,还有一个:
bash
+------------------+
| File caps | 文件本身携带的 capability
+------------------+
二. 实际应用场景
2.1 让普通用户程序绑定低端口
🔷Linux默认规定root之外的用户不能直接绑定1024以下的端口
- 需要使用root的传统方式
bash
sudo python3 -m http.server 80
- 使用
capability方式
bash
# 给 python3 这个可执行文件赋予绑定低端口的权限
sudo setcap cap_net_bind_service=+ep /usr/bin/python3
# 然后普通用户也可以绑定80端口了
python3 -m http.server 80
2.2 在caddy中的应用
- caddy启动时默认需要绑定443端口,如果启动caddy的用户不是root用户的话,则会绑定443端口失败
- 此时给
/usr/bin/caddy添加绑定低端口的权限就可以了
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo setcap cap_net_bind_service=+ep /usr/bin/caddy
[ec2-user@ip-172-31-25-58 ~]$
[ec2-user@ip-172-31-25-58 ~]$ getcap /usr/bin/caddy
/usr/bin/caddy cap_net_bind_service=ep
[ec2-user@ip-172-31-25-58 ~]$
✅当然,实际在应用的时候,更好的做法是把绑定低端口的权限写到.service中,也就是说:
不是给 /usr/bin/caddy 这个文件权限,而是 systemd 在启动 Caddy 这个进程时给它 capability。
- 详情请参照 → Linux caddy的安装与配置