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새 파일이 유효한지 확인한 다음 덮어쓴 sudoers다음 chmod 440새 파일에 덮어쓰는 것이 맞습니까? 이것을 구현하는 단계가 확실하지 않습니다.

답변1

경고하다: 다음과 같이 작동합니다. 이것이 좋은 생각인지 여부는 논쟁의 여지가 있습니다. 하지만 이렇게 하고 싶다면 이 방법은 덜 안전한 방법 중 하나입니다.

파일을 변경하는 스크립트를 사용하여 호출할 변수를 설정하고 내 SUDO_EDITOR보내면 됩니다. sed예를 들어

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

물론 루트로 실행해야 합니다. 일반적으로 정의되지 않습니다... 그러나 원하는 것을 사용하거나 또는 원하는 것을 알려주는 데 사용할 수 있습니다(많은 프로그램에서 사용하는 보다 일반적인 EDITOR 및 VISUAL 환경 변수보다 visudo보다 우선합니다. 정의된 경우 visudo는 이를 사용하지만 SUDO_EDITOR SUDO_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 또는 심지어 쉘 스크립팅(예: 래퍼 스크립트 ed또는 ex다른 스크립트 가능한 편집기)을 SUDO_EDITOR선호 하는 경우 sed. 주어진 파일을 변경하는 한 작동합니다 visudo. 공백과 중첩된 따옴표를 주의하세요.

답변2

프로그래밍 방식으로 가장 좋은 방법은 /etc/sudoers.d필요한 모든 지시문에 파일을 추가하는 것입니다. 이러한 파일은 0440이 소유 root하고 모드가 0440이어야 합니다. 파일을 추가하면 /etc/sudoers.d세 가지 이점이 있습니다. /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

관련 정보