五條強化SSH安全的建議
當(dāng)你查看你的 SSH 服務(wù)日志,可能你會發(fā)現(xiàn)充斥著一些不懷好意的嘗試性登錄。這里有 5 條常規(guī)建議(和一些個別特殊策略)可以讓你的 OpenSSH 會話更加安全。
1. 強化密碼登錄
密碼登錄很方便,因為你可以從任何地方的任何機器上登錄。但是它們在暴力攻擊面前也是脆弱的。嘗試以下策略來強化你的密碼登錄。
- 使用一個密碼生成工具,例如 pwgen。pwgen 有幾個選項,最有用的就是密碼長度的選項(例如,pwgen 12 產(chǎn)生一個12位字符的密碼)
- 不要重復(fù)使用密碼。忽略所有那些不要寫下你的密碼的建議,然后將你的所有登錄信息都記在一個本子上。如果你不相信我的建議,那總可以相信安全權(quán)威 Bruce Schneier 吧。如果你足夠細心,沒有人能夠發(fā)現(xiàn)你的筆記本,那么這樣能夠不受到網(wǎng)絡(luò)上的那些攻擊。
- 你可以為你的登錄記事本增加一些額外的保護措施,例如用字符替換或者增加新的字符來掩蓋筆記本上的登錄密碼。使用一個簡單而且好記的規(guī)則,比如說給你的密碼增加兩個額外的隨機字符,或者使用單個簡單的字符替換,例如 # 替換成 *。
- 為你的 SSH 服務(wù)開啟一個非默認的監(jiān)聽端口。是的,這是很老套的建議,但是它確實很有效。檢查你的登錄;很有可能 22 端口是被普遍攻擊的端口,其他端口則很少被攻擊。
- 使用 Fail2ban 來動態(tài)保護你的服務(wù)器,是服務(wù)器免于被暴力攻擊。
- 使用不常用的用戶名。絕不能讓 root 可以遠程登錄,并避免用戶名為“admin”。
2. 解決 Too Many Authentication Failures 報錯
當(dāng)我的 ssh 登錄失敗,并顯示“Too many authentication failures for carla”的報錯信息時,我很難過。我知道我應(yīng)該不介意,但是這報錯確實很礙眼。而且,正如我聰慧的奶奶曾經(jīng)說過,傷痛之感并不能解決問題。解決辦法就是在你的(客戶端的)~/.ssh/config 文件設(shè)置強制密碼登錄。如果這個文件不存在,首先創(chuàng)個 ~/.ssh/ 目錄。
- $ mkdir ~/.ssh
- $ chmod 700 ~/.ssh
然后在一個文本編輯器創(chuàng)建 ~/.ssh/confg 文件,輸入以下行,使用你自己的遠程域名替換 HostName。
- HostName remote.site.com
- PubkeyAuthentication=no
(LCTT 譯注:這種錯誤發(fā)生在你使用一臺 Linux 機器使用 ssh 登錄另外一臺服務(wù)器時,你的 .ssh 目錄中存儲了過多的私鑰文件,而 ssh 客戶端在你沒有指定 -i 選項時,會默認逐一嘗試使用這些私鑰來登錄遠程服務(wù)器后才會提示密碼登錄,如果這些私鑰并不能匹配遠程主機,顯然會觸發(fā)這樣的報錯,甚至拒絕連接。因此本條是通過禁用本地私鑰的方式來強制使用密碼登錄——顯然這并不可取,如果你確實要避免用私鑰登錄,那你應(yīng)該用 -o PubkeyAuthentication=no 選項登錄。顯然這條和下兩條是互相矛盾的,所以請無視本條即可。)
3. 使用公鑰認證
公鑰認證比密碼登錄安全多了,因為它不受暴力密碼攻擊的影響,但是并不方便因為它依賴于 RSA 密鑰對。首先,你要創(chuàng)建一個公鑰/私鑰對。下一步,私鑰放于你的客戶端電腦,并且復(fù)制公鑰到你想登錄的遠程服務(wù)器。你只能從擁有私鑰的電腦登錄才能登錄到遠程服務(wù)器。你的私鑰就和你的家門鑰匙一樣敏感;任何人獲取到了私鑰就可以獲取你的賬號。你可以給你的私鑰加上密碼來增加一些強化保護規(guī)則。
使用 RSA 密鑰對管理多個用戶是一種好的方法。當(dāng)一個用戶離開了,只要從服務(wù)器刪了他的公鑰就能取消他的登錄。
以下例子創(chuàng)建一個新的 3072 位長度的密鑰對,它比默認的 2048 位更安全,而且為它起一個獨一無二的名字,這樣你就可以知道它屬于哪個服務(wù)器。
- $ ssh-keygen -t rsa -b 3072 -f id_mailserver
以下創(chuàng)建兩個新的密鑰, id_mailserver 和 id_mailserver.pub,id_mailserver 是你的私鑰--不要傳播它!現(xiàn)在用 ssh-copy-id 命令安全地復(fù)制你的公鑰到你的遠程服務(wù)器。你必須確保在遠程服務(wù)器上有可用的 SSH 登錄方式。
- $ ssh-copy-id -i id_rsa.pub user@remoteserver
- /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
- user@remoteserver's password:
- Number of key(s) added: 1
- Now try logging into the machine, with: "ssh 'user@remoteserver'"
- and check to make sure that only the key(s) you wanted were added.
ssh-copy-id 會確保你不會無意間復(fù)制了你的私鑰。從上述輸出中復(fù)制登錄命令,記得帶上其中的單引號,以測試你的新的密鑰登錄。
- $ ssh 'user@remoteserver'
它將用你的新密鑰登錄,如果你為你的私鑰設(shè)置了密碼,它會提示你輸入。
4. 取消密碼登錄
一旦你已經(jīng)測試并且驗證了你的公鑰可以登錄,就可以取消密碼登錄,這樣你的遠程服務(wù)器就不會被暴力密碼攻擊。如下設(shè)置你的遠程服務(wù)器的 /etc/sshd_config 文件。
- PasswordAuthentication no
然后重啟服務(wù)器上的 SSH 守護進程。
5. 設(shè)置別名 -- 這很快捷而且很酷
你可以為你的遠程登錄設(shè)置常用的別名,來替代登錄時輸入的命令,例如 ssh -u username -p 2222 remote.site.with.long-name。你可以使用 ssh remote1。你的客戶端機器上的 ~/.ssh/config 文件可以參照如下設(shè)置
- Host remote1
- HostName remote.site.with.long-name
- Port 2222
- User username
- PubkeyAuthentication no
如果你正在使用公鑰登錄,可以參照這個:
- Host remote1
- HostName remote.site.with.long-name
- Port 2222
- User username
- IdentityFile ~/.ssh/id_remoteserver
OpenSSH 文檔 很長而且詳細,但是當(dāng)你掌握了基礎(chǔ)的 SSH 使用規(guī)則之后,你會發(fā)現(xiàn)它非常的有用,而且包含很多可以通過 OpenSSH 來實現(xiàn)的炫酷效果。