守护进程如何工作?

Mik*_*kov 6 users daemon

如果用户想要执行命令,他必须首先登录到系统。但是系统中的一些用户在文件中已经/bin/false/sbin/nologin设置为默认shell /etc/password。如果我的用户更改/bin/bash/bin/false,我将无法登录系统,因此我也将无法运行命令。

但是无壳用户无论如何都会这样做:

# ps -eo "%mem,user,group,args" | grep -i dns
 0.0 dnscrypt dnscrypt /usr/sbin/dnscrypt-proxy --daemonize --user dnscrypt --local-address=127.0.0.1:53 --resolver-address=208.67.222.222:443 --provider-name=2.dnscrypt-cert.opendns.com --provider-key=B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79

# cat /etc/passwd | grep -i dns
dnscrypt:x:113:121::/home/dnscrypt:/bin/false
Run Code Online (Sandbox Code Playgroud)

没有shell的用户如何执行命令?

Tho*_*man 9

在 POSIX 中,每个正在运行的进程都有三个与之关联的用户 ID (UID);在真正的UID,它标识是谁发动的过程中用户的有效UID,它是用来确定哪些资源的进程可以访问和保存设置用户ID(SUID),这是有效的UID的过程已经当它开始(在最后一次exec()通话时)。其中,有效的 UID 是最重要的,因为它是在确定有关进程的访问控制决策时使用的 UID。

守护进程通常从 init 脚本启动,这些脚本由 init 系统执行,以 root 权限运行。进程可以通过setuid(),seteuid()setreuid()系统调用更改真实/有效的 UID 。问题中dnscrypt-proxy作为示例1给出的调用就是这种情况。该--user dnscrypt选项告诉dnscrypt-proxy假设用户的身份dnscrypt。特权进程可以假设任何用户的身份(甚至更改其保存的 SUID),而非特权用户进程只能将有效 UID 设置为真实用户 ID、有效 UID 或保存的设置用户 ID。

更改 UID 的基本用例是特权进程永久或临时删除其特权。后一种情况是设置了SUID 位的程序需要的,这些程序需要使用他们的真实 UID 执行一些非特权操作,然后重新获得他们的 SUID 授予的特权。POSIX.1-1990 标准对该setuid()函数采用了传统的 System V 行为,该行为指定setuid()了特权用户和非特权用户的不同行为。当调用者具有适当的权限时,该函数设置调用进程的真实 UID、有效 UID 和保存的 SUID。当调用者没有适当的权限时,函数只设置有效的 UID,如上所述。

相比之下,4.3BSD 不支持保存的 SUID,而是用单独的函数处理后一种情况。虽然setuid()始终设置真实和有效 UID,seteuid()但可用于仅设置有效 UID(如setuid()在 POSIX1-1990 中为非特权用户设置)。最后,setreuid()允许进程交换其真实有效的 UID,以支持先前享有特权的进程重新获得其特权。

POSIX:2001 标准引入了一个名为 _POSIX_SAVED_IDS 的强制性特性。这允许 SUID 应用程序在其保存的 SUID 和有效用户 ID 的值之间来回切换其有效 UID。更多信息可以在POSIX:2004 规范setuid()的基本原理部分找到。在 Linux 中,setuid()与 POSIX 版本类似,具有 _POSIX_SAVED_IDS 功能。

1:ps可以使用ruser,eusersuser格式说明符显示真实的 UID、有效的 UID 和保存的 SUID ,例如ps -eo "ruser,euser,suser,args".