在確保Unix類系統(tǒng)的安全免受外部的攻擊時,我們要保證不能運行任何不必要的服務(wù)。在免費的BSD Unix系統(tǒng)或Linux發(fā)行版本中,我們幾乎總能遇到的一個服務(wù),即SSH進程。在多數(shù)情況下,這指的是OpenSSH,你可能會需要確保遠程訪問服務(wù)器的安全,特別是在你的服務(wù)器并沒有安裝監(jiān)視器和鍵盤時更是這樣。
只要你連上互聯(lián)網(wǎng),你就會發(fā)現(xiàn):總有一些系統(tǒng)在那兒每天24小時都在試圖通過22號端口訪問你的計算機,其目的是突破你的SSH口令保護。如果你檢查一下網(wǎng)絡(luò)中與互聯(lián)網(wǎng)直接相連的任何系統(tǒng)中的(或者是連接到某個開放的無線訪問點的設(shè)備中的)/var/log/auth.log文件,很快你就會發(fā)現(xiàn),在這個文件的末尾會出現(xiàn)如下的內(nèi)容:
NOV 05 9:03:12 local_host sshd[6906]: error: PAM: authentication error for root from remote_host |
其實,為降低這種攻擊的影響范圍,我們可以做的事情有許多。我們完全可以減少由這種盲目攻擊所造成的損害。例如,就目前的技術(shù)水平而言,一個足夠復(fù)雜的口令就很難破解。當(dāng)然,任何復(fù)雜的口令最終都能夠被破解,不過這種可能性也許要花費一個世紀(jì)才能完成。
另一個方法是簡單配置SSH,使之在另外一個端口上監(jiān)聽,而不是22號端口。例如,可以使其監(jiān)聽1138號端號。為此,可以簡單地改變/etc/ssh/sshd_config文件的端口行(即以Port開頭的一行),以顯示你想使用的新端口號,而且在從一個遠程系統(tǒng)連接時,要確保使用這個端口號。在編輯完畢后,sshd_config的這一行看起來應(yīng)是如下這個樣子:
Port 1138 |
這種方法可以提供額外一層的安全性,使普通的惡意破壞份子難以發(fā)現(xiàn)你擁有一個開放的SSH端口。OpenSSH容許采用基于密鑰的認證而不是口令認證,這就進一步地限制了這種別有用心的攻擊,這正如我們可以配置一個防火墻,使其拒絕除被列入優(yōu)良者名單的所有連接企圖。
也許最普遍的、最有效的限制強力攻擊的方法是簡單地禁止通過SSH對根(root)的訪問。也許你想遠程登錄,然后執(zhí)行需要根的訪問權(quán)的管理任務(wù),不過你還要保障其他人不能通過強力的口令破解攻擊直接獲得對你系統(tǒng)的訪問權(quán)。
當(dāng)然,你還可以容許其它的賬戶通過SSH訪問你的系統(tǒng)。借助于sudu或su,你可以獲得對根的訪問。因為自動化的攻擊難于猜測到一個未知用戶的賬戶名稱及其口令(特別是如果這個口令足夠復(fù)雜的話),而且,事實上多數(shù)攻擊者絕對不會試著猜測除根用戶之外的其它用戶的口令,主要原因在于:由于采取這種簡單的措施,你的系統(tǒng)在面對這種自動化的攻擊時,安全性得到了極大的提升。如果你不允許一般用戶賬戶使用sudu或su來獲得對根的訪問,情況尤其如此。你可以指定一個特別的管理員賬戶,使其對系統(tǒng)擁有很有限的特權(quán),不過一定要有一個其它非根賬戶沒有的特權(quán):通過su或sudu執(zhí)行管理任務(wù)的能力,這種任務(wù)可擁有對根的特權(quán)。
但是,一旦你已經(jīng)不接受通過SSH對根的訪問,你就會選擇安排可管理的訪問,其實,允許從遠程對根的訪問的情況很少。要禁用通過SSH直接登錄到根用戶,需要再次編輯ssdh_config文件,將PermitRootLogin設(shè)置為“no”:
Port 1138 PermitRootLogin no |
有一些操作系統(tǒng),如FreeBSD將其作為默認值。其它的系統(tǒng),如多數(shù)的Linux發(fā)行版本并非如此。任何用戶都應(yīng)該檢查其選擇的操作系統(tǒng),在決定自己的系統(tǒng)安然無恙之前,首先要決定其默認的PermitRootLogin設(shè)置。