單位的一臺Apache服務器在一次意外宕機,重新啟動后,管理員執 行“/usr/local/apache2/bin/apachectrl start”命令,卻出 現了“Permission Denied:make_cock:cound not bind to address[::]:80,no listening sockets available,shutdown,Unable to open logs”之類的提示,造成無法啟動Apache,在其上運行的網站平臺也無法正常使用。執行“whoami”命令,顯示當前的賬戶名為“gauser”。執行“cat /usr/local/apache2/conf/httpd.conf |grep Listen”命 令,在Apache配置文件中顯示監聽端口為80。切換到“/usr/local/apache2”目 錄,執行“ls -al”命令,查看相關目錄和文件的用戶均為“gauser”,其權限都是“rwx------”,這說明權限設置沒有問題。
既然默認的80端口無法使用,那只有更換端口進行嘗試。執行“sed -i 's/Listen 80/Listen 8080/' /usr/local/apache2/conf/httpd.conf”命令,將端口修改為8080。再次執行“/usr/local/apache2/bin/apachectrl start”命令,沒有出現以上報錯提示。但是執行“ps -ef|grep httpd”命令,檢測httpd進程信息,在與上述啟動命令對應的進程數量過少,說明Apache的啟動依然存在問題??磥恚挥写蜷_Apache的日志,才能發現隱藏的問題。
執 行“cat /var/log/apache2/error.log”命令,在日志中根據時間進行查找,發現存在“pid file /usr/local/apache2/logs/httpd overwritten --Unclean shutdown of previous Apache run?”,“Permission denied:could not create /usr/local/apache2/logs/http.pid”,“could not log pid to file /usr/local/apache2/logs/httpd.pid”等錯誤信息。根據這些可以判斷,問題是因為名為“httpd.pid”的文件權限不足引發的。
該文件存在于Apache的日志目錄下,主要作用是記錄進程的ID信息,該文件不能為空。執行“ll /usr/local/apache2/logs/httpd.pid ”命令,顯示該文件的擁有者是Root賬戶。因為當前的賬戶名為“gauser”,執 行“chown gauser /usr/local/apache2/logs/httpd.pid”命令,將該文件的擁有者設置為當前用戶。執行“/usr/local/apache2/bin/apachectrl start”命 令,Apcche順利啟動,執行“ps-ef|grep httpd”命令,和httpd相關的進程沒有問題。因為上面將Apache的端口修改為8080,所以可以順利啟動,但是如果設置為80就會出現問題。
對于TCP 80端口來說,實際上屬于系統保留端口。在Linux中從0到1023端口,都是系統保留端口,這些端口主要用于關聯常用的服務。例如80端口和HTTP服務對應,22端口和SSH服務對應等。出于安全性的考慮,對于這些保留端口,系統是要進行必要的安全控制的,即只允許Root賬戶控制這些端口的使用權,對于普通的賬戶,是不允許其隨意綁定保留端口的。對于從1024到49151的端口,是允許普通用戶使用的,即允許去將該范圍內的端口和特定的應用程序綁定。
對于從49152到65535的端口,屬于系統動態分配端口,只要有進程或者程序需要和外界建立連接時,系統就會從中選擇可用的端口進行分配,當進程或程序運行結束,就會將該端口釋放。綜合以上分析不難看出,因為“gauser”是普通賬戶,所以無法使用系統80這一系統保留端口。如果使用Root賬戶啟動Apache,雖然可以綁定80端口,但是存在一定的安全隱患,一旦黑客利用潛在的Apache漏洞入侵得手,黑客就會擁有Root權限,這對系統危害很大。最好的方法是,對Apache目錄下的httpd文件的SUID屬性進行修改,通過合理的授權來解決問題。SUID是一種特殊權限,設置了SUID的程序文件,在用戶執行該程序時,用戶的權限是該程序文件屬主的權限。例如,程序文件的屬主是Root,那么執行該程序的用戶就將暫時獲得Root賬戶的權限。
執 行“chmod u+s /usr/local/apache2/bin/httpd”,“chown Root/usr/local/apache2/bin/httpd”命令,讓gauser賬戶在執行httpd文件時,擁有該文件屬主的權限。執行“vi /usr/local/apache2/conf/httpd.conf”命令,在 Apache配置文件中將“User”項的值設置為“gauser”,將“Group”項的值設置為“gauser”,這表示運行httpd服務的用戶和組均為“gauser”賬戶,主要作用是給Web應用降權。執行“ps -ef|grep httpd”命令,在進程列表第一行中的和“/usr/local/apache2/bin/apachectrl start”命令對應的賬戶名為Root,說明Apache是以Root賬戶身份啟動,在列表其余行使用的依然是“gauser”賬戶,說明啟動Apache時依然使用到了“gauser”賬戶,只是和該賬戶關聯的是一些Apache子進程而已。