이거 안전한가요?
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가지가 있습니다.
/etc/sudoers
개행 문자로 끝나지 않는 경우 (sudo
허용됨visudo
), 예를 들어#includedir /etc/sudoers.d
종료되지 않는 행으로 끝나는 경우 명령은 다음과 같이 만듭니다.#includedir /etc/sudoers.dDefaults insults
이렇게 하면 해당 파일이 파괴되어
sudo
사용할 수 없게 됩니다.echo
예를 들어 파일 시스템이 가득 찬 경우 전체 문자열이 기록되지 않을 수 있습니다. 예를 들어 쓰기만 가능할 수 있습니다Defaults in
. 그러면sudoers
파일이 손상됩니다.- 여러 관리자가 있는 시스템에서
/etc/sudoers
두 사람이 동시에 수정하려고 하면 그들이 쓰는 데이터가 인터리브될 수 있습니다.
visudo
임시 파일( )을 편집하고 파일이 수정되었는지 감지할 수 있으므로 이러한 문제를 피할 수 있습니다 /etc/sudoers.tmp
(불행히도 파일이 수정된 경우에는 감지되지 않음).성공적으로수정(편집기의 종료 상태를 확인하지 않는 것 같으므로)하고 구문을 확인한 다음 rename
(원자적 작업)을 수행하여 새 파일을 제자리로 이동합니다. 따라서 파일을 성공적으로 업데이트하거나(편집기가 새 파일을 쓸 수 없는 경우에도 파일을 변경하지 않고 그대로 두는 경우) 업데이트할 수 없거나 구문이 유효하지 않은 경우 실패합니다.
visudo
sudoers
또한 여러 사람이 동시에 파일을 편집하는 것을 방지합니다 .
이제는 visudo
자동화된 방식으로 안정적으로 사용하는 것도 까다롭습니다. 이 작업에는 몇 가지 문제가 있습니다.
visudo
VISUAL
환경 변수를 사용하여 편집기 명령 (보다 우선함 ) 을 지정할 수 있지만EDITOR
이env_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
sudo
EL5 가 지원하는지 여부는 모르겠지만 includedir
, 지원한다면 그 안에 새 파일을 만드세요 visudo -f
.