Sudo: 쉘 이스케이프는 기본적으로 허용되지 않습니다.

Sudo: 쉘 이스케이프는 기본적으로 허용되지 않습니다.

다음과 같은 명령을 수행할 수 있도록 쉘 이스케이프를 비활성화하는 방법을 알 수 없습니다.

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중지했다가 나중에 다시 시작하는 경우(예: 일부 유지 관리 기간 동안 예약된 작업을 중지하기 위해) 다시 시작된 데몬은 제한 사항으로 인해 예약된 작업을 실제로 실행할 수 없습니다 .croncronNOEXEC:

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_Specs, 이것이 당신이 알고 싶은 부분입니다
  • 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를 실행할 수 있으며 모든 제한 사항이 제거됩니다.

관련 정보