本文以redhat6.2為例子討論Linux服務器安裝完成以後,應該馬上采取哪些措施來增強服務器的安全性。對於其他的Linux發布或者版本,這些方法也是適用的。
一、關閉不必要的服務
Linux的服務分為兩種,一種是由inetd超級服務器來啟動的,如:FTP、telnet等;對於這些服務來說,系統並不總是運行telnetd、ftpd等服務進程,而是由inetd進程監聽這些服務的服務端口,一旦有服務請求到達就啟動對應的服務進程(如:telnetd等)來提供服務。另外一種是獨立的服務器,系統一直運行有對應的服務進程。
關閉這兩種服務的方法是不同的,對於inetd啟動的進程:
inetd超級服務器的配置文件為/etc/inetd.conf,該文件指示了inetd應該監聽哪些服務請求,並在請求時啟動對應的服務。因此只要通過編輯/etc/inetd.conf文件就可以實現關閉不需要的服務,例如希望關閉pop3服務,則在編輯/etc/inetd.conf文件以前文件中有如下的內容:
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
要關閉pop3服務則在該行前添加注釋符即可:
#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
通過編輯該文件,實現關閉不需要的服務(例如我的系統我僅僅開放了telnet和ftp服務)以後,則需要重新啟動inetd超級服務器。首先找到inetd的進程號:
[root@aid /etc]# ps axgrep inetd
358 ? S 0:00 inetd
然後重新啟動inetd服務器:
[root@aid /etc]# kill -HUP 358
最後因為inetd.conf應該不允許普通用戶讀寫,因此設置其訪問權限為600:
chmod 600 /etc/inetd.conf
而且該文件應該不被任何用戶修改,包括root用戶。因此為了防止用戶錯誤的修改該文件,為該文件添加不可修改位:
chattr +i /etc/inetd.conf
對於獨立服務器,則需要通過/usr/sbin/ntsysv命令來修改:
只需要服務前面通過空格鍵來選擇是否在系統啟動時啟動該服務就可以實現關閉某個服務器,如:希望系統關閉dhcpd服務,則通過上下鍵選中該服務器,然後通過空格鍵去掉該服務前[ ]內的星號即表示系統啟動時不開放該服務。若希望了解某個服務的具體含義,可以選擇該服務以後按F1鍵來查看該服務的含義。
設置完畢以後,只有希望打開的服務前的[ ]內才會有星號。然後通過Tab鍵選擇OK,按空格鍵。重新啟動機器。
重新啟動機器以後,可以通過下面的命令來察看系統打開了哪些服務,來決定是否已經關閉了不需要的服務,例如我僅僅希望提供telnet服務則:
[ideal@aid ideal]$ netstat -ln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN
raw 0 0 0.0.0.0:1 0.0.0.0:* 7
raw 0 0 0.0.0.0:6 0.0.0.0:* 7
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
從上面的命令輸出可以看到系統僅僅開放了23號端口,也就是telnet服務。
二、控制使用開放的服務的用戶
在上面提到的/etc/inetd.conf的配置文件中,我們看到pop3服務配置一行的最後兩個字段為:
/usr/sbin/tcpd ipop3d
很顯然,pop3的服務器程序為ipop3d,那麼/usr/sbin/tcpd又是什麼含義呢?這是一個稱為Tcp wrapper的安全程序。該程序用來在啟動某個服務以前查看兩個配置文件來決定該用戶是否允許使用該服務。在/etc目錄下,有兩個文件:hosts.deny hosts.allow。
通過配置這兩個文件,你可以指定哪些客戶機允許使用這些服務。配置這兩個文件是通過一種簡單的訪問控制語言來實現的,訪問控制語句的基本格式為: 程序名列表,主機名/IP地址列表。
程序名列表指定一個或者多個提供相應服務的程序的名字,名字之間用逗號或者空格分隔,可以在inetd.conf文件裡查看提供相應服務的程序名:如上面的文件示例中,pop所在行的最後一項就是所需的程序名:ipop3d。
主機名/IP地址列表指定允許或者禁止使用該服務的一個或者多個主機的標識,主機名之間用逗號或空格分隔。程序名和主機地址都可以使用通配符,實現方便的指定多項服務和多個主機。 當服務請求到達服務器時,訪問控制軟件就按照下列順序查詢這兩個文件,直到遇到一個匹配為止:
1. 當在/etc/hosts.allow裡面有一項與請求服務的主機地址項匹配,那麼就允許該主機獲取該服務
2. 否則,如果在/etc/hosts.deny裡面有一項與請求服務的主機地址項匹配,就禁止該主機使用該項服務
3. 若均沒有匹配,則允許使用該服務。若相應的配置文件不存在,訪問控制軟件就認為是一個空文件,所以可以通過刪除或者移走配置文件實現對所有主機關閉所有服務。
在文件中,空白行或者以#開頭的行被忽略,你可以通過在行前加 # 實 現注釋功能。Linux提供了下面靈活的方式指定進程或者主機列表:
1. 一個以"."起始的域名串,如 .amms.ac.cn 那麼www.amms.ac.cn就和這一項匹配成功
2. 以.結尾的IP串如 202.37.152. 那麼IP地址包括202.37.152.的主機都與這一項匹配
3. 格式為n.n.n.n/m.m.m.m表示網絡/掩碼,如果請求服務的主機的IP地址與掩碼的位與的結果等於n.n.n.n 那麼該主機與該項匹配。
4. ALL表示匹配所有可能性
5. EXPECT表示除去後面所定義的主機。如:list_1 EXCEPT list_2 表示list_1主機列表中除去List_2所列 出的主機
6. LOCAL表示匹配所有主機名中不包含.的主機
上面的幾種方式只是Linux提供的方式中的幾種,但是對於我們的一般應用來說是足夠了。我們通過舉幾個例子來說明這個問題:
例一:我們只希望允許同一個局域網的機器使用服務器的ftp功能,而禁止互聯網上面的ftp服務請求,本地局域網由 202.39.154. 、202.39.153. 和202.39.152. 三個網段組成。在hosts.deny文件中,我們定義禁止所有機器請求所有服務: ALL:ALL 在hosts.allow文件中,我們定義只允許局域網訪問ftp功能:
in.ftpd: 202.39.154 202.39.153. 202.39.152.
這樣,當非局域網的機器請求ftp服務時,就會被拒絕。而局域網的機器可以使用ftp服務。
ALL:ALL
然後重新啟動你的 inetd進程:
/etc/rc.d/init.d/inet restart
但是hosts.denyallow文件只控制/etc/inetd.conf文件中包含的服務的訪問這些服務有/usr/bin/tcpd管 理,監聽接入的網絡請求,然後與在hosts.allow和hosts.deny的中的服務比較,然後做出允許或拒絕的決定。
最後因為hosts.allowhosts.deny應該不允許普通用戶讀寫,因此設置其訪問權限為600:
chmod 600 /etc/hosts.*
並且該文件應該不被任何用戶修改,包括root用戶。因此為了防止用戶錯誤的修改該文件,為該文件添加不可修改位:
chattr +i /etc/hosts.*
三、"/etc/exports"文件設置
如果通過NFS把文件共享出來,那麼一定要配置"/etc/exports"文件,使得訪問限制盡可能的嚴。這就是說,不要用通配符,不允許對根目錄有寫權限,而且盡可能只給只讀權限。編輯exports文件(vi /etc/exports)加入:
例如:
/dir/to/export host1.mydomain.com(ro,root_squash)
/dir/to/export host2.mydomain.com(ro,root_squash)
"/dir/to/export"是你想共享出來的目錄,host.mydomain.com是允許訪問這個目錄的計算機。
代表只讀,代表不允許對根目錄進行寫操作。使這些改變生效,你還要運行 "/usr/sbin/exportfs -a"命令。
注意:在服務器上裝NFS服務是會有安全隱患的,就我個人而言,不建議你使用NFS。
四、禁止使用控制台程序
一個最簡單而且最常用的保證系統安全的方法就是禁止使用所有的控制台程序,如:shutdown和halt。可以運行下面的命令來實現:
[root@aid /]# rm -f /etc/security/console.apps/servicename
這裡servicename是你要禁止的控制台程序名。除非你使用xdm,否則不要把xserver文件刪掉,如果這樣除了root之外,沒有人可以啟動X服務器了。(如果使用xdm啟動X服務器,這時root是唯一需要啟動X服務器的用戶,這才有必要把xserver文件刪掉)。例如:
[root@deep]# rm -f /etc/security/console.apps/halt
[root@deep]# rm -f /etc/security/console.apps/poweroff
[root@deep]# rm -f /etc/security/console.apps/reboot
[root@deep]# rm -f /etc/security/console.apps/shutdown
[root@deep]# rm -f /etc/security/console.apps/xserver (如果刪除,只有root可以啟動X).
這些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。記住,只有裝了Xwindow,刪除xerver文件才會有效果。
五、"/etc/aliases"文件
aliases文件可能會造成安全隱患。例如:很多的軟件產商都把 "decode"這個別名放在aliases文件裡。這樣做的目的是為了方便通過email傳送二進制文件。在發送郵件的時候,用戶把二進制
這裡servicename是你要禁止的控制台程序名。除非你使用xdm,否則不要把xserver文件刪掉,如果這樣除了root之外,沒有人可以啟動X服務器了。(如果使用xdm啟動X服務器,這時root是唯一需要啟動X服務器的用戶,這才有必要把xserver文件刪掉)。例如:
[root@deep]# rm -f /etc/security/console.apps/halt
[root@deep]# rm -f /etc/security/console.apps/poweroff
[root@deep]# rm -f /etc/security/console.apps/reboot
[root@deep]# rm -f /etc/security/console.apps/shutdown
[root@deep]# rm -f /etc/security/console.apps/xserver (如果刪除,只有root可以啟動X).
這些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。記住,只有裝了Xwindow,刪除xerver文件才會有效果。
五、"/etc/aliases"文件
aliases文件可能會造成安全隱患。例如:很多的軟件產商都把 "decode"這個別名放在aliases文件裡。這樣做的目的是為了方便通過email傳送二進制文件。在發送郵件的時候,用戶把二進制