`nsenter :`를 사용하여 자식 프로세스를 감금하는 신뢰할 수있는 방법


15

리눅스 네임 스페이스는 다른 것들 중에서도 좀비와 덤핑 가능성없이 자식 프로세스를 안전하게 제한하고 다루기 위해 활용 될 수 있다는 것을 알고있다 init. 그러나 구현 세부 사항에 대해 애매합니다. 어떻게에서 제공하는 도구를 사용할 수있는 util-linux같은 mountnsenter, 시청하는 모니터를하고, 모든 프로세스가 다른 프로세스의 직접 네임 스페이스의 후손이 시작되도록?

답변:


19

PID 네임 스페이스 생성

여기에 올바른 명령은 unshare입니다. 이 작업을 수행하는 데 필요한 옵션은에서만 사용할 수 있습니다 util-linux 2.23. 아이디어는 실행중인 프로그램에 대해 새로운 PID 네임 스페이스 를 작성하여 모든 하위 요소 도이 네임 스페이스에 작성되도록하는 것입니다. 다음을 수행하여 새 PID 네임 스페이스에서 명령을 실행할 수 있습니다.

sudo unshare -fp some_command

쉘을 실행하려면 명령을 생략하십시오. 이렇게하면 자식 (자식)과 함께 부모 (시스템) 네임 스페이스 내에서 평소와 같이 PID를 갖는 프로세스가 생성됩니다. 그러나 새 네임 스페이스 내 1에서 init프로세스 의 일부 특수 특성과 함께 PID를 갖게 됩니다. 모니터링 관점에서 가장 관련성이 높은 특성은 하위 항목 중 하나가 고아 인 경우 실제 init프로세스 가 아니라이 프로세스로 다시 양육된다는 것 입니다.

이 작업을 수행하면 대부분의 모니터링 사례에 충분할 수 있습니다. 앞에서 언급 한 것처럼 네임 스페이스 내의 프로세스에는 모두 부모 네임 스페이스 내에 PID가 있으므로 일반 명령을 사용하여 활동을 모니터링 할 수 있습니다. 또한 네임 스페이스의 프로세스가 고아가되면 최상위 수준 프로그램의 PID 아래에있는 프로세스 트리 분기에서 벗어나지 않으므로 여전히 쉽게 추적 할 수 있습니다.

마운트 네임 스페이스와 결합

그러나 우리가 할 수없는 것은 PID가 있다고 생각 하는 프로세스를 모니터링하는 것입니다 . 이를 위해, 특히 ps새 네임 스페이스 내에서 명령 을 사용할 수 있으려면 네임 스페이스에 대해 별도의 procfs파일 시스템 을 마운트해야 합니다. 이를 ps수용 하는 유일한 위치는이므로 다른 문제 procfs가 발생 /proc합니다. 한 가지 해결책은 chroot감옥 을 만들고 procfs거기 에 새 감옥을 설치하는 것입니다. 그러나 이것은 최소한 우리가 사용하려는 바이너리를 새로운 루트에 의존하는 라이브러리와 함께 복사 (또는 적어도 하드 링크)해야하기 때문에 번거로운 접근법입니다.

해결책은 새로운 마운트 네임 스페이스를 사용하는 것 입니다. 이 안에서 우리는 procfs진정한 루트 /proc디렉토리 를 사용하는 방식으로 새로운 것을 마운트 할 수 있고 PID 네임 스페이스 내에서 사용 가능하며 다른 어떤 것도 방해하지 않습니다. 이 프로세스를 매우 간단하게하기 위해이 unshare명령은 다음 --mount-proc옵션을 제공합니다 .

sudo unshare -fp --mount-proc some_command

이제 ps결합 된 네임 스페이스 내에서 실행 하면 PID 이름 공간이있는 프로세스 만 표시되고 PID가있는 최상위 프로세스가 표시됩니다 1.

무엇에 대해 nsenter?

이름에서 알 nsenter수 있듯이으로 이미 생성 된 네임 스페이스를 입력하는 데 사용할 수 있습니다 unshare. 이것은 관련이없는 스크립트에서 네임 스페이스 내부에서만 사용 가능한 정보를 얻으려는 경우에 유용합니다. 가장 간단한 방법은 네임 스페이스 내에서 실행중인 모든 프로그램의 PID에 액세스하는 것입니다. 명확하게하려면이 이름 nsenter이 실행중인 네임 스페이스 내에서 대상 프로그램의 PID 여야합니다 (네임 스페이스가 중첩 될 수 있으므로 단일 프로세스에 많은 PID가있을 수 있음). 대상 PID / 마운트 네임 스페이스에서 쉘을 실행하려면 다음을 수행하십시오.

sudo nsenter -t $PID -m -p

이 네임 스페이스가 위와 같이 설정되면 ps해당 네임 스페이스 내의 프로세스 만 나열됩니다.


고마워, Graeme 이것은 이미 그 질문에 더 대답했습니다. 실제로 내가 요청한 것은 / proc / pid / ns / *의 다양한 파일에있는 procfs 매뉴얼 페이지에서 다음과 같은 메모를 읽는 것입니다. "이 파일을 마운트 할 때 (mount (2) 참조) 파일 시스템의 다른 곳에 ... 현재 네임 스페이스에있는 모든 프로세스가 종료 되더라도 pid alive로 지정된 프로세스의 네임 스페이스입니다. " 똑같은 질문은 아니지만, 이미 알고 있기는하지만, 이것이 이미 좋았다고 생각되면 추가하고 싶을 수도 있습니다. linux.die.net/man/5/proc
mikeserv

이것은 LWN 기사 의 마지막 섹션 (바인드 마운트 검색) 에서 다룹니다 . PID 네임 스페이스를 유지하면서 최상위 포인트 init스타일 프로세스가 끝난 후에는 더 이상 만들 수 없지만 실제로 그 요점은 확실 하지 않습니다.
Graeme

그래, 나머지도 너무 확신하지 못한다. 그러나이 답변과 man주말에 나는 그것에 대해 조금 더 친숙하게 생각합니다. 다시 감사합니다. --user 네임 스페이스 와 더 관련이있을 수 있습니다.
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.