Provided by: lxc-utils_3.0.3-0ubuntu1~18.04.3_amd64 bug

NAME

       lxc-attach - 실행 중인 컨테이너 내에 프로세스를 실행

SYNOPSIS

       lxc-attach {-n, --name name} [-f, --rcfile config_file] [-a, --arch arch] [-e, --elevated-privileges
                  privileges] [-s, --namespaces namespaces] [-R, --remount-sys-proc] [--keep-env] [--clear-env]
                  [-L, --pty-log file] [-v, --set-var variable] [--keep-var variable] [-- command]

설명

       lxc-attachname으로 지정한 컨테이너 내에 command를 실행한다.  해당 컨테이너는 실행중이어야 한다.

       만약  command가  지정되지 않았다면, lxc-attach가 현재 실행 중인 쉘이 컨테이너 안에도 있는지 검사하고 이를
       실행한다.  만약 컨테이너 안에 사용자가 존재하지 않거나,  nsswitch가  제대로  동작하지  않는  경우에는  이
       명령이 실패하게 된다.

       이전  버전의  lxc-attach는  단순히 컨테이너의 특정 네임스페이스 내에서 쉘이나 명령어를 pseudo 터미널 할당
       없이 실행하였다.  이는 다른 특권 수준을 갖는 사용자 영역 컨텍스트 간의 전환후  TIOCSTI  ioctl를  호출하여
       입력을  가로챌 수 있는 취약점이 있다.  새로운 버전의 lxc-attach는 쉘이나 명령어를 실행하기 전, 호스트에서
       pseudo 터미널 마스터/슬레이브 쌍을 할당하고, 터미널을  가리키고  있던  표준  입출력  파일  디스크립터들을
       pseudo 터미널의 슬레이브로 연결한다.  터미널을 가리키고 있던 표준 입출력 파일 디스크립터가 아예 없었다면,
       lxc-attach는  pseudo  터미널  할당을 시도하지 않음에 주의해야 한다. 단순히 컨테이너 네임스페이스 내부에서
       쉘이나 지정한 명령어를 실행할 뿐이다.

옵션

       -f, --rcfile config_file
              컨테이너의 가상화 및 고립 기능들을 설정할 파일을 지정한다.

              이전에 만들어졌던 컨테이너에 설정 파일이 이미 있더라도, 이  옵션이  지정되어  있다면  해당  파일을
              사용한다.

       -a, --arch arch
              명령어를  실행하는  컨테이너의  아키텍처를  지정한다.   이  옵션은  컨테이너의 설정파일에서 지정한
              lxc.arch 옵션과 같은  것만  사용할  수  있다.   lxc.conf(5)를  참조  바란다.  기본값은  실행  중인
              컨테이너의 아키텍처이다.

       -e, --elevated-privileges privileges
              컨테이너  내부에서  command를 실행할 때 privilege를 제거하지 않는다.  만약 이 옵션이 지정되었다면,
              새로운 프로세스는 컨테이너의 cgroup에  추가되지  않는다.  그리고  실행  전  capability도  제거하지
              않는다.

              만약 모든 privilege를 얻고 싶지 않을 경우에는 CGROUP|LSM와 같이 파이프(|)로 구분된 리스트를 사용할
              수  있다.  허용되는  값은  CGROUPCAPLSM이다.  각각  cgroup,  capability, MAC label을 나타낸다.
              (파이프 기호는 CGROUP\|LSM처럼 \로 처리를 해주거나, "CGROUP|LSM"처럼 따옴표를 붙여야 한다.)

              경고 : 만약 명령어가 attach된 메인프로세스가 종료된  후에,  실행  상태로  남아있는  서브프로세스를
              시작하려고  한다면,  컨테이너  내부로  privilege  누수가  발생할  수 있다.  컨테이너 내에서 데몬을
              시작(또는 재시작)하는 것은 문제가 될 수 있다. 특히  만약  데몬이  많은  서브프로세스  를  실행하는
              경우라면,  예를  들어  cronsshd와  같은  경우는  문제가  될  수  있다.  충분한 주의를 기울여서
              사용하여야 한다.

       -s, --namespaces namespaces
              컨테이너의 어떤 네임스페이스와 연결할지 지정한다. NETWORK|IPC와 같이 파이프(|)로  구분된  리스트를
              사용할  수  있다.  허용되는  값은  MOUNT,  PID,  UTSNAME,  IPC, USER , NETWORK이다. 이를 사용하여,
              컨테이너의 네트워크 네임스페이스를 사용하면서도 다른 네임스페이스는 호스트의 것을 그대로  사용하는
              등의 조작이 가능하다.  (파이프 기호는 MOUNT\|PID처럼 \로 처리를 해주거나, "MOUNT|PID"처럼 따옴표를
              붙여야 한다.)

              중요 : 이 옵션은 -e 옵션을 포함하고 있다.

       -R, --remount-sys-proc
              -s를  사용하여  마운트  네임스페이스를 포함하지 않았을 때, 이 플래그는 lxc-attach/proc/sys를
              remount 하게 만든다.  이는 현재와 다른 네임스페이스 컨텍스트를 반영시키기 위함이다.

              좀더 자세한 설명은 주의섹션을 참고하면 된다.

              만약 마운트 네임스페이스에 연결하려고 한다면, 이 옵션은 무시된다.

       --keep-env
              현재의 환경변수를 실행할 프로그램에도 그대로 적용한다. 이것은 현재 기본 동작이지만 (버전 0.9에서),
              향후에 충분히 바뀔 수도 있다. 왜냐하면, 이것은 컨테이너에게 바람직하지 않은 정보를 넘겨줄 수  있는
              위험성이 있기 때문이다. 따라서 이 기능에 의존하고 있다면, 향후에도 이를 보장할 수 있도록 이 옵션을
              사용하는 것이 좋다. 또한 현재 환경 변수와 더불어, container=lxc도 설정된다.

       --clear-env
              프로그램을  실행하기  전에 모든 환경변수를 지운다.  이를 통해 바람직하지 않은 환경변수 누출을 막을
              수 있다. container=lxc 만이 프로그램이 실행되기 전에 설정되는 유일한 환경변수이다.

       -L, --pty-log file
              lxc-attach의 출력을 기록할 파일을 지정한다.

              중요: 표준 입출력 파일 디스크립터가 pty를 참조하지 않으면, 기록되지 않는다.

       -v, --set-var variable
              컨테이너 내에서 실행되는 프로그램이 볼 수  있는  환경변수를  추가한다.   이는  "VAR=VALUE"  형태로
              지정되며, 여러 번 지정할 수 있다.

       --keep-var variable
              \-\-clear-env와  함께  사용되며,  지정한 환경변수를 지우지 않고 그대로 유지한다. 여러 번 지정할 수
              있다.

공통 옵션

       이 옵션들은 대부분의 lxc 명령어들에서 공통으로 쓰인다.

       -?, -h, --help
              사용법을 기존 출력하는 것보다 길게 출력한다.

       --usage
              사용법을 표시한다.

       -q, --quiet
              결과를 표시하지 않는다.

       -P, --lxcpath=PATH
              컨테이너 경로를 직접 지정한다. 기본값은 /var/lib/lxc이다.

       -o, --logfile=FILE
              로그의 경로를 FILE로 지정한다. 기본값은 로그를 출력하지 않는 것이다.

       -l, --logpriority=LEVEL
              로그 수준을 LEVEL로 지정한다. 기본값은 ERROR이다. 사용 가능한  값  :  FATAL,  CRIT,  WARN,  ERROR,
              NOTICE, INFO, DEBUG.

              이  옵션은  로그 파일에만 적용된다는 사실을 주의해야 한다. stderr로 출력되는 ERROR 로그에는 영향을
              끼치지 않는다.

       -n, --name=NAME
              컨테이너 식별자로 NAME을 사용한다. 컨테이너 식별자의 형식은 알파벳-숫자 문자열이다.

       --rcfile=FILE
              컨테이너의 가상화 및 고립 기능들을 설정할 파일을 지정한다.

              이전에 만들어졌던 컨테이너에 설정 파일이 이미 있더라도, 이  옵션이  지정되어  있다면  해당  파일을
              사용한다.

       --version
              버전 정보를 표시한다.

예제

       존재하는 컨테이너의 내부에 새로운 쉘을 실행한다.

                 lxc-attach -n container

       실행중인 Debian 컨테이너의 cron 서비스를 재시작한다.

                 lxc-attach -n container -- /etc/init.d/cron restart

       NET_ADMIN  capability없이  실행중인  컨테이너의  네트워크  링크 eth1을 비활성화하였다. -e 옵션을 사용하여
       capability를 높였고, ip 툴이 설치되어있다고 가정하였다.

                 lxc-attach -n container -e -- /sbin/ip link delete eth1

호환성

       (pid와 마운트 네임스페이스를 포함한) attach가 동작하기  위해서는  커널의  버전이  3.8  이상이거나  패치가
       적용된  커널이어야 한다. 좀더 자세히 보려면 lxc 웹사이트를 참고하면 된다. lxc-attach는 패치되지 않은 커널
       버전 3.7 이하면 실패된다.

       그러나 -s를 사용하여  NETWORK,  IPC,  UTSNAME  네임스페이스  들만  지정한다면,  패치되지  않은  커널  3.0
       이상에서도 성공적으로 동작한다.

       사용자   네임스페이스와   연결되기  위해서는  커널  버전이  3.8  이상이어야  하고  사용자  네임스페이스가
       활성화되어야 한다.

주의

       리눅스의 /proc/sys 파일시스템은 네임스페이스의해 영향받는 몇가지 정보들을  포함하고  있다.  예를  들어
       /proc의   프로세스   id로  된  폴더들이나  /sys/class/net의  네트워크  인터페이스  정보  등이다.   pseudo
       파일시스템을 마운트하는 프로세스의 네임스페이스가 여기에 어떤 정보를 표시할지 결정하는 것이지, /proc 또는
       /sys에 접근하는 프로세스의 네임스페이스가 결정하는 것은 아니다.

       -s 를 사용하여 컨테이너의 pid  네임스페이스에만  attach  시키고  마운트  네임스페이스(컨테이너의  /proc는
       포함하고,  호스트의  것은  포함하지  않는)는 attach 시키지 않는 경우, /proc의 내용은 컨테이너의 것이 아닌
       호스트의 것이 된다.  네트워크 네임스페이스만을 연결하고 /sys/class/net의 내용을  읽을  때도  같은  현상이
       있다.

       이러한  문제를  해결하기  위해,  -R  옵션이  제공된다.  해당  옵션은  attach되는  프로세스의 네트워크/pid
       네임스페이스를 반영하기 위해 /proc/sys를 다시 마운트한다.  호스트의 실제 파일시스템에 방해가 되지 않기
       위해 마운트 네임스페이스는 공유되지 않는다(lxc-unshare의 동작과 비슷). /proc/sys 파일시스템을 제외하고
       호스트 마운트 네임스페이스와 동일한 새로운 마운트 네임스페이스가 주어지게 된다.

       이전 버전의 lxc-attach는 몇몇 중요한 서브시스템에 쓰기가 가능한 cgroup 내에 없더라도, 사용자가 컨테이너의
       네임스페이스에 연결할 수 있는 버그가 있었다.   새로운  버전의  lxc-attach는  현재  사용자가  몇몇  중요한
       서브시스템에  쓰기  권한이  있는  cgroup에  속하는지 여부를 검사한다. 그러므로 lxc-attach는 사용자에 따라
       실패하는 경우도 있다. (예를 들어, 로그인 시 비특권 사용자가  중요  서브시스템에  쓰기가  가능한  cgroup에
       위치하지 않은 경우) 하지만 이러한 동작은 정확한 것이고 더 안전한 것이다.

보안

       -e-s  옵션을 사용할때는 주의해야 한다. 잘못 사용하게 하면 컨테이너들 간의 고립(isolation)을 깨트릴 수
       있다.

참조

       lxc(7), lxc-create(1),  lxc-copy(1),  lxc-destroy(1),  lxc-start(1),  lxc-stop(1),  lxc-execute(1),  lxc-
       console(1),  lxc-monitor(1),  lxc-wait(1),  lxc-cgroup(1),  lxc-ls(1),  lxc-info(1),  lxc-freeze(1), lxc-
       unfreeze(1), lxc-attach(1), lxc.conf(5)

저자

       Daniel Lezcano <daniel.lezcano@free.fr>

                                                   2023-05-05                                      lxc-attach(1)