關於虛擬機密碼你所有需要知道的一切
雖然各種雲的虛擬機都推薦使用 SSH 密鑰登錄,但是還是有很多人喜歡使用密碼登錄,而且有的時候需要通過 console 來登錄系統。那麼如何更好的設置、修改虛擬機的密碼呢?本文以 OpenStack 為例,介紹如何設置及修改虛擬機改密碼。
內置密碼
這是最簡單的,製作鏡像的時候,直接給 root 賬號配置一個密碼。但是問題也不言而喻。所有的示例都有相同的默認密碼,如果用戶忘記改的話,其它人很容易的就能掃到你的機器,從而登錄你的機器。
啟動的時候通過 libvirt 進行密碼注入
方法是在 裡面開始如下配置
在虛擬機啟動的時候,通過 傳入一個指定的密碼。但是這個方法也有一系列的問題:
所以這個方法也不是推薦使用,更詳細的信息,可能參看我另一篇文章「rbd 是否支持注入」。
通過 metadata api 注入
cloud-init 這個服務是從 AWS 學來的。它安裝在虛擬機中,在啟動虛擬機時,做一些初始化工作。如:硬碟分區自動擴展,SSH Public Key 注入,用戶創建等。用戶甚至可以注入一些 shell 腳本到虛擬機中運行。在自動化方便啟了很大的作用。Heat 的實現就依賴於 cloud-init 服務。
在 OpenStack 上,cloud-init 應該從 http://169.254.169.254 去拿到所需要的信息。而這個服務是通過 iptables 轉到了 neutron-metadata-agent 服務上
通過 cloud-init 注入也有幾種方式,下面分別來說明。
腳本
因為在虛擬機啟動的時候,是可以傳入 shell 腳本的 user_data,所以可以在這個 shell 腳本裡面修改 root 密碼。
cloud init configuration
user data 也可以是 cloud-init 支持的一個 yaml 結構文件,所以還可以通過如下方式改密碼
這種方式要比「腳本」的方法優雅一些,推薦使用。而且cloud-init 本身功能很強大,值得深入挖掘下。
config drive
默認情況下,metadata api 是通過 這個地址獲取元數據信息。此外,nova 也支持使用 disk 的方式傳入元數據。方便在網路環境不允許 metadata api 的情況下使用。性能也比 metadata api 好的多。
config drive 的開啟方法是在 中配置:
或在啟動虛擬機的時候,加上如下參數:
開啟 config drive 後,除了上面提到的「腳本」和「cloud init configuration」方式,還可以使用 nova 的 參數。雖然這時密碼是注入到了虛擬中,但是 cloud init 並不支持讀取這裡的密碼,所以會失敗。不過可以修改下 cloud init 支持這種方式。具體更多信息參看[1]。
通過 nova set-password
nova 還支持通過 libvirt 的 set-user-password 介面來修改正在運行的虛擬的密碼。這個介面本質上是通過 qemu-guest-agent 的 介面來修改密碼。所以對 libvirt 及 qemu-guest-agent 的版本都有要求。
現在看支持的 Guest 操作系統如下:
值的一提的是 CentOS 6 雖然用的 qemu-guest-agent 版本是 ,但是紅帽已經把相關 patch backport 了回頭,所以也是支持。
使用方法如下:
虛擬機自動生成加密密碼
很早之前,nova 還支持了虛擬機生成密碼,然後加密後傳回 nova 的功能[4]。其原理如下:
因為密鑰對等加密原因,除了「1」「5」可以看到明文密碼外,其它步驟裡面都是加密的。所以這種方式可以說是最安全的方案。連雲平台提供傷都不能看到真正的密碼。
不過這種方式只在 Windows 的 cloud init 版本 cloudbase-init 裡面有實現[5]。Linux 版本的 cloud-init 並不支持。不過 Github 上面找到一個類似的實現[6],雖然只支持 RHEL 7, 但是有需要的話,可以參考修改下。
如果我忘記了虛擬機密碼怎麼辦
如果以上都不滿足,就需要手動重置 root 密碼,基本思路是在 Linux 啟動的時候,進入一個不需要密碼登錄的環境,然後修改 root 密碼,步驟如下
REF
[1] http://niusmallnan.com/_build/html/_templates/openstack/inject_passwd.html#cloud-init
[2] https://github.com/qemu/qemu/commit/215a2771a7b6b29037ee8deba484815d816b6fdd
[3] https://github.com/qemu/qemu/commit/259434b8067e1c61017e9a5b8667b6526b474ff2
[4] https://review.openstack.org/#/c/17274/
[5] https://github.com/openstack/cloudbase-init/blob/master/cloudbaseinit/metadata/services/httpservice.py
[6] https://github.com/vvaldez/openstack-password-reset
[7] https://zhangchenchen.github.io/2017/01/19/openstack-reset-instance-password
TAG:全球大搜羅 |