回答:
これが通常のバイナリの場合、次のコマンドを実行してsetuidできます。
# chmod u+s /path/to/binary
残念ながら、スクリプトはsetuidできません。(まあできますが、無視されます)。これは、スクリプトの最初の行で、スクリプトを実行するインタープリターをOSに指示するためです。たとえば、次のスクリプトがあるとします。
#!/bin/bash
あなたは実際に走ってしまうでしょう
/bin/bash /path/to/script
明らかに、インタープリターをsetuidにする必要があります。これは、すべてのスクリプトがsetuidになることを意味します。これは悪いでしょう。
visudoを実行して/ etc / sudoersファイルに次のように入力することにより、sudoでこれを行うことができます。
ALL ALL=NOPASSWD: /path/to/script
そして今、すべてのユーザーが実行できます
$ sudo /path/to/script
これにより、パスワードを入力しなくてもスクリプトを実行できます。
コマンドにsudoを必要としない代替手段があります。これは、スクリプトを実行する小さなsetuidバイナリを作成する必要がありますが、setuidバイナリを追加するたびに、別の潜在的なセキュリティ問題が追加されます。
ALL
単語をユーザー名に置き換えて、その1つのsudoerがパスワードを入力せずに実行できるようにします。
私は、その行を挿入するために必要なEND ATのは/ etc / sudoersファイル:ALL ALL = NOPASSWD: <filename>
どうやら、後で%admin ALL=(ALL) ALL
オーバーライドは、管理者ユーザーのパスワードを必要としていました。
スクリプトが十分に決定された無害な許可されたアクションを実行し、パラメータの値がスクリプトの誤動作を引き起こさない限り、スクリプトをrootとして実行することを許可するセキュリティ上の問題はありません。
しかし、落とし穴があります...
コマンド名とファイル名には常にフルパスを使用してください。のようなものを書くecho Hello world!
とmyrootscript
、誰かがを書いて、~/bin/echo script
そのmyrootscript
中にあるものは何でもrootとして実行するでしょう。
/bin/echo "Hoping this will keep you safe"
:-)
デフォルトでは、wheel
グループのメンバーはとしてsudo
任意のコマンドを実行できroot
ます。これはおそらくあなたがsudo
今まで使ってきた方法です。
別のユーザーを許可するには、sudoers
ルールを作成する必要があります。例えば:
mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh
ユーザーが許可するmickey.mouse
コマンドを実行する/usr/local/bin/test.sh
とroot
、追加のパスワードプロンプトを必要としません。
詳細については、このドキュメントをお読みください。
chmod +s <filename>
suidビットを設定するために使用します。これは、ファイルが実行されると、ファイルの所有者の権限で実行されることを意味します(そのように実行するためには、ファイルをrootに変更します)。
ただし、これはbashスクリプトのようなものでは非常に危険です。ユーザーが変更する方法を見つけたので、ルートシェルを簡単に取得できます。root以外は誰にも書き込めないことを確認してください。
Linuxでは、スクリプトのsetuidを許可していません。これを行うには、プログラムとしてコンパイルする必要があります。代わりに、sudoersファイル(/ etc / sudoers)を使用して、次のような行を追加できます。
<username> ALL = NOPASSWD: /path/to/script