web-dev-qa-db-ja.com

システムに/etc/sudoers.dがあるのはなぜですか?編集するにはどうすればいいですか。

前回、私はこれらのリスクについて尋ねました(/ etc/sudoersにあります)。

    user_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
    %group_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

この問題について考えていたときに、/ etc/sudoers.dディレクトリが見つかりました。ディレクトリ内のファイルは/ etc/sudoersに似た機能を持つべきです(上のスクリプトは/etc/sudoers.dでも問題があることを意味します)が、visudoを使用してファイルを編集することはできないため、このディレクトリを使用しないでくださいその中に。つまり、ディレクトリを間違えるとSudoを使う権利がなくなります。

それが本当なら、なぜ私たちは/ etc/sudoers.dを持っているのですか?それとも、/ etc/sudoers.dにあるファイルを編集する良い方法はありますか?

45
aob

システムをアップグレードしても、/etc/sudoers.d内のファイルに加えられた変更はそのまま残ります。これにより、システムのアップグレード時にユーザーのロックアウトを防ぐことができます。 Ubuntuはこの振る舞いを好む傾向があります。他のディストリビューションもこのレイアウトを使用しています。

私の経験では、このディレクトリ内のファイルに関する規則は/etc/sudoersよりも緩いものです。これは含まれています:

  • ファイルの間違いによってSudoが失敗することはありませんでした。しかし、ファイルは無視されました。
  • 許可規則はそれほど厳しくないようです。該当するグループなどがファイルを読み取ることができます。私はそれが/etc/sudoersで可能だったとは思わない。セキュリティを維持するためには、書き込み権限をrootに制限する必要があります。 Sudoの現在のUbuntuバージョンはグループまたはその他のための読み取り権限を許可します。 (この機能により、rootアクセスを必要とせずにSudoアクセスを監査することができます。)

visudoコマンドのデフォルトは/etc/sudoersだけです。 -fオプションで指定したファイルを編集して検証します。この機能を使用して、/etc/sudoersまたは/etc/sudoders.dに自動的にインストールされるファイルを編集します。ただし、他のファイルからの定義が見つからない可能性があります。ファイルを独立させるのが最善です。

スタンドアロンファイルを持つことができるため、アプリケーションはインストール時にSudo機能を有効にし、アンインストール時にそれらを削除することが簡単になります。自動設定ツールもこの機能を使用できます。

この機能を使用して、特定のシステム上の特定のユーザーグループにアクセス権を付与するために必要な変更を特定しました。

40
BillThor

はい、visudoを使ってこれらのファイルを編集することができます。あなたがしなければならないのは-fオプションで編集したいファイルの名前を指定することだけです。例えば:

visudo -f /etc/sudoers.d/somefilename

または、必要に応じて

Sudo visudo -f /etc/sudoers.d/somefilename

ドキュメンテーション

man visudoから:

-f sudoers
sudoersファイルの場所を指定して代替します。このオプションを指定すると、visudoはデフォルトの/ etc/sudoersの代わりにあなたが選んだsudoersファイルを編集(またはチェック)します。使用されるロックファイルは、指定されたsudoersファイルに「.tmp」を追加したものです。チェック専用モードでのみ、-fの引数は " - "になります。これはsudoersが標準入力から読み込まれることを示します。

要約すれば:

  1. 構文:visudovisudo -fは同じ構文検査を実行します

  2. 権限/所有権:大規模システムの管理を補助する機能 として追加されたvisudo -fの下で編集されたファイル所有権やパーミッションのチェックは行われません。これにより、ファイルの構文チェックをオフラインで、またはリビジョン管理システムの一部として行うことができます。

なぜ/etc/sudoers.d/を使うのか

通常/etc/sudoersはあなたのディストリビューションのパッケージマネージャの管理下にあります。そのファイルに変更を加え、パッケージマネージャがそれをアップグレードしたい場合は、手動で変更を調べて、それらが新しいバージョンにどのようにマージされるかを承認する必要があります。ローカルの変更を/etc/sudoers.d/ディレクトリのファイルに保存することで、この手動の手順を回避してアップグレードを自動的に進めることができます。

Sudo/etc/sudoers内のファイルを無視するのはいつですか?

/etc/sudoersファイルに次の行が含まれているとします。

#includedir /etc/sudoers.d

Sudoはディレクトリ/etc/sudoers.d内のファイルを読み込みます。

例外は以下のとおりです。

  1. 名前が~で終わるファイル
  2. 名前に.文字が含まれているファイル

これは(a)パッケージマネージャの利便性のために行われ、(b)エディタからのバックアップファイルは無視されるようにします。

59
John1024

/etc/sudoers.dがあるのはなぜですか?

脆弱な可能性がある/etc/sudoersに変更を加えるよりも、自動化ツール(ChefやPuppetなど)が個々のファイルをこのディレクトリにドロップする方が簡単なためです。

/etc/sudoers.d内のファイルは(事実上)連結されています。 /etc/etc/cron.dなど、/etc/logrotate.dにこのパターンの他のインスタンスがいくつかあります。

19
Roger Lipscombe

いくつかの回答で言及されているようにvisudo -fを使用することのもう一つの利点はあなたがsudoers.dファイルまたはあなたがsudoers.dに入れたいと思うかもしれない他のファイルに無効な情報がないことを検証する対応するオプション-cまたは--checkがあることですあなたが実行することができるようにこれは自動化されたツールで言及された場合に本当に便利です。

Sudo visudo -c -q -f /home/myuser/mysudoers && \
Sudo chmod 600 /home/myuser/mysudoers && \
Sudo cp /home/myuser/mysudoers /etc/sudoers.d/mysudoers

これは黙ってファイルをチェックし(-qのために出力されません)、それがエラーを返さない(出口1が無効なsudoersファイルを意味する)場合に限り、ファイルをsudoers.dにコピーします。最初に正しくする必要はありません(Sudo visudo -f /etc/sudoers.d/myfileを使用すると成功する必要があります。それ以外の場合は、コンテンツを破棄します)。

また、他の答えからのこれらのステートメントに関する注意の言葉

私の経験では、このディレクトリ内のファイルに関する規則は/ etc/sudoersよりも緩いものです。これは含まれています:

ファイルの間違いによってSudoが失敗することはありませんでした。しかし、ファイルは無視されました。許可規則はそれほど厳しくないようです。該当するグループにファイルの読み取りを許可します。/etc/Sudoではそれが可能だとは思わない。

/etc/sudoers.d内のファイルは、/ etc/sudoersと同じ構文に従う必要があります。カバーの下に、同じエントリが複数ある場合、システムは単にすべてのファイルを最後のファイルと連結するためです。特異な設定.

/etc/sudoers.d/内のファイルに対するパーミッションが非常に不正確(全世界書き込み可能)である場合、それらは無視される可能性があります。そうしないと、無効なsudoersを持つことによってSudoコマンドを深刻に破ることができます。正しい権限を持つ.dファイル。

あなたが誤って他のユーザとしてSudoに必要な 'other'書き込み許可を許可したり、root端末からこのコマンドを実行したりした場合、sudoersファイルが誰でも読めるようにすることができます。ファイルがroot:root以外の誰かによって所有されている場合も、これは壊れる可能性があります。

Sudo chmod 644 /etc/sudoers.d/mysudoers
Sudo chown root:root /etc/sudoers.d/mysudoers

chmod o+w /etc/sudoers.d/vagrantを実行すると、vagrantユーザーとしてSudoを使用できなくなり、パスワードの入力を求められて失敗することを確認しました。

適用されたコマンド権限を別の有効なSudoユーザーとして表示するためにSudo -lを実行したときに、ファイルの権限に関する警告も表示されました。これは、私がo+w権限をファイルに適用したときに 'vagrant'ユーザーがSudoを失ったことを確認するために使用したのと同じコマンドです。

13
dragon788

一般的な回答を少し追加するだけで、他の回答のどれも私の問題を解決しませんでした。

あなたの行がsudoers.dで動くがsudoers.dで動かないならば、#includeを動かすか、あなたのsudoers.dファイルの順序を変えることを試してください(数字を頭に付けることによって)。最も具体的なものがファイルの最初にあるはずです。

私はこんな感じでした:

somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand

そして2番目のものは最初のものがすでにマッチしているので効果がありませんでした。 NOPASSWDは条件ではありませんが、アクションを変更するための何らかの方法です。

Sudoers.dディレクトリのおかげで、1つのファイルに含まれていなかったので、それは明白ではありませんでした。

2
Peter