丢失私有密钥时连接到虚拟机(1)

有一些镜像制作的时候,只允许使用ssh登陆。所以一般创建虚拟机时,我们会将自己的公钥通过ec2的meta服务写入虚拟机,而后在本地通过和公钥一起生成的私钥登陆。

但是,既然是钥匙,就具备了“丢“的属性,如果我们丢失了本地的私钥,那不就不能登陆虚拟机了?其实倒也不至于不能登陆,只是费事一点罢了。

原理是这样:你需要将本虚拟机的云硬盘(volume)断开,将云硬盘作为数据卷挂载到另一台虚拟机上,然后修改 authorized_keys 文件,将云硬盘挂载回原虚拟机,重启虚拟机即可。

Note:本教程适用的虚拟机必须是从云硬盘创建的,从镜像或者快照创建的请参考丢失私有密钥时连接到虚拟机(2)

###具体步骤

  • 暂停虚拟机,点击左侧导航栏的云硬盘,选择本机A的云硬盘,将其从本机断开
  • 还是在云硬盘的目录,将此云硬盘挂载到另一台虚拟机B

  • 登陆到虚拟机B,执行lsblk,命令确定volume是否已分区

    ubuntu@key-test1:~$ lsblk
    NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    vda    253:0    0  10G  0 disk 
    └─vda1 253:1    0  10G  0 part /
    vdb    253:16   0  10G  0 disk 
    └─vdb1 253:17   0  10G  0 part
    

    截图中已经说明,在设备/dev/vdb上连接到key_test1,所以最后一行的vdb1就是我们挂载过来的云硬盘。

  • 创建临时目录以安装volume

ubuntu@key-test1:~$ sudo mkdir /mnt/tempvol
  • 使用之前确定的volume名称或设备名称在临时安装点安装volume(或分区)

    ubuntu@key-test1:~$ sudo mount /dev/vdb1 /mnt/tempvol
    
  • 这样你进入/mnt/tempvol目录就是进入了挂载的云硬盘,修改authorized_keys文件,删除失效的public_key,添加新的public_key

    ubuntu@key-test1:~$ vim /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
    
  • 修改完成后,卸载已连接的volume,以将其重新连接至原始实例

    ubuntu@key-test1:~$ sudo umount /mnt/tempvol
    

Note:卸载时可能会出现设备忙的告警,多试几次即可

回到openstack的控制面,将云硬盘重新挂载到机器A,启动机器A即可从拥有私钥的那台机器上登陆

##参考
Amazon EC2 Key Pairs

Instance Metadata and User Data