web-dev-qa-db-ja.com

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

誰が実行した場合でも、スクリプトをrootとして実行するにはどうすればよいですか?

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

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

27
HappyDeveloper

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

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

それでもsetuidを設定してスクリプトを実行する場合は、短い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. visudoを使用して/etc/sudoersのSudoアクセス権を変更します。

     ALL ALL =(root)NOPASSWD:/absolute/path/to/your/script.sh
    

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

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

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

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

31
speakr

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

スクリプトが編集されないようにするために、全員に書き込みを設定しないでください。

4
Tadas

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

#!/bin/su root
0
alexandre1985