前言
同僚誤操作删除了一台AWS EC2 Linux執行個體
ec2-user
使用者目錄下的
.ssh/authorized_keys
檔案,導緻無法使用SSH登入,于是就有了此篇重新配置SSH連接配接密鑰的記錄。該方法需要有AWS EC2控制台中對應操作的權限,适用于本地連接配接私鑰丢失或遠端伺服器儲存的密鑰丢失的情況。
解決方法
首先,需要登入到AWS EC2控制台頁面,按以下步驟生成新的密鑰對并将執行個體的根裝置卷附加到一個臨時執行個體上。
- 在EC2控制台的
頁面建立新的密鑰對。若是伺服器丢失Network & Security
而非本地丢失密鑰檔案,可以不生成新的密鑰對,也可生成新的密鑰對使用。authorized_keys
- 找到對應EC2執行個體
(存儲)頁籤中Storage
(根裝置名稱),記錄裝置名稱(例如Root device name
或/dev/sda1
)并在/dev/xvda
下找到對應Block devices
(卷ID)。Volume ID
- 在EC2控制台中停止原始執行個體(
)。Stop instance
- 建立一個新的臨時執行個體,并選擇在第一步中建立的密鑰對作為連接配接的密鑰對(若是伺服器端密鑰丢失,此處可使用原密鑰對)。若在同一區域下有其它現存的執行個體可以使用,可以選擇不建立新執行個體,在使用不同的密鑰對的情況下,在第9步中操作将有所不同,不再需要複制執行個體中的密鑰公鑰,而是根據密鑰私鑰生成對應的公鑰,生成方法可參考下文。
- 将原始執行個體的根裝置卷從原始執行個體中分離(
),在等待其狀态變為Detach Volume
後附加到臨時執行個體上(available
),并記下附加時設定的裝置名稱(例如Attach Volume
)。/dev/xvdf
執行完以上步驟後,需要通過SSH連接配接到臨時執行個體上進行後續的操作:
- 通過
指令确定卷是否已經分區,已分區的卷将帶有lsblk
類型的分區。如下面示例中的part
裝置帶有分區vxda
,而vxda1
裝置沒有進行分區。若卷已分區,在下面的步驟中進行挂載時将需要挂載對應的分區(如分區vxdg
),否則則需要挂載原始裝置(如裝置/dev/xvdf1
)。/dev/vxdg
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdf 202:80 0 101G 0 disk └─xvdf1 202:81 0 101G 0 part xvdg 202:96 0 30G 0 disk
注:不同的Linux發行版的裝置名稱命名規則有所不同,例如可能為
、/dev/sdf
、/dev/vdg
等。/dev/xvdk
- 建立臨時的目錄用于挂載卷,也可直接使用現用的目錄(示例中使用
,可替換為其它目錄)。/mnt/tempvol
$ sudo mkdir /mnt/tempvol
- 使用
指令将卷挂載到臨時目錄下,不同發行版中使用的指令可能有所不同。mount
# Amazon Linux、Ubuntu、Debian使用 $ sudo mount /dev/xvdf1 /mnt/tempvol # Amazon Linux 2、CentOS、SUSE Linux 12、RHEL 7.x使用 $ sudo mount -o nouuid /dev/xvdf1 /mnt/tempvol
若執行
指令時提示檔案系統受損錯誤,可通過mount
指令修複。fsck
$ sudo fsck /dev/xvdf1
- 更新挂載的卷中的
檔案,在不同發行版中該檔案位置将有所不同。如在Amazon Linux中其目錄為authorized_keys
,其它發行版中可能使用不同的位置或不同的使用者名,例如Ubuntu中使用/home/ec2-user/.ssh/authorized_keys
。挂載卷中的目标位置需在對應檔案目錄前加上挂載的目錄,例如ubuntu
。/mnt/tempvol/home/ec2-user/.ssh/authorized_keys
- 若使用臨時執行個體中的密鑰公鑰,則将其複制到挂載卷中對應的位置。
若出現權限不足的情況,請使用$ cp .ssh/authorized_keys /mnt/tempvol/home/ec2-user/.ssh/authorized_keys
複制後再修改挂載卷中的密鑰公鑰所屬的使用者群組。sudo
# 獲得原authorized_keys所屬的使用者user及使用者組group $ ls /mnt/tempvol/home/ec2-user/.ssh total 4 -rw------- 1 <user> <group> 381 Dec 23 2019 authorized_keys # 複制密鑰公鑰 $ sudo cp .ssh/authorized_keys /mnt/tempvol/home/ec2-user/.ssh/authorized_keys # 修改使用者及使用者組 $ sudo chown <user>:<group> /mnt/tempvol/home/ec2-user/.ssh/authorized_keys
- 若是使用新生成未綁定的密鑰,需要使用
指令擷取對應的密鑰公鑰。ssh-keygen
$ ssh-keygen -y -f key-pair.pem
- 若使用臨時執行個體中的密鑰公鑰,則将其複制到挂載卷中對應的位置。
- 使用
指令解除安裝已挂載的卷。unmount
$ sudo unmount /mnt/tempvol
将挂載的卷解除安裝後,可以斷開SSH連接配接,回到AWS EC2控制台,進行後續的操作。
- 将原始卷從臨時執行個體中分離,待其狀态變回到
後将其重新附加到原始執行個體上。附加時裝置名稱需要填寫為第2步中記錄的原始根裝置名稱(例如available
)。/dev/xvda
- 使用
連接配接測試,待成功後若無需再使用臨時執行個體,可将其終止,避免産生額外的費用。ssh
SSH連接配接出現 REMOTE HOST IDENTIFICATION HAS CHANGED!
且連接配接失敗
REMOTE HOST IDENTIFICATION HAS CHANGED!
在重設伺服器端使用者
authorized_keys
後重新連接配接伺服器,可能會連接配接失敗且出現以下内容提示:
$ ssh ***@***.***.***.***
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:*******************************************.
Please contact your system administrator.
Add correct host key in /home/***/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/***/.ssh/known_hosts:3
ECDSA host key for ***.***.***.*** has changed and you have requested strict checking.
Host key verification failed.
該錯誤産生原因是本地儲存的密鑰指紋資訊和遠端伺服器發送的ECDSA密鑰指紋資訊不符。該錯誤出現時若不是被信任修改,則可能存在中間人攻擊的安全風險。
因為在這裡該錯誤産生的原因是我們更新了伺服器上的使用者登陸密鑰,是以隻需要重新整理本地儲存的密鑰指紋資訊即可,解決辦法可選擇以下任意一種:
- 手動删除使用者目錄下
檔案中遠端伺服器IP對應的資訊。~/.ssh/known_hosts
- 使用
指令更新,運作後會有以下類似的提示:ssh-keygen -R <ip>
$ ssh-key -R ***.***.***.*** # Host ***.***.***.*** found: line xxx /home/***/.ssh/known_hosts updated. Original contents retained as /home/***/.ssh/known_hosts.old
參考資料
- 丢失私有密鑰時連接配接到 Linux 執行個體
- Amazon EC2 密鑰對和 Linux 執行個體