在 Linux 中,非 root 用户运行的进程可以分配一些功能来增加其权限。
由 root 用户运行的进程具有所有可用的功能,但是在某些情况下,这样的进程是否可以手动或自动删除其某些功能?
答案1
是的,能力的想法是用户 ID 本身并不赋予任何特殊能力。 UID 0 进程还可以删除不需要的功能。它仍将保留对 UID 0(例如/etc/shadow
或/etc/ssh/sshd_config
)拥有的文件的访问权限,因此切换到另一个 UID 仍然可能是明智之举。
我们可以使用 进行测试capsh
,它允许我们根据请求删除功能。在这里,最后一部分作为 shell 脚本运行,我们可以看到chown
由于更改文件所有者 ( CAP_CHOWN
) 的功能被删除而失败:
# capsh --drop=cap_chown -- -c 'id; touch foo; chown nobody foo'
uid=0(root) gid=0(root) groups=0(root)
chown: changing ownership of 'foo': Operation not permitted
这功能(7) 手册页提到系统对 setuid 二进制文件有一些保护措施,这些保护措施不了解功能,并且可能无法很好地处理某些被永久删除的情况。请参阅“功能哑二进制文件的安全检查”。
当然,同一手册页还包含有关功能的其他有用信息。
答案2
您还可以做一些其他事情。
根南瓜
NFS 共享可以通过该root_squash
标志来使用。
通过这种方式,可以安装网络共享,但客户端上的根用户不会获得对服务器上托管的文件的根访问权限,从而使 NFS 可用。在这种情况下,您可以使文件可供另一台主机访问,即使该主机上的用户在其机器上具有 root 权限,您的内容仍然是安全的。
这在企业环境中非常有用,例如,如果您希望允许网络管理员访问其设备的日志,但不希望他们能够进行任何更改。即使他们在 Linux 管理箱上拥有 root 权限,他们也无法更改日志。
如果您想进一步阅读,这是我最喜欢的指南:http://fullautolinux.blogspot.com/2015/11/nfs-norootsquash-and-suid-basic-nfs.html
SSH
您还可以执行其他一些操作。例如,您可以阻止 root 通过 SSH 连接到设备。这意味着要成为 root 用户,用户需要使用不同的帐户(例如您创建的管理员帐户)访问设备,然后使用类似 的命令切换到 root 用户su
。
可以在这里找到一个简单的指南:https://mediatemple.net/community/products/dv/204643810/how-do-i-disable-ssh-login-for-the-root-user
RHEL7/CentOS7
以下是 Redhat 的一些关于如何在企业环境中限制 root 帐户的文档: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/sec-controlling_root_access
更新:
正如其他答案中所讨论的,您还可以更改能力根帐户的。
答案3
以编程方式调整功能集
线程可以使用 capget(2) 和 capset(2) 系统调用检索和更改其功能集。然而,为此目的,首选使用 libcap 包中提供的 cap_get_proc(3) 和 cap_set_proc(3)。以下规则管理对线程功能集的更改:
...
- 新的允许集必须是现有允许集的子集(即不可能获取线程当前不具备的允许能力)。
- 新的有效集必须是新的允许集的子集。
--能力(7)
答案4
我正在向 @ilkkachu 答案添加信息。
看来进程的能力决定了用户是否有特权。
例如,我们删除除一项 ( cap_checkpoint_restore
) 之外的所有功能:
capsh --drop=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf -- -c 'sleep 10000'
我们可以看到该用户只有一种能力cap_checkpoint_restore
,即使该用户是root
:
# ps aux | grep sleep
root 2309662 0.0 0.0 5768 1008 pts/5 S+ 07:21 0:00 sleep 10000
# cat /proc/2309662/status | grep Cap
CapInh: 0000000000000000
CapPrm: 0000010000000000
CapEff: 0000010000000000
CapBnd: 0000010000000000
CapAmb: 0000000000000000
# capsh --decode=0000010000000000
0x0000010000000000=cap_checkpoint_restore