2012-05-05 14 views
1

私は管理者アカウント内で実行するbashスクリプトを作成したいと思います。スクリプトで既存のhostsファイルをファイル拡張子が.originalの同じディレクトリにバックアップし、スクリプトに3つの定義済みのエントリ(スクリプト本体内で指定されたもの)をhostsファイルに追加して、 hostsファイルユーザーが認証を受けることなくこれを達成するにはどうすればよいですか?管理者のパスワードをスクリプトに保存し、エスカレーションをリクエストするたびにsudoに渡します。ありがとうございました。ホストファイルへのエントリの追加

答えて

1

パスワードはスクリプトに保存しないでください。これはセキュリティ上の脆弱性です。 setuidビットを使用することで、どこにでもパスワードを保存することなく、必要な動作を実現できます。

最初に実行してオーナーとして実行させるには(所有者のルートを作成すると、あなたのスクリプトはrootとして実行されるので、スクリプト内ではまったくsudoを使う必要はありません)。

次に、スクリプトを実行できる任意の人がいることを確認します。すべてのユーザーがchmod +x myscriptを実行できるようにする場合は、グループ内の唯一のユーザーであることを自分自身で確認し、代わりにchmod g+x myscriptを使用できるようにする場合は、

次に、sudo chown root myscriptを実行してルート所有者にします。

このスクリプトを実行する権限を持つユーザーが実行されると、そのユーザーが管理者であるかどうかに関係なく、rootとして実行されます。

+0

ウィル私はUSBサムドライブ上のスクリプトを保存し、親指ドライブから直接それを実行しているマシンへのマシンからそれを持参する場合は、この作品。 –

+0

@ DeanA.Vassalloいいえ、それはその状況では動作しません。もしUnixやOSXがそうするなら、それは巨大なセキュリティ上の脆弱性になります。あなたは、親指のドライブに格納された10文字のスクリプトで誰のオペレーティングシステムを完全に制御することができます。 – Paulpro

+0

ええ、それは私が考えていたものです。これは、このような1つの状況です。私はたぶんホストファイルの修正バージョンを作成し、サムドライブに保存してマシンをマシンに接続し、cpを使用してコピーを作成し、次にcpを使ってサムドライブから/ etcにファイルを移動します。 –

1

これを実行するには、プログラム(コンパイル済みコード)とsuid rootを作成する必要があります。その場合、ユーザーにrootパスワードを明らかにする必要はありません。私はあなたがスクリプトをsuidできるシステムにはまだ遭遇していません。あるいは、実際のプログラムであるbash自体をsuidしなければならない場合、誰もがrootになることができます。

例:(rootとして実行)

ex qq.c << EOF 
1,\$d 
i 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <assert.h> 
int main() { 
    assert(0 == setreuid(geteuid(),-1)); 
    return system(
    "/bin/bash << DONE\n" 
    "if [ \"\$UID\" != '0' ];then echo \"need to be root to do this\";exit 16;fi;\n" 
    "cp /etc/hosts /etc/hosts.org\n" 
    "echo 127.0.0.1 banned1.domain >> /etc/hosts\n" 
    "echo 127.0.0.1 banned2.domain >> /etc/hosts\n" 
    "echo 127.0.0.1 banned3.domain >> /etc/hosts\n" 
    "DONE\n"); 
} 
. 
x 
EOF 
gcc -o qq qq.c && chmod u+s qq 
0

あなたはsudoコマンドでこれを行うことができます。 sudoコマンドを使用すると、どのユーザーがどのコマンドを実行できるか、およびどのユーザーを実行できるかを指定できます。通常、実行するにはルートにする必要のある特定のコマンドにユーザーがアクセスできるようにします。たとえば、特定の人がApache httpdを起動および停止できる必要があります。通常、rootだけがこれを行うことができますが、その権限をroot権限で他人に与える権限をWeb管理者に与えることはできません。

sudoコマンドは、/private/etc/sudoersファイルで制御されます。 (これはvisudoコマンドで編集する必要があります)。

/etc/hostsファイルを編集するためのシェルスクリプトを作成したとします。最初に特定の場所、たとえば/usr/local/edit_hosts_fileに配置したいと考えています。ディレクトリはrootが所有しているので、これは良い場所です。

ここで、rootだけがこのファイルを実行できるようにしたいと思うかもしれません。rootだけがこのファイルを読むことさえできます。特にrootだけがこのファイルを編集できるようにしたいとします。そうでなければ、人々は自分自身にあなたのシステムの他の部分へのrootアクセス権を与えるために、このファイルを使用することができます。

$ sudo chown root:root /usr/share/edit_hosts_file 
$ sudo chmod 700 /usr/share/edit_hosts_file 

今、あなたのコマンドが安全であることを、あなたは、特定のユーザーが、このシェルスクリプトを実行できるように/private/etc/sudoersファイルを編集することができますrootとして:

User_Alias ALLOWED_USERS = bob, carol, ted, alice 
Cmnd_Alias ETC_HOSTS_EDIT = /usr/share/bin/edit_hosts_file 
Host_Alias MACHINE_LIST = localhost 
ALLOWED_USERS MACHINE_LIST=(ALL) NOPASSWD: ETC_HOSTS_EDIT 

これは、定義されたALLOWEDユーザリスト内の任意のユーザーがパスワードを必要とせずに、あなたのetc/hosts編集スクリプトを実行できるようになります。

スクリプトを実行したい場合は、パスワードを知らずにパスワードを入力しなくても、rootとすることができます。この方法では、あなたのスクリプトが別のスクリプトで実行することができます

$ sudo /usr/share/bin/edit_hosts_file 
Script completed: /etc/hosts edited 
関連する問題