Centos7下使用非root用户运行tomcat
使用root用户启动tomcat有一个严重的问题,那就是tomcat具有root权限。这意味着你的任何一个页面脚本(html/js)都具有root权限,可以运行页面上的脚本,具有非常大的安全风险,所以强烈建议不要使用root启动tomcat。
创建以”tomcat”命名的用户和组
useradd -s /sbin/nologin -M tomcat
说明一下/nologin类型的用户,它是禁止登录系统,哪怕有了密码也不允许登录,但是它可以访问授权的资源,执行一些系统任务,刚好符合应用场景要求。
通过”id tomcat”可以查看创建结果
uid=1001(tomcat) gid=1001(tomcat) groups=1001(tomcat)
下载解压tomcat压缩包后,进入tomcat/bin目录,可以看到一个commons-daemon-native.tar.gz的压缩文件,此处直接使用解压命令解压到当前目录下。
tar -zxvf commons-daemon-native.tar.gz
进入这个解压目录,有一个unix和windows的目录,因我是在CentOS7上安装,因此进入unix目录,
[root@test commons-daemon-1.2.4-native-src]# ls
LICENSE.txt NOTICE.txt RELEASE-NOTES.txt unix windows
进入unix目录后,执行”./configure”,执行完成后会出现如下提示:
*** All done ***
Now you can issue "make"
此时可以执行”make”命令,结束后会生成一个名为”jsvc”的文件,将其复制到”tomcat/bin”目录,然后编辑目录下的”daemon.sh”文件,大概在第91行左右,有个”TOMCAT_USER=tomcat”的变量,这里默认用户就是”tomcat”,如果使用其它用户运行tomcat,则改成相应的用户名就可以。最后配置一下JDK的安装路径”JAVA_HOME=/usr/jdk1.8.0_172″即可。
91 test ".$TOMCAT_USER" = . && TOMCAT_USER=tomcat
92 # Set JAVA_HOME to working JDK or JRE
93 JAVA_HOME=/usr/jdk1.8.0_172
94 # If not set we'll try to guess the JAVA_HOME
95 # from java binary if on the PATH
赋于”daemon.sh”脚本的可执行权限
chmod a+x /opt/tomcat8/bin/daemon.sh
给”tomcat”用户及组授于可访问tomcat目录的权限
chown -R tomcat:tomcat /opt/tomcat8
设置完成后便可以通过”daemon.sh”脚本实现启动和停止tomcat了。
/opt/tomcat8/bin/daemon.sh start
/opt/tomcat8/bin/daemon.sh stop
启动tomcat后,会发现同时有2个tomcat进程,一个root用户,一个tomcat用户,使用jsvc来运行服务,没有了默认8005的shutdown端口; 主进程pid为1,fork 2个进程。Jsvc允许应用程序(例如Tomcat)以root身份执行某些特权操作(例如,绑定到端口<1024),然后将身份切换到非特权用户。使用root用户启动,然后降级为普通用户。Jsvc使用3个进程:启动进程,控制进程和受控进程。
受控进程:也是主要的Java线程,如果JVM崩溃,控制器将在下一分钟内重新启动它。 控制进程:Jsvc是一个守护进程,因此它应该以root用户身份启动,并且-user参数允许降级为未经授权的用户,当使用-wait参数时,启动程序进程将等待,直到控制器显示“我准备好”,否则在创建控制器进程后返回。