管理者アカウント内で実行するbashスクリプトを作成したいと思います。スクリプトで既存のhostsファイルをファイル拡張子.originalで同じディレクトリにバックアップしてから、スクリプトで3つの事前定義されたエントリ(スクリプト本体内で指定)をhostsファイルに追加し、既存のフォーマットを維持する必要があります。ホストファイル。ユーザーが認証しなくてもこれを実現するにはどうすればよいですか?管理者のパスワードをスクリプトに保存し、エスカレーションを要求するたびにsudoに渡す必要があります。ありがとうございました。
3 に答える
プログラム (コンパイルされたコード) を作成し、それを実行するために root に suid する必要があります。その後、root パスワードをユーザーに明らかにする必要はありません。スクリプトを suid できるシステムにはまだ出会ったことがありません。または、実際のプログラムである bash 自体を suid する必要があります。そうすれば、誰もが 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
スクリプトにパスワードを保存しないでください。それはセキュリティ上の脆弱性です。setuid ビットを使用すると、パスワードをどこにも保存せずに、目的の動作を実現できます。
最初chmod u+s myscript
に実行して、所有者として実行します (所有者を root にすると、スクリプトが root として実行されるため、スクリプト内で sudo を使用する必要はまったくありません)。
次に、必要な人がスクリプトを実行できることを確認します。すべてのユーザーが実行できるようにする場合は、chmod +x myscript
. chmod g+x myscript
自分だけがグループ内の唯一のユーザーであることを確認し、代わりに使用できるようにしたい場合。
次に実行sudo chown root myscript
して、root が所有するようにします。
これで、そのスクリプトを実行する権限を持つユーザーがスクリプトを実行すると、そのユーザーが管理者であるかどうかに関係なく、root として実行されます。
コマンドを使用してこれを行うことができますsudo
。このsudo
コマンドを使用すると、どのユーザーがどのコマンドを実行できるか、およびどのユーザーが実行できるかを指定できます。通常、実行するには root になる必要がある特定のコマンドへのアクセス権をユーザーに付与します。たとえば、特定の人が Apache httpd を開始および停止できる必要があります。通常、これを実行できるのは root だけですが、Web 管理者に root として他のことを行う許可を与えずに、この許可を与えることができます。
このsudo
コマンドは、/private/etc/sudoersファイルによって制御されます。(コマンドで編集する必要がありますvisudo
)。
ファイルを編集するためのシェル スクリプトを作成するとし/etc/hosts
ます。最初に、特定の場所に配置する必要があります/usr/local/edit_hosts_file
。ディレクトリはルートが所有しているため、これは適切な場所です。
ここで、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