為了進行遠程管理Unix以及Linux服務器,遠程登錄服務器方法主要包括:Telnet、 FTP、 rlogin、 rsh、 rexec和ssh。其中ssh(Secure Shell)是以遠程聯機服務方式操作服務器時的較為安全的解決方案。它最初由芬蘭的一家公司開發,但由於受版權和加密算法的限制,很多人轉而使用免費的替代軟件OpenSSH。它用安全、加密的網絡連接工具代替了 telnet、ftp、rlogin、rsh 和 rcp 工具。OpenSSH 支持 SSH 協議的版本 1.3、1.5、和 2。使用 OpenSSH 工具將會增進你的系統安全性。 所有使用 OpenSSH 工具的通訊,包括口令,都會被加密。 telnet 和 ftp 使用純文本口令,並被明文發送。這些信息可能會被截取,口令可能會被檢索,然後未經授權的人員可能會使用截取的口令登錄進你的系統而對你的系統造成危害。你應該盡可能地使用 OpenSSH 的工具集合來避免這些安全問題。 OpenSSH相對Telnet、FTP、rlogin、rsh、rexec這些服務來說比較安全。但是需要看到OpenSSH服務也面臨一些安全隱患:但是OpenSSH目前存在幾個安全遺患:口令、密匙破解(SSH可以允許任何人只要保持密碼框空白並按回車鍵,就可遠程登錄密碼為兩個字符的某一帳戶。)以及部分OpenSSH發行版本中可能被安放木馬(相關鏈接:http://network.ccidnet.com/pub/disp/Article?columnID=239&articleID=21882&pageNO=1 ),以及拒絕服務攻擊。本文將介紹如何加固OpenSSH服務器。
一、升級舊版本 升級陳舊的OpenSSH版本,因為早期的OpenSSH版本(3.0.0版本)存在的安全漏洞。2003年9月,在類Unix的世界裡也出現了一個嚴重的漏洞:Openssh的溢出漏洞。Openssh是遠程終端登錄軟件,運行在類Unix上。幾乎所有的類Unix發行版本都把這個軟件作為缺省安裝。因此這個軟件出現溢出漏洞影響了幾乎所有的類Unix操作系統。Redhat linux描述此漏洞的頁面網址是:rhn.redhat.com/errata/RHSA-2003-279.Html。特別是對於一個新配置的OpenSSH服務器來說使用最新穩定版本是最明智的選擇,可以在其官方網站(http://www.openssh.com/ )下載其源代碼進行編譯。最新版本是2005年9月1日發布4.2。
二、使用xinetd模式運行OpenSSH OpenSSH能以Stand-alone、xinetd兩種模式運行,當用戶賬號比較少又經常需要連接到ProFTPD服務器時推薦使用xinetd模式運行。使用xinetd方式運行ProFTPD可以有效防范DoS攻擊。xinetd模式工作原理見:深入了解Linux的守護進程(daemons)(鏈接:http://www.ccw.com.cn/server/yyjq/htm2005/20050914_14ND5.htm )。 和stand-alone工作模式相比,系統不想要每一個網絡服務進程都監聽其服務端口。運行單個xinetd就可以同時監聽所有服務端口,這樣就降低了系統開銷,保護系統資源。但是對於訪問量大、經常出現並發訪問時,xinetd想要頻繁啟動對應的網絡服務進程,反而會導致系統性能下降。xinetd提供類似於inetd+tcp_wrapper的功能,但是更加強大和安全。能有效的防止拒絕服務攻擊(Denial of Services): 1、限制同時運行的進程數 通過設置instances選項設定同時運行的並發進程數: instances=20 當服務器被請求連接的進程數達到20個時,xinetd將停止接受多出部分的連接請求。直到請求連接數低於設定值為止。 2、限制一個IP地址的最大連接數 通過限制一個主機的最大連接數,從而防止某個主機獨占某個服務。 per_source=5 這裡每個IP地址可以連接單個IP地址的連接數是5個。 3、限制負載 xinetd還可以使用限制負載的方法防范拒絕服務攻擊。用一個浮點數作為負載系數,當負載達到這個數目的時候,該服務將暫停處理後續的連接: max_load = 2.8 上面的例子中當一項系統負載達到2.8時,所有服務將暫時中止,直到系統負載下降到設定值以下。說明要使用這個選項,編譯時要加入--with-loadavg ,xinetd將而已處理max-load配置選項。從而在系統負載過重時關閉某些服務進程,來實現某些拒絕服務攻擊。 4、限制所有服務器數目(連接速率) xinetd可以使用cps選項設定連接速率,下面的例子: cps = 25 60 第一個參數表示每秒可以處理的連接數,如果超過了這個連接數之後進入的連接將被暫時停止處理;第二個參數表示停止處理多少秒後繼續處理先前暫停處理的連接。即服務器最多啟動25個連接,如果達到這個數目將停止啟動新服務60秒。在此期間不接受任何請求。 使用xinetd方式運行sshd的步驟: (1)檢查確省運行情況 確省情況下sshd以stand-alone工作模式運行,可以使用“ps aux grep sshd”命令查看是否正在運行,然後使用命令“/etc/rc.d/init.d/ sshd stop”中止運行。 (2)創建配置文件/etc/xinetd.d/sshd,代碼如下: service ssh { socket_type = stream wait = no user = root instances=20 cps = 25 60 server = /usr/local/sbin/sshd server_args = -i log_on_sUCcess += DURATION USERID log_on_failure += USERID nice = 10 } (3)重新啟動xinetd配置 killall -USR1 xinetd
三、為sshd配置PAM 1、安裝PAM模塊 PAM簡介: PAM全稱:Pluggable Authentication Module (嵌入式認證模塊)。它最初有SUN公司開發;很快被Linux社區的接受,並且開發了更多的模塊。其目標是提供一套可用於驗證用戶身份的函數庫,從而將認證從應用程序開發中獨立出來。Linux-PAM處理四種獨立的(管理)工作。它們是: 認證管理; 帳號管理; 會話期間管理;和密碼管理。 PAM工作方式: 1、調用某個應用程序,以得到該程序的服務。 2、PAM應用程序調用後台的PAM庫進行認證工作。 3、PAM庫在/etc/pam.d/目錄中查找有關應用程序細節的配置文件,該文件告訴PAM,本應用程序使用何種認證機制。 4、PAM庫裝載所需的認證模塊。 5、這些模塊可以讓PAM與應用程序中的會話函數進行通信。 6、會話函數向用戶要求有關信息。 7、用戶對這些要求做出回應,提供所需信息。 8、PAM認證模塊通過PAM庫將認證信息提供給應用程序。 9、認證完成後,應用程序做出兩種選擇:將所需權限賦予用戶,並通知用戶。認證失敗,並通知用戶。 圖1 PAM工作流程。 PAM具體使用方法: 下面手工建立一個/etc/pam.d/ftp文件包括以下內容: %PAM-1.0 auth required /lib/security/pam_stack.so service=system-auth auth required /lib/security/pam_nologin.so account required /lib/security/pam_stack.so service=system-auth passWord required /lib/security/pam_stack.so service=system-auth session required /lib/security/pam_stack.so service=system-auth 下面就可以使用PAM加固OpenSSH服務器。
四、使用TCP 會繞程序 TCP 會繞程序(TCP wrappers)為多項服務提供訪問控制。多數現代的網絡服務,如 SSH、Telnet 和 FTP,都使用 TCP 會繞程序。該會繞程序位於進入請求和被請求服務之間。 tcp_wrapper可以用來禁止(或者顯式的允許)特定的主機對某些服務的訪問。簡單的說,它的工作原理是這樣的:inetd或xinetd運行很多的服務,其中很多都是由tcpd包裝好的。換句話說,tcpd是真正運行這些服務的程序,但是inetd或xinetd不知道這些(其實它根本不關心)。tcpd根據/etc/hosts.allow和/etc/hosts.deny來判斷是否允許傳來的連接請求。tcp_wrapper工作原理見圖2。 tcp_wrappers的應用思路是“先阻止、後放行”。因此策略是首先禁止所有主機訪問FTP服務器(在/etc/hosts.deny文件中設定),然後在/etc/hosts.allow中加入允許訪問的主機或IP地址列表,這是最安全的訪問策略。修改/etc/hosts.allow文件,注釋掉"ALL : ALL : allow", 去掉其他無關控制訪問,增加如下內容: sshd : localhost : allow sshd : friendlycomputer : allow sshd : all : deny
五、修改確省配置文件 Sshd配置文件是/etc/ssh/sshd_config,如果你沒有使用SSH protocol (協議)1的機會,這裡建議你關閉pro tocol 1的使用,因為ssh protocol 1不如protocol 2安全, 還可以有效的阻止攻擊者通過修改包攜帶的版本banner來劫持(hijacking)啟動 會話進程並降級你到protocol 1,理論上可以迫使使用ssh 1 協議來通信。你必須注釋掉Protocol 2,1而使用下面的一行來代替: Protocol 2 另外SSH在運行的時候消耗比較多的內存,是個"耗糧"大戶,這也是近來發現有關SSH存在拒絕服務攻擊的原因。每一個連接使用一大塊可觀的內存,FreeBSD默認使用"MaxStartups"來管理,默認的值是一個比較健康的值,如: MaxStartups 5:50:10 因為一個系統你除非有很多人管理系統或者提供SHELL服務,一般情況下這個值是足夠了,MaxStartups不是意味著總的連接數,只是指還沒有認證的連接數,這意味著,在任一(意)時刻, 多達5人可以(能)同時喚起登陸進程。 默認情況下Linux的OpenSSH配置關閉了空密碼登陸,這裡還建議裡關閉X11Forwarding,你可以把X11Forwarding 這行改為: X11Forwarding no 如果你的機器作為服務器在運行,就不需要安裝X服務程序,因為使用了X11Forwarding on,就可能被受控制了的遠程主機發送進程把自己attach你的 X11會話進程,從而可以記錄擊鍵記錄,顯示一些雜亂信息和捕獲你的顯示內容。強烈建議不使用靜態密碼,而使用DSA或者RSA KEY,你修改如下內容就可以關閉。 使用密碼認證: PasswordAuthentication no 你可以通過下面的方法來限制組用戶或者光是單獨用戶來訪問SHELL: AllowGroups shellusers 設定root賬號不能登錄,這裡將#號去掉並改成不允許root用ssh登錄ssh服務器,因為利用root用戶登陸是不明智的,因為它擁有太大的權限,在實際使用時應該會出現安全問題,方法: 將 #PermitRootLogin Yes 改成 PermitRootLogin no 端口22是sshd監聽的端口,即為連接到主機時需要使用的端口。為了增加黑客探測sshd難度,可以把端口修改為其他數值,最好大於1024。 Port 1678 另外可以使用以下代碼可以指定sshd監聽的接口地址: ListenAddress 192.168.0.254 這樣,就可以避免向未知的人群提供此類登錄服務。 最後修改配置文件的屬性,防止非授權用戶修改配置文件: chmod 644 /etc/ssh/sshd_config
六、使用使用BlockHosts對抗暴力破解 Openssh服務面臨的另外一個威脅是黑客采取暴力破解的方式獲取用戶密碼而非法登錄FTP服務器。BlockHosts軟件就是利用通過分析日志文件幫助tcp_wrappers實現工作自動化。例如在30秒鐘內一個IP地址(192.168.1.23)連續20次登錄sshd服務器而且全部因為密碼錯誤登錄失敗。那麼這個IP地址無疑是非法或者惡意主機。這時BlockHosts會自動將該IP地址寫入/etc/hosts.deny文件。首先編輯你的/etc/syslog.conf文件,一般修改 security.* /var/log/security條目內容如下: security.*;auth.info /var/log/security 原因很簡單,這樣syslogd就把連接到sshd的日志信息記錄下來。 BlockHosts官方網站:http://www.aczoom.com/cms/blockhosts/,最新版本:1.0.0。BlockHosts啟動方法: python setup.py BlockHosts是基於命令行模式的,使用非常簡單這裡就不贅述了。
總結: 以上介紹了如何六個方面加固Openssh服務器方法。無論哪種類型的服務,存在漏洞都是不可避免的,只是被發現的時間早晚問題。作為使用者,我們能做的只有密切關注漏洞的發布情況,並及時打安全補丁以加固服務器,才能保證自己所管理的網絡不被黑客利用已經發現的漏洞攻擊。