ラッパースクリプトのみを許可し、コマンドは許可しません

ラッパースクリプトのみを許可し、コマンドは許可しません

サーバーのユーザーがリソース不足のコマンドを実行する必要があるとします。渡されたパラメータを解析し、そのコマンドが特定の条件または時間でのみ使用されることを保証するラッパースクリプトでそのコマンドをラップしたいと思います。

問題は、プログラム自体が実行可能でなければ、ラッパーもそれを実行できないことです。また、コマンドがrootとして実行されないようにしたいです。

可能ですか?

答え1

簡単な答えは次のとおりです。それは言わないユーザーはラッパースクリプトを使用します。

その理由は簡単です。説明したプログラム。これはbash(または他のシェルプロセスが)次のことを行う必要があることを意味します。読むファイル内で呼び出されたコマンドを実行するためにファイルを開きます。

これは、ラッパースクリプトを実行する権限を持つユーザーに、ラッパースクリプトで実行されるすべての操作を実行する権限が必要であることを意味します。ほとんどの場合*、シェルスクリプト(内部ロジックと条件文が多い場合でも)は、コマンドプロンプトでスクリプト全体を1行ずつ入力するのとまったく同じことを行います。

トレーニングを受けていないユーザーがシステムの速度を遅くするのを難しくしたい場合は、いくつかの方法があります。、@mikeservがあなたの質問へのコメントで提案したものと同じです。私はすぐに少なくとも5つのアプローチを考えることができます。彼らは安全ではありません。彼らは実際にはそうではありません防ぐユーザーはラッパースクリプトの代わりにコマンドを直接使用し、ユーザーが自分のラッパースクリプトのコピーを作成し(完全に実行するには読み取り権限を持っている必要があります)、必要な方法で変更することを防ぐことはできません(できません)。好きです。

それはいバイナリ実行可能ファイルにコンパイルし、そのCプログラムをSUID***にするラッパースクリプトの機能を実行する短いCプログラムを作成することができます。これは、ユーザーが議論しているコマンドを実行できる唯一の方法です。これは私の範囲と専門知識を超えています。

他のオプションには、日中の特定の時間にのみコマンドを実行する権限を許可するようにcronjobを設定してsudoersファイルを変更するなど、非常に奇妙な回避策(ハッキング)が含まれます。しかし、これは非常に奇妙で悪いアイデアの領域に入ります。


私はこれを行う標準的な方法があると思います。技術的に熟練したユーザーの場合、ラッパースクリプトは次のとおりです。

(制限命令はと仮定しますdate。)

  1. スクリプトで、その呼び出しがdate絶対パスを使用していることを確認します。 (/bin/date 実行してこれが何であるかを知ることができますwhich date。)また、スクリプトに正しいshebangがあることを確認して入力せずに実行でき、次のようbash ./myscriptに実行可能./myscriptで保証されます。誰もが読んで実行できるようにします。 ( chmod 555 myscript)
  2. ラッパースクリプトを入れて/usr/local/bin/名前をdate
  3. ユーザーがすでに/usr/local/binログインしていることを確認してください。スタート彼らの$PATH変数。 (ユーザーとしてログインして実行するだけですecho "$PATH"。)デフォルトでは、すでにこの機能が必要です。前のパスにあった限り/bin(または元のコマンドの場所が何でdateあれ)最初にある必要はありません。

そのパスにない場合は、次のコマンドを実行して追加できます。echo 'PATH="/usr/local/bin:$PATH"' | sudo tee /etc/profile.d/my_path_prefix.sh

今、ユーザーがコマンドを直接実行しようとするたびに、ラッパースクリプトがあるディレクトリが自分の$PATH


よりハッカースタイルの「黒い帽子」ソリューションは、ユーザーパスの前に別のバージョンを配置するのではなく、元のコマンド自体と同じ場所にラッパースクリプトを配置して元のバイナリを実際にマスクすることです。自分の責任で使用してください。

  1. 誰もコマンドをパスに含めないように、コマンド自体をbin通常のディレクトリの外に配置します。たとえば、に移動できます/var/local。 (もっと良いところがあるかもしれませんが、すでにハッキングされているので、あまり問題になりませんか?)
  2. dateラッパースクリプトへの呼び出しが以下を指していることを確認してください。新しいdate絶対パスの場所:/var/local/date私の例では。
  3. ラッパースクリプトをdate前の場所に移動し、date元の名前を使用します。

主な注意事項は毎回誰でもシステム初期化スクリプトを含むコマンドを実行すると、ラッパースクリプトが表示されます。

これは純粋にハッキングであり、規制に準拠していません。いいねシステム管理。しかしそれははいそれは可能であり、あなたはそれが可能であることを知っています。より良い解決策は上記の投稿です。


*例外は、スクリプトで実行する場合と対話式で実行すると異なる動作をする環境とプログラムの修正に関連しています。これらの異常現象は次のように関連しています。特権しかし、これはこの議論とは関係ありません。

**関心のある方はコメントで質問していただければ詳しく説明させていただきます。

*** suidルートではありません。これを行うには、ユーザーを作成し、あなたが話しているコマンド(chmod 010または何でも)を実行する権限を持つ唯一のグループであるグループに入れて、chown新しくコンパイルされたラッパーバイナリをユーザーが所有するグループに割り当て、としてsuidビットを設定しますchmod 4511

関連情報