私はこの質問に対する答えを見つけるためにインターネット検索を行い、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
呼び出されたが同じ違いを持つプロセスはプロセステーブルに表示されます。
答え2
ユーザーのログインシェルは、ユーザーが認証されると(通常はユーザー名とパスワードを入力して)、ほとんどのログインプログラムが呼び出すプログラムです。ログイン手順には、login
(テキストコンソールログインの場合)、sshd
(ネットワーク経由のログインの場合)、su
(他のアカウントからのログインの場合)などが含まれます。
ログインプログラムは、必要なものを何でも実行することを選択できます。ほとんどがユーザーのログインシェルを実行しているという事実は、技術的な制限ではなく管理上の決定です。このルールに従わないログインプログラムクラスの1つは、ディスプレイマネージャ、つまりグラフィカルモードでユーザーをログインするプログラムです。これらのプログラムは通常、次/bin/sh
のことを行います/etc/X11/Xsession
。
システムサービスは通常、ログインプログラムによってまったく呼び出されません。管理者権限で実行されるデーモン実行プログラムによって自動的に呼び出されます。システムサービスを開始するために認証は必要ありません。 (ユーザーの場合必要システムサービスを開始するには、通常ルートになるには認証が必要です。 ) したがって、ログインシェルはまったく含まれていないため、含める理由はありません。
デーモンランチャー(この回答で使用される用語)には、次のものが含まれます。システム、開始 - 停止 - デーモン、ユーザーの実行、等。