이 글은 구성 기록에 중점을 두고 있으며 chroot(jail)의 이점에 대해서는 자세히 설명하지 않습니다.
이 문서는 기본 chroot Jail 구성, nginx용 chroot Jail 구성, Tomcat용 chrootjail 구성의 세 부분으로 나누어져 있습니다.
1. 기본 chroot Jail을 구성합니다.
1.1 chroot Jail의 루트 디렉터리를 생성합니다.
# mkdir /home/chroot/jail
# ldd /bin/bash linux-vdso.so.1 => (0x00007fff56fcc000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003ad1200000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003abe600000) libc.so.6 => /lib64/libc.so.6 (0x0000003abe200000) /lib64/ld-linux-x86-64.so.2 (0x0000003abde00000)
# mkdir /home/chroot/jail/bin # mkdir /home/chroot/jail/lib64
# cp /bin/bash /home/chroot/jail/bin # cp /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} \ /home/chroot/jail/lib64
위 작업은 chroot에서만 bash를 실행할 수 있으며 다른 작업은 불가능합니다. 따라서 다음 예의 ls 명령을 찾을 수 없습니다
# chroot /home/chroot/jail bash-4.1# pwd / bash-4.1# ls bash: ls: command not found bash-4.1# exit exit #
1.6. 특정 서비스를 시작할 때 항상 오류가 발생하는 경우 strace를 사용하여 오류를 확인할 수 있습니다. nginx 구성이 끝나면 추가됩니다.
2.nginx 구성 chrootjail
nginx 설치 방법은 생략하고 tar.gz를 다운로드하고 unzip, 구성, 만들다, 설치하다 . . .
이 구성은 CentOS6.x 64비트 시스템용입니다.
2.1.1.1에서 언급한 루트 디렉터리인 chroot 디렉터리를 지정합니다.
명명 규칙을 통일하기 위해 다음과 같은 디렉터리 구조가 만들어집니다.
# D=/home/nginx/jail # mkdir -p $D
# mkdir -p $D/etc # mkdir -p $D/dev # mkdir -p $D/var # mkdir -p $D/usr # mkdir -p $D/usr/local/nginx # mkdir -p $D/tmp # chmod 1777 $D/tmp # mkdir -p $D/var/tmp # chmod 1777 $D/var/tmp # mkdir -p $D/lib64
여기에서 mknod 명령을 사용하여 캐시 파일을 만듭니다.
# /bin/mknod -m 0666 $D/dev/null c 1 3 # /bin/mknod -m 0666 $D/dev/random c 1 8 # /bin/mknod -m 0444 $D/dev/urandom c 1 9
# /bin/cp -farv /usr/local/nginx/* $D/usr/local/nginx
# ldd /usr/local/nginx/sbin/nginx
2.6. /etc를 감옥에 복사합니다.
nixCraft 튜토리얼에서는 nginx가 실행될 때 사용해야 하는 이러한 사항을 구체적으로 지적합니다.
# cp -fv /etc/{group,prelink.cache,services,adjtime,shells,gshadow,shadow,hosts.deny,localtime,nsswitch.conf,nscd.conf,prelink.conf,protocols,hosts,passwd,ld.so.cache,ld.so.conf,resolv.conf,host.conf} $D/etc
# cp -avr /etc/{ld.so.conf.d,prelink.conf.d} $D/etc
nginx가 실행 중이면 먼저 닫으세요.
# killall -9 nginx
# /usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx -t # /usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx
# chroot /home/nginx/jail bash-4.1# /usr/local/nginx/sbin/nginx -t bash-4.1# /usr/local/nginx/sbin/nginx
# echo '/usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx' >> /etc/rc.local
# cd /home/nginx/jail/usr/local/nginx/conf/ # vi nginx.conf
# /usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx -t # /usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx -s reload
# /usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# strace -f -o /tmp/nginx.strace chroot /nginx /usr/local/nginx/sbin/nginx -t
환경을 구성하다가 파일에 특정 패키지가 누락된 것을 발견하여 chroot Jail에 추가하고 정상적으로 시작하였습니다.
3. Tomcat은 chroot Jail을 구성합니다.
3.1 chroot Jail 루트 디렉터리를 만듭니다.
# mkdir /home/tomcat/jail
# cd /home/tomcat/jail # mkdir -p lib lib64 etc tmp dev usr # chmod 755 etc dev usr # chmod 1777 tmp
# cp -a /etc/hosts etc/hosts
# mkdir -p usr/java # cp -a /usr/java/jdk1.7.0_67 usr/java
# ldd /usr/java/jdk1.7.0_67/bin/java linux-vdso.so.1 => (0x00007fff532d1000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc36c8f2000) libjli.so => /usr/java/jdk1.7.0_67/bin/../lib/amd64/jli/libjli.so (0x00007fc36c6da000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fc36c4d6000) libc.so.6 => /lib64/libc.so.6 (0x00007fc36c142000) /lib64/ld-linux-x86-64.so.2 (0x00007fc36cb17000)
# cp -p /lib64/libm.so.6 lib64/ # cp -p /lib64/libnsl.so.1 lib64/
# cd /home/tomcat/jail # mkdir -p /home/tomcat/jail/dev/pts # /dev/MAKEDEV -d /home/tomcat/jail/dev null random urandom zero loop* log console # cp /dev/MAKEDEV /home/tomcat/jail/dev # cp -a /dev/shm /home/tomcat/jail/dev/
이 단계가 마운트되면 chroot에서 java를 사용할 수 있습니다. chroot를 입력하고 다음 명령으로 테스트할 수 있습니다.
# mkdir -p /home/tomcat/jail/proc # mount -t proc proc /home/tomcat/jail/proc
어. . 전제는 chroot에 bash와 sh의 복사본을 이미 만들었다는 것입니다. 아니면 3을 모두 마친 후에.
bash-4.1# /usr/java/jdk1.7.0_67/bin/java -version
복사해야 하는 명명된 지원이 있는 세 개의 종속 라이브러리가 있습니다.
cp -a /etc/{hosts,resolv.conf,nsswitch.conf} /home/tomcat/jail/etc/
이 단계 후에 Java는 chroot에서 작동할 수 있습니다. 문제가 발생하면 strace를 사용하여 문제를 해결하세요.
cp -p /lib64/libresolv.so.2 lib64/ cp -p /lib64/libnss_dns.so.2 lib64/ cp -p /lib64/libnss_files.so.2 lib64/
3.8.tomcat 설치 구성.
Tomcat은 일반적으로 설치할 필요가 없습니다. 압축 해제 패키지를 다운로드하여 chroot Jail 디렉토리에 압축을 풉니다.
Jail 루트 디렉토리에 직접 압축했습니다.
실행을 시도하면 다음과 같은 결과가 나타납니다.
두 개의 바이너리 파일 uname과 dirname과 종속 라이브러리를 복사해야 합니다. 방법은 bash와 동일합니다.bash-4.1# /apache-tomcat-7.0.57/bin/catalina.sh start /apache-tomcat-7.0.57/bin/catalina.sh: line 102: uname: command not found /apache-tomcat-7.0.57/bin/catalina.sh: line 122: dirname: command not found Cannot find //bin/setclasspath.sh This file is needed to run this program
# cp /bin/uname bin/ # mkdir usr/bin # cp /usr/bin/dirname usr/bin
좋아요 이를 통해 Tomcat은 chroot 컨테이너에서 정상적으로 실행될 수 있습니다.
bash-4.1# /apache-tomcat-7.0.57/bin/catalina.sh start /apache-tomcat-7.0.57/bin/catalina.sh: line 203: tty: command not found Using CATALINA_BASE: /apache-tomcat-7.0.57 Using CATALINA_HOME: /apache-tomcat-7.0.57 Using CATALINA_TMPDIR: /apache-tomcat-7.0.57/temp Using JRE_HOME: /usr/java/jdk1.7.0_67 Using CLASSPATH: /apache-tomcat-7.0.57/bin/bootstrap.jar:/apache-tomcat-7.0.57/bin/tomcat-juli.jar /apache-tomcat-7.0.57/bin/catalina.sh: line 368: touch: command not found Tomcat started.
# cp -p /lib64/librt.so.1 lib64/ # cp /usr/bin/tty usr/bin/ # cp /bin/touch bin/
export JAVA_HOME=/usr/local/java/jdk1.7.0_25 export JRE_HOME=$JAVA_HOME/jre mount -t proc proc /home/tomcat/jail/proc &>/dev/null /usr/sbin/chroot /home/tomcat/jail /usr/tomcat/bin/catalina.sh start
[1] 3.13 Chroot Jail 구성 및 사용 3장 릴리스 6용 Oracle Linux 보안 가이드 구현 [2] Linux nginx: Chroot(Jail) 설정 작성자: NIXCRAFT [3] Tomcat: 최종 가이드: 최종 가이드 작성자: Jason Brittain, Ian F. Darwin
위 내용은 관련 내용을 포함하여 chroot(jail)를 사용한 nginx와 tomcat의 관련 구성을 소개하고 있어 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.