실습> ssh의 chroot 기능을 이용하여 보안을 좀더 강화해보자.
!!! 참고 : http://www.digimoon.net/blog/343 !!!
1. chroot 기능 비활성화 테스트
2. chroot 설정을 위한 설정파일 변경
3. chroot 설정을 위한 시스템환경 세팅
4. chroot 설정을 위한 시스템 바이너리 복사
5. chroot 설정을 위한 라이브러리 세팅
6. chroot 기능 활성화 테스트
7. 부팅시 chroot 기능을 활성화
8. bash 프롬프트 변경하기
1. chroot 기능 비활성화 테스트
# ssh sysadmin@localhost
$ cd /
$ ls
bin dev home lost+found misc net proc sbin srv tmp var
boot etc lib media mnt opt root selinux sys usr
$ cd etc
$ tail passwd
squid:x:23:23::/var/spool/squid:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
:
:
2. chroot 설정을 위한 설정파일 변경
# vi /etc/ssh/sshd_config
-- /etc/ssh/sshd_config --
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group chrootusers <-- chroot 에 적용할 그룹 설정
ChrootDirectory /chroot <-- /chroot 디렉토리 설정
-- /etc/ssh/sshd_config --
# /etc/init.d/sshd restart
3. chroot 설정을 위한 시스템환경 세팅
5. chroot 설정을 위한 라이브러리 세팅
!!! 아래 Tree 구조로 세팅
/chroot
|-- bin -- /bin 명령어 복사 ls, bash, sh ...
|-- dev -- zero, null 생성
|-- etc -- profile, bashrc 복사
|-- home -- /home mount
|-- lib -- /lib mount
|-- tmp -- /tmp mount
|-- usr
| |-- bin -- /usr/bin 명령어 복사 id, vim ...
| `-- lib -- /usr/lib mount
`-- var -- X
# groupadd chrootusers
# mkdir /chroot (drwxr-xr-x => drwx--x--x)
# cd /chroot
# mkdir bin etc dev home lib usr tmp var
# mkdir usr/lib
# mkdir usr/bin
# mount --bind /home /chroot/home
# mount --bind /lib /chroot/lib
# mount --bind /usr/lib /chroot/usr/lib
# mount
:
/home on /chroot/home type none (rw,bind) <-- 확인
/lib on /chroot/lib type none (rw,bind) <-- 확인
/usr/lib on /chroot/usr/lib type none (rw,bind) <-- 확인
# mknod -m 666 /chroot/dev/null c 1 3
# mknod -m 666 /chroot/dev/zero c 1 5
4. chroot 설정을 위한 시스템 바이너리 복사
# cd /chroot/bin
# cp -a /bin/bash .
# ln -s bash sh
# cp -a /bin/ls .
# cp -a /bin/rm .
# cp -a /bin/mv .
# cp -a /bin/grep .
# cp -a /bin/awk .
# cp -a /bin/vi .
:
:
# cd /chroot/usr/bin
# cp -a /usr/bin/id .
# cp -a /usr/bin/vim .
:
:
6. chroot 기능 활성화 테스트
# useradd -g chrootusers chrootuser1
# echo 1234 | passwd --stdin chrootuser1
-- chrootuser1 로 로그인 --
df / ps / vi <-- command not found 가 나오면 성공!!!
# ssh chrootuser1@localhost
Password:
-bash-3.2$ id
-bash: id: command not found
-bash-3.2$ ps
-bash: ps: command not found
-bash-3.2$ vi
-bash: vi: command not found
-bash-3.2$ ls
bin dev etc home lib tmp usr var
-bash-3.2$ pwd
/
-bash-3.2$ ls /bin
bash ls mv rm
7. 부팅시 chroot 기능을 활성화
# echo 'mount --bind /home /chroot/home' >> /etc/rc.local
# echo 'mount --bind /home2 /chroot/home2' >> /etc/rc.local
# echo 'mount --bind /lib /chroot/lib' >> /etc/rc.local
# echo 'mount --bind /usr/lib /chroot/usr/lib' >> /etc/rc.local
# cat /etc/rc.local
-- /etc/rc.local --
:
:
mount --bind /home /chroot/home
mount --bind /home2 /chroot/home2
mount --bind /lib /chroot/lib
mount --bind /usr/lib /chroot/usr/lib
-- /etc/rc.local --
# reboot
8. bash 프롬프트 변경하기
-bash-3.2$ ->
# cp /etc/profile /chroot/etc <-- 그냥 쓰면 에러 발생
# cp /etc/bashrc /chroot/etc <-- 그냥 쓰면 에러 발생
# vi /chroot/etc/profile <-- 참고로 필요한 것만 남기고 모두 삭제
-- /chroot/etc/profile --
ulimit -S -c 0 > /dev/null 2>&1
HOSTNAME=`/bin/hostname`
HISTSIZE=1000
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
INPUTRC=/etc/inputrc
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
-- /chroot/etc/profile --
# cp -a /etc/inputrc /chroot/etc/inputrc
# vi /chroot/etc/bashrc <-- 참고로 필요한 것만 남기고 모두 삭제
-- /chroot/etc/bashrc --
shopt -s checkwinsize
PS1="[ssh@\h \W]\\$ "
umask 002
-- /chroot/etc/bashrc --
# ssh chrootuser@localhost
$ pwd
$ id
$ ls /bin
# telnet localhost 22
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
SSH-2.0-OpenSSH_4.3 <-- 보안상 버전정보는 감춘다.