]> @LXC_GENERATE_DATE@ lxc-attach 1 lxc-attach 실행 중인 컨테이너 내에 프로세스를 실행 lxc-attach -n name -a arch -e -s namespaces -R --keep-env --clear-env -- command <!-- Description -->설명 lxc-attachname으로 지정한 컨테이너 내에 command를 실행한다. 해당 컨테이너는 실행중이어야 한다. 만약 command가 지정되지 않았다면, lxc-attach가 현재 실행 중인 쉘이 컨테이너 안에도 있는지 검사하고 이를 실행한다. 만약 컨테이너 안에 사용자가 존재하지 않거나, nsswitch가 제대로 동작하지 않는 경우에는 이 명령이 실패하게 된다. 이전 버전의 lxc-attach는 단순히 컨테이너의 특정 네임스페이스에 붙어, 쉘을 실행하거나 첫 번째 pseudo 터미널 할당 없이 특정 명령어를 실행하였다. 이는 다른 특권 수준을 갖는 사용자 영역 컨텍스트 간의 전환후 TIOCSTI ioctl를 호출하여 입력을 가로챌 수 있는 취약점이 있다. 새로운 버전의 lxc-attach는 쉘이나 명령어를 실행하기 전에, pseudo 터미널 마스터/슬레이브 쌍을 호스트에 할당하고 터미널을 가리키고 있던 표준 입출력 파일 디스크립터들은 슬레이브 pseudo 터미널로 붙인다. 터미널을 가리키고 있던 표준 입출력 파일 디스크립터가 아예 없었다면, lxc-attach는 pseudo 터미널 할당을 시도하지 않음에 주의해야 한다. 단순히 컨테이너 네임스페이스에 붙어 쉘이나 지정한 명령어만 실행할 뿐이다. <!-- Options -->옵션 명령어를 실행하는 컨테이너의 아키텍처를 지정한다. 이 옵션은 컨테이너의 설정파일에서 지정한 옵션과 같은 것만 사용할 수 있다. lxc.conf 5 를 참조 바란다. 기본값은 실행 중인 컨테이너의 아키텍처이다. 컨테이너 내부에서 command를 실행할 때 privilege를 제거하지 않는다. 만약 이 옵션이 지정되었다면, 새로운 프로세스는 컨테이너의 cgroup에 추가되지 않는다. 그리고 실행 전 capability도 제거하지 않는다. 만약 모든 privilege를 얻고 싶지 않을 경우에는 CGROUP|LSM와 같이 파이프(|)로 구분된 리스트를 사용할 수 있다. 허용되는 값은 CGROUPCAPLSM이다. 각각 cgroup, capability, MAC label을 나타낸다. (파이프 기호는 CGROUP\|LSM처럼 \로 처리를 해주거나, "CGROUP|LSM"처럼 따옴표를 붙여야 한다.) 경고 : 만약 명령어가 attach된 메인프로세스가 종료된 후에, 실행 상태로 남아있는 서브프로세스를 시작하려고 한다면, 컨테이너 내부로 privilege 누수가 발생할 수 있다. 컨테이너 내에서 데몬을 시작(또는 재시작)하는 것은 문제가 될 수 있다. 특히 만약 데몬이 많은 서브프로세스 를 실행하는 경우라면, 예를 들어 cronsshd와 같은 경우는 문제가 될 수 있다. 충분한 주의를 기울여서 사용하여야 한다. 붙일 네임스페이스를 지정한다. NETWORK|IPC와 같이 파이프(|)로 구분된 리스트를 사용할 수 있다. 허용되는 값은 MOUNT, PID, UTSNAME, IPC, USER , NETWORK이다. 이를 사용하여, 컨테이너의 네트워크 네임스페이스를 사용하면서도 다른 네임스페이스는 호스트의 것을 그대로 사용하는 등의 조작이 가능하다. (파이프 기호는 MOUNT\|PID처럼 \로 처리를 해주거나, "MOUNT|PID"처럼 따옴표를 붙여야 한다.) 중요 : 이 옵션은 옵션을 포함하고 있다. 를 사용하여 마운트 네임스페이스를 포함하지 않았을 때, 이 플래그는 lxc-attach/proc/sys를 remount 하게 만든다. 이는 현재와 다른 네임스페이스 컨텍스트를 반영시키기 위함이다. 좀더 자세한 설명은 주의섹션을 참고하면 된다. 만약 마운트 네임스페이스에 attach하려고 한다면, 이 옵션은 무시된다. 현재의 환경변수를 attach될 프로그램에도 그대로 적용한다. 이것은 현재 기본 동작이지만 (버전 0.9에서), 향후에 충분히 바뀔 수도 있다. 왜냐하면, 이것은 컨테이너에게 바람직하지 않은 정보를 넘겨줄 수 있는 위험성이 있기 때문이다. 따라서 이 기능에 의존하고 있다면, 향후에도 이를 보장할 수 있도록 이 옵션을 사용하는 것이 좋다. 또한 현재 환경 변수와 더불어, container=lxc도 설정된다. attach하기 전에 모든 환경변수를 지운다. 이를 통해 바람직하지 않은 환경변수 누출을 막을 수 있다. container=lxc 만이 attach된 프로그램이 실행되기 전에 설정되는 유일한 환경변수이다. &commonoptions; <!-- Examples -->예제 존재하는 컨테이너의 내부에 새로운 쉘을 실행한다. lxc-attach -n container 실행중인 Debian 컨테이너의 cron 서비스를 재시작한다. lxc-attach -n container -- /etc/init.d/cron restart NET_ADMIN capability없이 실행중인 컨테이너의 네트워크 링크 eth1을 비활성화하였다. 옵션을 사용하여 capability를 높였고, ip 툴이 설치되어있다고 가정하였다. lxc-attach -n container -e -- /sbin/ip link delete eth1 <!-- Compatibility -->호환성 (pid와 마운트 네임스페이스를 포함한) attach가 동작하기 위해서는 커널의 버전이 3.8 이상이거나 패치가 적용된 커널이어야 한다. 좀더 자세히 보려면 lxc 웹사이트를 참고하면 된다. lxc-attach는 패치되지 않은 커널 버전 3.7 이하면 실패된다. 그러나 를 사용하여 NETWORK, IPC, UTSNAME 네임스페이스 들만 지정한다면, 패치되지 않은 커널 3.0 이상에서도 성공적으로 동작한다. 사용자 네임스페이스에 attach하기 위해서는 커널 버전이 3.8 이상이어야 하고 사용자 네임스페이스가 활성화되어야 한다. <!-- Notes -->주의 리눅스의 /proc/sys 파일시스템은 네임스페이스의해 영향받는 몇가지 정보들을 포함하고 있다. 예를 들어 /proc의 프로세스 id로 된 폴더들이나 /sys/class/net의 네트워크 인터페이스 정보 등이다. 의사파일시스템을 마운트하는 프로세스의 네임스페이스가 여기에 어떤 정보를 표시할지 결정하는 것이지, /proc 또는 /sys에 접근하는 프로세스의 네임스페이스가 결정하는 것은 아니다. 를 사용하여 컨테이너의 pid 네임스페이스에만 attach 시키고 마운트 네임스페이스(컨테이너의 /proc는 포함하고, 호스트의 것은 포함하지 않는)는 attach 시키지 않는 경우, 의 내용은 컨테이너의 것이 아닌 호스트의 것이 된다. 네트워크 네임스페이스만을 연결하고 /sys/class/net의 내용을 읽을 때도 같은 현상이 있다. 이러한 문제를 해결하기 위해, 옵션이 제공된다. 해당 옵션은 attach되는 프로세스의 네트워크/pid 네임스페이스를 반영하기 위해 /proc/sys를 다시 마운트한다. 호스트의 실제 파일시스템에 방해가 되지 않기 위해 마운트 네임스페이스는 공유되지 않는다(lxc-unshare의 동작과 비슷). /proc/sys 파일시스템을 제외하고 호스트 마운트 네임스페이스와 동일한 새로운 마운트 네임스페이스가 주어지게 된다. 이전 버전의 lxc-attach는 몇몇 중요한 서브시스템에 쓰기가 가능한 cgroup 내에 없더라도, 사용자가 컨테이너의 네임스페이스에 연결할 수 있는 버그가 있었다. 새로운 버전의 lxc-attach는 현재 사용자가 몇몇 중요한 서브시스템에 쓰기 권한이 있는 cgroup에 속하는지 여부를 검사한다. 그러므로 lxc-attach는 사용자에 따라 실패하는 경우도 있다. (예를 들어, 로그인 시 비특권 사용자가 중요 서브시스템에 쓰기가 가능한 cgroup에 위치하지 않은 경우) 하지만 이러한 동작은 정확한 것이고 더 안전한 것이다. <!-- Security -->보안 옵션을 사용할때는 주의해야 한다. 잘못 사용하게 하면 컨테이너들 간의 고립(isolation)을 깨트릴 수 있다. &seealso; <!-- Author -->저자 Daniel Lezcano daniel.lezcano@free.fr