スクリプトを常にルートとして実行することはできますか?


27

誰が実行するかに関係なく、スクリプトをルートとして実行する方法は?

setuidについて読みましたが、これを行う方法がわかりません。

Linux、Ubuntu 12.04 LTSを使用しています。


どのLinuxディストリビューションを使用していますか?それともUnixですか?
slhck

@slhck Linux、Ubuntu 12
HappyDeveloper

3
setuidスクリプトでは動作しません。最近のほとんどの* nixディストリビューションでは、セキュリティ上の理由で無効になっています。設定できますが、無視されます。実際の問題について詳しく説明して、代わりにこの問題を解決できるようにすることができますか?それはどんなスクリプトですか?ルートとして実行する必要があるのはなぜですか?sudo代替手段を使用していますか?
slhck

試しましたsudo -sか?
ナムプン

回答:


29

本当に注意してください:setuidと組み合わされたスクリプトは危険です!

まず、この質問/回答、特にこの回答とセキュリティ警告をご覧ください。

それでもsetuidset を使用してスクリプトを実行する場合は、短いCプログラムをラッパーとして記述setuidし、コンパイル済みバイナリにビットを設定できます。

ラッパーの例:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

を使用した別のソリューションsudoここで説明):

  1. rootとして、スクリプトへの書き込み(およびその他の)アクセスを禁止します。

    chown root /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. 親フォルダーのアクセス権を変更するなどして、root以外のユーザーがスクリプトを置き換えることができないことを確認します。

    chown root / absolute / path / to / your /
    chmod 755 / absolute / path / to / your /
    
  3. で、変更sudoのアクセス権/etc/sudoersを持ちますvisudo

    ALL ALL =(ルート)NOPASSWD:/absolute/path/to/your/script.sh
    

    設定の詳細(特定のユーザーまたはグループへのアクセスの制限など)は、sudoersのマンページに記載されています。

その後、すべてのユーザーはパスワードなしでrootとしてスクリプトを実行できます。

sudo /absolute/path/to/your/script.sh

これは、上記のwrapper / setuidソリューションの使用に似ています。


3
特定の危険性はそれほど明白ではありませんが、環境を中心に大きく展開します。ほとんどのプログラムとは異なり、シェルスクリプトの動作は多数の環境変数によって大幅に変更できるため、広範な保護策を講じることなく、このようなスクリプトを簡単にtrickして任意のコードを実行できます。
ステファニー

1
そのラッパーのシステムコールの前にclearenv()の呼び出しを追加して、環境を完全に吹き飛ばして、スクリプトを操作するための邪悪な設定がないようにする必要があります。kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
ステファニー

@Stephanie私は何か間違ったことをしているに違いありません。これはすべて、一般的なタスクには夢中に見えるからです。これは私がやろうとしているものです:serverfault.com/questions/401405/...
HappyDeveloper

@HappyDeveloper setuidスクリプトにはあまり夢中になりません。セキュリティが不十分なスクリプトは、それを実行する管理者にとってはrootへのパスです。
ステファニー

4
sudoすべてのユーザーに特定のプログラム(またはスクリプト)へのアクセスを許可するために使用できます。その意味で、それは派手なsetuidラッパーとして機能します。通常、独自のsetuidラッパーを記述するよりも、それが良い選択のようです。
jjlin

4

最も簡単で安全な方法は、ファイル許可でSETUIDビットを使用することです。これにより、コマンドの許可がファイル所有者の許可に昇格されます。

エディションのスクリプトを防止するために、すべてのユーザーに書き込みを設定しないでください。


0

これが役立つかどうかはわかりませんが、スクリプトをルートとしてのみ実行するには、スクリプトの最初の行でこのシェバンを使用できます。

#!/bin/su root
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.