本文著重配置記錄,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 #這裡只能執行一些內嵌的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 $D2.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
這裡使用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到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
如果有正在運行的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,再開啟:
# 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儲存關閉後,測試並重啟nginx:
# cd /home/nginx/jail/usr/local/nginx/conf/ # vi nginx.conf如果直接copy的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 -s reload再測試重啟nginx。 2.8.如果環境還是有問題,使用strace追蹤錯誤。 (本方法配置tomcat或其他服務也試用,之後不再贅述)
# /usr/sbin/chroot /home/nginx/jail /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confstrace可能需要安裝。 執行完語句,會有一些追踪,在/tmp/nginx.strace檔案中,會有更詳細的追蹤。
自己在設定環境時,就是子啊該檔案中發現,缺失了某個套件,將其加入chroot jail中,啟動正常。
3.tomcat設定chroot jail
3.1.建立chroot jail根目錄。
# strace -f -o /tmp/nginx.strace chroot /nginx /usr/local/nginx/sbin/nginx -t3.2.建立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 tmp3.3.安裝java環境,並拷貝root安裝的環境到chroot中。
# cp -a /etc/hosts etc/hosts3.4.查找拷貝java的依賴庫
# mkdir -p usr/java # cp -a /usr/java/jdk1.7.0_67 usr/java只拷貝上述4個lib64中的庫,另外還需要拷貝2個JVM需要的庫:
# 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)3.5.在運行JVM之前,還需要在運行JVM一些工作,使得chroot更像一個真實的root環境。
建立/dev和其中的子項:
# cp -p /lib64/libm.so.6 lib64/ # cp -p /lib64/libnsl.so.1 lib64/
3.6.掛載/proc。
# 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額。 。前提是你已經將bash,sh在chroot中做了一份。或是這個3.x全部做完後,再此時也闊以喲~
3.7.加入其他需要檔案和相依函式庫。
拷貝etc下的三個文件,不需要的盡量不要拷,還是那句話。 。服務最小化。 。
bash-4.1# /usr/java/jdk1.7.0_67/bin/java -version還有三個命名支援的依賴函式庫需要拷貝
cp -a /etc/{hosts,resolv.conf,nsswitch.conf} /home/tomcat/jail/etc/再將/bin/bash 和/bin/sh做到chroot中,參考1.x。其中sh在centos中是bash的一個軟連結。
在這一步後,java在chroot中就可以工作了,再出錯就用strace排錯。
java運作環境搭好後,開始設定tomcat。
3.8.tomcat安裝配置。
tomcat一般不需要安裝,算是綠化的吧,下載解壓縮包,在chroot jail目錄中解壓縮即可。
我直接壓縮在jail根目錄了。
嘗試運行,會有以下結果:
cp -p /lib64/libresolv.so.2 lib64/ cp -p /lib64/libnss_dns.so.2 lib64/ cp -p /lib64/libnss_files.so.2 lib64/需要將uname和dirname兩個二進位檔案和依賴函式庫copy進來,做法與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在運行tomcat,發現還有一點小問題:
# cp /bin/uname bin/ # mkdir usr/bin # cp /usr/bin/dirname usr/bin再加入這個幾個東西:
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.
這樣,tomcat在chroot容器中可以正常運作了。
將其配置為開機自啟,在rc.local末尾追加:
# cp -p /lib64/librt.so.1 lib64/ # cp /usr/bin/tty usr/bin/ # cp /bin/touch bin/注意這個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教程有興趣的朋友有所幫助。