無効なシェルを持つユーザーアカウントを使用してデーモンをどのように実行できますか?

無効なシェルを持つユーザーアカウントを使用してデーモンをどのように実行できますか?

私はこの質問に対する答えを見つけるためにインターネット検索を行い、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
$ 

通常、rootinitシステム(たとえば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呼び出されたが同じ違いを持つプロセスはプロセステーブルに表示されます。

おすすめ記事