Linux 中提升的 SSH 的安全性

linux-ssh

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

SSH 的驗證

而SSH 登陸時有兩種驗證方式linux

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

密碼認證的問題

  1. 密碼簡單容易被人攻破, 密碼複雜難記,又比較容易輸錯。
  2. 容易被人用暴力破解的方式攻擊。好比是ncrack。就算沒有攻破,服務器各類被人在嘗試密碼是什麼,有種各類被蹂躪的感受。
  3. 寫自動化腳本比較麻煩,須要用 expect 之類的命令

嘗試使用暴力破解ssh

安裝ncrack並下載一份經常使用的密碼git

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.github

# 保護 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.confcentos

#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:bash

  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

生成密鑰對

若是你沒有包含公鑰和私鑰的密鑰對,你須要生成一個。若是你已經有了想要使用的密鑰,請跳到複製公鑰的步驟。 要生成新的密鑰對,請在本地機器終端輸入如下命令:tcp

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

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

參考資料

相關文章
相關標籤/搜索