login account chroot
pam_chroot PAM 모듈을 이용하여 Jail filesystem 구성하는 방법에 대하여 기술합니다.
RHEL 7, CentOS 7, 안녕 리눅스 3은 원격 접속시에 password-auth-sc를 이용하며, local에서 su 명령을 이용한 계정 전환시에는 system-auth-sc를 이용합니다. 그러므로, chroot를 적용하기 위해서는 이 두 파일을 모두 제어해 주어야 합니다.
원격 접속을 위하여 password-auth-sc의 session part 최상단에 requiredpam_chroot를 설정 합니다.
1
[[email protected] ~]$ cat /etc/pam.d/password-auth-sc
2
** 상략 **
3
4
session required pam_chroot.so debug
5
session optional pam_keyinit.so revoke
6
session required pam_limits.so
7
-session optional pam_systemd.so
8
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
9
session required pam_unix.so
Copied!
다음, LOCAL에서의 계정 전환(su)를 위하여 system-auth-sc의 session part 최상단에 requiredpam_chroot를 설정 합니다.
1
[[email protected] ~]$ cat /etc/pam.d/system-auth-sc
2
** 상략 **
3
4
session required pam_chroot.so debug
5
session optional pam_keyinit.so revoke
6
session required pam_limits.so
7
-session optional pam_systemd.so
8
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
9
session required pam_unix.so
Copied!
다음, jail 시킬 account를 /etc/security/chroot.conf에서 설정 합니다.
1
[[email protected] ~]$ cat /etc/security/chroot.conf
2
# /etc/security/chroot.conf
3
# format:
4
#
5
# Expression CHROOTDIR
6
#
7
# Expression has user or group. You can use regular expression on User, and
8
# quoted with '/' (For example /^username$/). Group expression is use '%s'
9
# character at first (For example %groupname)
10
#
11
# If first byte is '!', it means chroot not user|group.
12
# if first byte is '-', it means that don't chroot this user|group.
13
#
14
# Configuration is Applied sequential
15
#
16
# Users who start sma_ is chrooted with /home/sam
17
# /^sam_/ /home/sam
18
#
19
# sam account is chrooted with /home/sam
20
# sam /home/sam
21
#
22
# admin account is not chrooted.
23
# -admin /home/nodir
24
#
25
# If user is not admin group, chroot /home/chroot
26
# !%admin /home/chroot
27
#
28
# nobody group is chrooted with /home/nobody
29
# %nobody /home/nobody
30
31
jk /chroot
Copied!
안녕 리눅스의 pam_chroot 모듈은 RHEL/CentOS의 pam_chroot 모듈보다 더 많은 기능을 제공합니다.
상단 chroot.conf 의 주석에서 볼 수 있듯이 기존 RHEL의 모듈은
1
ACCOUNT CHROOT_DIR
Copied!
의 형식 밖에 지원하지 않으나, 안녕 리눅스에서는 ACCOUNT 부분에 정규식, 그룹, 예외, reverse 지정이 가능 합니다.
1
# sam_me 계정은 Jail 하지 않음
2
-sam_me /chroot
3
4
# sam_ 로 시작하는 모든 계정을 /chroot에 Jail
5
/^sam_/ /chroot
6
7
# sam이 아닌 모든 계정을 /chroot에 Jail
8
!sam /chroot
9
10
# sam group을 /chroot에 Jail
11
%sam /chroot
Copied!
일단, 여기까지 설정을 하면 chroot가 동작을 합니다.
하지만, chroot를 하겠다는 것은 모든 경로를 chroot 시킨 디렉토리를 system root로 사용하겠다는 의미이므로, chroot directory에 기존의 file system과 실행 파일, library 등등이 존재해야 합니다.
다음의 script는 /chroot 디렉토리에 chroot 환경을 구성하는 script 입니다. 이 script를 구동하면 일단 chroot 환경에서 동작이 가능 합니다.
1
[[email protected] ~]$ cat chroot-installer.sh
2
#!/bin/bash
3
4
# Chroot installer
5
# Copyright (c) 2016 JoungKyun.Kim <http://oops.org> all rights reserved
6
# License by BSD 2-Clause
7
8
chroot="/chroot"
9
create_dir="bin dev home lib64 lib proc sbin var/tmp var/log usr"
10
bind_dir="home var/log usr proc dev"
11
root_bind="bin sbin lib64 lib"
12
13
if [ "${chroot}" = "" -o "${chroot}" = "/" ]; then
14
echo "Invalid base chroot path \"${chroot}\"" 1> /dev/stderr
15
exit 1
16
fi
17
18
19
mkdir -p ${chroot}
20
21
case "$1" in
22
start)
23
mount | grep "${chroot}/usr" >& /dev/null
24
[ $? -eq 0 ] && echo "Aleady constructed chroot" && exit 1
25
26
if [ ! -d "${chroot}/tmp" ]; then
27
mkdir -p ${chroot}/tmp
28
chmod 1777 ${chroot}/tmp
29
fi
30
31
for cdir in ${create_dir}
32
do
33
mkdir -p ${chroot}/${cdir} &> /dev/null
34
done
35
36
for cbind in ${bind_dir}
37
do
38
mount --bind /${cbind} ${chroot}/${cbind}
39
done
40
mount -o bind /dev/pts ${chroot}/dev/pts
41
42
for rbind in ${root_bind}
43
do
44
mount -o bind /usr/${rbind} ${chroot}/${rbind}
45
done
46
47
rsync -av /etc/ ${chroot}/etc/ >& /dev/null
48
rm -f ${chroot}/etc/shadow*
49
50
;;
51
*)
52
umount ${chroot}/dev/pts
53
for cbind in ${root_bind} ${bind_dir}
54
do
55
umount ${chroot}/${cbind}
56
done
57
;;
58
esac
59
60
exit 0
62
[[email protected] ~]$ bash ./chroot-installer.sh start
63
[[email protected] ~]$ [ -f /chroot/bin/bash -a ! -f "/chroot/etc/shadow" ] && echo "Success" || echo "Failure"
64
Success
65
[[email protected] ~]$ bash ./chroot-installer.sh stop
Copied!
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 환경을 구성하시기 바랍니다.
Last modified 2yr ago
Copy link