
システムにsudo
ローカルでタイムアウトが設定されているため、sudo
一部の端末で実行して一度認証すると、10分間再認証する必要がないとします。
これにより、プロセスがプロセスの子として実行されるのが効率的ですか?直接sudo
使用せずに呼び出されるsudo
(したがって子供ではない兄弟姉妹実行中のプロセスそして sudo
)私の権限をrootにアップグレードできますか?
具体的な例として端末で実行しているとしましょう。
sudo echo "hi"
other_process
プロセスはをecho
使用して実行されていますが、そうではありません。たとえば、前の呼び出しに関連付けられている10分の期限切れのsudoチケットを使用して、?を介して子プロセス自体を開始できます。sudo
other_process
other_process
sudo
sudo
答えが「はい」の場合、これは制限時間内に実行されるすべてのプロセスに非常に注意する必要があることを意味しますsudo
。信頼できないプロセスを実行することは、現在のユーザーのサンドボックスに保持するのと同じですが、既存のother_process
チケットを使用できる場合はsudo
rootに昇格できると考えることもできます。
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.sh
にsudotest.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
。
SHLVL
ttyは実行全体にわたって一定に保たれ、スクリプトによって実行される各シェルプロセスが呼び出しシェルより1レベル深くなると値が増加することがわかります。私のインタラクティブシェルSHLVL = 1
呼び出しtest.sh
which gets SHLVL = 2
、which呼び出しsudotest.sh
which gets SHLVL = 3
。
1つの注意点は、tty_tickets
このオプションが設定されていない以前のバージョンのsudoがある場合、sudoセッションのユーザー名+ tty粒度が削除され、粒度がユーザー名とタイムスタンプにのみ制限されることです。
などの他のsudoers
オプションも影響を与える可能性がありますrequiretty
。
sudo
元のシェルから呼び出されたスクリプトへの後続の呼び出しが、sudo資格情報が保持されるタイムアウト内にある場合は、同じユーザーに昇格することができます。タイムアウトが終了した後でも権限を昇格できるようにするには、パスワードを再入力する方法が必要です。 (または、タイムアウトを変更したり、ユーザーまたはコマンドのパスワード要件を無効にしたりできますが、これはこの回答の範囲外です。)
答え3
私の答えはいいえです。sudo id
後でid
確認してください。