Provided by: lxc_6.0.4-4ubuntu1_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] [-u, --uid uid] [-g, --gid
                  gid] [-- 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"처럼 따옴표를 붙여�\x95\xBC 한다.)

              경고 : 만약 명령어가 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와 함께 사용되며, 지정한 환경변수를 지우지 않고 그대로 유지한다. 여러  번  지정할  수
              있다.

       -u, --uid uid
              지정된 사용자 ID uidcommand를 container 내부에 실행한다.

       --g, --gid gid
              지정된 그룹 ID gidcommand를 container 내부에 실행한다.

공통 옵션

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

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

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

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

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

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

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

              이 옵션은 로그 파일에만 적용된다는 사실을 주의해야 한다. 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)

                                                   2025-06-09                                      lxc-attach(1)