通常啟用 SSH 登入會遇到一個大問題:經常會有奇怪的人想要暴力破解密碼,取得登入權限。最早我都是限制只能從校內 IP 來源登入來減輕這個問題,然而最近的電腦是在 NAT 背後,透過一個 port 連結 SSH,所以似乎看不到真正的來源 IP,因此無法輕易過濾。
我最後決定停用密碼登入的功能,改成只能用 public key 登入,這樣子可能比較難以猜中正確的密鑰。不過實際用起來偶爾會發現登入失敗搞不清楚理由,後來才發現是因為我的 Ubuntu 啟用了家目錄加密的功能,因此尚未登入之前根本讀不到 authorized_keys
設定檔。為了解決這個問題,必須移動設定檔的位置才行。
Generate SSH Keys
首先如果沒有自己的 SSH keys 的話可以參考〈Generating SSH Keys〉建立自己的 SSH keys。大致上是使用如下指令:
ssh-keygen -t rsa -C "your_email@example.com"
預設會把產生的 private key 存在 /home/$USER/.ssh/id_rsa
,public key 存在 /home/$USER/.ssh/id_rsa.pub
,不過也可以改位置。passphrase 則是用來加密 private key,建議要使用,這樣子每次要解開 private key 時都需要使用密碼,所以就算一不小心 private key 被別人取得,對方也要花上一段時間才能解開。
更改 sshd_config 設定
sudoedit /etc/ssh/sshd_config
首先取消密碼登入,將
#PasswordAuthentication yes
改成:
PasswordAuthentication no
再來更動 authorized_keys
的位置,將
#AuthorizedKeysFile %h/.ssh/authorized_keys
改成:
AuthorizedKeysFile /etc/ssh/keys/%u/authorized_keys
建立 authorized_keys 檔案
然後根據你的 $USER
名字建立資料夾,並修改權限:
sudo mkdir -p /etc/ssh/keys/$USER
sudo chmod 755 /etc/ssh/keys
sudo chmod 700 /etc/ssh/$USER
sudo chown $USER:$USER /etc/ssh/$USER
最後再將 id_rsa.pub
拷貝到 server 上,並複製到 authorized_keys:
# copy id_rsa.pub to server, then ->
cat id_rsa.pub >> /etc/ssh/keys/$USER/authorized_keys
chmod 400 /etc/ssh/ssh/keys/$USER/authorized_keys
重新讀取設定
重新讀取設定檔並測試一下登入就大功告成:
sudo service ssh reload