Bắt đầu từ phiên bản esxi 7.0 update 2, cách lưu trữ một số file cấu hình trên ESXi đã thay đổi. Một trong những file này là mật khẩu người dùng ESXi.
VMware (và gần đây là Broadcom) chính thức tuyên bố rằng không thể reset mật khẩu ESXi và nếu admin quên mật khẩu, phải cài đặt lại (trừ khi bạn đã kết nối ESXi với vCenter và có thể sử dụng để quản lý).
Sau một thời gian tìm kiếm với sự giúp đỡ của anh google tôi đã tìm được phương pháp khôi phục password dành cho phiên bản mới (tôi đã thử nghiệm trên phiên bản 9 trong môi trường lab của tôi).
1- Khởi động server với phiên bản ISO 7.0U2 trở lên. (Tốt nhất là sử dụng cùng phiên bản được cài đặt trên server của bạn)
2- Sau khi ESXi khởi động và trình cài đặt được hiển thị, hãy nhấn Alt+F1 để vào DCUI và từ đó, đăng nhập vào shell bằng tên người dùng root và không cần mật khẩu.
3- Nếu bạn thấy khó làm việc thông qua DCUI (ví dụ, vì không thể copy/paste), bạn có thể khởi động dịch vụ SSH và kết nối thông qua SSH.
Trước tiên, hãy đảm bảo rằng IP đã được thiết lập theo cách nào đó trên ESXi của bạn. Theo mặc định, bản thân ESXi nếu có DHCPv4 server sẽ lấy địa chỉ IPv4. Đối với IPv6, nó cũng sẽ gán cho bạn một địa chỉ bằng SLAAC, bạn có thể kiểm tra IP như sau:
localcli network ip interface ipv4 address list
localcli network ip interface ipv6 address list
Nếu server không nhận được IP bạn muốn sử dụng địa chỉ IP tĩnh, bạn có thể thực hiện theo cách sau:
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
Như bạn có thể thấy, tôi đang gán địa chỉ IP cho interface vmk0.
Trước khi bật SSH, hãy đảm bảo bạn đã đặt mật khẩu cho tài khoản root. Để thực hiện việc này, hãy sử dụng lệnh sau:
passwd root
Nếu bạn kích hoạt dịch vụ SSH mà không đặt mật khẩu, bạn có thể đăng nhập vào ESXi bằng tài khoản người dùng root mà không cần mật khẩu, điều này chắc chắn rất nguy hiểm về mặt bảo mật, đặc biệt nếu bạn sử dụng địa chỉ IP Public.
Cuối cùng, sử dụng lệnh sau để bật SSH:
/etc/init.d/SSH start
SSH sẽ chạy trên cổng 22/tcp.
4- Theo mặc định, ISO cài đặt sẽ tự động gắn các phân vùng cho bạn, bạn có thể xem trong đường dẫn này:
/vmfs/volumes/
5- Các phân vùng chúng ta quan tâm được gắn nhãn là BOOTBANK1 và BOOTBANK2 thuộc loại FAT. Nếu chưa bao giờ cập nhật ESXi, BOOTBANK2 sẽ trống, nhưng nếu đã cập nhật, ESXi sẽ thay đổi phân vùng khởi động mỗi khi bạn thực hiện cập nhật thành công.
Nếu bạn muốn chắc chắn 100%, hãy để ESXi khởi động và trong khi khởi động chờ 5 giây, hãy nhấn Shift+O và lưu ý giá trị bootUUID ở cuối màn hình trong dòng lệnh khởi động và cuối cùng sử dụng lệnh này sau khi bạn khởi động server bằng ISO
localcli storage filesystem list
6- Các thiết lập ESXi, bao gồm cả mật khẩu người dùng, được lưu trữ trong file state.tgz. Đối với các phiên bản ESXi mới hơn, nếu bạn giải nén file này, sẽ có hai file bên trong, một là encryption.info và file còn lại là local.tgz.ve.
Tôi sử dụng những lệnh này.
mkdir /tmp/thuonghdn
cd /tmp/thuonghdn
cp /vmfs/volumes/BOOTBANK1/state.tgz .
tar x -z -f state.tgz
Trong các phiên bản ESXi cũ hơn, file này chứa local.tgz.
* Lưu ý: Vì hệ thống file bootbank là FAT, nếu bạn giải nén ở đó, bạn sẽ mất quyền truy cập file. Tôi đã thực hiện thao tác này trong tmp để không mất quyền truy cập.
File local.tgz.ve là một loại file mà VMware gọi là file envelope và được mã hóa. Vì vậy, bạn không thể trích xuất và xem hoặc chỉnh sửa nội dung của file này như trước nữa.
File encryption.info là file văn bản thuần túy có nội dung phụ thuộc vào chế độ mã hóa bạn đang thiết lập. (Hiện tại có thể là NONE hoặc TPM)
Nếu phần cứng của bạn hỗ trợ và bạn muốn chuyển từ NONE sang chế độ TPM an toàn hơn, bạn có thể sử dụng một trong các lệnh sau sau khi đặt lại mật khẩu và đăng nhập vào ESXi:
localcli system settings encryption set --mode TPM
esxcli system settings encryption set --mode TPM
Phương pháp tôi chia sẻ cho phép bạn đặt lại mật khẩu ở cả chế độ NONE và TPM.
Nếu chúng ta muốn biết thông tin về mã hóa của file local.tgz.ve, chúng ta có thể thực hiện bằng lệnh này:
crypto-util envelope describe local.tgz.ve
Điều quan trọng nhất là KeyID được sử dụng để mã hóa file này.
Khóa này hiện không có trong bộ nhớ đệm khóa của bạn và nếu bạn hỏi ESXi khóa nào đang được sử dụng để mã hóa cấu hình, nó sẽ cung cấp cho bạn một khóa ngẫu nhiên được tạo trong quá trình khởi động ISO:
crypto-util keys getkidbyname ConfigEncryptionKey
Thông thường không giống với keyID mà chúng ta cần để giải mã file local.tgz.ve.
Hãy yêu cầu ESXi, khởi động từ ISO, sử dụng thông tin trong file encryption.info và thêm khóa mong muốn vào Bộ đệm khóa.
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
Sau đó, nếu bạn hỏi ESXi lần thứ hai về khóa mà nó sử dụng để mã hóa cấu hình, nó sẽ trả về cùng một keyID mà chúng ta cần.
7- Ở bước tiếp theo, chúng ta sẽ giải mã file local.tgz.ve.
crypto-util envelope extract --aad ESXConfiguration local.tgz.ve local.tgz
8- Giải nén file local.tgz.
mkdir local
tar x -z -f local.tgz -C local
cd local
9- Nếu bạn xem kỹ, bạn sẽ thấy rằng kho lưu trữ này không còn bao gồm các tập tin sau như trước nữa.
etc/passwd
etc/shadow
Lý do là VMware không còn lưu trữ mật khẩu trong file này nữa và đã chuyển nó sang cơ sở dữ liệu sqlite, địa chỉ của cơ sở dữ liệu này là:
var/lib/vmware/configstore/backup/current-store-1
Và bạn có thể xem mã băm mật khẩu được lưu trữ cho người dùng bằng lệnh này.
/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- Tạo một tập tin có nội dung sau.
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'
Sử dụng vi để tạo và lưu nó vào đường dẫn này:
vi /tmp/thuonghdn/reset-password.sql
Nếu bạn không thành thạo trong việc dùng vi, bạn có thể tạo file trong trình soạn thảo văn bản và chuyển nó sang ESXi bằng SFTP. (Ví dụ: bạn có thể sử dụng FileZilla hoặc WinSCP)
11- Chúng ta yêu cầu sqlite thực hiện truy vấn của chúng ta:
/usr/lib/vmware/sqlite/bin/sqlite3 var/lib/vmware/configstore/backup/current-store-1</tmp/thuonghdn/reset-password.sql
Thao tác này sẽ cập nhật giá trị băm trong cơ sở dữ liệu và bạn có thể xác minh thay đổi bằng lệnh ở bước 9.
Mã băm mà tôi sử dụng là từ pa$$w0rd
12- Chúng ta lưu trữ lại các tập tin để có được một tập tin local.tgz mới:
tar c -z -f /tmp/thuonghdn/local-new.tgz `tar t -z -f /tmp/thuonghdn/local.tgz`
13- Bây giờ mã hóa lại tập tin mới bằng khóa của mình.
cd /tmp/thuonghdn/
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- Chúng ta tạo một file state.tgz mới.
mv state.tgz state-old.tgz
tar c -z -f state.tgz local.tgz.ve encryption.info
15- Chúng tôi chuyển file sang bootbank và thay thế bằng file hiện có.
cd /vmfs/volumes/BOOTBANK1
mv state.tgz state.tgz.bak
mv /tmp/thuonghdn/state.tgz
Tôi cũng đã sao lưu file state.tgz gốc để đảm bảo.
Bây giờ bạn có thể khởi động lại máy chủ và đăng nhập bằng tài khoản root và mật khẩu pa$$w0rd.
Tôi hy vọng nó có thể hữu ích cho mọi người.
mkdir /tmp/thuonghdn
cd /tmp/thuonghdn
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/thuonghdn/local-new.tgz `tar t -z -f /tmp/thuonghdn/local.tgz`
cd /tmp/thuonghdn/
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/thuonghdn/state.tgz .