Memulihkan dari pengaturan shell root ke file yang buruk

23

Katakanlah saya sudah pergi dan melakukan hal yang konyol, seperti menggunakan 'chsh' untuk mengubah shell pengguna root ke jalur file yang buruk. Login mendatang ke akun root akan tiba-tiba gagal, mengutip / bin / apa pun yang tidak ditemukan, dan mem-boot Anda kembali ke layar login. Membatasi mode pemulihan atau memasukkan LiveCD untuk mengedit / etc / passwd, apa saja pilihan saya untuk mendapatkan kembali sistem saya? Mari kita asumsikan (untuk bersenang-senang?) Bahwa tidak ada pengguna lain di roda. Pikiran?

noffle
sumber
Apakah ini situasi hipotetis yang Anda usulkan?
Chris Down
Saya memang telah melakukan ini pada instalasi FreeBSD (yang relatif segar). Sejak itu telah diinstal ulang, jadi saya kira sekarang agak hipotetis, tapi saya ingin tahu tentang apa rute terbaik untuk pemulihan akan jika saya memang memiliki sistem lengkap hadir.
noffle
Pernah ke sana, melakukan itu, mendapatkan t-shirt. Tetapi sebagai hasilnya pada setiap mesin yang saya kelola, saya mengelola akun root cadangan, untuk berjaga-jaga.
Mark D

Jawaban:

30

Saat boot, tambahkan init=/bin/bash(atau path ke shell fungsional lain) ke opsi boot Anda - Anda akan langsung jatuh ke shell pengguna tunggal. Anda mungkin perlu melakukannya mount -o remount,rw /sebelum memodifikasi /etc/passwdentri di lingkungan itu. Setelah itu, cukup reboot atau lakukan exec /sbin/init 3. Hanya tidak ketik exitatau tekan Ctrl + D, karena ini akan menghasilkan kernel panik *.

Satu variasi tambahan dari metode ini mungkin diperlukan pada beberapa sistem yang dimuat dalam mode dua tahap (dengan gambar initrd). Jika Anda memperhatikan bahwa opsi-opsi boot berisi init=dan, yang paling penting real_init=,, maka tempat untuk meletakkan /bin/bashharus menjadi parameter yang terakhir (yaitu real_init=/bin/bash).

* Ini karena dalam lingkungan itu, shell dilihat oleh kernel sebagai program init - yang merupakan satu-satunya proses yang diketahui oleh kernel - itu mewakili sistem yang berjalan di bawahnya ke mata kernel. Tiba-tiba mengakhiri proses itu, tanpa memberitahu kernel untuk mematikan sistem, harus mengakibatkan panik kernel. (Bukankah kamu akan panik jika tiba-tiba semua yang ada di sekitarmu menjadi hitam dan sunyi?)

rozcietrzewiacz
sumber
Bagus untuk itu exec, tapi saya kira lebih baik tidak mengacaukan terlalu banyak dengan poin mount sebelumnya.
Stéphane Gimenez
2
@ Stéph Anda harus melakukannya jika kernel Anda tidak me-mount root read-write. Kalau tidak, Anda tidak akan dapat memodifikasi file apa pun (termasuk /etc/passwd).
rozcietrzewiacz
Pemikiran yang bagus! Saya telah berhasil masuk ke mode single-user, tetapi tidak mengejutkan saya bahwa saya harus me-remount / membaca / menulis untuk memodifikasi / etc / passwd. Terima kasih!
noffle
@roz Tentu, saya mencoba untuk mengatakan bahwa saya akan mengurus unmount segalanya yang mungkin telah di-mount (selain /) sebelum menjalankan init.
Stéphane Gimenez
@ Stéph Seharusnya tidak ada masalah dengan mounts. Perhatikan bahwa /bin/bashdijalankan tepat pada titik tersebut, maka /sbin/initakan dieksekusi pada boot normal. Jadi tidak mungkin ada tindakan yang dilakukan oleh sistem pada saat itu.
rozcietrzewiacz
10

Anda dapat menggunakan sudan menentukan shell yang akan dieksekusi (saya tidak yakin jika Anda mencoba menyiratkan ini tidak mungkin dengan catatan Anda tentang tidak ada pengguna lain yang ada di dalamnya wheel):

su -c /bin/bash

Kalau tidak, Anda bisa melakukan sesuatu yang serupa jika daemon ssh Anda memungkinkan login untuk melakukan root:

ssh root@localhost /bin/bash

Anda juga dapat mengatur shell sebagai init Anda di bootloader Anda, misalnya, init=/bin/kshatau serupa.

Chris Down
sumber
1
Ide bagus =) Seperti yang Anda duga, tidak ada pengguna lain yang dapat menggunakan 'su'. sshd juga menonaktifkan login root.
noffle
6

Jika bootloader Anda dikonfigurasi untuk memungkinkan pengeditan langsung parameter kernel, solusinya adalah me-reboot dan menggunakan shell sebagai proses init, misalnya init=/bin/bash. Kemudian, pasang apa pun yang perlu dipasang dengan tangan, dan edit /etc/passwd. syncdan boot lagi dengan yang biasa init.

Stéphane Gimenez
sumber
Wow, saya baru saja memperhatikan Anda memposting jawaban yang sama di menit yang sama dengan saya :-)
rozcietrzewiacz
6

Jika inti dari pertanyaan Anda adalah bahwa Anda telah mengunci semua cara untuk menjadi root, maka menurut definisi Anda tidak dapat menjadi root.

Adalah umum untuk mengizinkan tiga cara untuk menjadi root pada sistem unix:

  • Masuk sebagai root, dengan memasukkan rootprompt login dan mengetik kata sandi root. Ini menjalankan shell root.
  • Masuk sebagai pengguna biasa, lalu menjadi root dengan menjalankan sudan mengetik kata sandi root. Pada beberapa sistem, ini mengharuskan berada dalam kelompok tertentu (sering disebut wheel); pada sistem lain, siapa pun yang mengetahui kata sandi root dapat menjadi root. Sistem yang menggunakan PAM untuk otentikasi digunakan pam_wheeluntuk mengelola grup roda jika mereka memilikinya. Jika Anda menentukan perintah dengan su -c, itu dieksekusi melalui shell root.
  • Masuk sebagai pengguna biasa, lalu jadikan root dengan menjalankan sudodan mengetik kata sandi Anda sendiri. Akun pengguna harus diberikan kekuatan sudo oleh administrator. Kecuali dibatasi dalam sudoersfile, Anda dapat menjalankan perintah apa pun, terlepas dari shell root.

Cara tradisional untuk melindungi terhadap shell root yang tidak tersedia adalah dengan mendefinisikan akun lain dengan UID 0 dan shell yang berbeda ( tooradalah nama tradisional). Sebagai contoh, jika shell root adalah executable terkait secara dinamis (ide yang baik untuk menghemat memori) dan pemutakhiran pustaka salah, shell root mungkin tidak dapat digunakan. Akun root alternatif akan memiliki executable yang terhubung secara statis, mungkin yang dengan utilitas umum built-in seperti BusyBox .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
5

Jawaban di atas sangat bagus dan saya belajar dari membacanya. Jika Anda tidak ingat detail dari pendekatan ini dan tidak keberatan me-reboot, Anda selalu dapat mem-boot sistem Anda menggunakan distro CD langsung, pasang partisi / lalu edit / etc / passwd dan reboot. Tidak seanggun solusi di atas, tetapi lebih mudah diingat.

Joe
sumber
Anda harus menunjukkan risiko yang terkait dengan mengedit /etc/passwdfile secara manual . Selain ini, poin bagus - Saya hanya ingin menambahkan saran yang sama untuk jawaban saya.
rozcietrzewiacz