sudoを実行する前に、sudoの機能を確認できますか?


11

小さなユーティリティプログラムを書いています。sudo必要に応じて、何かを実行しようと思います。

つまり、ファイルのアクセス許可で現在のユーザーが特定のファイルを操作できない場合(およびsudoルールで許可されている場合)sudo、ファイルの所有者としてユーティリティを実行する必要があります。

システムログが失敗したsudo試行のノイズでいっぱいにならないようにしたいので、この機能を事前に確認したいと思っています。それsudo自体が失敗について報告するように:「この事件は報告される」

だから、私はプログラムでチェックしたいと思っています経由で実行できuser <x>ますか?command <y>sudo

ここに問題があり/etc/sudoersます:そのマッピングが含まれていますが、それはroot所有であり、通常のユーザーは読み取ることができません。

実行するサブプロセスを生成することを検討していましたsudo -l(現在のユーザーがsudo実行できるコマンドを出力します)。次に、これの出力を解析します。ただし、これは少し壊れやすいようです。出力には必要な情報が含まれていますが、それは人間が読むために設計されたようです(プログラムによる消費用ではありません)。出力が将来同じ形式に従うか、または異なるプラットフォーム間で保証されるかどうかはわかりません。

プログラムによるsudo -l出力の解析は安全ですか?そうでない場合、sudoコマンドが成功するかどうかを事前に判断するためのより良いオプションはありますか?


(X / Yの背景:このユーティリティは、アクセスが制限されたロールアカウントで使用するためのものです。他の一部のユーザーは、sudoルールを使用して、アクセスが制限されたアカウントがファイルを操作できるように効果的にオプトインすることを期待しています。しかし、他のどのユーザーが適切なsudoルールを設定しているかを事前に知りません)


3
少し異なるアプローチを取ることをお勧めします。ユーザーごとのルールを用意する代わりに、自分がやりたいことを何でもできるグループを作ってみませんか。これにより、ユーザーがグループに属しているかどうかを簡単に確認できます。それはまともな選択肢でしょうか?
terdon

回答:


13

sudoのmanページによると:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

これは煮詰めます

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Muruが指摘したように、必要に応じて、どちらか-U $USER-U $USERTOTESTまたは何も使用しないでください。


あなたが意図した場合は$USER、現在のユーザを意味するように、あなただけ行うことができsudo -l <command>ずに、-U $USER
muru

ありがとう-これは便利です。以下のような私は、このアプローチのテストに通知が、sudoのルールは、特定の例外を除いて、すべてのコマンドを許可するように設定されている場合の世話をしていないようだということでやったことの一つ、(targetUser) ALL, !/usr/bin/foo ...は、その場合にはsudo -l -u targetUser /usr/bin/foo、まだ出力に表示され/usr/bin/fooて終了ステータスは0です。それでも、基本的には私の単純なチェックには十分であり、より詳細なsudo -l出力を解析するよりも優れています。
Peter Martin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.