사용자가 비밀번호 없이 "sudo"를 사용할 수 있는지 확인

사용자가 비밀번호 없이 "sudo"를 사용할 수 있는지 확인

사용자가 사용할 수 있는지 확인하고 싶지만 sudo-아니요bash 쉘 스크립팅을 위해 비밀번호를 작성해야 합니다. 나는 몇 가지 조사를 했고 다음과 같은 사실을 알아냈습니다.

sudoersin을 통해 구성되지 않아 사용할 수 없는 사용자의 경우 sudo실행sudo -n <command> 언제나터미널에 메시지를 인쇄합니다 sudo: a password is required. 그리고 사용자가 사용할 수 있는 경우 sudo-- sudo세션에서 실행되지 않거나 sudo정지시키다만료됨 - sudo: a password is required메시지가 다시 인쇄됩니다.

또한 올바른 솔루션을 사용하십시오(그러나 다른 경우에는).

$(sudo -n uptime 2>&1 | grep "load" | wc -l)

sudo승인되지 않은 사용자의 경우언제나0을 반환합니다. 사용자가 사용할 수 sudo있고sudo정지시키다여전히 유효함 - 1을 반환하고, 그렇지 않으면 0을 반환합니다.

질문: 그래서 이 방법을 사용하는 것은아니요명령을 통해 사용자가 사용 가능한지 실제로 알 수 있습니다 sudo. 이 솔루션은 다음을 아는 경우에만 가능합니다 sudo.정지시키다아직도 유효합니까?

지금까지의 sudo -v해결책은 거의 다음과 같습니다.

sudoers명령으로 반환된 구성이 없는 사용자 의 경우

Sorry, user <username> may not run sudo on <hostname>.

사용자가 사용할 수 있는 경우 비밀번호가 필요합니다 sudo. sudo -v그것이 유효한 경우 sudo또는정지시키다여전히 유효합니다.비어 있는. 따라서 여기까지는 뚜렷한 차이점과 해결책이 없습니다.하지만Bash Shell일을 하고 있어서 사용해야 하기 때문에명령 대체

is_user_sudo=$(sudo -v) # if is empty sudo can be used otherwise not

질문비밀번호 프롬프트 부분을 피하고 싶습니다. 이것이 해결책이 될 것입니다.

sudo -k또는 비밀번호를 묻지 않는 것과 같은 다른 매개변수(물론 다른 작업을 수행함)나 목표를 달성하기 위한 다른 명령이 있는 경우 .

표적: 오직루트가 아닌사용 가능한 사용자는 sudo일부 bash 스크립트를 실행할 수 있습니다. 따라서 스크립트 내에서 유형을 식별하는 명령이 필요합니다.루트가 아닌사용자 - 따라서 non-root사용할 수 없는 사용자 에게 통보 sudo하고 스크립트 실행을 중지해야 합니다.

예를 들어:

# an if statement about 'id -u' not equals a 0
can_use_sudo=$(<command> whoami) # so the non-root user 
                                 # is able to use sudo or not?

whoami식별하는 다른 명령으로 대체될 수 있습니다.WHO스크립트 실행 중

답변1

나는 당신이 이것을 원하는 이유와 sudo whoami스크립트 시작 부분에서 사용자에게 즉시 암호를 묻고 사용자가 계속할 수 없을 때 종료하기 위해 뭔가를 실행하거나 수행 하지 않는 이유를 잘 이해하지 못한다는 것을 인정합니다. 좋아요. 적어도 Linux 시스템에서는 작동합니다( sudo아직 다른 구현을 확인하지 않았습니다).

sudo_response=$(SUDO_ASKPASS=/bin/false sudo -A whoami 2>&1 | wc -l)
if [ $sudo_response = 2 ]; then
    can_sudo=1
elif [ $sudo_response = 1 ]; then
    can_sudo=0
else
    echo "Unexpected sudo response: $sudo_response" >&2
    exit 1
fi

askpass여기서의 비결은 다른 프로그램을 사용하여 비밀번호를 확인하는 옵션을 활용하는 것입니다 . sudo이를 설정하면 사용자가 루트로 명령을 실행할 수 있는지 여부에 따라 두 가지 표준 응답을 얻을 /bin/false수 있습니다 .sudo

## A user with sudo rights
terdon@tpad $ SUDO_ASKPASS=/bin/false sudo -A whoami 2>&1 
sudo: no password was provided
sudo: a password is required

## A user without sudo rights
bib@tpad $ SUDO_ASKPASS=/bin/false sudo -A whoami
bib is not in the sudoers file.  This incident will be reported.

따라서 stderr을 stdout으로 리다이렉트한 후의 응답이 2줄이면 사용자는 sudo명령을 실행할 수 있고, 1줄이면 명령을 실행할 수 없습니다.

중요한: 저는 이것을 광범위하게 테스트하지 않았습니다. 위에 표시된 것처럼 두 명의 사용자가 있는 단일 Arch Linux 시스템에서만 시도했습니다. 위 명령의 출력을 변경할 수 있다면 이것이 다른 시스템에서 예상대로 작동하지 않더라도 놀라지 않을 것입니다.

sudo명백한 실패의 경우: 사용자가 비밀번호 없이 명령을 실행하도록 구성된 경우에는 작동하지 않습니다.

답변2

아직 명확한 확증은 찾지 못했지만 제 생각에는디자인에 의해이 작업은 인증이나 권한 없이 수행할 수 없습니다.

권한이 없는 사용자는 아닌 것 같아요~해야 한다사용자와 명령을 선택하고 해당 사용자에게 명령을 실행할 권한이 있는지 확인하는 기능 sudo. 이는 공격자가 시스템을 조사하고 어떤 계정이 가장 가치 있는지 이해하는 데 큰 도움이 되지만 어떤 이점을 가져올지는 확실하지 않습니다.

/etc/sudoers이 파일은 기본적으로 잠겨 있으며 루트 외에는 읽을 수 없다는 점에 유의할 가치가 있습니다 .

답변3

sudo사용자가 명령 을 사용할 수 있는지 확인하고 싶지만아니요비밀번호를 적어야 합니다

groups user_name사용자가 속한 모든 그룹이 표시됩니다. 사용자가 sudo이 그룹의 구성원인 경우 사용자는가능한사용될 수 있다sudo (@terdon이 지적했듯이 그룹 멤버십은 사용 권한을 부여하는 것이 아니지만 sudo사용자가 단순히 "일반 사용자" 또는 "관리자"로 생성되는 일반적인 경우 sudo 그룹 멤버십은 사용 권한과 관련이 있습니다 sudo).

if [ -z "$(groups user_name | grep sudo)" ]; then
    echo 'user is not in sudo group'
else
    echo 'user is in sudo group'
fi

물론 이것은 sudoers파일에 존재할 수 있는 더 세분화된 권한을 알려주지는 않습니다. 이를 읽으려면 루트가 필요합니다.

관련 정보