pam_chroot PAM 모듈을 이용하여 Jail filesystem 구성하는 방법에 대하여 기술합니다.
RHEL 7, CentOS 7, 안녕 리눅스 3은 원격 접속시에 password-auth-sc를 이용하며, local에서 su 명령을 이용한 계정 전환시에는 system-auth-sc를 이용합니다. 그러므로, chroot를 적용하기 위해서는 이 두 파일을 모두 제어해 주어야 합니다.
원격 접속을 위하여 password-auth-sc의 session part 최상단에 required로 pam_chroot를 설정 합니다.
다음, jail 시킬 account를 /etc/security/chroot.conf에서 설정 합니다.
[root@an3 ~]$ cat /etc/security/chroot.conf# /etc/security/chroot.conf# format:## Expression CHROOTDIR## Expression has user or group. You can use regular expression on User, and# quoted with '/' (For example /^username$/). Group expression is use '%s'# character at first (For example %groupname)## If first byte is '!', it means chroot not user|group.# if first byte is '-', it means that don't chroot this user|group.## Configuration is Applied sequential## Users who start sma_ is chrooted with /home/sam# /^sam_/ /home/sam## sam account is chrooted with /home/sam# sam /home/sam## admin account is not chrooted.# -admin /home/nodir## If user is not admin group, chroot /home/chroot# !%admin /home/chroot## nobody group is chrooted with /home/nobody# %nobody /home/nobodyjk/chroot[root@an3 ~]$
안녕 리눅스의 pam_chroot 모듈은 RHEL/CentOS의 pam_chroot 모듈보다 더 많은 기능을 제공합니다.
상단 chroot.conf 의 주석에서 볼 수 있듯이 기존 RHEL의 모듈은
ACCOUNTCHROOT_DIR
의 형식 밖에 지원하지 않으나, 안녕 리눅스에서는 ACCOUNT 부분에 정규식, 그룹, 예외, reverse 지정이 가능 합니다.
# sam_me 계정은 Jail 하지 않음-sam_me/chroot# sam_ 로 시작하는 모든 계정을 /chroot에 Jail/^sam_//chroot# sam이 아닌 모든 계정을 /chroot에 Jail!sam/chroot# sam group을 /chroot에 Jail%sam/chroot
일단, 여기까지 설정을 하면 chroot가 동작을 합니다.
하지만, chroot를 하겠다는 것은 모든 경로를 chroot 시킨 디렉토리를 system root로 사용하겠다는 의미이므로, chroot directory에 기존의 file system과 실행 파일, library 등등이 존재해야 합니다.
다음의 script는 /chroot 디렉토리에 chroot 환경을 구성하는 script 입니다. 이 script를 구동하면 일단 chroot 환경에서 동작이 가능 합니다.
[root@an3 ~]$ cat chroot-installer.sh#!/bin/bash# Chroot installer# Copyright (c) 2016 JoungKyun.Kim <http://oops.org> all rights reserved# License by BSD 2-Clausechroot="/chroot"create_dir="bin dev home lib64 lib proc sbin var/tmp var/log usr"bind_dir="home var/log usr proc dev"root_bind="bin sbin lib64 lib"if [ "${chroot}"=""-o"${chroot}"="/" ]; thenecho"Invalid base chroot path \"${chroot}\""1>/dev/stderrexit1fimkdir-p ${chroot}case"$1"instart)mount|grep"${chroot}/usr">&/dev/null [ $? -eq0 ] &&echo"Aleady constructed chroot"&&exit1if [ !-d"${chroot}/tmp" ]; thenmkdir-p ${chroot}/tmpchmod1777 ${chroot}/tmpfifor cdir in ${create_dir}domkdir-p ${chroot}/${cdir} &>/dev/nulldonefor cbind in ${bind_dir}domount--bind/${cbind} ${chroot}/${cbind}donemount-obind/dev/pts ${chroot}/dev/ptsfor rbind in ${root_bind}domount-obind/usr/${rbind} ${chroot}/${rbind}donersync-av/etc/ ${chroot}/etc/>&/dev/nullrm-f ${chroot}/etc/shadow* ;;*)umount ${chroot}/dev/ptsfor cbind in ${root_bind} ${bind_dir}doumount ${chroot}/${cbind}done ;;esacexit0[root@an3 ~]$[root@an3 ~]$ bash ./chroot-installer.sh start[root@an3 ~]$ [ -f /chroot/bin/bash -a!-f"/chroot/etc/shadow" ] &&echo"Success"||echo"Failure"Success[root@an3 ~]$ bash ./chroot-installer.sh stop
chroot 환경을 구성하기 전에 상단의 chroot-installer.sh를 구동해 주면 /chroot에 Jail 환경을 구성해 주게 됩니다.
다만, 위의 script는 chroot 시에 동작을 할 수 있는 최소한의 환경이며, 용량 문제로 RW가 가능한 bind mount를 한 상태이기 때문에 100% Jail 시켰다고 할 수가 없습니다. 이 script를 기본으로 하여 dev, dev/pts, sys, proc를 제외한 나머지는 copy가 되어야지 정말 system jail을 구성했다고 할 수 있으니, 이 script를 기준으로 chroot Jail 환경을 구성하시기 바랍니다.