
私は小さなユーティリティプログラムを書いています。必要に応じてsudo
何かを実行しようとします。
つまり、ファイル権限が現在のユーザーが特定のファイルで作業することを許可していない場合(そしてルールがsudo
それを許可する場合)、私のユーティリティはsudo
ファイル所有者として何かを実行したいと思います。
システムログがsudo
失敗した試みのノイズでいっぱいにならないようにしたいので、この機能を事前に確認したいと思いました。sudo
失敗した場合、それ自体が報告したとおり:「このイベントは報告されます。」
したがって、プログラムで確認したいと思います。user <x>
合格できますか?command <y>
sudo
問題は/etc/sudoers
マッピングが含まれていますが、rootが所有しているため、通常のユーザーが読めないことです。
実行するサブプロセスを作成しようとしていますsudo -l
(現在のユーザーがsudoを実行できるコマンドを出力します)。次に、出力を解析します。ただし、これは少し脆弱なようです。出力には私が望む情報が含まれていますが、人間が読めるように設計されているようです(プログラミング方法で消費するのではありません)。将来の出力が同じ形式に準拠するか、異なるプラットフォームにわたって保証できるかはわかりません。
プログラムで出力を解析するのはsudo -l
安全であると考えられますか?それ以外の場合、sudoコマンドが成功するかどうかを事前に決定するためのより良いオプションはありますか?
(関連するsudoルールの背景)
答え1
sudoのマニュアルページによると:
-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