私はこの質問に対する答えを見つけるためにインターネット検索を行い、initスクリプトを精神的に分析し、それがどこで完了したのかを見つけようとしましたが、役に立ちませんでした。
ps
ランダムな例を作成しました。次のプロセスがあります。
polkitd 1230 1 0 May07 ? 00:00:00 /usr/lib/polkit-1/polkitd --no-debug
私の/etc/passwdを見ると、次のようになります。
polkitd:x:87:87:PolicyKit daemon owner:/var/lib/polkit:/bin/false
テストでrootとしてコマンドを実行しました。
# su - polkitd -c whoami
期待どおり /bin/false がシェルとして使用されたため、出力は返されませんでした。また、# su - polkitd
私をpolkitdに切り替えません。この操作が正しく行われたことを確認するために、通常のユーザーアカウントを使用して両方の方法をテストしましたが、どちらも期待どおりに機能しました。
それでは、手動で何も実行できないように見えるときにプロセスを実行するための専用アカウント(例:私の例のpolkitd)をどのように取得しますか?
ベストアンサー1
root
これはpolkitd
適切なシステムコールを介して行うことができます。seteuid(2)
証明できる
$ cat becomepolkit.c
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
// ID obtained via `id polkitd` on a Centos7 system
// other systems may vary
seteuid(999);
printf("look for %d in process list\n", getpid());
sleep(99999);
return 0;
}
$ make becomepolkit
cc becomepolkit.c -o becomepolkit
$ sudo ./becomepolkit &
[1] 10914
$ look for 10915 in process list
$ ps auwwx | grep '1091[5]'
polkitd 10915 0.0 0.0 4160 340 pts/0 S 22:46 0:00 ./becomepolkit
$
通常、root
initシステム(たとえばsystemd
)を介しcron
てプロセスを開始し、root
そのプロセスのユーザーを変更します。これにはシェルアクセスは必要ありません。strace
プロセスを実行するか、別のトレースツールを使用してプロセスで進行中のタスクを観察できます。
sudo strace -o blah ./becomepolkit
look for 10968 in process list
^C$ grep 999 blah
setresuid(-1, 999, -1) = 0
nanosleep({99999, 0}, {99997, 670178798}) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
$
だからここでLinuxは実際にsetresuid(2)
polkitd
呼び出されたが同じ違いを持つプロセスはプロセステーブルに表示されます。