Mengapa kita perlu menjadi root di terminal untuk shutdown dan restart?

65

Ketika kami menginstal / menghapus / memperbarui paket atau membuat perubahan apa pun yang memerlukan hak administratif, kami diminta kata sandi pengguna admin yang memiliki sudohak istimewa - ini terjadi baik melalui GUI dan terminal.

meminta melalui gui

Namun, jika kita mencoba mematikan dan memulai kembali melalui terminal, itu mengeluh bahwa kita harus root:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Tetapi kami tidak pernah dimintai kata sandi saat kami melakukan tindakan ini melalui roda gigi di kanan atas.

menu roda gigi

Mengapa ada perbedaan ini?

Aditya
sumber
5
Pertanyaan bagus .. Anda tahu apa yang akan saya tanyakan sama. Skenario saya adalah mematikan Ubuntu dengan tombol pintasan. i, e kapan pun saya menekan beberapa tombol yang ditugaskan seperti ctrl + super + s itu mengeksekusi perintah sudo shutdown -h nowtetapi masalahnya adalah bahwa tanpa izin akses untuk shutdownitu tidak pernah berfungsi .. Karena di mana / bagaimana ia akan meminta kata sandi untuk masuk setelah menekan tombol pintas .. Semoga Anda mengerti situasi saya .. :)
Saurav Kumar

Jawaban:

50

Shutdown pada roda gigi memeriksa apakah Anda diizinkan mematikan mesin. Ini dilakukan melalui PolicyKit. Jika shutdown pernyataan ini dalam file /usr/share/polkit-1/actions/org.freedesktop.consolekit.policydiperiksa:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

PolicyKit memicu dbus-sendperintah. Dalam hal shutdown akan menjadi:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

Ada daemon yang berjalan di latar belakang dengan hak istimewa root yang memanggil perintah shutdown untuk Anda.

Ketika Anda ingin dapat mematikan mesin "cara lama" melalui baris perintah ( shutdown, reboot, halt, ...), maka Anda perlu menambahkan bit-suid ke perintah-perintah itu. Namun ketahuilah, semua orang di sistem Anda, yang memiliki akses ke shell kemudian dapat mematikan mesin Anda.

kekacauan
sumber
14
Opsi yang sedikit lebih aman adalah mengizinkan sudoers shutdown tanpa kata sandi dll. Itu mudah dilakukan: masukkan sudo visudo, tambahkan %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, simpan dan keluar. Dengan cara ini, reboot baris perintah masih akan membutuhkan sudo reboot, tetapi Anda tidak harus memasukkan kata sandi.
Sebastian Thürrschmidt
27

Ubuntu adalah distribusi dari Sistem Operasi GNU / Linux yang pada gilirannya milik keluarga sistem Unix - arsitektur umum untuk sejumlah Sistem Operasi modern.

Secara tradisional Unix digunakan untuk berjalan di komputer mainframe. Fasilitas komputasi pusat yang melayani dozend atau ratusan pengguna melalui terminal jarak jauh. Karena semua pengguna bergantung pada ketersediaan mainframe, tidak ada pengguna tunggal diizinkan untuk mengeluarkan perintah shutdown. Sebuah ide yang mendasar bagi arsitektur Unix - kernel sistem tidak akan pernah menginisialisasi shutdown kecuali fungsi yang sesuai dipanggil oleh proses superuser.

Dalam sistem desktop kontemporer, pengembang telah melalui rasa sakit tertentu untuk membuat penutupan tersedia untuk pengguna desktop belaka. Teknik yang umum adalah, untuk membiarkan manajer login, yang biasanya berjalan dalam konteks keamanan pengguna root, menangani shutdown dan reboot. Dalam hal ini shell grafis mengeluarkan permintaan kepada manajer login untuk mematikan komputer. Ini melibatkan penggunaan komunikasi antar proses (IPC), biasanya melalui layanan dbus.

Policykit yang disebutkan di atas memperluas proses ini dengan menyediakan kerangka kerja standar di mana manajer login (atau program apa pun yang menyediakan layanan shutdown) dapat memeriksa apa yang pengguna boleh menyebabkan shutdown, dan melalui mana seorang administrator dapat mengkonfigurasi masing-masing izin tersebut.

Beberapa lingkungan desktop tidak menggunakan layanan berbasis IPC melainkan serangkaian program pembantu untuk menyediakan fungsi yang sama atau serupa. Program-program pembantu tersebut akan dipanggil melalui mekanisme, yang memungkinkan untuk berubah ke dalam konteks pengguna super, seperti sudo, suid, atau mekanisme kebijakan yang mirip dengan sudo.

Bagaimanapun, program shutdown tradisional bodoh pada shell tidak bekerja dengan cara ini, itu mengharuskan Anda untuk melihat bahwa itu dijalankan dalam konteks pengguna super.

Paul Hänsch
sumber
14

Karena Linux umumnya digunakan sebagai server atau serupa, dan SSHing ke dalam kotak linux, bahkan laptop Ubuntu normal, sangat umum.

Masalahnya, Anda mungkin tidak ingin orang dengan akses SSH dapat mematikannya, terutama ketika mungkin ada pengguna lain yang login dari jarak jauh menggunakannya. Seseorang dengan akses ke GUI - yah, dia bisa mematikannya sendiri dengan tombol daya fisik.

Juga, pengguna yang masuk dari jarak jauh tidak akan dapat menyalakannya kembali.

Manishearth
sumber
Tidak terpikir oleh saya saat itu ketika saya mengajukan pertanyaan ini, tetapi saya kira mereka adalah pilihan di Ubuntu untuk menginstal paket GUI di server jauh dan menggunakan server jauh melalui GUI alih-alih baris perintah. (Mirip dengan cara kerja Windows Remote Desktop atau Teamviewer). Sehingga akan membatalkan asumsi bahwa seseorang yang menggunakan Ubuntu lebih dari GUI dapat mematikan dengan tombol daya fisik.
Aditya
@aditya yang memerlukan pengaturan server dengan cara itu, yang harus diputuskan oleh admin
Manishearth
Iya. Ini akan membutuhkan hak akses root untuk dapat menginstal paket dan mengkonfigurasi seperlunya. Tapi skenario ini muncul di benak saya ketika membaca jawaban Anda kemarin dan saya pikir saya akan membaginya dengan Anda :-)
Aditya
14

Ketika saya reboot melalui GUI saya bisa melakukannya tanpa sudokata sandi saya .

Hanya jika Anda satu-satunya yang masuk. Jika ada pengguna lain (termasuk pengguna konsol) Anda mungkin harus memasukkan kata sandi root. Ini sama pada OS X dan versi Windows yang lebih baru.

Mengapa demikian? Apa yang terjadi secara internal dari sistem ubuntu di sana?

Perintah berikut:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus adalah mekanisme IPC - media untuk komunikasi lokal antara proses yang berjalan pada host yang sama.

D-Bus "lebih pintar" dari protokol penyampaian pesan tingkat rendah seperti UDP. Di sisi lain, ia membawa pesan sebagai item yang terpisah — bukan aliran data yang berkelanjutan.

D-Bus memiliki pandangan terstruktur dari data yang dibawanya, dan menangani data dalam bentuk biner; angka integral dari berbagai lebar, string, dan sebagainya. Karena data bukan hanya "byte mentah" ke D-Bus, pesan dapat divalidasi.

- Desktop Gratis

Mengapa shutdownperintah itu tidak memeriksa apakah ada yang login? Tampaknya fitur yang tidak biasa jujur. Saya bisa membayangkan kadang-kadang akan menghemat waktu, tetapi konsol yang konsisten sering lebih disukai. Saya tidak ingin perintah terkadang memerlukan kata sandi setelah menjalankannya, dan kadang tidak.

Kata ganti saya adalah Dia / Dia

Tim
sumber
Ada juga versi yang lebih pendek melalui aplikasi qdbus
Sergiy Kolodyazhnyy
Ketika mematikan / keluar dari DE (GNOME dalam kasus ini) saya tidak diminta untuk sudokata sandi root / pengguna juga tidak dengan pengguna lain yang masuk melalui GDM atau dengan pengguna lain yang masuk melalui tty.
kos
@kos hu, itu aneh. Tangkapan layar itu dari Gnome 3, dan saya login di gui dan tty
Tim
Maksud saya, saya mendapatkan pesan yang sama, tetapi mengklik "Matikan" hanya berjalan dan mematikan sistem. Saya juga meminta Fabby untuk menguji ini dan melakukan hal yang sama untuknya juga, tidak yakin tentang apa itu.
kos
@kos ohh. Tunggu sebentar.
Tim
9

Alasan Anda tidak perlu menjadi root untuk memulai shutdown dari GUI sebagian besar adalah masalah kenyamanan bagi pengguna desktop biasa. Sistem tahu bahwa Anda adalah pengguna yang masuk di konsol, jadi jika Anda mematikan komputer secara tidak sengaja, Anda mungkin dapat menyalakannya kembali.

Untuk pengguna di shell, Anda mungkin harus login jarak jauh, sehingga sistem mengharuskan Anda login sebagai root untuk mengeluarkan perintah shutdown. Ini mencegah pengguna biasa masuk ke server dari mematikannya sementara orang lain menggunakannya, dan sementara tidak ada orang secara fisik di sana untuk memulai komputer kembali.

Alasan shutdown tidak memberikan prompt GUI untuk kata sandi pengguna super mungkin karena tidak ada utilitas nyata yang dapat diperoleh di sana - jika Anda berada di konsol, di mana prompt akan muncul, Anda bisa menggunakan cog- menu wheeel sebagai gantinya. Jika Anda ingin memiliki prompt baris perintah untuk kata sandi pengguna super untuk shutdown, itu sudah tersedia dengan "sudo shutdown".

Mark Bessey
sumber
5

Dalam sistem multi-pengguna, hal terakhir yang Anda inginkan adalah pengguna Anda masuk dan dapat me-reboot server secara acak kapan saja, sehingga versi baris perintah Reboot adalah perintah superuser saja, maka Anda perlu menjadi root atau punya hak sudo.

Lakukan juga perintah Stop dan PowerOff.

Jeff Sereno
sumber
2
Terima kasih atas jawaban Anda, saya mengerti bahwa saya sebagai pengguna mesin yang digunakan oleh puluhan seharusnya tidak dapat me-reboot mesin, tetapi apa yang dilakukan Ubuntu (atau hampir semua distro desktop) lakukan ketika saya memilih untuk reboot melalui mouse bukannya keyboard? Mereka membiarkan itu tanpa priveliges.
asco
3
Komponen seperti systemctl, loginctl, systemd, kebijakan sistem, dll. Semua memungkinkan pengguna yang saat ini masuk untuk mengakses fungsi root tertentu tanpa secara eksplisit memerlukan akses root untuk membuat pengalaman desktop lebih ramah pengguna, tetapi ini tidak perlu memanggil baris perintah perintah untuk melakukan tugas-tugas itu.
Jeff Sereno