使用脚本为tomcat 构建chroot non-root 环境

 最近为线上tomcat 构建chroot non-root环境,看了官方文档后,操作步骤还是不少。整个脚本以便批量创建,在这里对我当前的环境做个说明。关于脚本在使用过程中出现问题,请直接回复!

具体环境:  tomcat 6.0.3x+apr+apr-util+apr-iconv+jdk1.6+cronolog 

根据官方的建议,对jbchroot.c进行编译,获得jbchroot的可执行文件. 使用的好处是,它能够在chroot环境下,使用非root权限进行运行。在于lib64里库文件复制,可以参照物我的。我根据自己当前环境,添加了一下相应的文件。如 cp /usr/local/sbin/cronolog  usr/local/sbin 

脚本使用方法:   ./scriptname 后,输入chroot目录路径,以及tomcat解压后的目录环境。

脚本会根据你当前的系统环境变量进行jdk1.6目录复制。

关于脚本中提到的jbchroot.c 在这里可以复制保存并上传到/tmp目录下!

http://my.safaribooksonline.com/book/programming/java/0596003188/jbchrootdotc/tomcat-app-c

  
  
  
  
  1. #!/bin/bash -x 
  2. #used for create tomcat chroot 
  3. #myhat.blog.51cto.com 
  4. JAVA_HOME=/usr/local/jdk1.6 
  5.  
  6. while true 
  7. do 
  8.     read -p "please input your chroot directory :"  CHROOT 
  9.     read -p "please input tomcat direcotry :" TOM_PATH 
  10.     if [ "$CHROOT" = "" ];then 
  11.         echo "Your must input chroot directory" 
  12.         exit 1 
  13.     else 
  14.             test -e $CHROOT || mkdir $CHROOT 
  15.         if [ "$TOM_PATH" = "" ];then 
  16.             echo "Your must input tomcat directory" 
  17.             exit 1 
  18.         else 
  19.             test -e $TOM_PATH || mkdir $TOM_PATH 
  20.         fi 
  21.     fi 
  22.     break 
  23. done 
  24.      
  25.      
  26. #mkdir base dir 
  27. mkdir -p $CHROOT/chroot/usr/local/sbin/ 
  28. mkdir -p $CHROOT/chroot/{lib,lib64,etc,tmp,dev,usr,proc,bin} 
  29.  
  30. cd $CHROOT/chroot/ 
  31. chmod 755 etc dev usr  
  32. chmod 1777 tmp 
  33. #copy base file 
  34. cp -af /etc/hosts etc/ 
  35. cp -af /etc/resolv.conf etc/ 
  36. cp -af /etc/nsswitch.conf etc/ 
  37.  
  38. #command file  
  39. cp /bin/uname bin/ 
  40. mkdir -p usr/bin/ 
  41. mkdir -p usr/local/ 
  42. cp -f /usr/bin/dirname usr/bin/ 
  43. cp -f /usr/bin/tty usr/bin/ 
  44. cp -f /bin/touch bin/ 
  45. cp -f /bin/bash bin/ 
  46. ln -s /bin/bash bin/sh 
  47. cp /usr/local/sbin/cronolog  usr/local/sbin 
  48. #make dir and copy libs 
  49. cp -rva $JAVA_HOME $CHROOT/chroot/$JAVA_HOME 
  50. cd /lib64 
  51. for i in libpthread.so.0 ld-linux-x86-64.so.2  libc.so.6  libdl.so.2 libm.so.6 libnsl.so.1 libnss_dns.so.2 libnss_files.so.2  libresolv.so.2 librt.so.1 libtermcap.so.2 
  52. do 
  53. cp -p  $i  $CHROOT/chroot/lib64 
  54. done 
  55.  
  56. #make dev 
  57. mkdir -p $CHROOT/chroot/dev/pts 
  58. cd /dev 
  59. ./MAKEDEV -d $CHROOT/chroot/dev null random urandom zero loop* log console 
  60. cp -a MAKEDEV $CHROOT/chroot/dev 
  61. cp -a /dev/shm $CHROOT/chroot/dev 
  62. # make proc 
  63. mkdir -p $CHROOT/chroot/proc 
  64. mount -t proc proc $CHROOT/chroot/proc 
  65.  
  66. # test 
  67. chroot $CHROOT/chroot  $JAVA_HOME/bin/java -version  && echo "tomcat chroot env is ok" 
  68.  
  69. sleep 3 
  70. cp -r $TOM_PATH  $CHROOT/chroot/usr/local/ 
  71. # create user 
  72. id tomcat || useradd -M -s /sbin/nologin tomcat 
  73. chown tomcat.tomcat -R $CHROOT/chroot/usr/local/tomcat6.0 
  74. chown 755  $CHROOT/chroot/usr/local/tomcat6.0 
  75. cd  $CHROOT/chroot/usr/local/tomcat6.0 
  76. chown -R tomcat logs/ temp/ work/ webapps/ conf/ 
  77.  
  78. gcc -O /tmp/jbchroot.c -o  /usr/local/bin/jbchroot 
  79. chmod 755  /usr/local/bin/jbchroot  
  80. chown root.root /usr/local/bin/jbchroot  

在这里有一个地方需要注意:就是挂载proc文件,有时候机器发生重启,如果直接启动会导致tomcat 启动失败,并且在启动过程中不会有任何提示。如果有重启系统,请记得挂载proc文件。

在此写一个小脚本做备用:假定我使用的chroot目录为 /opt/chroot ,我的tomcat路径为/usr/local/tomcat6.0 

  
  
  
  
  1. #!/bin/bash  
  2. case $1 in 
  3. start) 
  4.     mount | grep /opt/chroot 
  5.     if [ "$?" != "0" ];then 
  6.         mount -t proc proc /opt/chroot/proc 
  7.     fi 
  8.     sleep 3 
  9.         /usr/local/bin/jbchroot -U tomcat -- /opt/chroot/ /bin/bash /usr/local/tomcat6.0/bin/startup.sh  
  10. ;; 
  11.  
  12. stop) 
  13.     if [ "$?" = "0" ];then 
  14.         umount /opt/chroot/proc 
  15.     fi 
  16.     kill -9 `ps aux | grep java| grep -v grep | awk '{print $2}'` 
  17. ;; 
  18. *) 
  19.     echo "USAGE:  {start|stop}" 
  20. ;; 
  21. esac 

 以上脚本均经过测试,修改后可以正常使用。 

 

  
  
  
  
  1. 使用以上脚本在建立完chroot环境后,运行很正常,但是面临另外一个问题: 
  2. a、tomcat 的输出日志里面有中文,会乱码;里面项目日志也同样会乱码! 
  3. 具体方法:修改tomcat配置 
  4. # vim /opt/chroot/usr/local/tomcat6.0/bin/catalina.sh  
  5. JAVA_OPTS="-Xms1536m -Xmx1536m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m" 
  6. JAVA_OPTS="$JAVA_OPTS -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.region=CN" 
  7. export JAVA_OPTS; 
  8. //解决了catalina.out里面的中文乱码 
  9.  
  10. 如果在项目里的中文乱码: 
  11. # cat /opt/chroot/usr/local/tomcat6.0/webapps/ccc/WEB-INF/classes/log4j.properties  
  12.  log4j.appender.ROLLING_FILE.encoding=UTF-8 

# ps aux |grep java
tomcat    6581 17.6 22.0 2392632 668824 pts/2  Sl   09:15   2:33 /usr/local/jdk1.6/bin/java -Djava.util.logging.config.file=/usr/local/tomcat6.0/conf/logging.properties -Xms1536m -Xmx1536m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.region=CN -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat6.0/endorsed -classpath /usr/local/tomcat6.0/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat6.0 -Dcatalina.home=/usr/local/tomcat6.0 -Djava.io.tmpdir=/usr/local/tomcat6.0/temp org.apache.catalina.startup.Bootstrap start

本文出自 “潜入技术的海洋” 博客,谢绝转载!

你可能感兴趣的:(tomcat,安全,chroot,自动脚本,non-root)