我正在使用libvirt python绑定创build一个类似于云计算提供者的系统。
我想让用户能够以与AWS类似的方式指定自定义虚拟机映像。
我想dynamic生成SSH密钥对,并将其设置为公钥authentication。
哪个是最好的方法来做到这一点? 我应该在用户指定的虚拟机镜像上施加哪些要求才能起作用?
我正在考虑用一个无密码的root帐户来允许我的软件login并设置所需的内容,但是这留下了一个(短)时间段,在这个时间段内每个人都可以以rootlogin。 有更好的解决scheme吗? 我可以在启动之前编辑虚拟机映像吗?
在实践中,我需要login才能login到本机并执行一些命令,然后再交给用户。
编辑:
一些额外的细节:
也许你应该尝试,而不是重新发明轮子。 有许多框架可以完全满足你的要求,甚至是自由/开源的框架。 尝试在两个这样的环境中查看cloudstack或eucalyptus 。
我用下面的方法解决了它:
由于我需要分配给虚拟机的IP地址,而且libvirt不提供检索它的方法(相对于VMWare提供这种操作的VMWare工具套件),我最终设置了一个串口(在guest虚拟机上)到虚拟机和主机之间的TCP(在主机上)通道,使用libvirt的虚拟设备支持 。
客户机上的一个简单的shell脚本将等待,直到IP地址被分配给给定的接口并将其写入串行设备。 当坐在主机上的TCP服务器接收到IP地址时,它将发回它的公共密钥,客户机上的脚本读取(再次从串行端口读取)并写回正确的authorized_keys文件。
该解决scheme可以在没有IP交换部分的情况下使用,只有访客在启动时从串口读取密钥。 这种解决scheme的优点是客户操作系统不需要使用给定的密钥进行定制(因此,不同的密钥对可以用于不同的系统“分区”),并且可以pipe理放置在哪里; 缺点是必须将guest虚拟机configuration为运行脚本。
另一个解决scheme是在启动虚拟机之前使用libguestfs类的libguestfs来挂载磁盘映像,复制公钥,卸载它并引导guest虚拟机。 这个解决scheme比TCP SerialPort更可取,但是正如我所需要的IP地址,我反其道而行之。
第三个解决scheme,正如ErikA在他的第一个评论中所build议的那样,就是让用户通过给他们公钥创build映像来完成所有的设置。 这可能是最通用的情况下最好的(最干净和更优雅的)解决scheme。