دسته بندی:

آموزش بازیابی رمز عبور root در سرور لینوکس CentOS با GRUB و Rescue Mode

آموزش بازیابی رمز عبور root در سرور لینوکس CentOS با GRUB و Rescue Mode

حدود ۸ دقیقه مطالعه

رمز عبور root را فراموش کرده‌اید، سرور روشن و سالم است اما هیچ راهی برای ورود ندارید. این وضعیت در لینوکس بن‌بست نیست: هر کسی که به کنسول فیزیکی یا کنسول مجازی سرور دسترسی داشته باشد، می‌تواند رمز root را بازنشانی کند. اما روش کار بسته به نسخه توزیع فرق می‌کند و همین جا بیشتر راهنماها اشتباه می‌کنند؛ دستوری که برای لینوکس CentOS نسخه ۶ درست بود، در CentOS 7 به بعد و در جانشین‌های امروزی آن یعنی AlmaLinux و Rocky Linux کار نمی‌کند.

در ادامه هر سه مسیر را می‌بینید: روش rd.break در GRUB2 برای نسخه‌های جدید، روش حالت تک‌کاربره در GRUB قدیمی برای CentOS 6، و Rescue Mode برای وقتی که هیچ‌کدام جواب نداد.

پیش از شروع: چه چیزی لازم دارید

  • دسترسی به کنسول. اگر هیچ راه ورودی به سرور ندارید، این کار از طریق SSH شدنی نیست؛ چون برای ورود با رمز، به همان رمزی نیاز دارید که ندارید. (اگر با کلید SSH به عنوان root وارد می‌شوید یا کاربر sudo دارید، اصلا کنسول لازم نیست؛ دو بند بعد را بخوانید.) روی سرور اختصاصی از IPMI / iDRAC / iLO یا KVM over IP استفاده کنید و روی سرور مجازی از کنسول VNC یا noVNC در پنل مدیریت.
  • یک ری‌استارت. هر سه روش نیازمند بوت مجدد سرور هستند، پس سرویس‌های شما چند دقیقه قطع می‌شوند. اگر سرور در حال سرویس‌دهی است، زمان مناسبی برای این کار انتخاب کنید.
  • اگر کاربر sudo دارید، اصلا به این مقاله نیاز ندارید. کافی است با آن کاربر وارد شوید و دستور زیر را اجرا کنید؛ نه ری‌استارتی لازم است و نه قطعی سرویس:
sudo passwd root

روش ۱ – CentOS 7 و بالاتر، AlmaLinux و Rocky Linux (روش rd.break)

از CentOS 7 به بعد بوت‌لودر GRUB2 و سیستم راه‌انداز systemd جایگزین نسخه‌های قدیمی شده‌اند. در این نسخه‌ها افزودن عدد ۱ به خط کرنل، سیستم را به rescue.target می‌برد و آن هدف خودش رمز root را می‌پرسد؛ یعنی دقیقا همان چیزی که ندارید. به همین دلیل باید پیش از بالا آمدن سیستم اصلی، در مرحله initramfs متوقف شوید.

مراحل

  • ۱- سرور را ری‌استارت کنید و در منوی GRUB روی ورودی کرنل مورد نظر کلید e را بزنید.
  • ۲- خطی را پیدا کنید که با linux شروع می‌شود. در CentOS 7 این خط linux16 و در حالت بوت UEFI معمولا linuxefi نام دارد؛ در CentOS 8، AlmaLinux و Rocky Linux فقط linux است.
  • ۳- عبارت rhgb quiet را از انتهای همین خط حذف کنید تا پیام‌های بوت را ببینید و به جای آن بنویسید:
rd.break enforcing=0

برای بوت شدن با این تغییر، کلیدهای Ctrl+X را بزنید. توجه کنید که این تغییر موقتی است و روی دیسک ذخیره نمی‌شود.

سیستم با پرامپت switch_root:/# متوقف می‌شود. حالا سیستم‌فایل اصلی که فقط خواندنی سوار شده را قابل نوشتن کنید، وارد آن شوید و رمز را عوض کنید:

mount -o remount,rw /sysroot
chroot /sysroot
passwd root

پس از تعیین رمز جدید، با دو بار exit ادامه بوت را آزاد کنید. سیستم به‌طور عادی بالا می‌آید و رمز جدید فعال است.

نکته حیاتی SELinux

وقتی در محیط chroot رمز را عوض می‌کنید، فایل /etc/shadow بازنویسی می‌شود و برچسب SELinux خود را از دست می‌دهد. اگر این موضوع را نادیده بگیرید، سرور بالا می‌آید اما رمز درست هم پذیرفته نمی‌شود. چون در مرحله قبل enforcing=0 را اضافه کردیم، سیستم در حالت Permissive بالا می‌آید؛ پس از ورود، فقط برچسب همان فایل را ترمیم و SELinux را دوباره فعال کنید:

restorecon -v /etc/shadow
setenforce 1

راه دیگر این است که پیش از خروج از chroot دستور touch /.autorelabel را اجرا کنید. این کار درست است اما باعث برچسب‌گذاری مجدد کل سیستم‌فایل و یک ری‌استارت اضافه می‌شود که روی دیسک‌های بزرگ می‌تواند خیلی طول بکشد. روش restorecon سریع‌تر است.

روش ۲ – CentOS 6 و GRUB قدیمی (حالت تک‌کاربره)

این همان روش کلاسیکی است که سال‌ها روی CentOS 5 و ۶ استفاده می‌شد. اگر هنوز چنین سروری دارید، مراحل زیر پابرجاست؛ ولی توجه داشته باشید که CentOS 6 سال‌هاست به پایان پشتیبانی رسیده و هیچ به‌روزرسانی امنیتی دریافت نمی‌کند.

۱- در زمان بوت شدن سیستم عامل وارد منوی بوت grub می‌شویم و کلید e را از صفحه‌کلید فشار می‌دهیم:

بازیابی رمز root در لینوکس CentOS - ورود به منوی بوت grub

۲- سپس گزینه دوم یعنی خط kernel /vmlinuz را انتخاب می‌کنیم و دوباره کلید e را فشار می‌دهیم:

انتخاب خط kernel vmlinuz در گراب برای بازیابی رمز root

۳- به انتهای عبارت زیر:

rhgb quiet

عدد ۱ را اضافه می‌کنیم تا لینوکس در مد تک‌کاربره بوت شود:

افزودن عدد ۱ به خط کرنل برای بوت در حالت تک کاربره

کلید Enter را می‌زنیم تا تغییر ثبت شود، سپس کلید b را می‌زنیم تا سیستم عامل بوت شود.

۴- دستور runlevel را اجرا می‌کنیم؛ خروجی باید N 1 باشد، یعنی سطح اجرای لینوکس مد تک‌کاربره است.

بررسی سطح اجرا با دستور runlevel در لینوکس CentOS

۵- و در آخر با اجرای دستور passwd رمز root را بازنشانی می‌کنیم:

تغییر رمز root با دستور passwd در مد تک کاربره

اگر SELinux روی سرور فعال است، پیش از ری‌استارت دستور touch /.autorelabel را هم اجرا کنید. در پایان با reboot سیستم را به حالت عادی برگردانید.

اگر حالت تک‌کاربره خودش رمز root را پرسید

در برخی سرورها فایل /etc/sysconfig/init طوری تنظیم شده که ورود به حالت تک‌کاربره نیازمند احراز هویت است. در این حالت به جای عدد ۱، عبارت زیر را به انتهای خط kernel اضافه کنید تا مستقیما یک shell بدون احراز هویت بگیرید:

init=/bin/bash

پس از بوت، چون سیستم‌فایل ریشه فقط خواندنی است باید ابتدا آن را قابل نوشتن کنید:

mount -o remount,rw /
passwd root
touch /.autorelabel
mount -o remount,ro /
reboot -f

دستور reboot -f یک ری‌استارت اجباری و بدون خاموش‌کردن تمیز سرویس‌هاست؛ به همین دلیل خط قبل از آن، یعنی mount -o remount,ro /، حتما باید اجرا شود تا نوشته‌ها روی دیسک نهایی شوند و سیستم‌فایل آسیب نبیند.

روش ۳ – Rescue Mode

اگر منوی GRUB با رمز محافظت شده باشد یا اصلا نمایش داده نشود، تنها راه باقی‌مانده بوت از یک محیط جداگانه است. سرور را از ISO نصب همان توزیع یا از Rescue Mode پنل سرور مجازی بوت کنید. اگر مطمئن نیستید سرویس شما چنین امکانی دارد یا نه، از پشتیبانی بپرسید.

در محیط نصب گزینه Troubleshooting و سپس گزینه رسکیو را انتخاب کنید؛ نام دقیق این گزینه به توزیع بستگی دارد و به شکل Rescue a CentOS system، Rescue an AlmaLinux system یا Rescue a Rocky Linux system نوشته شده است. در منوی بعدی گزینه Continue را بزنید تا دیسک سرور به صورت خواندنی-نوشتنی در مسیر /mnt/sysimage سوار شود. سپس:

chroot /mnt/sysimage
passwd root
touch /.autorelabel
exit
reboot

روی CentOS 6 و قدیمی‌تر، به جای منوی Troubleshooting باید در پرامپت بوت رسانه نصب عبارت linux rescue را تایپ کنید؛ بقیه مراحل یکسان است.

چطور مطمئن شویم کار کرده است

  • وضعیت رمز را بررسی کنید؛ خروجی باید نشان دهد رمز تنظیم شده و حساب قفل نیست: passwd -S root
  • برچسب SELinux فایل shadow را ببینید؛ باید shadow_t باشد: ls -Z /etc/shadow
  • وضعیت SELinux را بررسی کنید تا در حالت Permissive جا نمانده باشد: getenforce
  • پیش از بستن کنسول، یک بار ورود واقعی را تست کنید. کنسول را باز نگه دارید و از یک ترمینال دیگر با SSH وارد شوید، یا در یک نشست دیگر با یک کاربر معمولی (نه root) دستور su - را بزنید تا واقعا رمز پرسیده شود. اگر رمز کار نکرد، هنوز کنسول باز را در اختیار دارید.

خطاهای رایج

  • پیام Authentication token manipulation error هنگام اجرای passwd: سیستم‌فایل فقط خواندنی سوار شده است. دستور mount -o remount,rw /sysroot یا mount -o remount,rw / را فراموش کرده‌اید.
  • رمز عوض شد اما بعد از ری‌استارت پذیرفته نمی‌شود: تقریبا همیشه مشکل برچسب SELinux فایل /etc/shadow است. با enforcing=0 بوت کنید و restorecon -v /etc/shadow را اجرا کنید.
  • chroot را فراموش کرده‌اید: در این حالت رمز کاربر root داخل initramfs عوض شده، نه روی سیستم واقعی. عملا هیچ اتفاقی نیفتاده است.
  • منوی GRUB اصلا ظاهر نمی‌شود: مقدار GRUB_TIMEOUT صفر است. هنگام بوت کلید Esc یا Shift را نگه دارید یا مکرر کلید جهت بالا را بزنید.
  • رمز جدید در SSH کار نمی‌کند ولی در کنسول کار می‌کند: در فایل /etc/ssh/sshd_config گزینه PermitRootLogin روی no یا prohibit-password است، یا PasswordAuthentication غیرفعال است. این پیکربندی امن است؛ بهتر است به جای تغییر آن، با یک کاربر معمولی وارد شوید و از sudo استفاده کنید.
  • رمز اشتباه تایپ می‌شود: چیدمان صفحه‌کلید در محیط GRUB و initramfs انگلیسی استاندارد است. برای رمز اول از حروف و اعداد ساده استفاده کنید و بعد از ورود موفق، آن را با یک رمز قوی عوض کنید.

چه زمانی این کار را نکنید

اگر دیسک سرور با LUKS رمزنگاری شده و عبارت عبور آن را ندارید، هیچ‌کدام از این روش‌ها جواب نمی‌دهد؛ داده‌ها بدون آن عبارت قابل دسترسی نیستند. همچنین اگر رمز root ناگهان و بدون اینکه کسی آن را عوض کرده باشد از کار افتاده است، صرفا آن را بازنشانی نکنید؛ این می‌تواند نشانه نفوذ باشد و باید ابتدا لاگ‌ها و کاربران سیستم بررسی شوند.

بعد از بازیابی، جلوی تکرارش را بگیرید

این مقاله یک واقعیت مهم را نشان می‌دهد: هر کسی که به کنسول سرور دسترسی داشته باشد، عملا root است. پس:

  • دسترسی IPMI / iDRAC / iLO و پنل سرور مجازی را با رمز قوی و در صورت امکان تایید دومرحله‌ای محافظت کنید.
  • روی CentOS 7 و بالاتر، AlmaLinux و Rocky Linux می‌توانید ویرایش ورودی‌های GRUB را با رمز محافظت کنید. دستور زیر رمز را در فایل user.cfg ذخیره می‌کند و نیازی به ساخت مجدد grub.cfg نیست:
grub2-setpassword

این رمز را جایی امن نگه دارید: بعد از فعال کردن آن، روش‌های ۱ و ۲ بدون همان رمز کار نمی‌کنند و تنها راه باقی‌مانده برای شما هم Rescue Mode خواهد بود.

  • یک کاربر معمولی با دسترسی sudo بسازید و ورود مستقیم root از SSH را ببندید. با این کار دیگر فراموشی رمز root شما را از سرور بیرون نمی‌اندازد.

و یک نکته درباره خود توزیع: پشتیبانی CentOS Linux 8 در پایان سال ۲۰۲۱ و پشتیبانی CentOS Linux 7 در ۳۰ ژوئن ۲۰۲۴ به پایان رسید. اگر هنوز روی این نسخه‌ها هستید، مهاجرت به AlmaLinux یا Rocky Linux را در برنامه بگذارید؛ روش بازیابی رمز root در هر دو دقیقا همان روش ۱ است.

آموزش‌های مرتبط