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

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



답변

주목할만한 답변이 더 많은 유사한 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와 같은 다른 언어로 프로그래밍 할 수있는 샌드 박스 기능이 있다고 생각합니다.


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


답변

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

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

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


답변

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


답변

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

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

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

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


답변

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


답변