sudo'ing 전에 sudo 기능을 검사 할 수 있습니까?


11

작은 유틸리티 프로그램을 작성하고 있습니다. sudo필요한 경우 무언가 를 실행 하려고 합니다.

즉, 파일 권한으로 인해 현재 사용자가 특정 파일을 조작 할 수없는 경우 (그리고 sudo규칙에서 허용하는 경우) 유틸리티가 sudo파일 소유자로 무언가 를 실행 하고 싶습니다 .

시스템 로그가 실패한 sudo시도로 인한 소음으로 채워지지 않기를 원하기 때문에이 기능을 미리 확인하고 싶습니다 . 으로 sudo그 자체가 실패에보고합니다 : "이 사건은보고됩니다."

그래서 프로그래밍 방식으로 확인하고 싶습니다 : ? 를 통해 실행할 수 있습니다 .user <x>command <y>sudo

문제 /etc/sudoers가 있습니다. 해당 매핑이 포함되어 있지만 루트 사용자이며 일반 사용자가 읽을 수 없습니다.

실행할 하위 프로세스를 생성하는 것을 고려하고있었습니다 sudo -l(현재 사용자가 sudo-run 할 수있는 명령을 출력합니다). 그런 다음 이것의 출력을 구문 분석합니다. 그러나 이것은 약간 깨지기 쉬운 것 같습니다. 출력에는 원하는 정보가 포함되어 있지만 사람이 읽을 수 있도록 설계된 것 같습니다 (프로그램 소비 용이 아님). 출력이 미래에 또는 다른 플랫폼에서 동일한 형식을 따를 것이라는 보장이 있는지 모르겠습니다.

sudo -l출력의 프로그래밍 방식 파싱이 안전한 것으로 간주됩니까? 그렇지 않은 경우 sudo 명령의 성공 여부를 미리 결정하기위한 더 나은 옵션이 있습니까?


(X / Y에 대한 배경 :이 유틸리티는 제한된 액세스 역할 계정에서 사용하기위한 것입니다. 다른 사용자는 제한된 액세스 계정이 sudo 규칙을 통해 파일에서 작동하도록 효과적으로 선택해야합니다. 다른 사용자 중 어느 것이 관련 sudo 규칙을 가지고 있는지 미리 알 수 없음)


3
약간 다른 방법을 사용하는 것이 좋습니다. 사용자 별 규칙 대신, 원하는 모든 작업을 수행 할 수있는 그룹이없는 이유는 무엇입니까? 이렇게하면 사용자가 그룹에 있는지 간단히 확인할 수 있습니다. 괜찮은 대안일까요?
terdon

답변:


13

sudo 매뉴얼 페이지에 따르면 :

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

그래서 이로 끓일 것입니다

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Muru, 사용 중 하나에 의해 지적 -U $USER하거나 -U $USERTOTEST또는 아무것도, 당신의 필요에 따라.


$USER현재 사용자를 의미 하려는 경우 sudo -l <command>,없이 할 수 있습니다 -U $USER.
muru

감사합니다-유용합니다. 이 방법을 테스트하기는 sudo를 규칙과 같은 특정 예외와 ALL 명령을 허용하도록 설정 한 경우 알아서하지 않는 것이다에 한 가지 내가 통지를 한 (targetUser) ALL, !/usr/bin/foo 경우는에 .. sudo -l -u targetUser /usr/bin/foo여전히 출력에 표시 /usr/bin/foo하고 종료 그래도 기본적으로 내 간단한 확인에 충분하며 더 자세한 sudo -l출력을 구문 분석하는 것보다 낫습니다 .
피터 마틴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.