
~によるとhttps://unix.stackexchange.com/a/489913/674
cron ジョブは、ユーザーがログインしなくても任意のユーザーとして実行できます。
幸いなことに、initプロセスを開始するためにルートにログインする必要はありません(数千台のサーバーと数百万台の仮想マシンキューを処理すると想像してください)。
私を所有者にしてログインせずにプロセスを実行するには、2つの場所でどうすればよいですか?システム/ライブラリの呼び出しレベルとユーティリティレベル?
root
したい場合はどうすればいいですか?
たぶんログインできないサービスユーザープロセス所有者としてプロセスを開始しますか、それとも後でプロセス所有者になりますか?
唯一の方法は、プログラムでプロセスを呼び出すかsetuid()
実行することですか?seteuid()
ありがとうございます。
答え1
Unixでは、プロセスユーザーを変更する3つの方法があります。
プロセスユーザーを変更する2つのシステムレベルの方法
- プロセスにルートが伝統的に持っているCAP_SETUID機能(および他のすべての機能)がある場合は、システムコールを使用して他の
setuid
ユーザーに変更できます。他のユーザーはuidを混乱させることができます。プロセスには3つのuidがあり、自由に移動できます。 1つだけ残るまでuidを交換または削除できます。 CAP_SETUID機能がないと追加できません。通常、プロセスはこれらのシステムコールのみを使用して権限を解放または移動できます。これらの呼び出しによってプログラムを続行できます。setreuid
setresuid
setfsuid
uids
exec
実行可能ファイルsuid
:実行可能ファイルにsuid
ビットが設定されており、有効なタイプ(スクリプトではなくJavaではありません)の場合、実行時に有効なユーザーIDがファイルのユーザーIDに変更されます。所有者。 (これはビットを持つグループに対しても実行できますsgid
)。これが特権を得る唯一の方法です。現在のプログラムはexec
呼び出されると終了し、新しいプログラムに置き換えられますが、プロセスは同じで、オープンファイル(stdin、stdout、stderrなど)も継承します。
fork
定量いいえユーザーを変更します。分岐されたプロセスは、いくつかの例外を除いて親プロセスと同じです(参考資料を参照man fork
)。特に、uid、gid、および機能は変更されていません。
実用的な方法
これらのプログラムは、上記の2つの体系的なアプローチを使用します。
sudo
または使用su
:su
他のユーザーにはパスワードの入力を求められます。sudo
パスワードの入力を求められますが、ファイルに登録されている場合にのみ有効ですsudoers
。
sudo
、などはsu
2つのシステムメソッドを使用します。 (そして新しいプロセスが作成されます。他のシステムメソッドでは新しいプロセスは作成されません。)login
cron
sudo
、何をしますかsu
?
#↳ ll /usr/bin/sudo
-rwsr-xr-x 1 root root 155K Sep 9 2017 /usr/bin/sudo*
ユーザーが示すように、sudo
実行可能ファイルはrootが所有し、suidビットが設定されています(s
最初のビットが表示されると予想される場所x
)。
実行するとsudo
rootとして実行されます(何をしているのかわからない場合は試してはいけません)。その後、セキュリティチェックを実行します。その後、set??uid
希望のユーザーになるために使用され、その後、そのプログラムexec
(フォークでもあります)が目的のプログラムになります。
ログインせずにプロセスを実行する
スケジュールされた開始サービスを使用してください。
- 予約されたこと
- 存在する
ネットワークサーバーがジョブを実行するためのネットワーク要求に応答できるように、ネットワークメッセージを送信します。
自動ログインを有効にする:ssh
他のコンピュータのスクリプトからプロセスを開始するために使用されます。