首頁 >後端開發 >php教程 >nginx和tomcat使用chroot(jail)相關配置

nginx和tomcat使用chroot(jail)相關配置

WBOY
WBOY原創
2016-08-08 09:32:411716瀏覽

本文著重配置記錄,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/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)

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/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 $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 -t
bash-4.1# /usr/local/nginx/sbin/nginx

將其配置為開機自啟:中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.conf
strace可能需要安裝。 執行完語句,會有一些追踪,在/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 -t 
3.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 tmp
3.3.安裝java環境,並拷貝root安裝的環境到chroot中。


# cp -a /etc/hosts etc/hosts
3.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教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn