How to reset password for ESXi 7.0 U2 and later versions

از نسخه 7.0 آپدیت U2 نحوه ذخیره ساری بعضی از قسمت های Configuration مربوط به ESXi تغییر کرد. یکی از این قسمت ها Password کاربران ESXi بود.

شزکت VMware (و تازه تر Broadcom) به صورت رسمی میگه که امکان reset کردن password نرم افزار esxi وجود نداره و اگه ادمین رمزش رو فراموش کنه باید reinstall انجام بده (مگه اینکه از قبل esxi تون رو به یه vCenter وصل کرده باشید و بتونید از host profile استفاده کنید).

ما امروز برای نسخه های جدید روشش رو در اختیارتون قرار میدیم (که تا نسخه 9 در محیط تست ما تست شده)

1- سرور خودتون رو با ISO نسخه 7.0U2 یا بالاتر بوت کنید. (ترجیحاً از همون نسخه نصب شده روی سرورتون استفاده کنید)

2- بعد از این که ESXi روی installation disk شما بوت شد و Installer بهتون نمایش داده شد دکمه Alt+F1 رو بزنید تا وارد DCUI بشید و از اون جا با نام کاربری root و بدون پسورد وارد shell بشید.

3- اگه احیاناً با کار کردن از طریق DCUI راحت نیستید (مثلاً به خاطر اینکه نمی تونید Copy/Paste کنید) میتونید سرویس SSH رو استارت کنید و از طریق اون وصل بشید.

اول مطمئن بشید که روی ESXi تون IP Address به نحوی set شده باشه. خود ESXi به صورت پیش فرض اگه DHCPv4 داشته باشید، روی IPv4 اقدام به دریافت آدرس آی پی میکنه. روی IPv6 هم با SLAAC و از روش EUI64 اقدام به assign کردن آدرس بهتون میکنه که میتونید از این طریق ببینیدشون:

localcli network ip interface ipv4 address list
localcli network ip interface ipv6 address list

اگه این روش ها برای assign شدن آی پی به دردتون نمی خوره و ترجیح میدید که آدرس آی پی استاتیک استفاده کنید از این طریق میتونید این کار رو بکنید:

localcli network ip interface ipv4 set --interface-name vmk0 --ipv4 YOUR_IPv4_Address --netmask YOUR_NETMASK --type static
localcli network ip interface ipv6 address add --interface-name vmk0 --ipv6 YOUR_IPv6_ADDRESS/PREFIX

همون طور که مشخص هست من دارم روی اینترفیس vmk0 آدرس آی پی میذارم.

قبل از اینکه SSH رو فعال کنید مطمئن بشید که برای یوزر root یه پسورد قابل قبول گذاشتید. برای این کار از این دستور استفاده کنید:

passwd root

اگه بدون گذاشتن پسورد، سرویس SSH رو فعال کنید، اون موقع با استفاده از یوزر root و بدون پسورد میشه به ESXi لاگین کرد که مسلماً بسیار از نظر امنیتی خطرناک هست به خصوص اگه از آدرس آی پی Public استفاده میکنید.

نهایتاً برای فعال کردن SSH از دستور زیر استفاده کنید:

/etc/init.d/SSH start

که براتون SSH Server رو روی پورت 22/tcp اجرا خواهد کرد.

4- خود installation disk به صورت پیش فرض پارتیشن ها رو براتون mount میکنه که میتونید توی این مسیر ببینیدشون:

/vmfs/volumes/

5- پارتیشن هایی که ما بهشون علاقه مند هستیم لیبل هاشون BOOTBANK1 و BOOTBANK2 هست و از نوع FAT هم هستن. اگه هیچوقت ESXi خودتون رو آپدیت نکرده باشید، BOOTBANK2 خالی خواهد بود اما اگه آپدیت انجام داده باشید، هر بار که آپدیت موفق انجام میدید، ESXi پارتیشن بوتش رو عوض میکنه. من دیگه بیش از این وارد جزئیات bootbank ها نمیشم و از این جا به بعد فرض میکنم که ESXi شما داره از BOOTBANK1 بوت میشه.


اگه میخواید 100% مطمئن باشید؛ بذارید ESXi اصلی تون شروع به بوت کنه و توی زمانی که بوت لودر 5 ثانیه صبر میکنه Shift+O رو بزنید و مقدار bootUUID پایین صفحه توی bootloader command line رو یادداشت کنید و نهایتاً بعد از اینکه سرور رو با ISO بوت کردید از این دستور استفاده کنید

localcli storage filesystem list

6- تنظیمات ESXi منجمله پسورد یوزرها توی فایل state.tgz ذخیره میشه. برای نسخه های جدید ESXi اگه این فایل رو extract کنید داخلش دو تا فایل هست، یکی encryption.info و یکی هم local.tgz.ve

من از این دستورها استفاده میکنم

mkdir /tmp/digiboy
cd /tmp/digiboy
cp /vmfs/volumes/BOOTBANK1/state.tgz .
tar x -z -f state.tgz

در نسخه های قدیمی ESXi داخل این فایل یه local.tgz بود.

نکته: چون فایل سیستم bootbank ها از نوع FAT هست، اگه extraction رو اونجا انجام بدید permission های فایل ها رو از دست خواهید داد. من توی tmp این کار رو کردم تا اونا رو از دست ندم.

فایل local.tgz.ve یه نوع فایل هست که VMware بهش میگه envelope file و روش encryption اعمال شده. بنابراین دیگه مثل گذشته نمی تونید extractش کنید و محتویاتش رو ببینید یا تغییر بدید.

فایل encryption.info یه فایل plain text هست که محتویاتش به این بستگی داره که encryption mode شما روی چی تنظیم شده باشه. (در حال حاضر میتونه NONE یا TPM باشه)

اگه سخت افزار شما قابلیتش رو داشته باشه و دوست داشته باشید که از NONE به حالت امن تر TPM سوئیچ کنید، بعد از ایتکه پسوردتون رو ریست کردید و به ESXi تون لاگین کردید میتونید از یکی از این دستورها استفاده کنید:

localcli system settings encryption set --mode TPM
esxcli system settings encryption set --mode TPM

روشی که ما باهاتون به اشتراک میذاریم بهتون اجازه میده که پسوردتون رو در هر دو حالت NONE و TPM ریست کنید.

اگه بخوایم اطلاعاتی راجع به encryption فایل local.tgz.ve به دست بیاریم با این دستور میتونیم این کار رو بکنیم:

crypto-util envelope describe local.tgz.ve

چیزی که برای ما از همه مهم تر هست، KeyID هست که برای encrypt کردن این فایل استفاده شده.

در حال حاضر این key توی key cache شما نیست و اگه شما از ESXi بپرسید که از چه Key داره برای رمزنگاری کانفیگش استفاده میکنه، یه Key رندوم که در طول فرایند بوت ISO ایجاد شده رو بهتون میده:

crypto-util keys getkidbyname ConfigEncryptionKey

که قاعدتاً با keyIDی که برای decrypt کردن فایل local.tgz.ve نیاز داریم یکی نیست.

بیاید به ESXiی که از روی ISO بوت شده بگیم که با اطلاعات داخل فایل encryption.info بره و key مورد نظر ما رو توی Key Cache اضافه کنه.

localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption stop
localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption setup -c encryption.info
localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption start

بعد از این کار اگه دومرتبه از ESXi بپرسید که برای رمزنگازی کانفیگش از چه کلیدی استفاده میکنه همون keyID که ما نیاز داریم رو بهمون بر میگردونه.

7- توی مرحله بعد فایل local.tgz.ve رو decrypt میکنیم.

crypto-util envelope extract --aad ESXConfiguration local.tgz.ve local.tgz

8- فایل local.tgz رو extract میکنیم

mkdir local
tar x -z -f local.tgz -C local
cd local

9- اگه دقت کنید میبینید که دیگه این archive مثل گذشته شامل فایل های زیر نمیشه.

etc/passwd
etc/shadow

دلیلش این هست که VMware دیگه پسورد رو توی این فایل ذخیره نمیکنه و اونو به یه دیتابیس sqlite منتقل کرده که آدرسش هم این هست:

var/lib/vmware/configstore/backup/current-store-1

و می تونید با این دستور هش پسورد ذخیره شده برای یوزرها رو ببینید.

/usr/lib/vmware/sqlite/bin/sqlite3 var/lib/vmware/configstore/backup/current-store-1 \
"SELECT * FROM Config WHERE Component='esx' AND ConfigGroup='authentication' \
AND Name='user_accounts' AND Identifier='root'"

10- یه فایل با محتویات زیر بسازید.

UPDATE Config SET UserValue='{"name":"root","password_hash":"$6$OuBJHTuaUlOIkE/k$p2fCVL5q5kniGsWYo1xU4Tzct0ZJ7hFQeJH2z9c5F/srN2hQkBKf/lTepTZHwJqRim48vNJ9Meky3E5S0amnL0","description":"Administrator"}' WHERE Component='esx' AND ConfigGroup='authentication' AND Name='user_accounts' AND Identifier='root'

من از vi برای ساختش استفاده میکنم و توی این آدرس ذخیره ش میکنم:

vi /tmp/digiboy/reset-password.sql

اگه احیاناً نحوه کار با vi رو نمی دونید، میتونید فایل رو توی text editor مورد علاقه تون توی سیستم عامل خودتون بسازید و با SFTP منتقلش کنید به ESXi تون. (مثلاً میتونید از FileZilla یا WinSCP استفاده کنید)

11- به sqlite میگیم که query مون رو اجرا کنه:

/usr/lib/vmware/sqlite/bin/sqlite3 var/lib/vmware/configstore/backup/current-store-1</tmp/digiboy/reset-password.sql

با این کار hash توی دیتابیس آپدیت میشه که میتونید با دستور مرحله 9 از تغییر مطمئن هم بشید.

این هش که من در اختیارتون قرار دادم برای کلمه pa$$w0rd هست.

12- فایل ها رو مجدداً archive میکنیم تا یه فایل local.tgz جدید به دست بیاریم:

tar c -z -f /tmp/digiboy/local-new.tgz `tar t -z -f /tmp/digiboy/local.tgz`

13- حالا فایل جدیدمون رو مجدداً با استفاده از کلیدمون encrypt میکنیم.

cd /tmp/digiboy/
key_id=`crypto-util keys getkidbyname ConfigEncryptionKey`
mv local.tgz.ve local-old.tgz.ve
crypto-util envelope insert --aad ESXConfiguration --id ${key_id} local-new.tgz local.tgz.ve

14-فایل state.tgz جدید رو میسازیم.

mv state.tgz state-old.tgz
tar c -z -f state.tgz local.tgz.ve encryption.info

15- فایل رو به bootbank منتقل میکنیم و با فایل موجود جایگزین میکنیم.

cd /vmfs/volumes/BOOTBANK1
mv state.tgz state.tgz.bak
mv /tmp/digiboy/state.tgz .

من یه بکاپ هم برای اطمینان از state.tgz اصلی تهیه کردم.

حالا میتونید سرورتون رو reboot کنید و با یوزر root و پسورد pa$$w0rd لاگین کنید.

امیدوارم بتونه برای همه مفید باشه.

این هم TL;DR برای اونایی که بهش نیاز دارن :دی

mkdir /tmp/digiboy
cd /tmp/digiboy
cp /vmfs/volumes/BOOTBANK1/state.tgz .
tar x -z -f state.tgz
localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption stop
localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption setup -c encryption.info
localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption start
crypto-util envelope extract --aad ESXConfiguration local.tgz.ve local.tgz
mkdir local
tar x -z -f local.tgz -C local
cd local
/usr/lib/vmware/sqlite/bin/sqlite3 var/lib/vmware/configstore/backup/current-store-1 "UPDATE Config SET UserValue='{"name":"root","password_hash":"\$6\$OuBJHTuaUlOIkE/k\$p2fCVL5q5kniGsWYo1xU4Tzct0ZJ7hFQeJH2z9c5F/srN2hQkBKf/lTepTZHwJqRim48vNJ9Meky3E5S0amnL0","description":"Administrator"}' WHERE Component='esx' AND ConfigGroup='authentication' AND Name='user_accounts' AND Identifier='root'"
tar c -z -f /tmp/digiboy/local-new.tgz `tar t -z -f /tmp/digiboy/local.tgz`
cd /tmp/digiboy/
key_id=`crypto-util keys getkidbyname ConfigEncryptionKey`
mv local.tgz.ve local-old.tgz.ve
crypto-util envelope insert --aad ESXConfiguration --id ${key_id} local-new.tgz local.tgz.ve
mv state.tgz state-old.tgz
tar c -z -f state.tgz local.tgz.ve encryption.info
cd /vmfs/volumes/BOOTBANK1
mv state.tgz state.tgz.bak
mv /tmp/digiboy/state.tgz .

۶ دیدگاه نوشته شده است! می توانید دیدگاه خود را بنویسید

  1. حامد گفت:

    Wow!
    دمتون واقعا گرم . بسیار مفید و باجزییات و کاربردی
    این پست نه تنها نشون میده روی جزییات مسلط هستید بلکه نشون دهنده اینه که به تمامی فرایند های VmWareتسلط کافی دارید. (اما این اطلاعات از کجا بدست آمده یک علامت سوال بزرگ است)

    Well done Guys!

  2. یوسف گفت:

    محمد عزیز سلام
    خیلی ممنون بابت این پست مفید و کاربردی

  3. حسین شرافتیان گفت:

    سلام و تشکر از پست عالی تون

    توی گزینه 11 یدونه / قبل از tmp جا افتاده و خطا میده وقتی که Copy/Paste کنی

  4. وحید.ک گفت:

    با تشکر از زحمات دیجی بوی.
    یه ابزار هم هست به نام Rescutax (بوتیبل) که خیلی کاربردیه در زمینه پسورد و گراب و بوت و …
    فقط باید بلد باشی باهاش کار کنی.

دیدگاه خود را در پاسخ به حامد به ما بگویید.