關於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 的錯誤。
晚安!
關於CentOS上以低權限用戶自啟動Tomcat,Redis這類應用服務器的坑