루트가 아닌 프로세스를“감옥”하는 방법은 무엇입니까?


26

나는 루트였습니다. 단순히 더미 사용자 / 그룹을 만들고 파일 권한을 적절하게 설정하고 프로세스를 해당 사용자로 실행할 수 있습니다. 그러나 나는 그렇지 않습니다. 뿌리없이 이것을 달성 할 수있는 방법이 있습니까?


1
@alex : 여러 개의 시뮬레이션 (다른 디렉토리에서)을 실행하는 스크립트를 가지고 있으며 프로그래밍이 아무리 나쁜 경우에도 자신의 디렉토리에있는 파일에만 액세스 할 수 있고 실수로 다른 시뮬레이션의 출력을 수정할 수
없도록하고 싶습니다

2
@Tobias : 요점을 알았습니다. chroot자연스럽게 거기에 적합하지만 다시는 뿌리가 아닙니다.
alex

1
그 SELinux는, AppArmor의, 그리고 grsecurity는 생각 할 수 이 작업을 수행 할 수 있습니다,하지만 난 모르겠어요. 그러나 sys 관리자가 사용할 수 없거나 구성되어 있지 않으면 그에 대한 해결책입니다.
xenoterracide

4
그러한 질문은 몇 년 동안 내가 궁금해 한 것입니다. 루트가 아니더라도 일부 사용자 권한이 삭제 된 상태로 프로세스를 실행할 수있는 것, 즉 프로세스를 사용자 설정 "감옥"으로 제한 할 수있는 것은 자연스러운 자연스러운 것 같습니다. 사용자보다 권리가 적습니다. 평범한 Unices가 이것을 표준으로 제공하지 않은 것은 유감입니다!
imz-Ivan Zakharyaschev

2
시스템 관리자에게 두 번째 사용자 계정을 만들도록 요청하십시오.
LawrenceC

답변:


23

주목할만한 답변이 더 많은 유사한 Q :

참고 : 여기에 언급되지 않은 특정 솔루션에 대한 답변이 있습니다.

실제로는 구현 방식이 다른 여러 도구를 사용하지만 디자인에 의해 안전하지 않거나 (예 fakeroot: LD_PRELOAD기반) 완전하지 않거나 (예 fakeroot-ng: ptrace기반) 루트 ()가 필요 chroot하거나 fakechroot에plash 언급되어 있습니다. 경고 라벨 ).

이것들은 단지 예일뿐입니다. 아마도 운영 체제 수준의 가상화 구현 에서 이러한 두 가지 기능 ( "신뢰할 수 있습니까?", "설정이 필요한 루트?")의 표시와 함께 모두 나란히 나열하려고 생각했습니다 .

일반적으로 거기에 대한 답변은 설명 된 모든 가능성과 그 이상을 포괄합니다.

가상 머신 / OS

커널 확장 (SELinux와 같은)

  • (여기에 의견에 언급)

chroot

Chroot 기반 헬퍼 (그러나 루트 chroot가 필요 하기 때문에 setUID 루트 여야 함) 또는 chroot격리 된 네임 스페이스에서 작동 할 수 있음 (아래 참조) :

[그들에 대해 조금 더 이야기하기 위해!]

알려진 chroot 기반 격리 도구 :

  • hsh-runhsh-shell명령을 가진 hasher . ( Hasher 는 안전하고 반복 가능한 방식으로 소프트웨어를 구축하도록 설계되었습니다.)
  • 다른 답변 에서 언급 된 schroot
  • ...

ptrace

(이외의 또 다른 신뢰할 수있는 절연 솔루션 기반의 하나 )을 통해 전체 콜-차단 될 에 대한 맨 페이지에 설명 된대로 :seccompptracefakeroot-ng

이전 구현과 달리 fakeroot-ng는 추적 된 프로세스가 fakeroot-ng의 "서비스"를 사용할지 여부와 관련하여 선택 사항을 남기지 않는 기술을 사용합니다. 프로그램을 정적으로 컴파일하고 커널을 직접 호출하고 자신의 주소 공간을 조작하는 것은 프로세스에 대한 LD_PRELOAD 기반 제어를 우회하는 데 사소하게 사용될 수 있으며 fakeroot-ng에는 적용되지 않는 모든 기술입니다. 이론적으로 추적 된 프로세스를 완전히 제어 할 수있는 방식으로 fakeroot-ng를 성형 할 수 있습니다.

이론적으로는 가능하지만 아직 완료되지 않았습니다. Fakeroot-ng는 추적중인 프로세스에 대한 특정 "정상적으로 행동 한"가정을 가정하며, 이러한 가정을 위반하는 프로세스는 완전히 탈출하지 않으면 최소한 가짜 루트에 의해 부과 된 "가짜"환경 중 일부를 우회 할 수 있습니다. ng. 따라서, 보안 도구로 fakeroot-ng를 사용하지 말 것을 강력히 경고합니다. 프로세스가 의도적으로 (의도하지 않은 것과 달리) 가짜 루트를 피할 수 있다고 주장하는 버그보고는 "버그가 아닌"것으로 닫히거나 우선 순위가 낮은 것으로 표시됩니다.

이 정책은 나중에 다시 생각할 수 있습니다. 그러나 당분간은 경고를 받았습니다.

여전히 읽을 수 있듯이이 fakeroot-ng목적을 위해 설계된 것은 아닙니다.

(BTW, 왜 그들이 seccomp기반이 아닌 크롬 기반의 접근 방식 을 사용하기로 선택했는지 궁금합니다 ptrace.)

위에서 언급하지 않은 도구 중 Geordi 를 언급 했습니다. 제어 프로그램이 Haskell로 작성되는 것을 좋아했기 때문입니다.

알려진 ptrace 기반 격리 도구 :

seccomp

격리를 달성하는 한 가지 알려진 방법 은 Google Chromium에 사용 된 seccomp 샌드 박스 방식을 사용하는 것입니다 . 그러나이 방법은 "허용 된"파일 액세스 및 다른 syscall 중 일부 (허용 된 것)를 처리하는 도우미를 작성한다고 가정합니다. 그리고 물론, syscall을 "차단"하고 도우미로 리디렉션하기 위해 노력하십시오 (아마도 제어 된 프로세스의 코드에서 인터셉트 된 syscall을 바꾸는 것과 같은 의미 일 것입니다. 매우 간단합니다. 관심이 있다면 내 대답보다는 세부 사항을 읽는 것이 좋습니다.)

관련 정보 (Wikipedia에서 제공) :

마지막 항목 seccomp은 Chromium 이외의 일반 기반 솔루션을 찾는 경우에 흥미로운 것으로 보입니다 . "seccomp-nurse"( SeccomP를 샌드 박싱 솔루션으로 작성? ) 의 저자의 블로그 게시물도 있습니다 .

"seccomp-nurse"프로젝트 의이 접근 방식은 다음과 같습니다.

                      여기에 이미지 설명을 입력하십시오

리눅스의 미래에 "유연한"seccomp가 가능합니까?

2009 년 에는 리눅스 커널을 패치하여seccomp 모드에 더 많은 유연성을 제공하기 위해 "현재 우리가 필요로하는 많은 곡예를 피할 수있다"는 제안이있었습니다. ( "Acrobatics"는 교도소 절차를 대신하여 많은 무고한 시스템 콜을 실행하고 감옥에있는 무고한 시스템 콜을 대체해야하는 도우미 작성의 합병증을 나타냅니다.) LWN 기사 는 다음과 같이 썼습니다.

나온 한 가지 제안은 seccomp에 새로운 "모드"를 추가하는 것이 었습니다. API는 애플리케이션마다 보안 요구 사항이 다를 수 있다는 아이디어로 설계되었습니다. 여기에는 적용해야 할 제한 사항을 지정하는 "mode"값이 포함됩니다. 원래 모드 만 구현되었지만 다른 모드는 추가 할 수 있습니다. 시작 프로세스에서 허용되는 시스템 호출을 지정할 수있는 새 모드를 만들면 Chrome 샌드 박스와 같은 상황에서이 기능이 더 유용합니다.

아담 랭글리 (또한 구글)는이를위한 패치를 게시했다. 새로운 "모드 2"구현은 액세스 할 수있는 시스템 호출을 설명하는 비트 마스크를 허용합니다. 그 중 하나가 prctl () 인 경우 샌드 박스 코드는 자체 시스템 호출을 추가로 제한 할 수 있지만 거부 된 시스템 호출에 대한 액세스는 복원 할 수 없습니다. 모든 것은 샌드 박스 개발자가보다 쉽게 ​​생활 할 수있는 합리적인 솔루션처럼 보입니다.

즉, 토론이 다른 가능성으로 넘어 갔기 때문에이 코드는 병합 될 수 없습니다.

이 "유연한 seccomp"는 복잡한 도우미를 작성할 필요없이 Linux의 가능성을 OS에서 원하는 기능을 제공하는 데 더 가깝게 만듭니다.

(이 답변과 기본적으로 동일한 내용의 블로그 게시물 : http://geofft.mit.edu/blog/sipb/33 )

네임 스페이스 ( unshare)

여기에 언급되지 않은 네임 스페이스 ( unshare기반 솔루션 ) 를 통한 분리 ( 예 : FUSE와 결합 된 마운트 포인트 공유 )는 신뢰할 수없는 프로세스의 파일 시스템 액세스를 제한하려는 실제 솔루션의 일부일 수 있습니다.

네임 스페이스에 대한 자세한 내용은 구현이 완료되었으므로이 격리 기술은 nme "Linux 컨테이너"또는 "LXC" 에서도 알려져 있지 않습니까? ..) :

"네임 스페이스의 전반적인 목표 중 하나는 경량 가상화 (및 기타 목적)를위한 도구 인 컨테이너 구현을 지원하는 것입니다 . "

새로운 사용자 네임 스페이스를 생성하는 것도 가능합니다. "프로세스는 네임 스페이스 내에 사용자 ID가 0 인 동시에 프로세스는 사용자 네임 스페이스 외부에 권한이없는 일반 사용자 ID를 가질 수 있습니다. 이는 프로세스에 전체 루트 권한이 있음을 의미합니다. 사용자 네임 스페이스 내부의 작업에는 사용되지만 네임 스페이스 외부의 작업에는 권한이 없습니다 ".

이 작업을 수행하는 실제 작업 명령은 다음 위치의 답변을 참조하십시오.

특수 사용자 공간 프로그래밍 / 컴파일

물론, 원하는 "감옥"보장은 OS에서이 기능을 추가로 지원하지 않고 사용자 공간에서 프로그래밍하여 구현할 수 있습니다 . 아마도이 기능이 OS 디자인에서 처음에는 포함되지 않은 이유입니다 ); 다소의 합병증으로.

언급 된 ptrace- 또는 seccomp일부 유닉스 프로그램 임의의 "블랙 박스"로 취급 될 다른 프로세스를 제어 할 샌드 박스 헬퍼를 작성하여 보증을 구현하는 변종으로 기반 샌드 박싱을 볼 수 있습니다.

또 다른 방법은 허용되지 않아야하는 효과에 신경 쓸 수있는 프로그래밍 기술을 사용하는 것입니다. (그런 다음 프로그램을 작성하는 사람은 당신이어야합니다. 더 이상 블랙 박스가 아닙니다.) Haskell 과 같은 순수한 프로그래밍 언어를 사용하면 부작용없이 프로그램 할 수 있습니다 . 프로그래머가 허용하지 않는 효과가 없는지 쉽게 확인할 수 있습니다.

Java와 같은 다른 언어로 프로그래밍 할 수있는 샌드 박스 기능이 있다고 생각합니다.


이 주제에 대한 정보를 축적하는 일부 페이지도 거기에 대한 답변에서 지적되었습니다.


Rootless GoboLinux도 옵션이 될 수 있습니다 ...
Tobias Kienzler

@tobias 그러나이 뿌리가 Gobolinux는 사용자가 작성한 프로그램이 외부 환경에 액세스하지 않을 것이라는 보장을 제공 않습니다 ..?
IMZ - 이반 Zakharyaschev

1
별로 - 그것을 사용하는 것이 가능할 수도 있지만 - 나는 하나가 단순히 이러한 프로세스에 대한 가상 사용자를 만들 수있는 "로컬"루트 사용자가 될 수 있도록 것이라는 오해에서 어떻게 든이었다 chroot, 그러나 그것은 아마도 여전히 필요 실제 루트 권한 ...
Tobias Kienzler

8

이것은 유닉스 권한 모델의 근본적인 한계입니다 : 루트 만이 위임 할 수 있습니다.

가상 머신을 실행하기 위해 루트 (root) 일 필요는 없지만 (모든 VM 기술에 해당되는 것은 아님), 이것은 헤비급 솔루션입니다.

사용자 모드 Linux 는 비교적 가벼운 Linux-on-Linux 가상화 솔루션입니다. 설정하기가 쉽지 않습니다. 최소한 루트 부팅에 필요한 최소한의 디렉토리 (디렉토리에있는)와 파티션 , 그에 종속 된 파일 /etc, /sbin/init그에 따른 로그인 프로그램, 쉘 및 유틸리티 로 루트 파티션을 채워야합니다 .


1

LD_PRELOAD특정 파일에 대한 액세스를 가로 채기 위해 운 이 좋을 것 같지만 실제로 까다로울 수 있습니다.


Google Chromium의 seccomp 샌드 박싱은보다 안정적인 방식, 즉 시스템 호출 차단을 효과적으로 수행합니다. - unix.stackexchange.com/questions/6433/...
IMZ - 이반 Zakharyaschev

무언가를 가로 채려고하는 것과 Sanboxing (Chromium의 경우처럼)의 차이점은 격리를 보장한다는 것입니다.
imz-Ivan Zakharyaschev

1
를 통한 차단 LD_PRELOAD은 신뢰할 수 없지만 (우회 할 수는 있지만) 차단할ptrace 수는 있습니다.
imz-Ivan Zakharyaschev

1
< joey.kitenet.net/blog/entry/fakechroot_warning_label >에 간단한 예제가 제시되어 있으며, 이는 LD_PRELOAD기반 솔루션을 보안 수단으로 신뢰할 수 없음 을 나타냅니다 .
imz-Ivan Zakharyaschev

0

전체 목록에서 다음을 추가합니다.

  • fakeroot (debian package maintener의) : "친숙한"툴로 패키지를 만드는 것을 목표로합니다. 이것은 완전한 격리는 아니지만 다른 사용자와 가짜 장치 및 기타 특수 의사 파일로 패키지를 작성하는 데 도움이됩니다.

  • fakechroot (fakeroot를 사용함). 이 프로그램에는 많은 버그가 있습니다. 예를 들어, "/ etc / hosts"는 glibc에 하드 코딩되어 있습니다.이 도구를 통해 변경할 수 없습니다.

  • qemu : 리눅스 커널을 컴파일해야하지만 결과는 매우 빠르며 실제 루트 권한을 가진 "가짜"(가상) 머신입니다. 부팅 이미지를 빌드하고 마운트 할 수 있습니다.


0

Firejail은 많은 옵션으로 루트 액세스 권한이 있거나없는 모든 프로세스를 감옥에 수감 할 수있는 훌륭한 도구입니다.


2
firejail을 사용하는 방법에 대한 자세한 내용은 환영합니다. 해당 링크가 종료되면 답변 정보 내용이 유틸리티 이름으로 내려갑니다. 배포판에서 사용 가능한 패키지, 사용 방법 등은 여기에 포함하십시오.
Anthon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.