私はubuntu 8.04を持っていて、すべてのユーザーが実行できるroot
として実行されるbashスクリプトを書きたいのですが。
私自身も須藤ができる。
それ、どうやったら出来るの?
[〜#〜] clarification [〜#〜]:ユーザーがパスワードを入力する必要があるため、Sudoを使用したくない。私は彼らにrootとしてスクリプトを実行してもらいたいと思っています。
これが通常のバイナリの場合は、次のコマンドを実行してsetuidできます。
# chmod u+s /path/to/binary
残念ながら、スクリプトはsetuidできません。 (まあできますが、無視されます)。これは、スクリプトの最初の行で、スクリプトを実行するインタープリターをOSに指示するためです。たとえば、次のスクリプトがあるとします。
#!/bin/bash
あなたは実際に走ってしまうでしょう
/bin/bash /path/to/script
明らかに、インタープリターをsetuidにする必要があります。これは、すべてのスクリプトがsetuidになることを意味します。これは悪いでしょう。
Sudoでこれを行うには、visudoを実行して/ etc/sudoersファイルに次のように記述します。
ALL ALL=NOPASSWD: /path/to/script
そして今、すべてのユーザーが実行できます
$ Sudo /path/to/script
これにより、パスワードを入力せずにスクリプトを実行できます。
コマンドにSudoを必要としない代替方法があります。スクリプトを実行する小さなsetuidバイナリを作成する必要がありますが、setuidバイナリを追加するたびに、別の潜在的なセキュリティ問題が追加されます。
その行を挿入する必要がありましたAT THE END of/etc/sudoers:_ALL ALL = NOPASSWD: <filename>
_どうやら、後の%admin ALL=(ALL) ALL
オーバーライドでは、管理ユーザーのパスワードが必要でした。
スクリプトが十分に決定された無害な許可されたアクションを実行し、パラメータの値がスクリプトの誤動作を引き起こさない限り、スクリプトをrootとして実行することを許可するセキュリティ上の問題はありません。
しかし、落とし穴があります...
コマンド名とファイル名には常にフルパスを使用してください。 myrootscript
に_echo Hello world!
_のようなものを書くと、誰かが_~/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
as root
追加のパスワードプロンプトは必要ありません。
詳細は このドキュメント を参照してください。
使用する chmod +s <filename>
suidビットを設定します。これは、ファイルが実行されると、ファイルの所有者の権限で実行されることを意味します(そのため、ファイルをrootに移動して、そのように実行します)。
ただし、これはbashスクリプトのようなものでは非常に危険です。ユーザーが変更する方法を見つけたので、ルートシェルを簡単に取得できます。 root以外は誰にも書き込めないことを確認してください。
Linuxでは、スクリプトのsetuidを許可していません。これを行うには、プログラムとしてコンパイルする必要があります。代わりに、sudoersファイル(/ etc/sudoers)を使用して、次のような行を追加できます。
<username> ALL = NOPASSWD: /path/to/script
別の代替策:そのスクリプトの周りに小さなsetuid Cラッパーを実行して、
Sudo
の複数の機能の独自のサブセットのようなものです。