在虚拟机上设置身份validation

我正在使用libvirt python绑定创build一个类似于计算提供者的系统。

我想让用户能够以与AWS类似的方式指定自定义虚拟机映像。

我想dynamic生成SSH密钥对,并将其设置为公钥authentication

哪个是最好的方法来做到这一点? 我应该在用户指定的虚拟机镜像上施加哪些要求才能起作用?

我正在考虑用一个无密码的root帐户来允许我的软件login并设置所需的内容,但是这留下了一个(短)时间段,在这个时间段内每个人都可以以rootlogin。 有更好的解决scheme吗? 我可以在启动之前编辑虚拟机映像吗?

在实践中,我需要login才能login到本机并执行一些命令,然后再交给用户。

编辑:

一些额外的细节:

  1. 我知道Eucalyptus,Cloudstack和Openstack。 此实现适用于特定的环境/要求(HPC群集,批处理作业调度),不允许运行这些。
  2. 我其实并不在乎(或者为了这个问题的目的,它是不相关的)密钥对来自哪里,我只想知道服务提供者如何可能访问机器,通过要求尽可能less的设置在用户部分的虚拟机映像上; ErikA回答了这个build议服务特定的密钥对。 很公平。 还有其他解决scheme吗?
  3. 最终用户不必访问新的虚拟机,他将通过SLURM在其上运行作业(尽pipe如果他愿意,他可以访问它,我不在乎)。
  4. 提供者照顾:
    1. 分配和产生新的域(虚拟机)
    2. 产生SLURM守护进程(在启动时不必发生,但在某个时间点,因此需要提供者能够访问机器)

也许你应该尝试,而不是重新发明轮子。 有许多框架可以完全满足你的要求,甚至是自由/开源的框架。 尝试在两个这样的环境中查看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。