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