解決 Ubuntu 加密 Home 目錄後無法遠端用 public key 登入的問題

By Shaform, Sat 21 June 2014, in category Notes

linux, public key, SSH, Ubuntu

通常啟用 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