ユーザーが引数(スペースを含む)を使用してコマンドを実行できるようにします


17

1人のユーザーに(sudoを介して)grepを実行させ、1つの特定のファイルの1つの特定の文字列に対してgrepを許可したい。このユーザーがすべてのファイルでgrepを実行できるようにしたくありません。ユーザーにはファイルへの読み取りアクセス権がないため、sudoを使用する必要があります。マシン上の別のサービスのログファイルを把握するnagiosチェックを作成しようとしています。

動作しませんが、sudoはパスワードを要求し続けます。

私のコマンドは次のとおりですsudo grep "string I want (" /var/log/thefilename.log(はい、そこに生で(、文字列の一部のスペースが、私はgrepをしたいです)

/etc/sudoers.d/user-can-grep このコンテンツがあります:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

このsudoersファイルは所有者root:rootであり、アクセス許可があります-r--r-----

サーバーはUbuntu trusty 14.04.3 LTSです。

この作業を行うにはどうすればよいですか?


nagiosチェックは/ bin / grepまたは/ usr / bin / grepを明示的に呼び出していますか?
ジェフシャラー

これを行うシェルスクリプトを作成し、スクリプトを実行させsudoます。
user253751

@JeffSchaller参考までに、スクリプトはを呼び出しgrep、をwhich grep使用していることを通知し/bin/grepます。sudoファイルで知る限り、完全パスなしで呼び出す場合でも、バイナリの完全パスを指定する必要があります。
ロリー

回答:


13

どうやら、sudoはコマンドを文字列にフラット化してから、sudoersファイルの仕様と比較します。したがって、あなたの場合、引用符やその他のエスケープ形式を使用する必要はありません。

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

編集:@ user23013がコメントで指摘しているように、これは任意のファイルの「string I want」のgrepに悪用される可能性があります(さらに、「string I」と「string」の拡張子によっても)。 sudoの引数チェックを使用します!


また、次の呼び出しは同等であることに注意してください。つまり、ユーザーを特定の表現に制限することはできません。

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

これは、引用とエスケープがシェルによって処理され、到達しないという事実によるものsudoです。


興味深いのは、それが悪用可能かどうか、つまり、sudo1つ(仕様に一致するもの)を入力したことを納得させるかどうかですが、それを実行することになると、まったく別のものになります。
-EightBitTony

4
@EightBitTonyもちろんです!では、あなたのsudoersuser host = NOPASSWD: /usr/bin/vim Editing sudoers file(意図して「sudoersファイルの編集」ユーザーの編集をできるように)によって悪用される可能cdにする」/etc/と実行していますsudo vim Editing sudoers file。合理的な複雑さのコマンドについては、コメントで提案されているアプローチ$@を使用する必要があります。シェルは、引数がグループ化されると予想される方法でグループ化されていることを確認できる変数を提供します。
アレクサンダーバティシエフ16

8
( /var/logどこでもパスを作成し、thefilename.log任意のファイルへのシンボリックリンクを作成すると、ユーザーはstring I want任意のファイルからgrep を実行できます。
user23013

2
@EightBitTonyの答え(ラッパースクリプトを作成し、そのスクリプトへのsudoアクセスを許可する)は、はるかに優れており、安全です。
cas

うわー、それはセキュリティに焦点を当てたツールの非常に悪い練習です。
サムワトキンス

32
  1. スクリプトを記述します(rootのみが書き込み可能)
  2. そのスクリプトで、grep必要なものを実行します
  3. sudoers構成で、そのスクリプトへのアクセスのみを許可します
  4. 任意のツールを設定するか、sudoを介してスクリプトを実行するだけのユーザーにアドバイスします

デバッグがはるかに簡単になり、特定のファイルへの特定のアクセスをロックダウンしやすくなり、悪用がはるかに難しくなります。


2

ファイルへのアクセスにはrootのみが必要なので、を使用catするteeか、同様のものを使用し、それgrepを実行する必要のあるプログラムにパイプすることを検討してください。たとえば、sudo cat /file/path | grep …このようにルートを絶対に必要な場所に制限します。


0

sudo素晴らしいですが、時にはそれが最適ではありません。このために私は使用したいsupersuperまた、昇格されたアクセス許可も許可されますが、コマンドエイリアスを想定しています。これは、単純なコマンドラインとして使用されるため、複雑なコマンドラインを許可する場合に便利です。

super.tabは次のようになります。

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

として呼び出されsuper grepcmdます。


sudohas Cmnd_Alias(引数の制限の有無にかかわらず、1つ以上のコマンドを含めることができます)。
cas

まったく同じことではありません。Cmnd_Aliasは、構成ファイルを簡素化するためのツールです。スーパーの主要な動作モードであるユーザーにエイリアスを公開しません(ほとんどの場合、エイリアスコマンドやsuidスクリプトを実行していないときにsudoを使用します) 、およびこれら2つの使用例ではsuper)。
16

それがラッパースクリプトの目的です...そして、それらはワンライナーに限定されず、クォートの問題がありません。
cas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.