讓 SSH 可以不用輸入密碼登入(authentication key)

SSH加密連線,對於管理遠端伺服器來說,是個重要的工具,可以說是必用的工具了。但每次登入都要輸入密碼有時候滿麻煩的,然後SSH也滿friendly的,提供了一個不用輸入密碼的選擇,其實Amazon AWS,以及drupal git也是預設用這種方式連線。

用Authentication key的優點就是不用輸入密碼,安全性跟「輸入帳號密碼」相對而言較佳,要持有private key的電腦才能登入伺服器,不用擔心被人暴力破解密碼。但這裡其實也產生了一個問題,只要持有private key就可以了。所以不管用帳號或authentication key,都要好好保管。

廢話不多說,直接說明如何作,以下是在Ubuntu的環境下(基本上Linux指令應該都一樣):

  1. 首先在任何一台你想要用來登入伺服器的電腦建立金鑰對(key-pair),也就是一個公鑰,一個私鑰。
    ssh-keygen -t rsa
     
  2. 通常會問你要不設定金鑰密碼,因為本來就希望不要輸入密碼,直接按Enter就好
    Enter new passphrase (empty for no passphrase):
     
  3. 產生的金鑰會放在/home/fabio/.ssh/username 底下(username就是目前產生金鑰的帳號),會有兩個檔案
    id_rsa(私鑰) , id_rsa.pub(公鑰),要好好保管私鑰,如果不見了就...,接著我們要把公鑰複製到目標伺服器去。
     
  4. 可以簡單的透過指令複製,以下是把公鑰複製到abc.com這個伺服器,要注意的是在伺服端要有userA這個帳號
    ssh-copy-id userA@abc.com     ...(註1)
    過程中會問你userA這個帳號的登入密碼(當然,是登入到abc.com的密碼)。
     
  5. 完成後在abc.com這個伺服器裡的/home/userA/.ssh/ 這個目錄底下會出現一個檔案authentication_keys (或 authorized_keys ,可在sshd_config 設定)
    有沒有注意到是"keys",也就是說可以有不只一個公鑰可以放在裡面
  6. 然後要記得要修改abc.com的ssh的設定檔,找到以下兩個設定值取消註解,如果沒有就自己新增
    RSAAuthentication yes
    PubkeyAuthentication yes
    ...(註2)
     
  7. 然後重啟abc.com的sshd服務
    sudo service sshd restart
     
  8. 完成,可以試著登入看看
     

註1:ssh-copy-id 可以指定公鑰的位置,加上參數 -i即可,範例如下:
   ssh-copy-id -i /home/otheruser/.ssh/id_rsa.pub userA@abc.com
 

註2:如果未來只希望用key登入,不希望任何人透過密碼連線,則可以加上以下設定
  PasswordAuthentication no

註3: 如果是要手動添加 authorized_keys  的話,~/.ssh  以及  ~/.sshd/authorized_keys  的權限分別要設定為 700 與 600