使用非root用户启动进程是运维安全的一个主要环节,拿tomcat进程来说,如果是使用root用户去启动了tomcat,那么有一个严重的问题,那就是tomcat具有root权限。这意味着你的任何一个jsp脚本都具有root权限,所以那些不怀好意的人可以轻易地用jsp脚本去搞破坏,甚至删除你整个硬盘里的东西!所以为了活着,我们要极力避免这种现象。很多的软件都自带的用户/用户组,比如nginx、zabbix、elasticsearch,但是也有很多的软件没有这么贴心的服务,这就需要我们手动的更改了。
使用非root用户启动tomcat
以tomcat为例,打算用chris账号(属于chen这个group)启动。那么首先先创建账号和组,如下:
1 | [root@chen-docker ~]groupadd chen #创建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 | cd ~/ 代表用户所在目录 |
这个start.sh
的内容很简单,如下:
1 | #/bin/bash |
shutdown.sh
的内容同理:
1 | #/bin/bash |
chmod +x *.sh
给上面两个脚本可执行权限,但是现在执行startup.sh或者shutdown.sh会出现一个问题:
1 | Neither the JAVA_HOME nor the JRE_HOME environment variable is defined |
这是因为chris用户没有权限去启动java这个可执行程序,如果使用java -version
回答是bash: java: command not found
,这个时候怎么办?
编辑 paradin~/.bash_profile
,在末尾处加上如下的内容:
然后 paradinsource .bash_profile
,再使用java -version
确认一下应该是OK了。这个时候也是可以使用chris用户去启动刚刚的那个start.sh和shutdown.sh的。
由于我们的tomcat是源码解压缩,所以要使用root用户去创建一下/etc/init.d/tomcat
。里面内容如下:
1 |
|
保存之后,执行一下 paradinservice tomcat start
看看效果。
如果要设置开机自启动,别忘了 paradinchkconfig --add tomcat
和chkconfig tomcat on
,在浏览器打开ip:8080
看见汤姆猫~
当普通用户要使用1024以下的端口
众所周知,linux默认是不准许普通用户调用1024以下的端口的,那么遇到这样的需求怎么办呢?最好的方法是使用iptables。
首先让程序运行在非root帐户下,并绑定高于1024的端口,在确保能正常工作的时候,将低端口通过端口转发,将低端口转到高端口,从而实现非root运行的程序绑定低端口。要使用此方法可以使用下面的方式:
1 | sysctl -w net.ipv4.ip_forward=1 #要长久保存,需要在/etc/sysctl.conf文件内修改,然后sysctl -p /etc/sysctl.conf |
这么操作在速度上没有任何影响。