工做太忙了,許久沒有上來寫個文,今天給你們寫一下關於CentOS上以低權限用戶自啓動Tomcat,Redis這類應用服務器的坑。sql
最近接手了一個NLP分佈式平臺架構,實施過程當中運維工程師給我埋了一個致命的BUG,Redis服務因爲使用了Root用戶運行,且,雲主機的虛擬外網IP與內網IP之間互相映射,加至沒有注意到IPTABLE的設定,導致雖然Redis是隻監聽了內網IP,但,其實狀況是,外網掃描端口時,仍然能順利經過「未受權」方式或暴力破解方式,擊倒Redis天生的軟肋(弱爆的密碼策略),最終,達到「提權」的目的。tomcat
今天不對***方式展開,感興趣的朋友自行網上科普。咱們言歸正傳,關於使用低權限用戶啓動相關應用服務器(Nginx,Mysql,Tomcat,Redis...)的作法,在網上良多,大可能是Ctrl+C & Ctrl+V,對細節的說明一筆帶過,雖然沒什麼大不了,但,卻難倒了這位小工程師!!!bash
例子中的操做系統爲: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。運維
好吧!再次執行上述的腳本的時候,就會莫名其妙地報錯了....分佈式
緣由:ide
問題不是什麼新鮮事,包括一些老派的運維專家估計都遇過這個坑!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 的錯誤。
晚安!