當你安裝一台Linux系統,你就擁有了一個強大的、高級的、多任務的網絡操作系統。但是該系統功能有些過於強大了.某些發布版本缺省啟動很多服務(如:rlogind, inetd, httpd, innd, fingerd, timed, rhsd,等等)。作為系統管理員需要熟悉了解這些服務。如果你的機器連接到了Internet的話你更需要關注你的系統安全。 大多數攻擊者並不是一個革新者,他們往往利用最新的公布的系統工具技術等突破一個眾所周知的或一個新的剛剛發現的安全漏洞。但作為一個管理者,通過訪問你使用的Linux發布的官方站點如www.redhat.com/、http://www.calderasystems.com/等可以獲知最新的安全漏洞及相應的補丁程序。也可以通過定期訪問http://www.securityfocus.com/、http://www.cert.org/等安全漏洞通告站點。
最方便的的控制訪問服務器的方法是通過一個叫TCP wrapper的程序。在大多數發布版本中該程序往往是缺省地被安裝。利用TCP wrapper你可以限制訪問前面提到的某些服務。而且TCP wrapper的記錄文件記錄了所有的企圖訪問你的系統的行為。通過last命令查看該程序的og管理員可以誰在企圖連接你的系統。 在Linux的/etc目錄下,有一個如下所示inetd.conf文件,該文件是TCP wrapper的配置文件,定義了TCP wrapper可以控制啟動哪些服務。比如要將finger服務去除,就將finger服務的那一行注釋掉(在前面加上"# "即可); # inetd。conf This file describes the services that will be available # through the INETD TCP/IP super server. To re-configure # the running INETD process, edit this file, then send the # INETD process a SIGHUP signal。
# service_name sock_type proto flags user server_path args
FTP stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd # Finger, systat and netstat give out user information which may be 。。。 。。。 但是對於諸如sendmail,named等服務,由於它們不象finger,telnet等服務,在請求到來時由inet守護進程啟動相應的進程提供服務,而是在系統啟動時,作為守護進程運行的。在slackware版本的Linux,可以通過修改/etc/rc.d目錄下的啟動配置文件rc.M文件,將啟動sendmail的命令行注釋掉: #!/bin/sh # rc。M This file is executed by init(8) when the system is being # initialized for one of the "multi user" run levels (i.E. # levels 1 through 6). It usually does mounting of file # systems et al. # Start the sendmail daemon: # if [ -x /usr/sbin/sendmail ]; then # echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -q 15m)… " # /usr/sbin/sendmail -bd -q 15m # fi 。。。。。。 對於諸如named等其他服務,也是通過將同一個目錄下相應啟動配置文件中相應的啟動命令注釋掉,從而當你重新啟動機器時,相應的服務將不會啟動。而對於高版本的redhat linux,提供了一個linuxconfig命令,可以通過它在圖形界面下交互式地設置是否在啟動時,運行相關服務。 但是對於telnet、ftp等服務,如果將其一同關閉,那麼對於管理員需要遠程管理時, 將非常不方便。Linux提供另外一種更為靈活和有效的方法來實現對服務請求用戶的限制, 從而可以在保證安全性的基礎上,使可信任用戶使用各種服務。 在/etc目錄下,有兩個文件:hosts.deny hosts.allow 通過配置這兩個文件,你可以指定 哪些機器可以使用這些服務,哪些不可以使用這些服務。 配置這兩個文件是通過一種簡單的訪問控制語言來實現的,訪問控制語句的基本格式為:
程序名列表,主機名/IP地址列表。
程序名列表指定一個或者多個提供相應服務的程序的名字,名字之間用逗號或者空格分割,可以在inetd.conf文件裡查看提供相應服務的程序名:如上面的文件示例中,telent所在行的最後一項就是所需的程序名:in.telnetd 主機名/IP地址列表指定允許或者禁止使用該服務的一個或者多個主機的標識,主機名之間用逗號或空格分隔。程序名和主機地址都可以使用通配符,實現方便的指定多項服務和多個主機。 當服務請求到達服務器時,訪問控制軟件就按照下列順序查詢這兩個文件,直到遇到一個匹配為止: 1. 當在/etc/hosts.allow裡面有一項與請求服務的主機地址項匹配,那麼就允許該主機獲取該服務 2. 否則,如果在/etc/hosts.deny裡面有一項與請求服務的主機地址項匹配,就禁止該主機使用該項服務 如果相應的配置文件不存在,訪問控制軟件就認為是一個空文件,所以可以通過刪除或者移走配置文件實現對所有主機關閉所有服務。在文件中,空白行或者以#開頭的行被忽略,你可以通過在行前加 # 實現注釋功能。 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 -l -a: 202.39.154 202.39.153. 202.39.152. 這樣,當非局域網的機器請求ftp服務時,就會被拒絕。而局域網的機器可以使用ftp服務。
ALL:ALL
然後重新啟動你的 inetd進程:
/etc/rc.d/init.d/inet restart
但是hosts.deny文件只能控制/etc/inetd.conf文件中包含的服務的訪問這些服務有/usr/bin/tcpd管理。wrapper監聽接入的網絡請求,然後與在hosts.allow和hosts.deny的中的服務比較,然後做出允許或拒絕的決定。 files, and makes a yes or no decision on what to allow through. 但是對於wrapper沒有包含的服務你就需要采用其他方法了