Chroot Jail

외부(호스트)와 공유할 디렉토리

  • 본서에서는 VM은 아니지만 편의상 외부 환경을 '호스트', Chroot Jail 환경을 '게스트'라고 한다.

msys64와 겹치는 디렉토리

  • /dev: 호스트를 그대로 사용
  • /etc: 호스트와 합침
  • /home: 새로 만들어도 무방
  • /opt: 호스트를 그대로 사용
  • /tmp: 호스트를 그대로 사용
  • /usr: 호스트와 일부 합침
  • /var: 호스트와 일부 합침

Read Only로 바인드하는 노드(디렉토리, 파일)

$ sudo mount -o bind,ro "/$dir" "$newroot/$dir"

  • /lib
  • /lib64
  • /sbin
  • /usr/lib/x86_64-linux-gnu

Read Write로 바인드하는 노드(디렉토리, 파일)

$ sudo mount -o bind "/$dir" "$newroot/$dir"

  • /proc
  • /sys
  • /dev
  • /dev/pts
  • /tmp
  • /opt

합치는 디렉토리

$ mkdir -p "$newroot/$dir"

  • /etc
  • /var
  • /usr/bin

새로 만드는 디렉토리

$ mkdir -p "$newroot/$dir"

  • /bin
  • /home/$USER

ID 관리

ID 생성

  • 일단은 패스워드 없이
  • PAM과 NSS 없이
$ cat > "$newroot/etc/passwd" <<- EOS
	root::0:0:root:/root:/bin/bash
	"$USER::$UID:$(id -g):$USER:/home/$USER:/bin/bash"
EOS

$ cat > "$newroot/etc/group" <<- EOS
	root::0:
	"$USER::$(id -g):
EOS

SU

  • 호스트의 SU, SUDO는 libpam을 링크하고 있기 때문에 반드시 PAM, NSS 환경이 있어야 한다.
$ ldd `which su`
	linux-vdso.so.1 (0x00007fff893b7000)
	libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007f93cdbf0000)
	libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007f93cdbeb000)
	libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f93cdbe6000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f93cd9f4000)
	libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007f93cd9c8000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f93cd9c2000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f93cdc25000)
	libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007f93cd9b8000)
  • PAM과 NSS 환경을 Chroot Jail로 옮기지 않으려면 호스트의 SU 대신 busybox를 쓴다
  • 참고) docker는 일반적으로 container안에서 root로 실행
$ cp /bin/busybox "$newroot/bin"
$ ln -s /bin/busybox "$newroot/bin/su"

X Forwarding

local sudo (ssh거친 remote 말고)

  • sudo할 때 pam_xauth가 source user의 X Cookie를 target user의 .Xautority에 merge
sudo echo "session    optional   pam_xauth.so" >> /etc/pam.d/sudo

ssh, sudo

.bashrc에 추가

# access("/root/.Xauthority", R_OK)       = -1 ENOENT (No such file or directory)
export XAUTHORITY="/home/$USER/.Xauthority"

ssh, chroot, su

$ cp "/home/$USER/.Xauthority" "$newroot/home/$USER"
$ cp /etc/hosts "$newroot/etc"
$ sudo chroot "$newroot"
# su <USER> -
$ xmessage -center 'hello!'