發新話題

XP上使用PuTTY的公鑰認證管理 Linux遠程SSH

XP上使用PuTTY的公鑰認證管理 Linux遠程SSH

注意 :代碼中的 # 只表示註釋作用,該內容不能輸入到命令行窗口中

      遠程管理 Ubuntu,可以通過很多方式,這裡只介紹 SSH。通過 SSH 可以遠程登錄到服務器上,讓你覺得好像就在服務器面前工作一樣。我們使用的 SSH 是 OpenSSH ,它是由兩個小組開發的,其中 OpenBSD 為該項目做了傑出貢獻。通過 OpenSSH,我們不僅可以遠程使用命令行,還可以遠程運行 X Window 圖像程序,安全地傳輸文件。我們甚至還可以用 OpenSSH 的端口映射功能為其它協議做管道,來通過防火牆或者不可信任的網絡。

      OpenSSH 的安全性非常高,如果你目前仍在使用 telnet、rlogin、ftp 這些非常不安全的工具(它們傳輸密碼時使用明文,導緻密碼很容易被竊取),希望你能盡快轉移到 SSH 上來,已減少網絡安全隱患。


關於公鑰認證
為什麼要用公鑰認證

      如果你的 SSH 服務器是放在 Internet 上的,那麼 Hiweed 強烈建議你不要使用密碼登錄。因為總有些像搞破壞的人,使用各種各樣的方法,希望能夠得到你的用戶名和密碼,然後做一些亂七八糟的事情。

      請你千萬不要不以為然。你可以查看系統認證日誌文件,該文件位於/var/log/auth.log 。使用 tail 查看文件的最後幾行(-n 的默認值為 10,即十行)。使用 -f 開關,可以輸出該文件新增的數據。具體參數配置可以使用 tail --help 命令。
Linux代碼

   1. $ cd /var/log  
   2. $ tail -f auth.log  

$ cd /var/log
$ tail -f auth.log

其輪轉(rotate)後的日誌文件為 /var/log/auth.log.0 等。使用 grep 過濾出 SSH 的認證信息:
Linux代碼

   1. $ grep failed auth.log.0  

$ grep failed auth.log.0

       你很有可能會看到非常多的認證失敗信息:
Sshd - failed代碼

   1. Jul  1 21:18:44 lee sshd[2273]: error: key_read: key_from_blob AAAAB3NzaC1yc2EAAAABJQAAAIEAql2+PY8ZDVK+RVLUCzteXHyz8qFoC/fNlUOw fjRVUuVoytgjpqyHWM7vSxkBO90B6f8mPL8jxhWBGqXMv2hQKsJrHDf4m9ILIrDN/pGt/HnZ/JQZkLOnxddWdXCLbDMESrU8D3a9SMSkEbmL5RgJ+NIv6DbrlTElT7lm ESAM5Ns= lee's key\n failed  
   2. Jul  1 21:26:13 lee sshd[2560]: error: key_read: uudecode AAAAB3NzaC1yc2EAAAABJQAAAIEAql2+PY8ZDVK+RVLUCzteXHyz8qFoC/fNlUOwfjRVUuVoytgjpqyHWM7vSxkBO90B6f8mPL8jxhWBGqXMv2hQKsJrHDf4m9ILIrDN/pGt/HnZ/JQZkLOnxddWdXCLbDMESrU8D3a9SMSkEbmL5RgJ+NIv6DbrlTElT7lmESAM5Ns== lee's key\n failed  

Jul  1 21:18:44 lee sshd[2273]: error: key_read: key_from_blob AAAAB3NzaC1yc2EAAAABJQAAAIEAql2+PY8ZDVK+RVLUCzteXHyz8qFoC/fNlUOw fjRVUuVoytgjpqyHWM7vSxkBO90B6f8mPL8jxhWBGqXMv2hQKsJrHDf4m9ILIrDN/pGt/HnZ/JQZkLOnxddWdXCLbDMESrU8D3a9SMSkEbmL5RgJ+NIv6DbrlTElT7lm ESAM5Ns= lee's key\n failed
Jul  1 21:26:13 lee sshd[2560]: error: key_read: uudecode AAAAB3NzaC1yc2EAAAABJQAAAIEAql2+PY8ZDVK+RVLUCzteXHyz8qFoC/fNlUOwfjRVUuVoytgjpqyHWM7vSxkBO90B6f8mPL8jxhWBGqXMv2hQKsJrHDf4m9ILIrDN/pGt/HnZ/JQZkLOnxddWdXCLbDMESrU8D3a9SMSkEbmL5RgJ+NIv6DbrlTElT7lmESAM5Ns== lee's key\n failed

     尤其是那些在時間上很連續的登錄嘗試,一看就知道是暴力破解。

     既然密碼登錄方式這麼不安全,那麼使用什麼方式登錄呢?使用公鑰 。

公鑰認證是怎麼工作的

     「公鑰」是從 Public Key 翻譯過來的,和「私鑰」(Private Key)相對應。公鑰和私鑰都是一個很長的字符串(一個非常大的隨機數)。公鑰放在服務器上,私鑰放在你的客戶機上;當你從客戶機連接服務器時,如果你的私鑰能夠和公鑰對上號,就可以通過認證。

     簡單地說,公鑰就好像一把鎖,把服務器鎖住;私鑰就好像一把鑰匙,只有鑰匙對了,才能打開那把鎖。沒有鑰匙,別指望打開它。

       因為大多數 SSH 程序保持私鑰時都使用密碼加密保護。所以,即便你的電腦丟失,私鑰被人拿到,你也有足夠的時間來創建新的公鑰和私鑰,並將服務器上的舊公鑰替換掉。

SSH 的安裝

       Ubuntu 提供了一個 meta 軟件包,名為 ssh。它依賴 openssh-server 和 openssh-client。使用 apt-cache 顯示軟件包的依賴關係,從而驗證我們剛才所說的是否正確:
Linux代碼

   1. $ apt-cache show ssh  
   2. ...  
   3. Depends: openssh-client, openssh-server  
   4. ...   

$ apt-cache show ssh
...
Depends: openssh-client, openssh-server
...

      如果你的機器上既需要 SSH Server 又需要 SSH Client,可以直接安裝 ssh 軟件包;否則,就可以分開來安裝。

安裝 SSH 服務器和客戶端

      如果你的服務器上只需用 SSH Server的話,則安裝 openssh-server 軟件包即可。使用 dpkg -l 查看軟件包 openssh-server 是否已安裝。如沒,則輸入安裝命令。
Linux代碼

   1. # 確認 openssh-server 是否已安裝  
   2. $ dpkg -l openssh-server  
   3. # 如沒,則輸入安裝命令  
   4. $ sudo apt-get install openssh-server  

# 確認 openssh-server 是否已安裝
$ dpkg -l openssh-server
# 如沒,則輸入安裝命令
$ sudo apt-get install openssh-server

      這樣,OpenSSH 服務器就安裝好了。提供 SSH 服務的程序叫做 sshd,其配置文件是/etc/ssh/sshd_config 。在默認情況下,SSH 服務跑在 TCP 的22端口。為了安全起見,你可以把這個端口號改成別的,比如2323。使用 sudo nano 修改端口號:
Linux代碼

   1. $ sudo nano /etc/ssh/sshd_config  
   2. # 將 Port 22 改為 Port 2323,然後按 Ctrl+o,最後按 Ctrl+x。這樣就修改完成  
   3. # 重新啟動系統才能生效  
   4. $ sudo reboot  

$ sudo nano /etc/ssh/sshd_config
# 將 Port 22 改為 Port 2323,然後按 Ctrl+o,最後按 Ctrl+x。這樣就修改完成
# 重新啟動系統才能生效
$ sudo reboot

      如果是在客戶端上,我們只需要安裝 SSH Client,那麼安裝 openssh-client 軟件包即可:
Linux代碼

   1. $ sudo apt-get install openssh-client  

$ sudo apt-get install openssh-client

      這樣,OpenSSH 客戶端就安裝好了。它攜帶了一些其他 SSH 工具,比如 ssh-keygen 可以用來生成公鑰/私鑰對,scp 可以用來通過 SSH 遠程複製文件,sftp 可以實現安全 FTP 傳輸,等等。

測試

      安裝好後,馬上就可以在服務器上測試一下:
Linux代碼

   1. $ ssh localhost -p 2323  

$ ssh localhost -p 2323

      正常情況下,SSH 會邀請你輸入密碼,通過認證後,便登錄成功,你就進入了基於 SSH 新的命令行了。要退出也很簡單,使用 Ctrl+d 或 exit 命令即可。



SSH 配置

      首先,我們需要生成一對公鑰/私鑰。

       在 Linux 客戶機上,運行 ssh-keygen 命令(請確認你安裝了 openssh-client 軟件包):

      上面命令行輸入的 rsa 代表 rsa for protocol version 2。有關參數選項的含義,建議參考 OpenSSH 用戶手冊——ssk-keygen 。

      這樣,密鑰對就生成了。公鑰是~/.ssh/id_rsa.pub,私鑰是~/.ssh/id_rsa。

將公鑰複製到服務器

      生成公鑰後,我們還需要將它複製到服務器上。

      你可以使用 scp 進行遠程 copy,但是 OpenSSH 提供了一個更好的工具叫做 ssh-copy-id (QuickTip: Make life easier with ssh-copy-id ), 專門用於密鑰的複製 。它可以更安全地幫助我們上傳公鑰,並自動把公鑰寫入 SSH 服務器上的 ~/.ssh/authorized_keys (如果~/.ssh目錄不存在的話,它會自動創建)。
Linux代碼

   1. $ ssh-copy-id -i .ssh/id_rsa.pub lewis@192.168.1.199  

$ ssh-copy-id -i .ssh/id_rsa.pub lewis@192.168.1.199

      如果想查 authorized_keys 文件的獲取權限是不是 -wr------ ?可以使用 ls -l 命令查看文件的權限:
Linux代碼

   1. $ cd .ssh  
   2. $ ls -l  

$ cd .ssh
$ ls -l



SSH 登錄測試

      複製後,我們來測試一下,看看使用剛才創建的密鑰對能不能登錄。

  1. 從 Linux 登錄

      從 Linux 客戶機上登錄 SSH 服務器很簡單:
Linux代碼

   1. $ ssh lewis@192.168.1.199  

$ ssh lewis@192.168.1.199

      輸入密鑰密碼後,應該就可以登錄成功了。如果你在創建 key 時沒有輸入密碼,則登錄時也不需要使用密碼,直接就能登錄成功(可以用在 shell 腳本中實現自動維護任務)。

      如果你的 .ssh 目錄下有多個 key,則可以使用 -i 來指定 key 文件:
Linux代碼

   1. $ ssh -i .ssh/id_rsa lewis@192.168.1.199  

$ ssh -i .ssh/id_rsa lewis@192.168.1.199

   2. 用 PuTTY 登錄

      在 Windows 上用 PuTTY 登錄的話,我們的私鑰必須用 PuTTYgen 轉換一下格式。在 PuTTYgen 的 File 菜單上,選擇「Load private key」 或 直接單擊「load」按鈕。

在 PuTTYgen 上加載私鑰

       如果你的私鑰有密碼,PuTTYgen 會要求你輸入密碼。

輸入私鑰的密碼

       輸入正確的密碼後,會顯示導入成功。並提示說,「Save private key」將私鑰保存為 PuTTY 自己的 key 格式。

私鑰導入成功

      現在,在 PuTTYgen 的界面上,你可以修改 key 的備註(Key comment),然後單擊「Save private key」按鈕,將私鑰保存。

修改備註並保存

    * Run the Putty client (PuTTY.exe) to specify the saved private key and auto-login username before initiating connection to lewis.

      現在,在 PuTTY 中的「Connection -> SSH -> Auth」配置界面中,指定 key 的路徑即可。

在 PuTTY 中加載私鑰

Graph 20.6 Specify the login user ID

SSH服務器配置

      在 SSH 服務器上,我們要禁止使用密碼登錄,僅允許使用密鑰登錄。

      先備份/etc/ssh/sshd_config,然後修改它:
Linux代碼

   1. $ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config-backup  
   2. $ sudo nano /etc/ssh/sshd_config  

$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config-backup
$ sudo nano /etc/ssh/sshd_config

     找到下面幾行內容:
Linux代碼

   1. PermitRootLogin yes  
   2. #PasswordAuthentication yes  
   3. UsePAM yes  

PermitRootLogin yes
#PasswordAuthentication yes
UsePAM yes

     將 yes 全部改為 no:
Linux代碼

   1. # 不允許使用 root 賬號登錄系統  
   2. PermitRootLogin no  
   3. # 密碼登錄權限失效  
   4. PasswordAuthentication no  
   5. UsePAM no  

# 不允許使用 root 賬號登錄系統
PermitRootLogin no
# 密碼登錄權限失效
PasswordAuthentication no
UsePAM no

     文件保存後,重新啟動 SSH 服務:
Linux代碼

   1. $ sudo /etc/init.d/ssh restart  

$ sudo /etc/init.d/ssh restart

     好,SSH 服務器的配置就完成了。現在開始,SSH 服務器將不再接受密碼登錄方式,只有使用私鑰 key 才能登錄。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。