在虛擬機上設置身份驗證
我正在使用 libvirt python 綁定創建一個類似於雲計算提供商的系統。
我想讓使用者能夠以與 AWS 類似的方式指定自定義虛擬機映像。
我想即時生成 SSH 密鑰對並將 VM 設置為進行公鑰身份驗證。
執行此操作的最佳方法是什麼?我應該對使用者指定的 VM 映像施加哪些要求才能使其正常工作?
我正在考慮使用無密碼的 root 帳戶來允許我的軟體登錄並設置所需的內容,但這會留下一個(短)時間跨度,在此期間每個人都可以以 root 身份登錄。有更好的解決方案嗎?我可以在啟動之前編輯虛擬機映像嗎?
在實踐中,我需要登錄才能登錄機器並執行一些命令,然後再將其提供給使用者。
編輯:
一些額外的細節:
我知道 Eucalyptus、Cloudstack 和 Openstack。此實現適用於非常特定的環境/要求(HPC 集群、批處理作業調度),並且不允許執行這些。
我實際上不在乎(或者,就這個問題而言,它不相關)密鑰對來自哪裡,我只想知道服務提供商如何通過要求盡可能少的設置來訪問機器在使用者部分的 VM 映像上;ErikA 對此進行了回复,建議使用特定於服務的密鑰對。很公平。還有其他解決方案嗎?
最終使用者不必訪問新虛擬機,他將通過SLURM在其上執行作業(不過,如果他願意,他可以訪問它,我不在乎)。
提供者負責:
分配和生成新域(虛擬機)
生成 SLURM 守護程序(不必在啟動時發生,而是在某個時間點發生,因此需要提供者能夠訪問機器)
我通過以下方式解決了它:
由於我需要分配給 VM 的 IP 地址,並且由於 libvirt 不提供檢索它的方法(相反,即 VMWare,它為此類操作提供了 VMWare 工具套件),所以我最終設置了一個串列(在來賓) 到 VM 和主機之間的 tcp(在主機上)通道,使用 libvirt 的虛擬設備支持。
來賓上的一個簡單的 shell 腳本會等待,直到 IP 地址分配給給定的介面並將其寫入串列設備。當位於主機上的 TCP 伺服器接收到 IP 地址時,它會發回其公鑰,客戶機上的腳本會讀取(同樣,從串列埠)並將其寫回正確的
authorized_keys
文件。該解決方案可以在沒有 IP 交換部分的情況下使用,只有來賓在啟動時從串列埠讀取密鑰。這種解決方案的優點是客戶作業系統不必使用給定的密鑰進行定制(如此不同,密鑰對可以用於不同的系統“分區”)並且它可以管理放置它的位置;缺點是必須配置來賓來執行腳本。
另一種解決方案是在 VM 啟動之前使用類似的方式安裝磁碟映像
libguestfs
,複製公鑰,解除安裝它並啟動來賓。該解決方案優於 TCP<->SerialPort 解決方案,但由於無論如何我都需要 IP 地址,因此我採用了另一種方式。第三種解決方案,正如 ErikA 在他的第一條評論中所建議的那樣,是讓創建圖像的使用者通過向他們提供您的公鑰來完成所有設置。對於最通用的情況,這可能是最好的(最乾淨和更優雅的)解決方案。
也許你應該嘗試而不是重新發明輪子。有許多框架可以完全滿足您的需求……甚至是免費/開源的。嘗試查看cloudstack或eucalyptus的兩個這樣的環境。