SSH 是遠程登錄 Linux 服務器的最常見的方式。且 SSH 登錄的時候要驗證的,相對來講會比較安全。那只是相對,下面會介紹一些方式提高 SSH 的安全性
SSH 的驗證
而SSH 登錄時有兩種驗證方式
- 密碼認證,要求用戶每次登錄服務器的時候都要輸入密碼
- 密鑰認證,客戶端的公鑰先保存在服務器的
.ssh/authorized_keys
中,登錄時使用該公鑰自動驗證,認證成功就不用輸入密碼都能登錄
密碼認證的問題
- 密碼簡單容易被人攻破, 密碼復雜難記,又比較容易輸錯。
- 容易被人用暴力破解的方式攻擊。比如是ncrack。就算沒有攻破,服務器各種被人在嘗試密碼是什么,有種各種被蹂躪的感覺。
- 寫自動化腳本比較麻煩,需要用
expect
之類的命令
嘗試使用暴力破解ssh
安裝ncrack
並下載一份常用的密碼
ncrack -p 22 --user root -P 500-worst-passwords.txt 192.168.31.121
結果如下
```
Starting Ncrack 0.6 ( http://ncrack.org ) at 2018-01-27 14:20 CST
Discovered credentials for ssh on 192.168.31.121 22/tcp:
192.168.31.121 22/tcp ssh: 'root' '123456'
Ncrack done: 1 service scanned in 96.06 seconds.
# 保護 ssh 的方法
## 不要使用簡單的密碼
上面被人暴力破解密碼的主要原因是用了簡單的密碼,而使用強密碼就相對比較難暴力破解 而何為強密碼:
* 強密碼長度至少有 8 個字符,
* 不包含全部或部分用戶帳戶名,不能是連貫的名
* 至少包含以下四類字符中的三類:大寫字母、小寫字母、數字,以及鍵盤上的符號(如 !、@、#)
最好還要定期修改密碼
## 拉黑 ip
若一定要開放密碼登錄,就有會有人嘗試暴力破解
```bash
sudo cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2" = "$1;}'
用這個命令可以看到有多少“客人”關顧你的服務器. 面對這種情況,就要把這些客人拉進黑名單了。此時我們可以使用DenyHosts這種工具,這個工具的Centos
andDebain
都有對應有二進制文件,直接yum install denyhosts
或者apt-get install denyhosts
就行了 配置文件在/etc/denyhosts.conf
#sshd日志文件,它是根據這個文件來判斷的,不同的操作系統,文件名稍有不同。
SECURE_LOG = /var/log/secure
#控制用戶登陸的文件
HOSTS_DENY = /etc/hosts.deny
#過多久后清除已經禁止的IP,如5m(5分鍾)、5h(5小時)、5d(5天)、5w(5周)、1y(一年)
PURGE_DENY = 5m
DAEMON_PURGE = 5m
#禁止的服務名,可以只限制不允許訪問ssh服務,也可以選擇ALL
BLOCK_SERVICE = sshd
#允許無效用戶失敗的次數
DENY_THRESHOLD_INVALID = 5
#允許普通用戶登陸失敗的次數
DENY_THRESHOLD_VALID = 10
#允許root登陸失敗的次數
DENY_THRESHOLD_ROOT = 5
#是否做域名反解
HOSTNAME_LOOKUP=NO
#日志文件
DAEMON_LOG = /var/log/denyhosts
其中ip白名單在/etc/hosts.allow
,禁止訪問ssh的名單在/etc/hosts.deny
- 為防止自己的IP被屏蔽,可以:echo “你的IP” >> /usr/share/denyhosts/allowed-hosts 將你的IP加入白名單,再重啟DenyHosts
手動解禁ip:
- wget http://soft.vpser.net/security/denyhosts/denyhosts_removeip.sh
- 如果是centos 7 的,將
/etc/init.d/
的轉成systemctl
sduo sh denyhosts_removeip.sh 待解封的ip
搞定
設置 ssh 不能使用 root 登錄
使用ssh
登錄root
用戶,畢竟root
用戶的權限太大了。禁止root
用戶ssh
后,即使密碼泄露了,也不能通過ssh
遠程登錄,提高了服務器的安全性。 相關的操作就是把/etc/ssh/sshd_config
中的PermitRootLogin yes
修改為PermitRootLogin no
再重啟一下服務 systemctl restart sshd
不使用密碼登錄
使用密碼登錄會有以上的問題,不太安全且不太方便 所以我覺得還是用密鑰去認證會比較好。更方便更安全。
生成密鑰對
如果你沒有包含公鑰和私鑰的密鑰對,你需要生成一個。如果你已經有了想要使用的密鑰,請跳到復制公鑰的步驟。 要生成新的密鑰對,請在本地機器終端輸入以下命令:
ssh-keygen
假設你的本地用戶叫 localuser
,你會看到的輸出如下所示
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/localuser/.ssh/id_rsa):
按回車鍵以接受這文件名和路徑(或者輸入新的名稱) 下一步,系統會提示你輸入密碼確保密鑰的安全。你可以輸入密碼或者將密碼留空。 注意:如果你將密碼留空,你可以用私鑰進行身份驗證,不輸入再輸入密碼。如果你輸入密碼了,你需要私鑰和密碼才能登陸。使用密碼保護密碼會更加安全,但兩者都有自己的用途,並且都比基本密碼驗證更安全。 這會在 localuser 的Home
(主)目錄的 .ssh
文件夾 中生成一個私鑰 id_rsa
和一個公鑰 id_rsa.pub
。記住私鑰不要和任何不該訪問你服務器的人共享。
復制公鑰
復制公鑰有兩種方式,手動檔和自動擋
手動配置
做的東西很簡單,就是將本機的公鑰字符串復制到"~/.ssh/authorized_keys" 若服務器中沒有.ssh
文件夾則需要自己創建
cd ~
mkdir .ssh
chmod 700 ~/.ssh
cd ssh
touch authorized_keys
chmod 600 authorized_keys
復制公鑰內容
scp id_rsa.pub userName@host:/home/userName/.ssh/wait_to_authorized_key
ssh 登錄后
cat wait_to_authorized_key >> authorized_keys
自動上傳密鑰
手動復制密鑰太麻煩了,so 懶惰的人會用
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
自動生成公鑰,並上傳為服務器的.ssh/authorized_keys
若服務器沒有.ssh
會自動創建對應的文件和賦予文件對應的權限
禁止密碼登錄
既然已經可以通過密鑰去認證,認為那台機器是可以信任的,那么最好就是禁止密碼登錄,這樣的話就不怕暴力破解了。 把/etc/ssh/sshd_config
中的PasswordAuthentication yes
修改為PasswordAuthentication no
再重啟一下服務
systemctl restart sshd
如果有人想登錄,但密鑰不對會是這種結果