특정 명령에 항상 sudo 비밀번호를 적용하는 방법은 무엇입니까?


12

다른 날에는 웹 서버에서 일부 유지 관리 작업을 수행했습니다. 나는 서두르고 졸려서 sudo명령을 사용하여 모든 것을했습니다 .

그런 다음 실수로 Ctrl+ V를 눌러이 명령을 내 웹 서버로 보냅니다.

sudo rm -rf /*

위의 명령이 무엇인지 궁금한 사람들을 위해 : 이것은 전체 웹 서버를 삭제했습니다.

운 좋게도 백업이 있었고 슬프게도이 멋진 오류를 해결하기 위해 깨어있는 데 두 시간을 더 소비해야했습니다. 그러나 그 이후로 나는 궁금해했다.

특정 명령에 항상 sudo 비밀번호를 적용하는 방법이 있습니까?

서버가 암호를 요구하면 많은 어려움에서 벗어날 것입니다. sudo이 장엄한 오류 전에 약 5 개의 명령을 실행했기 때문에 그렇지 않았습니다 .

그래서 할 수있는 방법이 있습니까? rm항상 시행 하려면 명령에 암호가 필요합니다 . 내가 사용하는 다른 명령은 일반적으로 nano또는 cp어느 정도는 되돌릴 수 있습니다.



2
@solsTiCe /*는 rm 명령으로 전달되기 전에 확장됩니다. 따라서 명령에는 단일 인수가 아니라 인수 목록 ( /bin /boot /cdrom /dev /etc /home...)이 표시됩니다.
Dan

3
이것을 피하는 한 가지 중요한 교훈은 실제로 필요하지 않은 한 sudo로 물건을 실행해서는 안된다는 것입니다. 나는 당신이 여기에 요청한 것에 대답하지 않지만, 가장 중요한 질문은 서버를 다시 삭제하지 못하게하는 방법이며, sudo를 피하는 것이 첫 번째 방어선이되어야합니다.
David Z


2
@ WinEunuuchs2Unix 그것은 전혀 중복 된 질문이 아니며, 여기서 op는 rm명령이 암호를 갖기를 원하지 않습니다 . sudorm 명령을 사용할 때마다 프롬프트를 표시 하려고 합니다. 첫 번째 명령이이면 연결 한 질문에 대한 해결책이 약간 성가신 것입니다 sudo rm. 두 개의 비밀번호를 요구할 것 sudo입니다 rm.
Dan

답변:


17

당신은 설정할 수 있습니다 timestamp_timeout0있는 특정 명령에 대한을 /etc/sudoers. visudo -f /etc/sudoers.d/pduck다음 내용 으로 파일 을 작성하십시오 .

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

이제 사용자 pduck는 그룹의 sudo rm구성원이고 다른 명령에 대한 비밀번호를 기억 하더라도 실행시 (추가 매개 변수에 관계없이 ) 항상 비밀번호를 요청 합니다.sudosudo

단점은 /bin/rm파일 의 행에 매개 변수를 쉽게 추가 하여이를 추가로 제한 할 수 없다는 것입니다. 음… 당신은 다음과 같이 할 수 있습니다.

Cmnd_Alias DANGEROUS = /bin/rm -f

그러나 예를 들어 정확히 sudo rm -f(다시) 프롬프트가 표시 되지 않습니다 sudo rm -rf.


9

하나의 방법은 safe-rm 을 사용하는 것 입니다. 이것은 "rm"의 사용법 만 다루고 "rm"의 특정 버전이 실행되는 것을 방지합니다. 여기에는 루트 시스템 제거가 포함되지만 "/ usr /"또는 "/ var /"와 같은 시스템 관련 디렉토리가 제거되지 않도록하는 데 사용될 수도 있습니다. 링크에서 :

실수로 중요한 파일 삭제 삭제

Safe-rm은 /bin/rm래퍼 로 교체하여 실수로 중요한 파일이 삭제되는 것을 방지하기위한 안전 도구로 , 제거 할 수없는 파일 및 디렉토리의 구성 가능한 블랙리스트에 대해 지정된 인수를 검사합니다.

이러한 보호 된 파일 또는 디렉토리 중 하나를 삭제하려는 사용자는이를 수행 할 수 없으며 대신 경고 메시지가 표시됩니다.

$ rm -rf /usr   
Skipping /usr

보호 된 경로는 사이트 및 사용자 수준에서 모두 설정할 수 있습니다.

실수로 삭제 한 중요한 파일을 복구하는 것은 매우 어려울 수 있습니다. safe-rm을 설치하여 오늘 자신을 보호하고 데이터 복구 서비스에 문의해야 할 가능성을 줄이십시오!

여기에 이미지 설명을 입력하십시오


Safecow에 대한 찬성
Michael Fulton

3

sudo옵션을 제공 -k, --reset-timestamp, 참조 man sudo:

암호가 필요할 수있는 명령 또는 옵션과 함께 사용하면이 옵션은 sudo가 사용자의 캐시 된 자격 증명을 무시하도록합니다. 결과적으로 sudo는 암호를 요구하고 (보안 정책에 필요한 경우) 사용자의 캐시 된 자격 증명을 업데이트하지 않습니다.

sudo테스트 rm -rf /*및 실행을 위한 간단한 래퍼를 작성할 수 있습니다.

sudo -k rm -rf /*

대신, 예를 들면 다음과 같습니다.

sudo ()                                                                                                                                                 
{ 
    [[ "$*" == "rm -rf /*" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

사용법 예

echo a여기에서 테스트 하십시오.

$ sudo echo
[sudo] password for dessert: 

$ sudo echo

$ sudo echo a
[sudo] password for dessert: 
a
$ sudo echo a
[sudo] password for dessert: 
a

일반적으로 실행할 때마다 질문 rm을 받으려면 다음과 같이 위 기능을 조정할 수 있습니다.

sudo () 
{ 
    [[ "$1" == "rm" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

일반 명령 호출과 특정 명령 줄을 모두 결합 하려면 다음 과 같이 사용하는 것이 좋습니다 case.

sudo () 
{ 
    case "$*" in 
        rm*)            opt="-k" ;;
        "mv /home"*)    opt="-k" ;;
        "ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
        *)              opt="" ;;
    esac;
    /usr/bin/sudo $opt "$@"
}

참고 이러한 접근 방식은 실행되지 작동하는지 것으로 sudo옵션 - 가능한 해결책은 [[ "$*" =~ " rm " ]]공백으로 또는 둘러싸인 문자열 "RM"를 확인하기 위해 *" rm "*)함께 case"RM"를 포함하는 모든 명령 줄을 잡을 수 있습니다.


[[ "$1" == "rm" ]] && opt="-k";그리고 /bin/rm어때요?
Rinzwind

@Rinzwind이 기능은 특정 요구 사항, 특히 case접근 방식에 쉽게 적용 할 수 있다고 생각합니다 .
디저트

1

이 답변은 해결되지 않는 sudo질문의 일부를하지만, 다른 한편으로는 사고의 위험을 완화 할 수있는 방법 주소 rm에 대한 호출 모든 사용자.

할 수 있습니다 별칭 rmrm -I있는

  • 디렉토리 또는 3 개 이상의 파일을 삭제하자마자 확인을 요청합니다.
  • -f이전 -I옵션 보다 우선하는 것을 제외 하고는

--one-file-systemrm별칭에 사용하는 의도하지 않은 삭제에 대한 또 다른 보호 수단 입니다.

설정

이러한 별명을 작성하려면 다음 명령을 사용하십시오.

alias rm='rm -I --one-file-system'

당신은 당신의 ~/.bashrc또는 심지어 넣을 수 있습니다 /etc/bash.bashrc.

용법

$ sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?

yes로케일 또는 단어의 첫 글자로 유형 또는 번역 을 확인 하고를 누르십시오 Enter. 아무것도 포함하지 않은 다른 입력은 작업을 중단합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.