用非root用户启动tomcat进程

使用非root用户启动进程是运维安全的一个主要环节,拿tomcat进程来说,如果是使用root用户去启动了tomcat,那么有一个严重的问题,那就是tomcat具有root权限。这意味着你的任何一个jsp脚本都具有root权限,所以那些不怀好意的人可以轻易地用jsp脚本去搞破坏,甚至删除你整个硬盘里的东西!所以为了活着,我们要极力避免这种现象。很多的软件都自带的用户/用户组,比如nginx、zabbix、elasticsearch,但是也有很多的软件没有这么贴心的服务,这就需要我们手动的更改了。

使用非root用户启动tomcat

以tomcat为例,打算用chris账号(属于chen这个group)启动。那么首先先创建账号和组,如下:

1
2
3
4
5
[root@chen-docker ~]groupadd chen    #创建chen这个组
[root@chen-docker ~]useradd -s /bin/bash -g chen chris #在这个组里面添加chris这个用户
[root@chen-docker ~]passwd chris #给这个用户设定密码
[root@chen-docker ~]# id chris
uid=1000(chris) gid=1002(chen) groups=1002(chen) #可见添加成功

su chris切换到chris用户,在/home/chris里使用wget http://apache.fayea.com/tomcat/tomcat-9/v9.0.7/bin/apache-tomcat-9.0.7.tar.gz下载tomcat。然后解压缩在/home/chris里,因为chris用户在这里是有权限的。然后进行如下的操作:

1
2
3
4
5
cd  ~/ 代表用户所在目录
mkdir -p ~/shell-script
cd ~/shell-script/
touch start.sh
toush stop.sh

这个start.sh的内容很简单,如下:

1
2
3
4
5
6
7
8
#/bin/bash
if [ "root" == "$USER" ] #不让root启动
then
echo "can't start with user 'root',retry after change user!"
exit 1
else
cd /home/chris/apache-tomcat-9.0.7/bin/ && ./start.sh
fi

shutdown.sh的内容同理:

1
2
3
4
5
6
7
8
#/bin/bash
if [ "root" == "$USER" ] #不让root启动
then
echo "can't start with user 'root',retry after change user!"
exit 1
else
cd /home/chris/apache-tomcat-9.0.7/bin/ && ./shutdown.sh
fi

chmod +x *.sh给上面两个脚本可执行权限,但是现在执行startup.sh或者shutdown.sh会出现一个问题:

1
2
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program

这是因为chris用户没有权限去启动java这个可执行程序,如果使用java -version回答是bash: java: command not found,这个时候怎么办?

编辑~/.bash_profile,在末尾处加上如下的内容:
paradin

然后source .bash_profile,再使用java -version确认一下应该是OK了。这个时候也是可以使用chris用户去启动刚刚的那个start.sh和shutdown.sh的。
paradin

由于我们的tomcat是源码解压缩,所以要使用root用户去创建一下/etc/init.d/tomcat。里面内容如下:

1
2
3
4
5
6
7
8
9
#!/bin/bash
case $1 in
start)
su - chris -lc "sh /home/chris/shell-script/start.sh";; #如果要root启动,那就是su - root -lc "sh /home/utomcat/shell-script/start.sh";;
stop)
su - chris -lc "sh /home/chris/shell-script/shutdown.sh";;
*)
echo "parameter error, usage:(start|stop)";;
esac

保存之后,执行一下service tomcat start看看效果。
paradin

如果要设置开机自启动,别忘了chkconfig --add tomcatchkconfig tomcat on,在浏览器打开ip:8080看见汤姆猫~
paradin

当普通用户要使用1024以下的端口

众所周知,linux默认是不准许普通用户调用1024以下的端口的,那么遇到这样的需求怎么办呢?最好的方法是使用iptables。

首先让程序运行在非root帐户下,并绑定高于1024的端口,在确保能正常工作的时候,将低端口通过端口转发,将低端口转到高端口,从而实现非root运行的程序绑定低端口。要使用此方法可以使用下面的方式:

1
2
3
4
sysctl -w net.ipv4.ip_forward=1        #要长久保存,需要在/etc/sysctl.conf文件内修改,然后sysctl -p /etc/sysctl.conf
iptables -F -t nat
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to:8088 #将80端口转发到8088
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 #这句话也可以

这么操作在速度上没有任何影响。

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------