web-dev-qa-db-ja.com

sudoなしでroot以外のユーザーに一連のコマンドのアクセス権を与える

私のマシンの非rootユーザーに非sudoアクセスを付与したいのですが、ユーザーdns-managerがあり、彼の唯一の役割はすべてのBINDコマンド(rndc、dnssec-keygen)などを実行することです。

今度はコマンドを実行する必要があるたびに、

Sudo rndc reload

このSudoを取り除く方法はありますか?ただし、特定のコマンドセット(およびdns-managerのみ)でのみですか?

13
Anss

私があなたのコメントを正しく理解している場合、ここでの問題は、Sudoがデフォルトで要求するパスワードを入力する機能を持たない接続を介してコマンドが発行されることです。また、多くのOSディストリビューションでは、SudoはデフォルトでTTYを要求しますが、このプログラムにはありません。

ただし、Sudoは非常にきめ細かなアクセス許可構造を持つことができるため、1人以上のユーザーがパスワードとTTYなしで1つの特定のコマンドを発行できるようにすることができます。以下に、ニーズに合わせてこれを構成する3つの方法を示します。どちらを選択しても、ユーザーはパスワードを入力しなくてもSudo rndc reloadコマンドを発行できるようになります。

(また、これは不要な場合もありますが... お願い編集する前にsudoersファイルのバックアップコピーを作成し、元に戻す必要がある場合に備えて、シェルを開いたままにしておきます。バックアップに追加し、Sudo vi /etc/sudoersの代わりにvisudoを使用して編集します。うまくいけば、これらの予防策は不要になりますが、...それらを用意し、逆の場合よりも必要ない方がいいです!)

1.リクエストにTTYを必要としない場合

TTY要件(存在する場合)を取り除く最も簡単な方法は、/etc/sudoersDefaultsで始まる行にWord requirettyが含まれていないことを確認することです。代わりに、 !requirettyを含める必要があります。ただし、これを行うと、noSudoコマンドにはttyが必要になります!

また、行を追加する必要があります

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2.これを除くすべてのユーザーにTTYを要求する場合

これは、次のように、この1人のユーザーのデフォルトを設定することで実行できます。

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3.この1人のユーザーがこの1つのコマンドを除くすべてのコマンドにTTYを要求する場合

Sudoersファイルの構文のため、これは少し複雑です。次のように、コマンドのコマンドエイリアスを作成し、そのコマンドエイリアスのデフォルトを設定する必要があります。

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD
31
Jenny D

はい。 Sudoは非常に柔軟に構成できます。そうであっても、私は言及しなければなりません:これらのタイプのソリューションは非常に安全であると見なされるべきではなく、他のコントロールが配置されている協調環境でのみ使用されるべきです(したがって、これらの拡張された特権を忠実な部下に与えることができますが、ネットからしかわからない顧客に対してはそうすべきではありません)。

Sudo設定は、ほとんどのシステムで/etc/sudoersにあります。その構文は、グーグルまたはman Sudoコマンドで確認できます。

このファイルを直接編集しないでください。これを行うと、セキュリティの競合状態が発生する可能性があります。代わりに、visudoコマンド($EDITOR環境変数のラッパー)を使用してください。


Sudoを構成した後、これを表示されるコマンドに簡単にラップできます。それは非常に簡単です:

  1. Sudoラッパースクリプトのリスト用のディレクトリを作成します(例:/usr/local/dnsadmin/bin
  2. Sudoなしで使用できるようにするコマンドのラッパースクリプトを作成します。これは非常に単純なコマンドです。たとえば、/usr/local/dnsadmin/bin/rndcは次のようになります。

    #!/bin/bash exec /usr/bin/Sudo /usr/sbin/rndc "$@"

  3. このディレクトリをPATH環境変数に取得します(たとえば、システム全体またはローカルの.profileによって)。

これは、rndcの特定のケースでは一般的な解決策ではありませんが、Sudoはまったく必要ありません。

rndcは、ローカルソケットまたはリモートポートを介してnamedプロセスと通信でき、秘密鍵を使用して自身を認証します。デフォルトでは(または少なくとも、私が使用しているディストリビューションであるdebianの場合)、このファイルは/etc/bind/rndc.keyにあり、通常はユーザーbindおよびグループbindだけが読み取ることができます。

そのキーファイル(またはその同じコピー)への読み取りアクセス権を持つユーザーはrndcを使用してBINDサーバーを制御できるため、この特定のケースで最も簡単な解決策は、ユーザーをbind group。

驚くほど多くの一般的なデーモンが似たような設定になっています(私はまだ個人的にpowerdnの可能性を考えていますが、今のところ有望です)。 Sudoしたくない場合は、ケースバイケースで達成したいことが可能かどうかを確認する必要があります。

2
Shadur