###### tags: `govc` `vmware` `api` # 使用 GOVC 更新 ESXi 主機 root 密碼 [toc] 因為前幾周客戶遇到 ESXi 主機使用 SSH 連線,發現無法使用已知密碼登入,進而轉由 DCUI 登入,居然也出現無法正常登入的狀態。同事告知 **ESXi 帳戶鎖定行為僅適用於 SSH 及 Web Service SDK,並不包括 DCUI 及 ESXi Shell**。 所以原本要從 DCUI 登入解除 root 帳戶鎖定的方法,無用! 暫時不討論為何 DCUI/ESXi Shell 的 root 密碼被修改的原因,先針對**如何恢復 root 密碼作為問題解決目標吧**。 當初在查找解決方案時,有搜尋到使用 **Host Profile** 的方式,但初步測試並沒有成功。剛好在研究 **GOVC** 時發現 **`govc host.account.update`** 的命令,初步測試沒有問題,以下就重點分享執行步驟。 ## ESXi 密碼預設原則 ### Security.PasswordQualityControl ![](https://i.imgur.com/a2GOuc7.png) ESXi 會強制密碼必須符合需求,才能從 Direct Console 使用者介面、ESXi Shell、SSH 或 VMware Host Client 進行存取。 **預設設定** **`retry=3 min=disabled,disabled,disabled,7,7`** - 預設設定會提示使用者最多輸入三次 (retry=3)。 - 由於前三個項目已停用,因此不允許使用包含一或兩類字元類別的密碼及**複雜密碼**。三類及四類字元類別的密碼需要七個字元。 :::info - 密碼複雜度採用 **pam_passwdqc** ,請參閱相關手冊[[**說明**]](https://www.openwall.com/passwdqc/README)及 [[**ESXi 密碼及帳戶鎖定**]](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vsphere.security.doc/GUID-DC96FFDB-F5F2-43EC-8C73-05ACDAE6BE43.html)。 - min=N0,N1,N2,N3,N4 [passphrase=X] - N0:有1種類型字元,最少幾個字元(例:vmware) - N1:有2種類型字元,最少幾個字元(例:VMware) - N2:如果是單詞間要有空格,最少單詞總和字元數(例:Hello World,2個單詞) - N3:有3種類型字元,最少幾個字元(例:VMware1) - N4:有4種類型字元,最少幾個字元(例:VMware1!) ** ::: ## ESXi 帳戶預設鎖定行為 ### Security.AccountLockFailures ![](https://i.imgur.com/57zVZec.png) 使用者帳戶鎖定前的嘗試登入失敗次數上限。0 表示停用帳戶鎖定。 - 最多 5 次嘗試失敗後,帳戶即會鎖定。 ### Security.AccountUnlockTime ![](https://i.imgur.com/Rmwtfxf.png) 使用者被鎖定的秒數。 - 帳戶會在 15 分鐘(900 秒)後解除鎖定。 ## 使用 GOVC 檢視預設密碼原則 ### ESXi UI 檢視設定 ![](https://i.imgur.com/VjimdJH.png) ### GOVC 檢視設定 使用 **`govc host.option.ls`** 可以檢視 ESXi 主機選項。 ```bash $ govc host.option.ls -host.ip ${esxi_ip} | grep '^Security.' Security.AccountLockFailures: 5 Security.AccountUnlockTime: 900 Security.PasswordQualityControl: retry=3 min=disabled,disabled,disabled,7,7 ``` ## 鎖定帳號 先透過瀏覽器輸入錯誤 root 登入資訊造成帳戶鎖定紀錄。 ![](https://i.imgur.com/0DSTSWd.png) 使用以下命令產生 10 次錯誤登入,使得 root 帳戶鎖定。 ```bash $ for i in $(seq 1 10); do sshpass -p ${ERROR_PASSWORD} ssh root@${esxi_ip}; done ``` 從 ESXi UI 事件檢視紀錄,可以發現在第 6 次開始,ESXi 主機 root 帳戶已經違反安全原則而被鎖定。 ![](https://i.imgur.com/73lIfFu.png) 在 ESXi 主機使用 **`pam_tally2 --user root`** 命令,可以檢視 root 帳戶登入狀態。 ```bash [root@esxi01:~] pam_tally2 --user root Login Failures Latest failure From root 20 11/03/21 02:44:52 192.168.100.87 ``` :::info - 使用 **`pam_tally2 --user root --reset`** 命令,可以解除鎖定。 - 從 **`/var/log/auth.log`** 也可檢視到相關事件紀錄。 ```log 2021-11-03T03:17:09Z sshd[2138176]: Connection from 192.168.100.87 port 45836 2021-11-03T03:17:09Z sshd[2138178]: pam_tally2(sshd:auth): user root (0) tally 24, deny 5 2021-11-03T03:17:09Z sshd[2138178]: [module:pam_lsass]pam_sm_authenticate: failed [error code:40017] 2021-11-03T03:17:09Z sshd[2138178]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.100.87 user=root 2021-11-03T03:17:11Z sshd[2138176]: error: PAM: Authentication failure for root from 192.168.100.87 ``` - 只要帳戶被鎖定,即便輸入正確登入資訊,也會無法正常登入。客戶也是因為這種情形才發現 root 帳戶無法正常登入。 ::: ## 變更 root 密碼 不要忘記,即便帳戶被鎖定,只要能透過 DCUI 登入,還是能順利解除帳戶鎖定的問題。但是現在遇到的狀況是**無法正常登入DCUI**,也就是 root 帳戶的密碼已更動。 ![](https://i.imgur.com/vnFpVhR.png) :::info 以上是使用 SSH 連線後,在 ESXi Shell 下輸入 **dcui** 的畫面。 ::: 所以我們將使用 **GOVC** 變更帳戶密碼來處理問題,重點是 **ESXi 主機不需要重新開機**。 ### host.account.update 目前測試成功的環境是,**ESXi 主機必須還是被 vCenter Server 管理**,因為 **GOVC** 這裡管控的切入點還是 vCenter Server。 好吧,說了這麼多,輸入以下命令變更帳戶密碼。 ```bash $ govc host.account.update -host.ip ${esxi_ip} -id root -password ${new_password} govc: ServerFaultCode: A general system error occurred: Weak password: not enough different characters or classes. ``` 如果出現以上**錯誤訊息**,就是密碼違反設定原則。還記得之前提到的 [**密碼預設原則**] 嗎?請先調整該原則後,更新密碼後再恢復預設值即可。 **調整密碼原則** ```bash $ govc host.option.set -host.ip ${esxi_ip} Security.PasswordQualityControl "retry=3 min=1,1,1,1,1" $ govc host.option.ls -host.ip ${esxi_ip} Security.PasswordQualityControl Security.PasswordQualityControl: retry=3 min=1,1,1,1,1 ``` **更新 root 密碼** ```bash govc host.account.update -host.ip ${esxi_ip} -id root -password ${new_password} ``` 此時就可以順利變更密碼!使用變更後的登入資訊進行連線測試。 - 登入 DCUI ![](https://i.imgur.com/mCZb2zC.png) - SSH 連線 ```bash $ ssh root@esxi01 (root@esxi01) Password: The time and date of this login have been sent to the system logs. WARNING: All commands run on the ESXi shell are logged and may be included in support bundles. Do not provide passwords directly on the command line. Most tools can prompt for secrets or accept them from standard input. VMware offers supported, powerful system administration tools. Please see www.vmware.com/go/sysadmintools for details. The ESXi Shell can be disabled by an administrative user. See the vSphere Security documentation for more information. [root@esxi01:~] ``` **恢復預設密碼原則** 務必恢復原來預設原則或調整至所需規則。 ```bash $ govc host.option.set -host.ip ${esxi_ip} Security.PasswordQualityControl "retry=3 min=disabled,disabled,disabled,7,7" $ govc host.option.ls -host.ip ${esxi_ip} Security.PasswordQualityControl Security.PasswordQualityControl: retry=3 min=disabled,disabled,disabled,7,7 ``` 對了,最後也別忘了利用 **GOVC** 將 **SSH** 和 **ESXi Shell** 服務關閉。 ## 參考 - [ESXi 密碼及帳戶鎖定](https://docs.vmware.com/tw/VMware-vSphere/7.0/com.vmware.vsphere.security.doc/GUID-DC96FFDB-F5F2-43EC-8C73-05ACDAE6BE43.html) - [README - pam_passwdqc](https://www.openwall.com/passwdqc/README) ## 其他分享 ### [GOVC 安裝及基礎測試](https://hackmd.io/@farmer87/govc) ### [使用 GOVC 開啟/關閉 ESXi 主機服務](https://hackmd.io/@farmer87/govc_services) ### [使用即時克隆 (Instant Clone) 複製虛擬機 - Part 3 (GOVC)](https://hackmd.io/@farmer87/instantclone-3) ### [使用 GOVC 安裝 Fedora CoreOS 於 vSphere 環境](https://hackmd.io/@farmer87/govc-coreos) ### [使用 Docker 方式來操作 GOVC](https://hackmd.io/@farmer87/podman_govc)