sudoを使用せずに非rootユーザーに一連のコマンドのアクセスを許可する


13

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

今、彼はコマンドを実行する必要があるたびに、入力します、

sudo rndc reload

このsudoを取り除くことができる方法はありますが、特定のコマンドセットでのみ(そしてdns-managerのみ)ですか?


5
このような自由裁量のアクセス制御sudoは、ほとんどの目的です。彼sudoがこれに使用することに対するあなたのビジネス上の異議は何ですか?
-MadHatter

1
@peterh私は私の質問を繰り返します:任意のアクセス制御(すなわち、部分的なsysadm委任)はの役割ですsudo。異議は何ですか?
MadHatter

3
sudoでは、パスワードレスはどうですか?または、パスワード付きのsudo を使用してDNS管理ツールを実行しますnamed。これにより、必要に応じてグループまたはユーザーの特権、またはルート特権で操作できます。
MadHatter

4
@peterh「この方法で行う正当な理由」が欠けているでしょう。通常、このような質問は偽装のXY問題であることが判明し、根本的な問題を理解することが完全かつ専門的にそれらに答える鍵であることがわかります。
MadHatter

2
@peterh私たちはお互いに同意していると思います。私も、OPが彼の質問を改善するのを見たいです。それを掘り下げることは、著者が自分の周りに構築されたボックスの外側を考えるのを助ける方法として私にとってうまく機能します。彼は避けsudoたがる十分な理由があるかもしれません。私たちにそれを表現しようとするとき、彼は私たちの混乱を解消するか、彼自身の問題を解決するかもしれません。
MadHatter

回答:


31

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

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

(また、これは不要かもしれないが、... してください、あなたはバックアップに戻す場合にいるルートのオープンを必要とするシェルを保つために、それを編集する前に、あなたのsudoersファイルのバックアップコピーを作成することを忘れないでください、と編集にそれ使用してvisudoの代わりにsudo vi /etc/sudoers、より良いそれらを持っているし、逆よりも、それらを必要としないために...うまくいけば、これらの注意事項は不要となります。しかし!)

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

TTY要件(存在する場合)を取り除く最も簡単な方法は、Defaultsinで始まる行に/etc/sudoers単語が含まれていないことを確認することです。requiretty代わりにを含める必要があります!requiretty。ただし、これを行うと sudoコマンドには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

もちろん、何らかの理由でsudoがパスワードなしでも直接使用できない場合は、これをsudoを使用してコマンドを呼び出すラッパースクリプトと組み合わせることができます。
ジェニーD

4

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

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

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


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

  1. sudoラッパースクリプトのリスト用のディレクトリを作成します(fe /usr/local/dnsadmin/bin
  2. sudoを使用せずに使用可能にするコマンドのラッパースクリプトを作成します。たとえば、次のような非常に単純なコマンドに/usr/local/dnsadmin/bin/rndcなります。

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

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


好奇心から- exec単にコマンドを直接呼び出すのではなく、シェルスクリプトで使用するのはなぜですか?(私はそれが間違っていると言っているのではなく、あなたがそれをする理由を知りたいので、何かを学ぶことができるかもしれません)
ジェニーD

2
パスワードなしのsudoビットで完了しました。ラッパースクリプトのアイデアは素晴らしいです。
アンス

2
@JennyD :-)安定性とパフォーマンスのため。の場合exec、呼び出されたコマンドはシェルの代わりに置き換えられます。シェルは消えます。execがなければ、シェルはそのコマンドを開始し、その終了を待ってから終了します。この2番目のexec-lessは、複数の協調プロセスを意味しますが、これは不要です。ただし、大きな違いはありません。execを使用しなくても、これと同じように機能します。
peterh -復活モニカ

@JennyD私の嘆願:-)
ペテル-モニカの復活

@Snowbody講義ありがとうございました!それは非常に大きな名誉です。
peterh -復活モニカ・

2

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

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

そのキーファイル(またはその同一のコピー)への読み取りアクセス権を持っている人は誰でもrndcBINDサーバーの制御に使用できるため、この特定のケースで最も簡単な解決策はユーザーをbindグループに追加することです。

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


-1

sudoを使用して、一部のコマンドのルートを許可したくない場合。代わりに、特定のプログラム(コマンドをラップできる)をchmod 4750して、通常のユーザーの権限を高めて、rootとして実行することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.