分享

丢失私有密钥时连接到虚拟机的两种办法

yuwenge 发表于 2015-6-7 18:08:22 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 35614

问题导读

1.如果我们丢失了本地的私钥,那不就不能登陆虚拟机了?
2.该如何解决丢失了本地的私钥,不能登陆虚拟机了问题?
3.丢失私有密钥时连接到虚拟机原理是什么?








丢失私有密钥时连接到虚拟机(1)
有一些镜像制作的时候,只允许使用ssh登陆。所以一般创建虚拟机时,我们会将自己的公钥通过ec2的meta服务写入虚拟机,而后在本地通过和公钥一起生成的私钥登陆。
但是,既然是钥匙,就具备了“丢“的属性,如果我们丢失了本地的私钥,那不就不能登陆虚拟机了?其实倒也不至于不能登陆,只是费事一点罢了。
原理是这样:你需要将本虚拟机的云硬盘(volume)断开,将云硬盘作为数据卷挂载到另一台虚拟机上,然后修改 authorized_keys 文件,将云硬盘挂载回原虚拟机,重启虚拟机即可。
Note:本教程适用的虚拟机必须是从云硬盘创建的,从镜像或者快照创建的请参考丢失私有密钥时连接到虚拟机(2)
launch.png
具体步骤
  • 暂停虚拟机,点击左侧导航栏的云硬盘,选择本机A的云硬盘,将其从本机断开
  • 还是在云硬盘的目录,将此云硬盘挂载到另一台虚拟机B
volume.png
  • 登陆到虚拟机B,执行lsblk,命令确定volume是否已分区
    [mw_shl_code=bash,true]ubuntu@key-test1:~$ lsblk
    NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    vda    253:0    0  0G  0 disk
    └─vda1 253:1    0  0G  0 part /
    vdb    253:16   0  0G  0 disk
    └─vdb1 253:17   0  0G  0 part[/mw_shl_code]
  • 截图中已经说明,在设备/dev/vdb上连接到key_test1,所以最后一行的vdb1就是我们挂载过来的云硬盘。
  • 创建临时目录以安装



[mw_shl_code=bash,true]ubuntu@key-test1:~$ sudo mkdir /mnt/tempvol[/mw_shl_code]



  • 使用之前确定的volume名称或设备名称在临时安装点安装volume(或分区)



[mw_shl_code=bash,true]ubuntu@key-test1:~$ sudo mount /dev/vdb1 /mnt/tempvol[/mw_shl_code]




  • 这样你进入/mnt/tempvol目录就是进入了挂载的云硬盘,修改authorized_keys文件,删除失效的public_key,添加新的public_key



[mw_shl_code=bash,true]ubuntu@key-test1:~$ vim /mnt/tempvol/home/ubuntu/.ssh/authorized_keys[/mw_shl_code]



  • 修改完成后,卸载已连接的volume,以将其重新连接至原始实例


[mw_shl_code=bash,true]ubuntu@key-test1:~$ sudo umount /mnt/tempvol[/mw_shl_code]


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

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



################################################################################################


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







原理和丢失私有密钥时连接到虚拟机(1)是一样的,从镜像创建的虚拟机我们也可以将其挂载到别的机器上,只是需要的命令不同。
具体步骤
  • 关闭你的虚拟机
  • 找到你的虚拟机的id,类似282d0355-a4db-4467-a70b-4783ac2c7ed6这样一串数字
  • 找到你的虚拟机的宿主机,登录到宿主机上
  • 进入到存放虚拟机文件的目录
    [mw_shl_code=bash,true]cd /var/lib/nova/instances/{id}[/mw_shl_code]
    这里的id就是你上面虚拟机的id
    这个目录下的内容是这样的
    [mw_shl_code=bash,true].
    ├── console.log
    ├── disk
    ├── disk.info
    ├── libvirt.xml[/mw_shl_code]
    这里的disk文件就是我们要操作的对象
  • 在当前目录下创建sysroot目录
    mkdir sysroot
  • 挂载disk文件到本机
    [mw_shl_code=bash,true]guestmount -a disk --rw -m /dev/sda1  sysroot[/mw_shl_code]
    Note:如果你是ubuntu的系统,guestmount会报错如下:
    [mw_shl_code=bash,true]libguestfs: error: /usr/bin/supermin-helper exited with error status 1.
    To see full error messages you may need to enable debugging.
    See http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs[/mw_shl_code]
    这个时候你可以执行:
    [mw_shl_code=bash,true]update-guestfs-appliance[/mw_shl_code]
  • 进入sysroot并把它当作当前进程的根文件系统
    [mw_shl_code=bash,true]cd sysroot; chroot .[/mw_shl_code]
  • 现在就可以修改虚拟机的文件啦!
  • 修改完成后,exit退出chroot的环境
    [mw_shl_code=bash,true]exit
    cd ..  #回到上一级目录
    umount sysroot[/mw_shl_code]
  • 启动虚拟机即可






没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条