Google Code Prettify

2015年2月16日 星期一

ssh 公鑰認證登入

大部份情況下用 ssh 連線到 Linux 主機,就是連上去後打帳號、密碼後登入,但其實 ssh 還提供公鑰認證的方式,就是在本機安裝一把私鑰,在 Linux 主機上安裝一把公鑰,那麼使用 ssh 連線時,就可以直接連線,不需要輸入帳號、密碼,方法如下: (這裡使用 putty 連線 Linux)
  • 產生公鑰和私鑰
執行如下指令,產生 ssh 所需要的公鑰和私鑰。
ssh-keygen -f steven
這樣會產生命名為 steven 的私鑰及命名為 steven.pub 的公鑰,接著開啟 PuTTY Key Generator,點選上方選單「Conversions/Import Key」,如下圖,按【Save private key】,將 private key 存成 putty 所要的格式,這裡假設存成的檔名為 steven.ppk。

  • 設定 Putty
如下圖,輸入要連線的主機的 IP 或 host name,並為這個 session 取個名稱後按【Save】。
於「Connection/Data」的 Auto-login username 處輸入要登入的帳號。
於「Connection/SSH/Auth」的 Private key file for authentication 設定私鑰的檔名,然後點選左邊的 Session,回到最開頭的那個畫面後按【Save】,將上述的設定儲存。

  • 部署公鑰
使用 ssh-copy-id 將公鑰部署到 Linux Server 上,steven.pub  是公鑰檔名,steven 是帳號,192.168.253.128 是主機的 IP。
ssh-copy-id -i steven.pub steven@192.168.253.128
部署上去後,在 Linux 主機上的 /home/steven/.ssh 目錄下,會出現一個名為 authorized_keys 的檔案,公鑰被放入這個檔案裡了! 如果這個檔案原本就已存在,這一次部署的公鑰會被 append 在檔案後頭。部署後要記得檢查一下 /home/steven 目錄的權限必須是 700.ssh 目錄的權限也必須是 700,且 authorized_keys 這個檔案的權限必須是 600,.ssh 及 authorized_keys 的使用者和群組需要是 steven steven,如果不是當然就自己改一下… (權限錯誤在連線時有可能會出現 "server refused our key" 的錯誤訊息!)
chmod 600 authorized_keys
chown steven.steven authorized_keys
【註】一般的 Windows 上不會有這支程式,我的電腦因為有安裝 Cygwin 才會有,這個軟體提供了在 Windows 作業系統下的 UNIX 模擬環境,不想安裝這個軟體的話,可以把公鑰上傳到 Linux Server 後,將公鑰放入 .ssh 目錄,然後執行如下指令:
cat steven.pub >> authorized_keys
也就是把公鑰匯入 authorized_keys 檔就可以了。
  • 修改 ssh 設定檔
使用 root 權限,開啟 /etc/ssh/sshd_config,這個檔有很多選項,下面只列出要設定的部份,因為我們產生的是 RSA 演算法的公私鑰,所以進行如下設定,這些設定簡單的說,就是開啟 RSA public key 授權,並指明 public key  所放置的位置。其實這些選項原本就都存在於 sshd_config 檔裡,只是被 # 設成註解,只要找到這些選項將 # 移除就可以了。
复制代?
HostKey /etc/ssh/ssh_host_rsa_key

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
复制代?
修改完 ssh 設定必須重啟服務,如下:
service sshd restart
  • 測試
開啟 putty 選擇一開始我們儲存的那個 session,按【Open】進行連線,不需要輸入帳號、密碼,即可以看到如下畫面,表示已登入成功。
ps. 如果一直無法登入,可以開啟 debug log 來查原因,在 /etc/ssh/sshd_config 檔中,找到 LogLevel INFO,將它改為 LogLevel DEBUG3。重新登入後,打開 /var/log/secure 檔查看 log。

  • Git Bash 的 ssh 連線
上面介紹的是使用 putty 的 ssh 連線方式,如果是要用 Git Bash 中的 ssh 連到遠端的 Linux server,環境要怎麼設定? 如下:
  1. 在 C:/Windows/System32/drivers/etc/hosts 中,新增 192.168.253.128 gitserver。
  2. 開啟 Git Bash,因為我在登入 Windows 時,是用 Steven 這個帳號,開啟 Git Bash 時,預設會連到他的家目錄 /c/Users/Steven。
  3. 進入 .ssh 目錄,開啟或新建一個 config 檔,然後在這個檔案裡輸入如下內容:
host gitserver
            user steven
            hostname 192.168.253.128
            port 22
            identityfile /d/seal/steven


這樣的設定是指,要使用 steven 這個帳號登入 192.168.253.128 這台主機,私鑰的檔案是放在 /d/seal/steven,設定好後輸入如下指令,即可登入遠端的 Linux Server。
ssh gitserver

如果不想設定這個 config 檔,可以直接將私鑰放在家目錄的 .ssh 子目錄下,也就是將私鑰放到 /c/Users/Steven/.ssh 目錄也可以。

沒有留言:

張貼留言