本文注重配置記錄,chroot(jail)作用好處不再贅述。
本文分三部分講述:配置基本的chroot jail,nginx配置chroot jail,tomcat配置chrootjail。
1.配置基本的chroot jail
1.1.建立一個目錄,作為chroot jail的根目錄。
# mkdir /home/chroot/jail
1.2.使用ldd命令,找出你想在chroot jail中想啟動並執行命令的依賴庫。
# ldd /bin/bashlinux-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)
1.3.建立chroot jail根目錄的子檔案夾,你想在chroot下要啟動並執行東西需要什麼,就建立什麼,記住服務最小化原則。
# mkdir /home/chroot/jail/bin# mkdir /home/chroot/jail/lib64
1.4.拷貝二進位檔案(需要在chroot下啟動並執行)和依賴庫到chroot jail目錄下。
# 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
1.5.完成上面操作,就可以進chroot下查看了。
上述操作只是能再chroot下能運行bash,其他動作不可以。因而下列例子中的ls指令找不到
# chroot /home/chroot/jailbash-4.1# pwd/bash-4.1# lsbash: ls: command not foundbash-4.1# exitexit#
這裡只能運行一些內嵌的shell,比如pwd,但是其他指令不行,除非你將它的二進位檔案和相關依賴庫也拷進chroot jail中。
1.6.如果啟動某服務總是出錯,可以使用strace來查錯。在nginx配置最後會補充。
2.nginx配置chroot jail
nginx的安裝方式省略,就是下載tar.gz,解壓,configure,make,make install。。。
這裡配置針對CentOS6.x 64位系統。
2.1.指定chroot目錄,也就是1.1.中說的根目錄。
為命名規範統一,都做成以下目錄結構:
# D=/home/nginx/jail# mkdir -p $D
2.2.建立隔離環境,jail根目錄下的子目錄。
# 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
2.3.在$D/dev中建立需要的裝置,應該是緩衝區。
這裡使用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
2.4.拷貝所有的nginx檔案到jail中。
# /bin/cp -farv /usr/local/nginx/* $D/usr/local/nginx
2.5.拷貝依賴庫到jail中。(2.5與2.4相當於1.4中的過程)
# ldd /usr/local/nginx/sbin/nginx
需要什麼拷什麼,服務最小化。
2.6.拷貝/etc到jail。
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
2.7.啟動nginx。
如果有正在啟動並執行nginx,首先要關閉之:
# killall -9 nginx
在chroot中開啟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,再開啟:
# chroot /home/nginx/jail bash-4.1# /usr/local/nginx/sbin/nginx -tbash-4.1# /usr/local/nginx/sbin/nginx
將其配置為開機自啟:
# echo '/usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx' >> /etc/rc.local
編輯chroot中nginx的設定檔:
# cd /home/nginx/jail/usr/local/nginx/conf/# vi nginx.conf
儲存關閉後,測試並重啟nginx:
# /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
如果直接copy的chroot環境,nginx可能設定檔不識別,執行:
# /usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
再測試重啟nginx。
2.8.如果環境還是有問題,使用strace追蹤錯誤。(本方法配置tomcat或其他服務也試用,之後不再贅述)
# strace -f -o /tmp/nginx.strace chroot /nginx /usr/local/nginx/sbin/nginx -t
strace可能需要安裝。
執行完語句,會有一些追蹤,在/tmp/nginx.strace檔案中,會有更詳細的追蹤。
自己在配置環境時,就是子啊該檔案中發現,缺失了某個包,將其加入chroot jail中,啟動正常。
3.tomcat配置chroot jail
3.1.建立chroot jail根目錄。
# mkdir /home/tomcat/jail
3.2.建立chroot 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
3.3.安裝java環境,並拷貝root安裝的環境到chroot中。
# mkdir -p usr/java# cp -a /usr/java/jdk1.7.0_67 usr/java
3.4.尋找拷貝java的依賴庫
# ldd /usr/java/jdk1.7.0_67/bin/javalinux-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)
只拷貝上述4個lib64中的庫,另外還需要拷貝2個JVM需要的庫:
# cp -p /lib64/libm.so.6 lib64/# cp -p /lib64/libnsl.so.1 lib64/
3.5.在運行JVM之前,還需要做一些工作,使得chroot更像一個真實的root環境。
建立/dev和其中的子項:
# 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/
3.6.掛載/proc。
# mkdir -p /home/tomcat/jail/proc# mount -t proc proc /home/tomcat/jail/proc
這一步掛載完後,在chroot下就可以用java了,可以進入chroot通過以下命令測試:
bash-4.1# /usr/java/jdk1.7.0_67/bin/java -version
額。。前提是你已經將bash,sh在chroot中做了一份。或者這個3.x全部做完後,再此時也闊以噠~
3.7.添加其他需要檔案和依賴庫。
拷貝etc下的三個檔案,不需要的盡量不要拷,還是那句話。。服務最小化。。
cp -a /etc/{hosts,resolv.conf,nsswitch.conf} /home/tomcat/jail/etc/
還有三個命名支援的依賴庫需要拷貝
cp -p /lib64/libresolv.so.2 lib64/cp -p /lib64/libnss_dns.so.2 lib64/cp -p /lib64/libnss_files.so.2 lib64/
再將/bin/bash 和/bin/sh做到chroot中,參考1.x。其中sh在centos中是bash的一個軟串連。
在這一步後,java在chroot中就可以工作了,再出錯就用strace排錯。
java運行環境搭好後,開始配置tomcat。
3.8.tomcat安裝配置。
tomcat一般不需要安裝,算是綠化的吧,下載解壓包,在chroot jail目錄中解壓即可。
我直接壓縮在了jail根目錄。
嘗試運行,會有如下結果:
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 foundCannot find //bin/setclasspath.shThis file is needed to run this program
需要將uname和dirname兩個二進位檔案和依賴庫copy進來,做法與bash相同。
# cp /bin/uname bin/# mkdir usr/bin# cp /usr/bin/dirname usr/bin
在運行tomcat,發現還有一點小問題:
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 foundUsing CATALINA_BASE: /apache-tomcat-7.0.57Using CATALINA_HOME: /apache-tomcat-7.0.57Using CATALINA_TMPDIR: /apache-tomcat-7.0.57/tempUsing JRE_HOME: /usr/java/jdk1.7.0_67Using 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 foundTomcat started.
再添加這個幾個東西:
# cp -p /lib64/librt.so.1 lib64/# cp /usr/bin/tty usr/bin/# cp /bin/touch bin/
這樣,tomcat在chroot容器中可以正常運行了。
將其配置為開機自啟,在rc.local末尾追加:
export JAVA_HOME=/usr/local/java/jdk1.7.0_25export JRE_HOME=$JAVA_HOME/jremount -t proc proc /home/tomcat/jail/proc &>/dev/null/usr/sbin/chroot /home/tomcat/jail /usr/tomcat/bin/catalina.sh start
注意這個java路徑,root與chroot要一致。
參考文獻:
[1] 3.13 Configuring and Using Chroot Jails Chapter 3 Implementing Oracle Linux Security Guide for Release 6
[2] Linux nginx: Chroot (Jail) Setup By NIXCRAFT
[3] Tomcat: The Definitive Guide: The Definitive Guide By Jason Brittain, Ian F. Darwin
以上就介紹了nginx和tomcat使用chroot(jail)相關配置,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。