Linux、プログラムでsudoersファイルに追加

Linux、プログラムでsudoersファイルに追加

プログラムでファイルを更新する正しい方法は何ですかsudoers?具体的には:

  • 私のファイルに行末を追加し,timestamp_timeout=600(残り時間を10時間に増やし)、システムを中断せずにプログラムで実行するにはどうすればよいですか(一度試してみましたが、Linuxシステムが起動せずにインストールを再起動する必要がありました) 。私はこれがこれにとって重要であるかもしれないことを読んだ。Defaults env_resetsudoerssudochmod 440
  • 私はそれが危険であることを知り、それが保護されている理由を理解しています。しかし、これは何十もの簡単な設定変更を実行するスクリプトを持つ私のホームシステムです(そして私はこれらのシステムもかなり定期的に再構築するので、これは私にとって便利です)。これは自動的に実行できます)。
  • bash私はスクリプトに置くことができる標準のLinuxツールを使用してこれを行う方法に最も興味がありますが、このような簡単な変更を適用するためにAnsibleで正確なタスクを実行する方法を学ぶことにも非常に興味があります。sudoers私の家のウェブ上のすべてのファイル。
  • 存在するこのページドキュメントに議論がありますが、sudoers私が参照した内容をよく理解できませんvisudo -c -f考える提案は次のとおりです。ファイルのコピーを作成し、そのsudoersコピーを変更してvisudo -c -f新しいファイルが有効であることを確認し、上書きして新しいファイルに上書きするsudoerschmod 440は正しいですか?これを実装する手順は不明です。

答え1

警告する:次のように動作します。これが良いアイデアかどうかは議論の余地があります。しかし、これをしたい場合は、この方法は安全性が低い方法の1つです。

ファイルを変更するスクリプトを使用して、呼び出す変数を設定してエクスポートSUDO_EDITORするだけです。sed例えば

export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
visudo
unset SUDO_EDITOR

もちろん、rootとして実行する必要があります。通常は定義されていません...しかし、あなたが望むものを使用したり、あなたが望むものを知らせるために使うことができます(多くのプログラムで使用されるより一般的なEDITORおよびVISUAL環境変数よりもvisudoよりも優先されます。定義されている場合、visudoはそれを使用しますが、SUDO_EDITORSUDO_EDITORではない)。この例では、対話型エディタの代わりにストリームエディタ()を使用しています。visudovinanojoesed

変更が適用されない場合は、visudo当社がこれを認識し、何をすべきかを尋ねます。あなたのオプションは次のとおりです。

What now?
Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)

オプションを使用する必要がありますx。再実行されe、破損した変更が保存されます。sedQ

しかし、他の変更が必要/etc/sudoersで、何らかの理由でファイルを直接置くことができない場合は、/etc/sudoers.d// etc / sudoers(例:/ tmp / sudoers)のコピーで変更をテストし、オプション-fvisudo

正しい変更が行われたことを確認できますdiff。うまくいけば素晴らしいです-f /tmp/sudoers。希望の効果が得られるまで繰り返します。cpvisudo

# cp -af /etc/sudoers /tmp/
# export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
# visudo -f /tmp/sudoers 
# unset SUDO_EDITOR
# diff -u /etc/sudoers /tmp/sudoers
--- /etc/sudoers    2020-07-18 02:57:35.220317224 +1000
+++ /tmp/sudoers    2021-10-15 03:26:13.048804192 +1100
@@ -9,7 +9,7 @@
 
 Defaults exempt_group=sudo
 
-Defaults   env_reset
+Defaults   env_reset,timestamp_timeout=600
 Defaults   mail_badpass
 Defaults   secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

ところで、ここでファイルを変更することは何でも使用できます。 Perl、Python、またはシェルスクリプト(ラッパースクリプトedex他のスクリプト可能なエディタなど)をSUDO_EDITOR好む場合sed。指定されたファイルを変更する限り動作しますvisudo。スペースと入れ子になった引用符に注意してください。

答え2

プログラムで最良の方法は、/etc/sudoers.d必要なすべてのディレクティブにファイルを追加することです。これらのファイルは0440が所有し、rootモードは0440でなければなりません。ファイルを追加するには/etc/sudoers.d3つの利点があります。/etc/sudoersほとんどの場合、/etc/sudoersシステムのデフォルト設定が維持されるため、変更に関連する将来のアップグレードが簡素化され、/etc/sudoersデフォルト値の変更を簡単に表示できます。

タイムアウト設定でもファイルを追加できます。Defaults行が繰り返される可能性があるため、追加

Defaults timestamp_timeout=600

既存の行に追加するのと同じ効果がありますDefaults env_reset

これを行うには、次の/etc/sudoersものを含める必要があります。

@includedir /etc/sudoers.d

これは最近のインストールのデフォルトですが、sudo次のようにプログラムでこれを保証できます。

if ! sudo grep -q '^[@#]includedir /etc/sudoers.d$' /etc/sudoers; then
    sudo sed '$a\\n@includedir /etc/sudoers.d' /etc/sudoers > /etc/sudoers.new
    sudo visudo -c -f /etc/sudoers.new && sudo mv /etc/sudoers{.new,}
fi

SUDO_EDITOR(ここではこのトリックを使用しないでください。visudo処理されるためループが/etc/sudoers.d/README発生します。)@include

関連情報