다음과 같은 명령을 수행할 수 있도록 쉘 이스케이프를 비활성화하는 방법을 알 수 없습니다.
sudo-user ALL=(ALL) NOEXEC: NOPASSWD: ALL
sudoers 매뉴얼에는 다음과 같이 나와 있습니다.
명령에는 0개 이상의 태그가 연결되어 있을 수 있습니다. 가능한 태그 값은 NOPASSWD, PASSWD, NOEXEC, EXEC, SETENV, NOSETENV, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT 및 NOLOG_OUTPUT의 8가지입니다. Cmnd에 레이블이 설정되면 Cmnd_Spec_List의 후속 Cmnd는 반대 레이블로 재정의되지 않는 한 해당 레이블을 상속합니다(예: PASSWD가 NOPASSWD를 재정의하고 NOEXEC가 EXEC를 재정의함).
그러나 이것은 여러 플래그를 설정하는 방법을 설명하지 않습니다. 쉼표를 사용하면 작동하지 않는 것 같습니다(두 번째 태그를 별칭으로 처리함).
더 좋은 점은 기본값을 설정하고 싶기 때문에 위의 줄은 다음과 같습니다.
defaults NOEXEC
sudo-user ALL=(ALL) NOPASSWD: ALL
sudo가 noexec를 사용하여 컴파일될 수 있다는 것을 알고 있지만 이 경우에는 실용적이지 않습니다. 나는 또한 이것이 전체 대답이 아니라는 것을 알고 있습니다. LD_PRELOAD를 적절하게 설정하면 이를 뒤집을 수 있지만 시작에 불과합니다.
Sudo 버전:
Sudo version 1.8.19p2
Sudoers policy plugin version 1.8.19p2
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.19p2
On RHEL 7.5
답변1
이렇게 하지 마십시오.
sudo-user
모든 사용자로서 모든 명령을 실행할 수 있는 기능을 제공합니다 .여기에는 수정 기능이 포함됩니다. /etc/sudoers
하위 프로세스 실행이 필요하지 않은 도구를 사용하십시오. 제외된다고 생각할 수도 있지만 visudo
엄밀히 말하면 그렇지 않습니다.필요 visudo
편집하다 /etc/sudoers
.
예를 들어:
sudo-user$ sudo sed --in-place -e '/^sudo-user/s/NOEXEC://' /etc/sudoers
...사용자가 방금 NOEXEC:
제한을 제거했습니다.
사용자가 마음대로 해제할 수 있는 제한은 실제로는 제한이 아닙니다.
게다가 NOEXEC:
문제가 발생할 수도 있습니다. 이는 쉘 이스케이프를 방지할 뿐만 아니라 sudo
다음을 사용하여 실행되는 프로그램 도 방지합니다.다른 프로그램을 직접 실행하세요.. 이는 많은 결과를 초래할 수 있습니다.
예를 들어, 데몬을 sudo-user
중지했다가 나중에 다시 시작하는 경우(예: 일부 유지 관리 기간 동안 예약된 작업을 중지하기 위해) 다시 시작된 데몬은 제한 사항으로 인해 예약된 작업을 실제로 실행할 수 없습니다 .cron
cron
NOEXEC:
NOEXEC:
exec()
시스템 관리자가 하위 프로세스 없이도 작업을 수행할 수 있는 것으로 확인된 신중하게 선택한 프로그램에 이를 적용할 수 있도록 존재합니다 . 맹목적으로 적용모든 것문제를 일으킬 것입니다.
하지만 반드시 해야 한다면 방법은 다음과 같습니다.
sudoers(5)
매뉴얼 페이지 에서 :
User specification
User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \
(':' Host_List '=' Cmnd_Spec_List)*
Cmnd_Spec_List ::= Cmnd_Spec |
Cmnd_Spec ',' Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')
이것은상세한구성하는 방법에 대한 설명사용자 사양파일의 줄 sudoers
. 읽기가 다소 지루할 수 있지만 필요한 정보가 포함되어 있습니다.
이 문제를 해결하기 위해 예제 라인을 사용해 보겠습니다.
sudo-user ALL=(ALL) NOEXEC: NOPASSWD: ALL
전체 생산 라인이 호출됩니다.사용자 사양, 또는 User_Spec
.
다음과 같이 분류됩니다.
User_List
귀하의 예에는 사용자가 한 명뿐입니다.sudo-user
Host_List
항목이 하나뿐입니다.ALL
Cmnd_Spec_List
귀하의 예에서는(ALL) NOEXEC: NOPASSWD: ALL
- 줄에 다른 단위가 없습니다
: Host_List = Cmnd_Spec_List
. (괄호 뒤의 별표는 그러한 추가 단위가 0개 이상 있을 수 있음을 나타냅니다.)
귀하의 것에는 Cmnd_Spec_List
쉼표가 없으므로 하나만 있습니다 Cmnd_Spec
.
Cmnd_Spec
다음과 같이 분해됩니다.
- 선택사항
Runas_Spec
: 상황에 따라(ALL)
- 선택 사항
SELinux_Spec
, 귀하의 예에는 존재하지 않습니다 - 0개 이상의
Tag_Spec
s, 이것이 당신이 알고 싶은 부분입니다 Cmnd
, 명령, 그게ALL
당신의 경우입니다.
Single은 Tag_Spec
끝에 콜론이 있고 명시적으로 나열된 쉼표, 공백 또는 기타 구분 기호가 없는 키워드 중 하나입니다. 이 Cmnd_Spec ::=
줄은 줄의 공백 위치를 정확하게 알려줍니다. 태그 사이에 공백이나 기타 구분 기호를 넣는 방법에 대한 지침이 없으므로 그렇게 하지 마세요.
그래서,라벨을 하나씩 배치하면 됩니다., 이와 같이:
sudo-user ALL=(ALL) NOEXEC:NOPASSWD: ALL
답변2
noexec
기본 입력 줄에도 부울 플래그가 필요하므로 이에 대한 레이블을 추가할 필요가 없습니다 .
noexec
설정된 경우 sudo를 통해 실행되는 모든 명령은 EXEC 플래그로 재정의되지 않는 한 NOEXEC 플래그가 설정된 것처럼 작동합니다. 아래의 NOEXEC 및 EXEC에 대한 설명을 참조하세요.쉘 탈출 방지이 설명서를 마치겠습니다. 이 표시는떠나다기본적으로.
그래서 당신에게 필요한 것은
Defaults noexec
이는 telcoM이 지적한 것과 동일한 문제를 제시할 것입니다.그들의 대답
. 실행을 방지하므로 visudo
(별도의 편집기 프로세스를 시작해야 하기 때문에) 나중에 변경 사항을 실행 취소하기가 더 어려워집니다.
답변3
지금까지 제공된 두 가지 답변을 결합하면 다음과 같습니다.
Defaults noexec
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
sudo-user ALL=(ALL) EXEC:NOPASSWD: ALL
fred ALL=(ALL) NOPASSWD: user_allowed_commands
사실은 내가예sudo 사용자에게 무제한 액세스 권한을 부여하는 것이 좋습니다. 이것은 루트를 사용하는 대신 (적어도 우분투 등에서는) 권장되는 접근 방식인 것 같습니다. 나는 이미 /etc/sudoers 디렉토리를 검토하고 있습니다. 이를 통해 fred는 "user_allowed_commands"에 있는 명령 목록을 실행할 수 있습니다(fork/exec가 필요하지 않다고 가정할 때, 그럴 것 같지 않습니다. TBH - 아니면 noexec가 수행하는 작업을 잘못 읽은 것일까요?)
@telcoM에서 다음 내용을 추가하고 싶습니다. 사용자가 마음대로 해제할 수 있는 제한은 실제로는 제한이 아닙니다.
내가 본 모든 SELinux 구현에서는 기본적으로 설정되어 있지 않으므로 모든 사용자가 setenforce permissive를 실행할 수 있으며 모든 제한 사항이 제거됩니다.