일반 사용자에게 sudo vim 액세스 권한을 부여하는 것이 왜 위험합니까? 만들고 sudo 액세스 권한을 부여하고 싶습니다. 구체적으로,

새 사용자를 만들고 sudo 액세스 권한을 부여하고 싶습니다. 구체적으로, 나는 그가 sudo vimhttpd.conf 를 사용 하고 편집 하기를 원합니다 . 나는 이것을 sudoers에 썼다 :

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

그러나 이것이 위험 할 수 있다고 들었습니다. 왜 이것이 문제가됩니까? 문제가 얼마나 심각합니까?



답변

명령 줄 인수를 제한하더라도 루트로 실행 된 임의의 파일 을 vim을 사용하여 열고 편집하고 덮어 쓰는 데 방해가되는 것은 없습니다 .

사용자는 sudo vim /etc/httpd/conf/httpd.conf 다음을 실행할 수 있습니다

  • 편집 버퍼에서 모든 텍스트를 지우십시오.
  • 그 다음 편의 원본 (즉,이 경우에도 필요하지 않지만) 기존 파일의 경우 : sudo를 구성, 예를 들어
    :r /etc/sudoers 주 : SELinux에 의해 제한되지 않는 사용자가 읽을 수 있는 파일이 방법을!
  • 더 많은 sudo 권한을 부여 user ALL=(ALL) NOPASSWD: ALL
  • 이전 구성을 덮어 씁니다 :w /etc/sudoers

사용자가 시스템을 액세스, 수정 또는 파괴 할 수있는 수십 가지의 유사한 방법을 상상할 수 있습니다.

sudo 로그 메시지에서 Apache 구성을 편집하는 것만 볼 수 있으므로 이러한 방식으로 변경된 파일에 대한 감사 내역도 없습니다. 이것은 sudo모든 편집자에게 권한을 부여 할 때의 보안 위험입니다 .

이는 sudo 루트 수준의 권한을 명령과 같은 권한에 부여하는 것과 같은 이유로 tar, 보안 unzip이 불안정한 경우가 많으 므로 시스템 바이너리 또는 시스템 구성 파일을 아카이브에 대체 할 수있는 요소는 없습니다.


다른 많은 주석가들이 지적했듯이 두 번째 위험 vim쉘 이스케이프 를 허용 한다는 것입니다 . 여기서 vim 내에서 하위 쉘을 시작하여 임의의 명령실행할 수 있습니다 . sudo vim 세션에서 루트로 실행됩니다 (예 : 쉘 이스케이프).

  • :!/bin/bash 대화식 루트 셸을 제공합니다
  • :!/bin/rm -rf / 술집에서 좋은 이야기를 만들 것입니다.

대신 무엇을해야합니까?

사용자는 sudo자신이 소유하지 않은 파일을 안전하게 편집 할 수 있습니다 .

sudoers 설정 sudoedit에서 사용자가 편집 할 수있는 파일에 대한 특별한 예약 명령 과 전체 (와일드 카드) 경로 이름을 설정할 수 있습니다.

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

그런 다음 사용자는 -esudo 명령 행에서 스위치 를 사용 하거나 다음 sudoedit명령을 사용할 수 있습니다 .

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

매뉴얼 페이지에 설명 된대로 :

-e (edit)옵션은 명령을 실행하는 대신 하나 이상의 파일을 편집하려고 함을 나타냅니다. 명령 대신 문자열 “sudoedit”이 보안 정책을 참조 할 때 사용됩니다.
정책에 따라 사용자에게 권한이 부여되면 다음 단계가 수행됩니다.

  • 소유자가 호출 사용자로 설정하여 편집 할 파일로 임시 사본이 작성됩니다.
  • 정책에 의해 지정된 편집기가 임시 파일을 편집하기 위해 실행됩니다. sudoers 정책은 SUDO_EDITOR, VISUAL 및 EDITOR 환경 변수를 순서대로 사용합니다. SUDO_EDITOR, VISUAL 또는 EDITOR가 설정되지 않은 경우 편집기 sudoers(5) 옵션에 나열된 첫 번째 프로그램 이 사용됩니다.
  • 파일을 수정 한 경우 임시 파일이 원래 위치로 다시 복사되고 임시 버전이 제거됩니다.
    지정된 파일이 없으면 작성됩니다.
    sudo로 실행되는 대부분의 명령과 달리 편집기는 호출하는 사용자 환경을 수정하지 않고 실행합니다. 어떤 이유로 sudo가 편집 된 버전으로 파일을 업데이트 할 수없는 경우 사용자에게 경고 메시지가 표시되고 편집 된 사본은 임시 파일로 유지됩니다.

또한 sudoers매뉴얼 에는 및 옵션으로 쉘 이스케이프 를 제한적으로 보호 하는 방법에 대한 전체 섹션이 있습니다.RESRICTNOEXEC

restrict
사용자에게 임의의 명령을 실행할 수있는 명령에 대한 액세스 권한을 부여하지 마십시오. sudoedit는 sudo를 통해 편집기를 실행하는 데 더 나은 솔루션이지만 많은 편집기에는 쉘 이스케이프가 비활성화 된 제한된 모드가 있습니다. 쉘 이스케이프를 제공하는 많은 수의 프로그램으로 인해 사용자가 종종 실행 불가능한 프로그램 세트로 제한합니다.

noexec
공유 라이브러리를 지원하는 많은 시스템은 환경 변수 (일반적으로 LD_PRELOAD)를 대체 공유 라이브러리로 지정하여 기본 라이브러리 기능을 대체 할 수 있습니다. 이러한 시스템에서 sudo의 noexec 기능을 사용하여 sudo에 의해 실행되는 프로그램이 다른 프로그램을 실행하지 못하게 할 수 있습니다. 참고 ... ...
명령에 대한 NOEXEC 사용하려면 사용하려면 NOEXEC위의 사용자 사양 섹션에 설명 된대로 태그를. 다음은 그 예입니다.
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
사용자 aaron이 실행 /usr/bin/more되고 /usr/bin/vinoexec가 활성화되어 있습니다. 이렇게하면이 두 명령이 다른 명령 (예 : 셸)을 실행하지 못하게됩니다.


답변

이 구성을 통해 해당 사용자는 해당 파일을 편집 할 수 있습니다. 그렇게하기 위해 그는 vim루트 권한을 가진 편집기를 시작합니다 .

vim명령이 시작 되면 사용자는 해당 편집기로 원하는 작업을 수행 할 수 있습니다. -다른 파일을 열거 나 vim에서 쉘을 시작할 수도 있습니다.

따라서 사용자는 이제 임의의 파일을보고 편집하고 시스템에서 임의의 명령을 실행할 수 있습니다.


답변

보안 잠금

예를 들어 같은 일부 프로그램, less, vi, vim과는 more다른 프로그램이 쉘 명령 어떤 쉘 탈출로 알려진 또는 명령 인터프리터 탈출되어에서 실행할 수 있습니다. 이 경우 NOEXEC일부 프로그램이 다른 프로그램의 실행을 허용하지 않도록 사용할 수 있습니다 . 예:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

이것은 사용자가 vim 등을 실행하는 시스템의 파일을 편집하거나 특권을 볼 수있게하지만, escape 명령 해석기에서 특권을 가진 다른 프로그램을 실행할 수 없게합니다 vim.

sudo프로그램 실행의 표준 출력 ( STDOUT)을 사용자의 홈 디렉토리 외부에있는 파일 로 리디렉션하는 등 위험한 작업을 방지 할 수있는 몇 가지 보안 잠금 (기본값)이 중요 합니다 .

파일 /etc/sudoers에 사용자가 권한으로 실행할 수있는 /usr/bin/vim경우 (예 : 다음과 같이)

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudo정의 된 일반 사용자가 /usr/bin/vim다음과 같은 방식으로 실행할 수 있습니다 .

sudo /usr/bin/vim
sudo vim

그러나 다음과 같이 vim을 실행하지 못하게하십시오.

cd /usr/bin
sudo ./vim

답변

간단한 대답 :

다음은 Vim 명령입니다.

:shell

그들은 이제 루트 쉘을 가지고 있습니다.


답변

증분 보안 향상 중 하나는 다음을 대체하는 것입니다.

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

그런 다음 사용자를 sudo rvim /etc/httpd/confs/httpd.conf대신 실행하십시오 .

Vim은 -Z 명령 줄 옵션 또는 프로그램을 rvim으로 시작하여 트리거 된 제한 모드를 지원합니다. 제한 모드가 활성화되면 “외부 쉘을 사용하는 모든 명령이 비활성화됩니다”. 이 접근 방식은 사용자가 :split fileex 명령을 사용하여 다른 파일을 여는 것을 막지는 않지만 적어도 의도적으로 악의적 인 쉘 명령을 막아야합니다 :!rm -rf /.


답변

루트로 vim을 실행하면 시스템이 실제로 넓어지고 sudoedit이 더 안전한 솔루션이라는 HBruijn의 답변에 동의합니다 .

그러나 그때도 시스템은 여전히 ​​개방적 일 것입니다. 적어도 루트 권한을 가진 일부 아파치 프로세스가 해당 구성을 기반으로 시작된다고 가정합니다. 외부 프로그램을 실행하는 방식으로 아파치를 구성하는 방법은 백만 가지가 있습니다. 일례로 CustomLog 지시문에 대한 파이프 인수를 고려하십시오 . 매뉴얼에는 다음과 같이 명시되어 있습니다.

보안:

프로그램이 사용 된 경우 시작한 사용자로 실행됩니다 httpd. 서버가 루트로 시작된 경우 루트가됩니다. 프로그램이 안전한지 확인하십시오.

분명히 사용자가 구성을 작성할 수 있으면 해당 프로그램을 원하는대로 변경할 수 있습니다 (예 : 쉘 스크립트를 실행하여 추가 권한을 부여하는 것).

이런 이유로, 나는 아파치가 일반 사용자처럼 달리 실행되는 경우에도 아파치가 특권 포트에 바인딩하는 특수 기능을 얻을 수있는 방식으로 기능을 사용하는 방법을 함께 해킹했습니다. 이렇게하면 사용자는 구성을 편집하고 서버를 시작할 수 있으며 여전히 안전합니다. 유일한 문제는 IP의 모든 프로세스를 바인딩 할 수 있다는 것입니다. 시스템 sshd와 충돌 할 수있는 방법을 찾은 다음 루트 암호를 얻기 위해 자체 버전을 시작할 수 있기 때문에 어느 정도 신뢰가 남아 있습니다.


답변

심지어는 주목해야한다 sudoedit {.../whatever.conf}보안 위험이 발생할 수 있습니다.

쉘 스크립트 만들기 /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

구성 파일에서이 스크립트를 호출하십시오. 이 접근법이 작동하는 몇 가지 예를 알고 있습니다.

삼바 -> 로그 NT 토큰 명령

log nt token command = /tmp/make_me_root.sh

syslog-ng- > 프로그램 : 외부 응용 프로그램으로 메시지 보내기

log {
    source{ system() } ;
    destination { program("/tmp/make_me_root.sh") };
};

아파치 -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

나는이 목록을 끝없이 확장 할 수 있다고 가정합니다.

서비스를 다시 시작하기 만하면됩니다. 물론, 일단 루트가되면 트레이스를 흐리게하기 위해 그러한 설정 라인을 되돌릴 것입니다.