私は管理者アカウント内で実行するbashスクリプトを作成したいと思います。スクリプトで既存のhostsファイルをファイル拡張子が.originalの同じディレクトリにバックアップし、スクリプトに3つの定義済みのエントリ(スクリプト本体内で指定されたもの)をhostsファイルに追加して、 hostsファイルユーザーが認証を受けることなくこれを達成するにはどうすればよいですか?管理者のパスワードをスクリプトに保存し、エスカレーションをリクエストするたびにsudoに渡します。ありがとうございました。ホストファイルへのエントリの追加
答えて
パスワードはスクリプトに保存しないでください。これはセキュリティ上の脆弱性です。 setuidビットを使用することで、どこにでもパスワードを保存することなく、必要な動作を実現できます。
最初に実行してオーナーとして実行させるには(所有者のルートを作成すると、あなたのスクリプトはrootとして実行されるので、スクリプト内ではまったくsudoを使う必要はありません)。
次に、スクリプトを実行できる任意の人がいることを確認します。すべてのユーザーがchmod +x myscript
を実行できるようにする場合は、グループ内の唯一のユーザーであることを自分自身で確認し、代わりにchmod g+x myscript
を使用できるようにする場合は、
次に、sudo chown root myscript
を実行してルート所有者にします。
このスクリプトを実行する権限を持つユーザーが実行されると、そのユーザーが管理者であるかどうかに関係なく、rootとして実行されます。
これを実行するには、プログラム(コンパイル済みコード)と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
あなたは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
- 1. KeystoreFileへのエントリの追加
- 2. task_structへのエントリの追加とデフォルト値への初期化
- 3. 静的DNSエントリの追加
- 4. ホストファイルに行が追加されていない場合のみ
- 5. PHPでホストファイルのエントリを確認していますか?
- 6. NSMutableDictionaryにNSDictionaryのエントリに追加
- 7. HashMapのArrayListにエントリを追加する
- 8. $(this)への追加
- 9. イメージファイルへの追加
- 10. オブジェクトフィールドへの追加
- 11. .net Windowsアプリケーションの「プログラムの追加と削除」にエントリを追加する方法
- 12. sqliteデータベーステーブルに新しいエントリを追加
- 13. AppContlegateへのViewControllerの追加
- 14. NSMutableArrayへのファイルの追加
- 15. データベーステーブルへのタイムスタンプの追加
- 16. モデルへのカスタムクエリの追加
- 17. キープレスイベントへのリンクの追加
- 18. awstatsへのカスタムログインページの追加
- 19. StructuredTextViewerへのソースバリデーションの追加
- 20. QMainWindowへのQGLWidgetの追加
- 21. インスタンスのdir()への追加
- 22. PyCharmへのライブラリディレクトリの追加
- 23. jspのリクエストパラメータへの追加
- 24. AppへのUINavigationControllerの追加
- 25. メンバーリストへの追加のPython
- 26. ドロップダウンリストへのコントロールの追加
- 27. JTableへのKeyListenerの追加
- 28. カスタムビューグループへのビューの追加
- 29. ネームサービススイッチへのサービスの追加
- 30. ViewGroupへのフラグメントの追加
ウィル私はUSBサムドライブ上のスクリプトを保存し、親指ドライブから直接それを実行しているマシンへのマシンからそれを持参する場合は、この作品。 –
@ DeanA.Vassalloいいえ、それはその状況では動作しません。もしUnixやOSXがそうするなら、それは巨大なセキュリティ上の脆弱性になります。あなたは、親指のドライブに格納された10文字のスクリプトで誰のオペレーティングシステムを完全に制御することができます。 – Paulpro
ええ、それは私が考えていたものです。これは、このような1つの状況です。私はたぶんホストファイルの修正バージョンを作成し、サムドライブに保存してマシンをマシンに接続し、cpを使用してコピーを作成し、次にcpを使ってサムドライブから/ etcにファイルを移動します。 –