Linux 中提高的 SSH 的安全性


linux-ssh

SSH 是遠程登錄 Linux 服務器的最常見的方式。且 SSH 登錄的時候要驗證的,相對來講會比較安全。那只是相對,下面會介紹一些方式提高 SSH 的安全性

SSH 的驗證

而SSH 登錄時有兩種驗證方式

  1. 密碼認證,要求用戶每次登錄服務器的時候都要輸入密碼
  2. 密鑰認證,客戶端的公鑰先保存在服務器的.ssh/authorized_keys中,登錄時使用該公鑰自動驗證,認證成功就不用輸入密碼都能登錄

密碼認證的問題

  1. 密碼簡單容易被人攻破, 密碼復雜難記,又比較容易輸錯。
  2. 容易被人用暴力破解的方式攻擊。比如是ncrack。就算沒有攻破,服務器各種被人在嘗試密碼是什么,有種各種被蹂躪的感覺。
  3. 寫自動化腳本比較麻煩,需要用 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這種工具,這個工具的CentosandDebain都有對應有二進制文件,直接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:

  1. wget http://soft.vpser.net/security/denyhosts/denyhosts_removeip.sh
  2. 如果是centos 7 的,將/etc/init.d/ 的轉成 systemctl
  3. 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

如果有人想登錄,但密鑰不對會是這種結果

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM