使用非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
5cd ~/ 代表用户所在目录
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
2Neither 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
,在末尾处加上如下的内容:
然后source .bash_profile
,再使用java -version
确认一下应该是OK了。这个时候也是可以使用chris用户去启动刚刚的那个start.sh和shutdown.sh的。
由于我们的tomcat是源码解压缩,所以要使用root用户去创建一下/etc/init.d/tomcat
。里面内容如下:
1
2
3
4
5
6
7
8
9
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
看看效果。
如果要设置开机自启动,别忘了chkconfig --add tomcat
和chkconfig tomcat on
,在浏览器打开ip:8080
看见汤姆猫~
当普通用户要使用1024以下的端口
众所周知,linux默认是不准许普通用户调用1024以下的端口的,那么遇到这样的需求怎么办呢?最好的方法是使用iptables。
首先让程序运行在非root帐户下,并绑定高于1024的端口,在确保能正常工作的时候,将低端口通过端口转发,将低端口转到高端口,从而实现非root运行的程序绑定低端口。要使用此方法可以使用下面的方式:
1
2
3
4sysctl -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 #这句话也可以
这么操作在速度上没有任何影响。