CentOS 是最多人用來運行伺服器的 Linux 版本,最新版本是 CentOS 7。當(dāng)你興趣勃勃地在一臺主機或 VPS 上安裝 CentOS 7 後,首要的工作肯定是加強它的安全性,以下列出的七件事,是你進一步配置系統(tǒng)和安裝其他軟件前必須做的。
若果你是自行安裝 CentOS 7 的話,安裝程序會讓你自行設(shè)定 root 的密碼。不過很多 VPS 服務(wù)商只會提供預(yù)先安裝好的 CentOS 7 映像檔,這種情況下他們會透過主控界面告訴你 root 的密碼,這個密碼的安全性誰也不知道,它是如何產(chǎn)生的呢?隨機性可靠嗎?複雜性足夠嗎?服務(wù)商的伺服器是否記錄了密碼的副本?我們實在有必要第一時間重設(shè)這個密碼。
首先使用 ssh
登入伺服器,在 Windows 可以使用 Putty、Tera Term、或者在 Cygwin 環(huán)境下執(zhí)行 OpenSSH。在 Mac 和 Linux 上只需在終端機 (terminal) 中執(zhí)行以下指令便可以了,比 Windows 簡單得多:
由於你從來沒有使用過 ssh 聯(lián)繫到這臺伺服器,你的電腦會把伺服器的加密公鑰下載,然後詢問你是否信任它,這臺新鮮安裝好的 CentOS 7 應(yīng)該還未引起黑客的興趣,也不大可能在這麼短的時間內(nèi)被攻陷,所以可以放心接受這個加密公鑰。跟著輸入 root 的密碼登入伺服器:
登入後立即更改 root 的密碼,你需要輸入新密碼兩次:
好的密碼應(yīng)該同時包含數(shù)字、小寫英文字母、大寫英文字母、和標(biāo)點符號,最少 15 個字符,這樣的密碼強度大概有 90 bit,勉強可以應(yīng)付密碼被「暴力破解」,當(dāng)然我假設(shè)了你的密碼是真正隨機產(chǎn)生,有些人喜歡把個人資料例如名字、出生日期、車牌號碼、地址、配偶和子女的名字等等崁入密碼中,或者使用字典裏的字詞拼湊密碼,這樣密碼的強度將會大幅下降,甚至不堪一擊,這些問題我曾經(jīng)在《如何管理密碼?》討論過。
網(wǎng)上有很多隨機密碼產(chǎn)生器,例如 RANDOM.ORG,大都可用,但記緊必須使用 HTTPS 造訪這些網(wǎng)站。如果你有使用「密碼夾萬」一類的軟件,不妨使用它們內(nèi)建的密碼產(chǎn)生器。
完成後不要登出系統(tǒng),使用另一個視窗用新密碼嘗試登入,即使失敗也可以在原來的視窗重複以上步驟。
這一步連同下一步,相當(dāng)於為一個城市築起兩道城牆,既可加強防衛(wèi),也建立了一道警報機制,當(dāng)敵人(黑客)卒然來襲,第一道城牆被襲擊和破壞,我們還有第二道城牆阻延一下,有時間部署防衛(wèi)甚至反擊。所以這是一個很多人忽略,但其實非常重要的步驟。
首先我們新增一個帳號:
這個新帳號 ahhang 沒有預(yù)設(shè)密碼,即是說登入 ahhang 時系統(tǒng)不用輸入密碼!所以我們立即要設(shè)定密碼:
有些人認(rèn)為不應(yīng)該把建立帳號和設(shè)定密碼兩件事分開來做,一來可能會不慎遺忘,二來也給黑客一道時間縫隙登入這個新帳號,所以他們會在 adduser
指令中一併提供加密後的預(yù)設(shè)密碼,方法是加入 -p
參數(shù),不過這樣做也有風(fēng)險,因為黑客可以透過列出系統(tǒng)的進程,得知加密了的新密碼,然後把密碼破解。
CentOS 7 預(yù)設(shè)容許任何帳號透過 ssh
登入,包括 root 和一般帳號,為了不讓 root 帳號被黑客暴力入侵,我們必須禁止 root 帳號的 ssh
功能,事實上 root 也沒有必要 ssh
登入伺服器,因為只要使用 su
或 sudo
(當(dāng)然需要輸入 root 的密碼) 普通帳號便可以擁有 root 的權(quán)限。使用 vim
(或任何文本編輯器) 開啓 /etc/ssh/sshd_config
,尋找:
修改為:
最後輸入以下指令重新啟動 sshd
:
這樣黑客要取得 root 的權(quán)限,必須破解 root 和一個普通用戶的密碼,難度增加了。
完成後不要登出系統(tǒng),使用另一個視窗嘗試登入 root 和普通帳號,測試無誤便可進行下一步。
Ssh
預(yù)設(shè)使用端口 22,這是在 IANA 註冊的官方端口,但沒有人說 ssh 不能使用其他端口,很多黑客專門向伺服器的 22 端口發(fā)動攻擊,即使你的伺服器固若金湯、牢不可破,但是要系統(tǒng)日以繼夜接受攻擊,消耗的系統(tǒng)資源(網(wǎng)絡(luò)、處理器、記憶體等等)也不會少,何況它是否真的牢不可破還說不定呢!所以有必要讓 ssh
使用其他端口,只讓有權(quán)使用 ssh
的用戶知道。
使用 vim (或任何文本編輯器) 開啓 /etc/ssh/sshd_config
,尋找:
修改為:
你可以把 10837 改為任何 1024 – 65535 之間的任何數(shù)字,若果怕與某些系統(tǒng)服務(wù)發(fā)生衝突,可以參考一下這裏。
跟著重新啟動 sshd
:
然後是設(shè)定防火牆,CentOS 7 的內(nèi)核已經(jīng)有防火牆 netfilter
,但你的系統(tǒng)未必安裝了用戶界面,較前版本的 CentOS 預(yù)設(shè)使用 iptables
,但 CentOS 7 開始使用效能更高、穩(wěn)定性更好的 firewalld
,若果伺服器尚未安裝 firewalld
,可以使用以下指令安裝,不確定是否已經(jīng)安裝的話也可以輸入這個指令,它會告訴你已經(jīng)安裝然後退出。
跟著啟動:
設(shè)定 firewalld
的方法有兩個,第一個是修改 firewalld
有關(guān) sshd
的設(shè)定,把端口 22 改為 10837,這是正統(tǒng)的做法,但步驟比較多;第二個是要求 firewalld
開啓端口 10837,不指定它屬於哪一個服務(wù),這個做法通常處理臨時的端口開啓/封鎖,步驟簡單,但是日後你要是忘記了這個端口為甚麼開啟了呢?什麼時候開啟的呢?為了哪一項服務(wù)開啟呢?可能有點麻煩。我兩種方法都會介紹一下,但作為專業(yè)的系統(tǒng)管理員(即使不是真正的專業(yè),也應(yīng)該具備這樣的心態(tài)),我推薦使用第一種方法。
複製 firewalld
有關(guān) sshd
的設(shè)定檔案:
使用 vim
(或任何文本編輯器) 開啓 /etc/firewalld/services/ssh.xml
,尋找:
修改為:
儲存後重新載入 firewalld
:
輸入以下指令:
就是這樣簡單!
不論使用哪種方法,完成後不要登出系統(tǒng),使用另一個視窗嘗試登入,例如:
ssh
現(xiàn)在只有普通帳號才能透過 ssh
登入伺服器,但是 ssh
提供一個更先進更安全的驗證方法:公鑰驗證法。
首先每一名用戶建立一對加密鑰匙(密鑰和公鑰),密鑰儲存在日常使用的電腦,公鑰則儲存在伺服器,使用 ssh
聯(lián)繫到伺服器的時候,電腦會把一些建立連線請求的資料,其中包括帳號名稱和公鑰,並且把部分資料用密鑰製作數(shù)碼簽署,一股腦兒送到伺服器,伺服器檢查自己的「公鑰庫」是否包含送來的公鑰,有的話再驗證數(shù)碼簽署,成功的話便直接登入伺服器,無需輸入帳號密碼。
第一步在日常使用的電腦上使用 ssh-keygen
指令建立一對加密鑰匙,它會詢問儲存加密鑰匙的檔案名稱,和把鑰匙加密的密碼,檔案名稱使用預(yù)設(shè)的路徑和名稱便可以,密碼則無需輸入:
這個指令會創(chuàng)造兩個檔案,一個名為 id_rsa
,是你的 RSA 密鑰,另一個是 id_rsa.pub
,是你的 RSA 公鑰。公鑰必需上傳到伺服器並且附加於用戶帳號裏面的 .ssh/authorized_keys
檔案中,這個檔案儲存所有可透過 ssh
登入到這一個帳號的公鑰,一行一條公鑰:
順便一提,目錄 .ssh
和 authorized_keys
除了 owner 之外,其他人均不能有寫入的權(quán)限,否則 sshd
不會讀取,換句話說,兩者最寬鬆的權(quán)限是 755:
使用公鑰驗證法登入 ssh
又省力又安全,因為我們不用輸入密碼,自然也沒有密碼被盜取的憂慮,簡簡單單地輸入連線指令便可以了。
但是存放在日常電腦中的密鑰卻帶來新的安全隱患,萬一密鑰被盜取了,其他人豈不是可以隨便登入伺服器?現(xiàn)在是「雙重驗證」(two-factor authentication) 隆重登場的時候,雙重驗證的理念是我們必須向伺服器證明兩種不同性質(zhì)的東西,才能成功驗證身分,第一樣是我們知道什麼,第二樣是我們擁有什麼。首先伺服器會要求我們輸入密碼,我們知道密碼,過了第一關(guān)。跟著伺服器要求我們證明擁有公鑰驗證法中的密鑰,透過上面的設(shè)定程序我們也通過了驗證,過了第二關(guān)?,F(xiàn)在伺服器才會讓我們進入系統(tǒng)。
設(shè)定 ssh 的雙重驗證法很簡單,使用 vim
(或任何文本編輯器) 開啓 /etc/ssh/sshd_config
,在檔案的末端假如這一行:
它告訴伺服器用戶必須擁有合法的公鑰,和輸入正確的密碼才能成功登入。修改完成後重新啟動 sshd
:
完成後不要登出系統(tǒng),使用另一個視窗嘗試登入,測試無誤便可進行下一步。
每一天都有成千上萬的黑客在世界各地尋找 Linux 系統(tǒng)和常見軟件的安全漏洞,一有發(fā)現(xiàn)便會發(fā)動規(guī)模龐大而迅速的網(wǎng)絡(luò)攻擊,務(wù)求在我們來得及反應(yīng)前把系統(tǒng)攻陷。不要以為黑客都只是十來歲的年輕小毛頭,大部分黑客背後都有勢力龐大、資源幾乎無限的國家機構(gòu)支持,有些甚至屬於這些機構(gòu)的雇員,美國的 NSA,英國的 GQHC,中國的無名黑客隊伍,都是比較明目張膽由國家支持的網(wǎng)絡(luò)黑幫,可見我們的系統(tǒng)時時刻刻都被兇狠之徒盯著,保持軟件在最新的狀態(tài)是其中一項我們必須做,也很容易做到的工作。
首先我們立即手動更新所有預(yù)先安裝的軟件:
跟著設(shè)定系統(tǒng)定時自動更新,第一步確定伺服器是否安裝了自動執(zhí)行指令的工具,跟著使用 yum
一個名叫 yum-cron
插件。
CentOS 7 使用數(shù)個軟件來自動執(zhí)行指令:cron
、anacron
、at
和 batch
,其中 cron
和 anacron
用來定期重複執(zhí)行指令,At
和 batch
則用來在特定時間執(zhí)行一次性的指令。我們將會使用 cron
和 anacron
,兩者的分別這裏不細表了,將來有機會再討論,現(xiàn)在使用以下指令安裝 cron
和 anacron
:
下一步就是安裝 yum-cron
:
其實你可以使用一個指令同時安裝 cronie
和 yum-cron
,甚至單獨安裝 yum-cron
也可以,因為 yum
會自動檢測到 yum-cron
需要 cronie
然後自動替你安裝,上面分開兩個指令純粹令大家容易明白。
完成後系統(tǒng)多了數(shù)個檔案,比較重要的包括:
/etc/cron.daily/0yum.cron
Anacron
每天執(zhí)行這個檔案一次,它根據(jù)配置檔案 /etc/yum/yum-cron.conf 來更新軟件/etc/yum/yum-cron.conf
yum-cron
的配置檔案,預(yù)設(shè)只會下載更新的軟件,並不安裝,用意是讓管理員檢視 yum-cron
的輸出,選取需要更新的軟件進行手動安裝。跟著我們修改配置檔案,讓 yum-cron
自動更新軟件,使用 vim
(或任何文本編輯器) 開啓 /etc/yum/yum-cron.conf,尋找:
修改為:
確認(rèn)一下 update_messages = yes
, download_updates = yes
, apply_updates = yes
,正如下圖:
最後,啟動 crond
和 yum-cron
:
防火牆的作用好比網(wǎng)絡(luò)警察,它監(jiān)察所有進出系統(tǒng)的 IP 封包,哪些端口容許封包進入,哪些端口容許封包外出等等,都由防火牆控制,保護使用這些端口的應(yīng)用程式,所以設(shè)定防火牆是極重要的工作。
過濾封包功能的 netfilter 已經(jīng)內(nèi)建在 CentOS 7 的內(nèi)核,但是配置 netfilter 的界面程式 firewalld 卻未必有安裝,不論是否已經(jīng)安裝,都可以執(zhí)行下面的安裝指令:
跟著查看一下防火牆現(xiàn)在開啟了哪些服務(wù)和端口:
上圖可見防火牆只開啟了 DHCP 客戶端和 ssh 兩個服務(wù)的通訊端口,倘若日後安裝了其他網(wǎng)絡(luò)軟件,例如網(wǎng)站伺服器、域名伺服器等等,必須要檢查安裝程式有否開啓他們的通訊端口,沒有的話便要手動開啓。如果好像前面第四點那樣使用了非常規(guī)的通訊端口,也可能要手動配置防火牆,防火牆詳細的配置方法超出了本文的討論範(fàn)圍,將來有機會再談。