非root用户tomcat daemon配置

基于安全策略来考虑,绝大多数应用程序都应以非root用户来启动,对于轻量级的应用程序,如tomcat,用root再寻常不过了。你懂的,方便啊。在生产环境这么干很容易被攻击者通过脚本干太多的事情了。因此生产环境就还是麻烦一点吧,使用非root用户来启动。本文演示了基于非root用户启动tomcat,同时将其作为一个daemon服务随服务器自启动。

一、演示环境描述

OS及tomcat版本
  [root@node132 ~]# more /etc/redhat-release
  CentOS release 6.7 (Final)
  [root@node132 ~]# /usr/local/tomcat/bin/catalina.sh version
  Using CATALINA_BASE: /usr/local/tomcat
  Using CATALINA_HOME: /usr/local/tomcat
  Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  Using JRE_HOME: /usr/local/src/jdk1.7.0_79
  Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  Server version: Apache Tomcat/7.0.69
  Server built: Apr 11 2016 07:57:09 UTC
  Server number: 7.0.69.0
  OS Name: Linux
  OS Version: 2.6.32-573.el6.x86_64
  Architecture: amd64
  JVM Version: 1.7.0_79-b15
  JVM Vendor: Oracle Corporation

Java环境变量
  [root@node132 ~]# env|grep JAVA
  JAVA_HOME=/usr/local/src/jdk1.7.0_79

二、配置tomcat daemon服务及自启动

添加tomcat用户及组
  [root@node132 ~]# groupadd tomcat
  [root@node132 ~]# useradd -s /sbin/nologin -g tomcat tomcat
  [root@node132 ~]# usermod -L tomcat

配置启动脚本
  [root@node132 ~]# cd /usr/local/tomcat/bin/
  [root@node132 bin]# tar -xf commons-daemon-native.tar.gz
  [root@node132 bin]# cd commons-daemon-1.0.15-native-src/unix/
  [root@node132 unix]# ./configure --with-java=/usr/local/src/jdk1.7.0_79
  [root@node132 unix]# make
  [root@node132 unix]# cp jsvc /usr/local/tomcat/bin/.

  [root@node132 bin]# vim daemon.sh
  #!/bin/sh

  #chkconfig: 235 80 20 ##当前行开始添加下列行
  #description:tomcatd

  JAVA_HOME=/usr/local/src/jdk1.7.0_79 ##Author : Leshami
  CATALINA_HOME=/usr/local/tomcat ##Blog : http://blog.csdn.net/leshami
  TOMCAT_USER=tomcat

  #ARG0="$0" ##注释此行,用下一行替换
  ARG0=/usr/local/tomcat

配置自启动
  [root@node132 bin]# cp daemon.sh /etc/init.d/tomcatd
  [root@node132 bin]# chkconfig --add tomcatd
  [root@node132 bin]# chkconfig tomcatd on

  [root@node132 bin]# chown -R tomcat:tomcat /usr/local/tomcat
  [root@node132 bin]# /etc/init.d/tomcatd start

  [root@node132 local]# ss -nltp|grep jsvc
  LISTEN 0 100 :::8009 :::* users:(("jsvc",15942,45))
  LISTEN 0 100 :::8080 :::* users:(("jsvc",15942,44))

  [root@node132 local]# ps -ef|grep tomcat
  root 16293 1 0 17:10 ? 00:00:00 jsvc.exec -java-home /usr/local/..
  tomcat 16294 16293 2 17:10 ? 00:00:02 jsvc.exec -java-home /usr/local/..

测试
  [root@node132 local]# curl -I http://localhost:8080
  HTTP/1.1 200 OK
  Server: Apache-Coyote/1.1
  Content-Type: text/html;charset=ISO-8859-1
  Transfer-Encoding: chunked
  Date: Thu, 02 Nov 2017 07:35:08 GMT

三、基于su命令实现非root非daemon方式

直接使用su - tomcat方式来实现非root用户运行tomcat程序

  [root@node132 ~]# vim /etc/init.d/tomcat
  #!/bin/sh
  # Tomcat init script for Linux.
  #
  # chkconfig: 2345 96 14
  # description: The Apache Tomcat servlet/JSP container.
  JAVA_HOME=/usr/java/latest
  CATALINA_HOME=/usr/local/tomcat-su
  export JAVA_HOME CATALINA_HOME
  su - tomcat -c "exec $CATALINA_HOME/bin/catalina.sh $*" ##关键是这行

  [root@node132 ~]# /etc/init.d/tomcat start ##需要解锁账户
  This account is currently not available.

  [root@node132 ~]# usermod -U -s /bin/bash tomcat
  usermod: unlocking the user's password would result in a passwordless account.
  You should set a password with usermod -p to unlock this user's password.
  [root@node132 ~]# /etc/init.d/tomcat start
  Using CATALINA_BASE: /usr/local/tomcat
  Using CATALINA_HOME: /usr/local/tomcat
  Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  Using JRE_HOME: /usr/local/src/jdk1.7.0_79
  Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:
  Tomcat started.

  [root@node132 ~]# ps -ef|grep tomcat
  tomcat 16600 1 69 17:25 ? 00:00:02 /usr/local/src/jdk1.7

  [root@node132 ~]# curl -I http://localhost:8080
  HTTP/1.1 200 OK
  Server: Apache-Coyote/1.1
  Content-Type: text/html;charset=ISO-8859-1
  Transfer-Encoding: chunked
  Date: Thu, 02 Nov 2017 09:20:54 GMT

四、基于sudo命令实现非root非daemon方式

  [root@node132 ~]# sudo su - tomcat /usr/local/tomcat/bin/catalina.sh start
  Using CATALINA_BASE: /usr/local/tomcat
  Using CATALINA_HOME: /usr/local/tomcat
  Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  Using JRE_HOME: /usr/local/src/jdk1.7.0_79
  Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  Tomcat started.
  [root@node132 ~]# ps -ef|grep tomcat
  tomcat 16523 1 64 17:24 pts/0 00:00:02 /usr/local/src/jdk1.7.0_79/bin....

五、三种方式比较

  daemon 方式可以实现自启动,安全度高,即账号可以锁定,配置nologin,但是会多启动一个进程   su及sudo方式大同小异,两者都需要账号为启用状态,少一个进程   三种方式中,都需要将tomcat其下相关目录的所有者设定为tomcat用户及其对应的属组

参考链接 http://tomcat.apache.org/tomcat-7.0-doc/setup.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏醉梦轩

编译可用的Android模拟器ranchu内核

53330
来自专栏黑白安全

Windows下更改Mac地址

在桌面上的“网上邻居”图标上单击右键,选择“属性”,在弹出的“网络连接”的对话框中,在“本地连接”图标上单击右键,选择“属性”,会弹出一个“本地连接属性”的对话...

24030
来自专栏葡萄城控件技术团队

Web API 持续集成:PostMan+Newman+Jenkins(图文讲解)

上篇文章我们已经完成了API测试工具选型,接下来是一系列周期性的开发测试过程:接口开发、检出代码、运行测试、记录结果、发送报告。为了快速发现问题,并减少重复过程...

21520
来自专栏向治洪

android守护进程

Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务。而一些安全软件,如360等,会有结束...

36680
来自专栏xingoo, 一个梦想做发明家的程序员

Tomcat 6 --- 你很少使用的安全管理SecurityManager

试想一下,如果你的JSP页面中包含一句代码“System.exit(1);”,你的web应用访问到该JSP时,会发生什么? 一般使用tomcat可能都没有注...

27270
来自专栏测试驿栈

Jmeter(二十一)_脚本参数化与内存溢出的解决方案

首先准备你的参数数据。我在bin/data中新建了一个dat文件,记事本另存为修改编码为UTF-8,注意用户名和密码是一一对应的,用英文逗号隔开

16430
来自专栏HaHack

Write a Tiny Shell-based Test Framework

12340
来自专栏Linyb极客之路

tomcat cpu暴涨的原因之一及其解决方法

当你使用tomcat部署web系统时,过了一段时间发现cpu暴涨,你不防试试下面的方法,看看是否程序内的死循环导致cpu暴涨。 第一步:增加tomcat监控...

10610
来自专栏IT技术精选文摘

JTA深度历险-原理与实现

在 J2EE 应用中,事务是一个不可或缺的组件模型,它保证了用户操作的 ACID(即原子、一致、隔离、持久)属性。对于只操作单一数据源的应用,可以通过本地资源接...

21250
来自专栏挖坑填坑

使用typescript开发angular模块(发布npm包)

20520

扫码关注云+社区

领取腾讯云代金券