'echo "기본 모욕" >> /etc/sudoers'는 안전합니까?

'echo "기본 모욕" >> /etc/sudoers'는 안전합니까?

이거 안전한가요?

echo "Defaults    insults" >> /etc/sudoers

그렇다면 이 일을 할 수 있습니까?

echo "## First line" >> /etc/sudoers
echo "### Second line" >> /etc/sudoers
echo "Defaults    insults" >> /etc/sudoers
echo "### Totally the last line" >> /etc/sudoers

이를 수행하는 더 좋은 방법이 있습니까 visudo?

나는 bash 스크립트를 만들고 있는데 이 부분에서는 모욕을 켜고 끄는 것이 필요합니다.

답변1

이것이 위험할 수 있는 방법은 최소한 3가지가 있습니다.

  1. /etc/sudoers개행 문자로 끝나지 않는 경우 ( sudo허용됨 visudo), 예를 들어 #includedir /etc/sudoers.d종료되지 않는 행으로 끝나는 경우 명령은 다음과 같이 만듭니다.

    #includedir /etc/sudoers.dDefaults insults
    

    이렇게 하면 해당 파일이 파괴되어 sudo사용할 수 없게 됩니다.

  2. echo예를 들어 파일 시스템이 가득 찬 경우 전체 문자열이 기록되지 않을 수 있습니다. 예를 들어 쓰기만 가능할 수 있습니다 Defaults in. 그러면 sudoers파일이 손상됩니다.
  3. 여러 관리자가 있는 시스템에서 /etc/sudoers두 사람이 동시에 수정하려고 하면 그들이 쓰는 데이터가 인터리브될 수 있습니다.

visudo임시 파일( )을 편집하고 파일이 수정되었는지 감지할 수 있으므로 이러한 문제를 피할 수 있습니다 /etc/sudoers.tmp(불행히도 파일이 수정된 경우에는 감지되지 않음).성공적으로수정(편집기의 종료 상태를 확인하지 않는 것 같으므로)하고 구문을 확인한 다음 rename(원자적 작업)을 수행하여 새 파일을 제자리로 이동합니다. 따라서 파일을 성공적으로 업데이트하거나(편집기가 새 파일을 쓸 수 없는 경우에도 파일을 변경하지 않고 그대로 두는 경우) 업데이트할 수 없거나 구문이 유효하지 않은 경우 실패합니다.

visudosudoers또한 여러 사람이 동시에 파일을 편집하는 것을 방지합니다 .

이제는 visudo자동화된 방식으로 안정적으로 사용하는 것도 까다롭습니다. 이 작업에는 몇 가지 문제가 있습니다.

  • visudoVISUAL환경 변수를 사용하여 편집기 명령 (보다 우선함 ) 을 지정할 수 있지만 EDITORenv_editor옵션이 비활성화되지 않은 경우에만 가능합니다.
  • 내 버전은 visudo적어도 특정 조건에서 /etc/sudoers포함된 모든 파일을 편집합니다( $VISUAL모든 파일에 대해 실행) . 따라서 $VISUAL수정만 했는지 확인해야 합니다 /etc/sudoers.
  • 위와 같이 에디터의 종료 상태를 확인하지 않습니다. 따라서, 편집기에서 저장한 파일이 성공적으로 작성되었는지, 전혀 수정되지 않았는지 확인해야 합니다.
  • 문제가 발생하면 사용자에게 메시지가 표시됩니다.

이 모든 문제를 해결하는 것은 약간 까다롭습니다. 다음을 수행할 수 있습니다.

NEW_TEXT='Defaults insults' \
  CODE='
    if [ "$2" = /etc/sudoers.tmp ]; then
      printf >&2 "Editing %s\n" "$2"
      umask 077
      {
        cat /etc/sudoers.tmp && printf "\n%s\n" "$NEW_TEXT"
      } > /etc/sudoers.tmp.tmp &&
        mv -f /etc/sudoers.tmp.tmp /etc/sudoers.tmp
    else
      printf >&2 "Skipping %s\n" "$2"
    fi' \
  VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null

env_editor설정하지 않으면 아무런 효과가 없습니다.

GNU 시스템에서 더 나은 대안은 which 를 사용하는 것입니다 . 최신 버전을 작성할 수 없는 경우 sed -i변경하지 않고 그대로 두어야 합니다 .sudoers.tmp

다음에 추가 insults:

SED_CODE='
  /^[[:blank:]]*Defaults.*insults/,${
    /^[[:blank:]]*Default/s/!*\(insults\)/\1/g
    $q
  }
  $a\Defaults insults' \
CODE='
  if [ "$2" = /etc/sudoers.tmp ]; then
    printf >&2 "Editing %s\n" "$2"
    sed -i -- "$SED_CODE" "$2"
  else
    printf >&2 "Skipping %s\n" "$2"
  fi' \
VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null

모욕을 제거하십시오:

SED_CODE='
  /^[[:blank:]]*Defaults.*insults/,${
    /^[[:blank:]]*Defaults/s/!*\(insults\)/!\1/g
    $q
  }
  $a\Defaults !insults' \
CODE='
  if [ "$2" = /etc/sudoers.tmp ]; then
    printf >&2 "Editing %s\n" "$2"
    sed -i -- "$SED_CODE" "$2"
  else
    printf >&2 "Skipping %s\n" "$2"
  fi' \
VISUAL='sh -fc IFS=:;$1 sh eval:eval:"$CODE"' visudo < /dev/null

답변2

확인해 보니 오래 전에 (내가 아는 한 2001년쯤) includedir지원이 가능했던 것 같으니 RHEL 5에서 이를 지원해야 합니다. sudo다음을 포함하여 sudoers에서 지시어를 찾으세요.

sudo grep '#includedir' /etc/sudoers

결과를 얻으면 이상적으로는 해당 디렉터리에 파일을 추가하고 제거해야 합니다 /etc/sudoers.d. 일반적으로 셸 스크립트에서 경로를 결정하는 것은 어려울 수 있습니다.

어쨌든, 가정적으로는 해당 디렉터리에 권한이 있는 파일을 추가 sudoers.d해야 합니다 . 0600그것은 다음과 같습니다:

sudo sh -c '
  umask 0177;
  filename="/etc/sudoers.d/$1";
  echo 'Defaults insults' > "$filename";
  visudo -cf "$filename" || rm "$filename"
' _ 99-insults

( 99-insults생성할 파일 이름은 어디에 있습니까? sudoers.d) 그런 다음 설정을 제거하는 방법은 다음과 같이 간단합니다.

sudo rm /etc/sudoers.d/99-insults

실제로 이것이 sh -c명령의 마지막 부분이 수행하는 작업입니다. 검사에 실패하면 이 파일을 삭제하여 visudo손상된 sudoers.


당신은 그것을 사용할 수 있습니다 tee -a:EDITOR

$ sudo VISUAL='tee -a' visudo <<<"Defaults insults"
Defaults insults
$ sudo tail /etc/sudoers
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
Defaults insults

sudoEL5 가 지원하는지 여부는 모르겠지만 includedir, 지원한다면 그 안에 새 파일을 만드세요 visudo -f.

관련 정보