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!'