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

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

私はこの質問に対する答えを見つけるためにインターネット検索を行い、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呼び出されたが同じ違いを持つプロセスはプロセステーブルに表示されます。

答え2

ユーザーのログインシェルは、ユーザーが認証されると(通常はユーザー名とパスワードを入力して)、ほとんどのログインプログラムが呼び出すプログラムです。ログイン手順には、login(テキストコンソールログインの場合)、sshd(ネットワーク経由のログインの場合)、su(他のアカウントからのログインの場合)などが含まれます。

ログインプログラムは、必要なものを何でも実行することを選択できます。ほとんどがユーザーのログインシェルを実行しているという事実は、技術的な制限ではなく管理上の決定です。このルールに従わないログインプログラムクラスの1つは、ディスプレイマネージャ、つまりグラフィカルモードでユーザーをログインするプログラムです。これらのプログラムは通常、次/bin/shのことを行います/etc/X11/Xsession

システムサービスは通常、ログインプログラムによってまったく呼び出されません。管理者権限で実行されるデーモン実行プログラムによって自動的に呼び出されます。システムサービスを開始するために認証は必要ありません。 (ユーザーの場合必要システムサービスを開始するには、通常ルートになるには認証が必要です。 ) したがって、ログインシェルはまったく含まれていないため、含める理由はありません。

デーモンランチャー(この回答で使用される用語)には、次のものが含まれます。システム開始 - 停止 - デーモンユーザーの実行、等。

関連情報