この記事は設定レコードに焦点を当てており、chroot (jail) の利点については詳しく説明しません。
この記事は 3 つの部分に分かれています: 基本的な chroot ジェイルの構成、nginx 用の chroot ジェイルの構成、Tomcat 用の chrootjail の構成。
1. 基本的な chroot ジェイルを設定します
1.1. chroot ジェイルのルート ディレクトリとしてディレクトリを作成します。
# 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のダウンロード、解凍、設定、メイク、インストール方法は省略しています。 。 。
この構成は 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
環境を構築しているときに、ファイルに特定のパッケージが欠落していることに気づき、それをchrootjailに追加したところ、正常に起動しました。
3. Tomcat で chroot ジェイルを設定します
3.1. chroot ジェイルのルート ディレクトリを作成します。
# 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/
/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/
# mkdir -p /home/tomcat/jail/proc # mount -t proc proc /home/tomcat/jail/proc
bash-4.1# /usr/java/jdk1.7.0_67/bin/java -version
cp -a /etc/{hosts,resolv.conf,nsswitch.conf} /home/tomcat/jail/etc/
また、名前付きサポートを備えた 3 つの依存ライブラリをコピーする必要があります
cp -p /lib64/libresolv.so.2 lib64/ cp -p /lib64/libnss_dns.so.2 lib64/ cp -p /lib64/libnss_files.so.2 lib64/
この手順の後、java は chroot で動作できるようになり、問題が発生した場合は strace を使用してトラブルシューティングを行います。
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 の実行中に、まだ小さな問題があることがわかりました:
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/
起動時に自動的に開始するように設定し、rc.local の最後に追加します:
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) Setup by NIXCRAFT
[3] Tomcat: The Definitive Guide: The Definitive Guide by Jason Brittain、Ian F. Darwin
上記は、chroot (jail) を使用した nginx と Tomcat の関連する設定を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。