capsh 命令详解
capsh
是 Linux 中用于管理 capabilities(能力) 的工具,它允许精细控制进程权限,替代传统的全权 root 模式。
📌 核心概念:Capabilities
Linux 将 root 权限拆分为多个独立的能力(如 CAP_NET_ADMIN
、CAP_DAC_OVERRIDE
),进程可按需拥有特定能力,而非全部 root 权限,提升安全性。
🔍 常用参数
参数 | 说明 |
---|---|
--print | 显示当前 capabilities 状态 |
--decode=<N> | 解码数值形式的 capability(如 --decode=3 显示 cap_net_admin,cap_net_raw ) |
--caps=<cap_set> | 设置 capabilities(格式:cap_name+[eip] ,e=Effective, i=Inheritable, p=Permitted) |
--drop=<cap_list> | 移除指定 capabilities(逗号分隔,如 --drop=cap_chown,cap_kill ) |
--keep=1 | 保持当前 capabilities 并切换用户/组(通常与 --user 配合使用) |
--user=<user> | 切换到指定用户(需配合 --keep ) |
--inh=<cap_list> | 设置 Inheritable 集合 |
--secbits=<bits> | 设置安全位(如 none 禁用所有特性) |
-- -c "command" | 执行指定命令(-- 后为命令参数) |
🛠️ 使用示例
1. 查看当前 capabilities
sudo capsh --print
# 输出示例:
# Current: cap_net_admin=eip cap_net_raw=ep
# Securebits: 00/0x0/0
2. 启动进程并赋予特定能力
# 赋予 cap_net_bind_service 能力,允许绑定低端口
sudo capsh --caps='cap_net_bind_service+eip' -- -c "nginx"
3. 降权运行命令(保留能力并切换用户)
# 保留 cap_net_bind_service 并切换为 nobody 用户
sudo capsh --caps='cap_net_bind_service+eip' --keep=1 --user=nobody -- -c "id"
4. 移除指定能力
# 移除 cap_chown 和 cap_sys_admin 能力
sudo capsh --drop=cap_chown,cap_sys_admin -- -c "your_command"
5. 安全位操作(禁用 SUID)
sudo capsh --secbits=none -- -c "./suid_program"
⚠️ 注意事项
修改 capabilities 通常需要 root 权限。
确保仅授予必要能力,避免安全风险。
–keep=1 用于在切换用户时保留 capabilities,否则会被重置。