Sudoチケットとそれ以降の非Sudoピアプロセス

Sudoチケットとそれ以降の非Sudoピアプロセス

システムにsudoローカルでタイムアウトが設定されているため、sudo一部の端末で実行して一度認証すると、10分間再認証する必要がないとします。

これにより、プロセスがプロセスの子として実行されるのが効率的ですか?直接sudo使用せずに呼び出されるsudo(したがって子供ではない兄弟姉妹実行中のプロセスそして sudo)私の権限をrootにアップグレードできますか?

具体的な例として端末で実行しているとしましょう。

sudo echo "hi"
other_process

プロセスはをecho使用して実行されていますが、そうではありません。たとえば、前の呼び出しに関連付けられている10分の期限切れのsudoチケットを使用して、?を介して子プロセス自体を開始できます。sudoother_processother_processsudosudo

答えが「はい」の場合、これは制限時間内に実行されるすべてのプロセスに非常に注意する必要があることを意味しますsudo。信頼できないプロセスを実行することは、現在のユーザーのサンドボックスに保持するのと同じですが、既存のother_processチケットを使用できる場合はsudorootに昇格できると考えることもできます。

sudo端末から直接呼び出すのではなく、端末で実行されているスクリプトから呼び出すと答えが変わりますか?

たとえば、次のようにします。

script.sh
other_process2

script.shそこにこのような行がある場合、後でsudo echo "inside script"スクリプトによって開始された他のプロセスはsudoチケットを使用して権限をrootに引き上げることができますか?スクリプトが完了したらどうなりますか?チケット1は、実行中の端末の他のプロセスscript.shで引き続き使用できますか?sudo


1これらはもはや兄弟プロセスと同じではありませんが、「叔母」または「おじさん」プロセス(親プロセスの兄弟)です。

答え1

はい、sudoチケットはその端末で実行されているすべてのプロセスで動作します(少なくともユーザーとして)。これはテストが簡単です。 1つだけを作るtest.sh

#!/bin/sh

sudo apt-get check

それから:

$ sudo apt-get check
[sudo] password for anthony: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done

$ ./test.sh 
Reading package lists... Done
Building dependency tree       
Reading state information... Done

通常、特に自分のユーザーとして信頼できないプログラムを実行することはお勧めできません。そして、sudoチケットがある端末ではこれを行うべきではありません。信頼できないプログラムを実行する必要がある場合は、セキュリティバリアを設定する必要があります(少なくとも他のユーザー、より良い仮想マシン、または少なくともコンテナ - 信頼できないプログラムを実行するためのセキュリティサンドボックスを設定するのは簡単ではありません)。

答え2

はい。sudo認証はユーザー名、tty、およびタイムスタンプの組み合わせに関連付けられているため、このシェルで実行されるすべてのコマンドは、パスワードを入力せずにsudoを介して特権を昇格させる機能を独自に渡すことができます(ファイルtimestamp_timeout=0にパスワードがないと仮定/etc/sudoers) 。

これらのスクリプトは、設定したタイムアウト(デフォルト= 15分)以内に実行されます。

ファイルtest.sh:

#!/bin/bash

echo "test: \$SHLVL is: $SHLVL"
echo "test: I am $(id) on $(tty)"
echo "test: with sudo I am $(sudo id) on $(tty)"
/bin/bash -l ./sudotest.sh

ファイル sudotest.sh:

#!/bin/bash

echo "sudotest: \$SHLVL is: $SHLVL"
echo "sudotest: I am $(id) on $(tty)"
echo "sudotest: with sudo I am $(sudo id) on $(tty)"

結果:

test: $SHLVL is: 2
test: I am uid=1000(tim) gid=1000(tim) groups=1000(tim) on /dev/pts/7
[sudo] password for tim:
test: with sudo I am uid=0(root) gid=0(root) groups=0(root) on /dev/pts/7
sudotest: $SHLVL is: 3
sudotest: I am uid=1000(tim) gid=1000(tim) groups=1000(tim) on /dev/pts/7
sudotest: with sudo I am uid=0(root) gid=0(root) groups=0(root) on /dev/pts/7

この場合、sudoへの最初の呼び出しはtest.shsudotest.shありますが、いいえsudo自体を使って呼び出しましたが、私のユーザー名とttyがまだ同じであるため、sudoはプロセスが高い権限を受け取ることができると思いますsudotest.sh

数分後、タイムアウトする前に再実行すると、次のようになります。

test: $SHLVL is: 2
test: I am uid=1000(tim) gid=1000(tim) groups=1000(tim) on /dev/pts/7
test: with sudo I am uid=0(root) gid=0(root) groups=0(root) on /dev/pts/7
sudotest: $SHLVL is: 3
sudotest: I am uid=1000(tim) gid=1000(tim) groups=1000(tim) on /dev/pts/7
sudotest: with sudo I am uid=0(root) gid=0(root) groups=0(root) on /dev/pts/7

ヒントを全く得られませんでした。制限時間が過ぎるまではしないでくださいtimestamp_timeout

SHLVLttyは実行全体にわたって一定に保たれ、スクリプトによって実行される各シェルプロセスが呼び出しシェルより1レベル深くなると値が増加することがわかります。私のインタラクティブシェルSHLVL = 1呼び出しtest.shwhich gets SHLVL = 2、which呼び出しsudotest.shwhich gets SHLVL = 3

1つの注意点は、tty_ticketsこのオプションが設定されていない以前のバージョンのsudoがある場合、sudoセッションのユーザー名+ tty粒度が削除され、粒度がユーザー名とタイムスタンプにのみ制限されることです。

などの他のsudoersオプションも影響を与える可能性がありますrequiretty

sudo元のシェルから呼び出されたスクリプトへの後続の呼び出しが、sudo資格情報が保持されるタイムアウト内にある場合は、同じユーザーに昇格することができます。タイムアウトが終了した後でも権限を昇格できるようにするには、パスワードを再入力する方法が必要です。 (または、タイムアウトを変更したり、ユーザーまたはコマンドのパスワード要件を無効にしたりできますが、これはこの回答の範囲外です。)

答え3

私の答えはいいえです。sudo id後でid確認してください。

関連情報