工作太忙了,许久没有上来写个文,今天给大家写一下关于CentOS上以低权限用户自启动Tomcat,Redis这类应用服务器的坑。

最近接手了一个NLP分布式平台架构,实施过程中运维工程师给我埋了一个致命的BUG,Redis服务由于使用了Root用户运行,且,云主机的虚拟外网IP与内网IP之间互相映射,加至没有注意到IPTABLE的设定,致使虽然Redis是只监听了内网IP,但,其实情况是,外网扫描端口时,仍然能顺利通过“未授权”方式或暴力破解方式,击倒Redis天生的软肋(弱爆的密码策略),最终,达到“提权”的目的。

今天不对***方式展开,感兴趣的朋友自行网上科普。我们言归正传,关于使用低权限用户启动相关应用服务器(Nginx,Mysql,Tomcat,Redis...)的做法,在网上良多,大多是Ctrl+C & Ctrl+V,对细节的说明一笔带过,虽然没什么大不了,但,却难倒了这位小工程师!!!

例子中的操作系统为:CentOS 7
如:
adduser tomcat
su - tomcat -p -c '/user/local/tomcat/bin/startup.sh';

su - tomcat /user/local/tomcat/bin/startup.sh

绝大多数的 度娘 搜索出来的都是这一流。

可我们并不能adduser tomcat之后就不管了,一般都会想到禁用tomcat的登陆能力,于是乎就到/etc/passwd中给 tomcat 加上 /sbin/nologin。

好吧!再次执行上述的脚本的时候,就会莫名其妙地报错了....

原因:

问题不是什么新鲜事,包括一些老派的运维专家估计都遇过这个坑!su - 用户名 这就相当转登到 另一个用户账号,可你前面已经修改了/sbin/nologin,禁止了以该身份执行登入操作,当然会提示你该用户未启用或被禁用,不报这个错才怪!(除非是操作系统有BUG)。

解决:
那么我们是不是非要将 /sbin/nologin修改回来(/bin/bash),No! 细仔地阅读一下su 参数说明 你会发现当中有一个可选参数 -s ,这个不起眼的参数就是解决问题的关键所在。
我们可以通过

su - tomcat -s /bin/sh -c '/usr/local/tomcat/bin/startup.sh'

这样来被现 变更用户并指定执行系统中的sh,开辟一个通道,结合-c指定通道接下来的要执行的命令为 startup.sh,相当于在执行 nologin之前完成一次sh、startup.sh,然后自动退回到Root用户下。
最后,ps aux|grep tomcat(服务名称) 列出该服务的进程,启动用户顺利变更为tomcat(用户名)了。

好吧!问题至此已经解说完毕,其它情况基本类同。
注意:
别忘记了给于tomcat这个用户对startup.sh的执行权限,否则,会因权限不足而No permission 的错误。

晚安!