スクリプトがsudoingを実行するのを防ぐ

スクリプトがsudoingを実行するのを防ぐ

2日ごとにユーティリティを実行するスクリプトがあります。このユーティリティは私のシステムでいくつかのことをしました。非常によく知られ、広く使用されているオープンソースソフトウェアです。

#!/usr/bin/env bash

#...do stuff here
utility

時々(常にそうではない)、utility作業を完了するにはパスワードを入力する必要があります。私は実行を見なかったし、utility何の結果も見なかった1>/dev/null。だから私はすべての試みが自動的に失敗したいとutility思いますsudo。後で手動で実行して、スーパーユーザーアクセスが必要なタスクを確認できます。

問題は、これが私がsudoしているスクリプトではありませんが、定期的に更新されるのでutility編集utilityしたくないということです。 SUDO_ASKPASSを役に立たないように設定するsudoと有望に-A見えますがutilityutilityマニュアルページやオンラインドキュメントにも「sudoブロック」の方法はなく、Googleで「システム全体のsudoブロック」を検索したことがありません。

私はこれを使うつもりですfake-sudo-test.bash

#!/usr/bin/env bash

FAKE_SUDO="/usr/local/bin/sudo"
echo "echo 'no sudo for you $0' && exit 1" > $FAKE_SUDO
chmod u+x $FAKE_SUDO
sudo echo "I got superuser access"
\rm $FAKE_SUDO

私の$ PATH/usr/local/binの前に/usr/bin

より良い方法を知っていますか?

PS: utilityはいbrew、macOSのHomebrandパッケージマネージャです。私はbrew upgrade問題のパッケージマネージャを使用しています。質問をもっと一般的なものにすることで、もっと役に立つと思います。

$ sudo -V
Sudo version 1.8.17p1
    Sudoers policy plugin version 1.8.17p1
    Sudoers file grammar version 45
    Sudoers I/O plugin version 1.8.17p1

答え1

Linuxでは、このフラグを有効にして、プロセスおよびここで開始された他のすべてのプロセスに対するsetuidビットの影響を無効にすることができますno_new_privs(参考文献を参照prctl(2))。シェルスクリプトでは、setprivパッケージ内のユーティリティを使用して次のことができますutil-linux

$ setpriv --no-new-privs sudo -v
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?

したがって、上記の騒々しいエラーメッセージに耐えることができる限り、スクリプトを修正して代わりにsetpriv --no-new-privs utility実行すると、アクションが実行されます。utility

brew(残念ながら、これはmacOSでは機能しないかもしれませんが、他の人には役に立つかもしれないと言いました。)

答え2

端末に接続していないとパスワードを要求できません。

setsid brew < /dev/null &> /dev/null

または出力をキャプチャする場合:

setsid brew < /dev/null |& cat

つまり、あなたが持っていると仮定setsid、これは明らかにMacOSでは動作しないことがあります。欲しいのにないとここにいます。利用可能な実装

あなたはいませんが、sedsid持っているならat:

[ -e ~/brew_$$.log ] && rm ~/brew_$$.log
at now << eof
brew > ~/brew_$$.lo_ 2>& 1 || true
mv ~/brew_$$.lo_ ~/brew_$$.log
eof
while ! [ -e ~/brew_$$.log ]; do sleep 1; done
cat ~/brew_$$.log && rm ~/brew_$$.log

brewこれで、端末から離れて実行され、出力をキャプチャし、それをスクリプトの出力ストリームにコピーします。

答え3

  1. 出てください/etc/sudoers。これにより、すべてのsudo試行が失敗します。

    次の行をコメントアウトする必要があります。

    %sudo   ALL=(ALL:ALL) ALL
    

    この操作をキャンセルできるように、root権限(rootパスワードなど)を取得する他の方法があることを確認してください。

  2. 次の行を編集してください/etc/sudoers

    Defaults        env_reset
    

    入力する

    Defaults        env_reset,timestamp_timeout=-1
    

    これにより、sudoはパスワードを要求しません。 (源泉。)

  3. 失敗したすべてのsudo試行は/var/log/auth.log.Runに書き込まれ、utility次の行を探しますauth.log

    Jul  4 12:23:07 host sudo: test_perm : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/nick ; USER=root ; COMMAND=/bin/echo
    

    (これはmacOSの他の場所に記録される可能性があります。わかりません。)

関連情報