Mengapa perintah sudo tidak membutuhkan kata sandi root?

48

Saya telah menggunakan Linux untuk sementara waktu sekarang dan setiap kali saya mengetik sudosaya pikir saya beralih ke pengguna root untuk perintah.

Tampaknya ini tidak benar karena yang saya butuhkan adalah kata sandi akun pengguna saya. Saya menduga karena saya belum bekerja dengan banyak pengguna, saya belum benar-benar memperhatikan hal ini di dunia nyata.

Saya tidak yakin bagaimana Ubuntu mengatur akun pertama saya. Apakah ada pengguna root? Apakah saya root? Saya kira saya baru saja membuat pengguna baru pada saat instalasi tetapi itu memberi saya hak akses root? Hanya sedikit bingung di sini ...

Jadi mengapa saya diizinkan menjalankan perintah root dengan kata sandi pengguna saya?

EGHDK
sumber
Menggunakan pengguna mana Anda memerlukan kata sandi dan yang tidak Anda gunakan? Perintah apa yang Anda jalankan? Ingat, sudo itu menyimpan kata sandi Anda untuk sementara waktu sebelum Anda harus mengetik ulang.
Braiam
11
sudomemiliki bit set "setuid". Jadi ini berjalan sebagai pengguna yang memilikinya (yang merupakan root pada semua sistem standar jika saya tidak salah), bukan pengguna yang meluncurkannya. sudokemudian memuat /etc/sudoersfile dan memeriksa apa yang diizinkan berdasarkan siapa yang meluncurkannya.
LawrenceC
1
Saya minta maaf jika saya mengulangi sesuatu yang orang lain katakan, tetapi saya tidak dapat menemukannya. Jawabannya adalah: Ini keputusan kebijakan. Dugaan terbaik saya pada motivasi adalah bahwa, dalam instalasi besar di mana Anda memiliki banyak orang dengan sudohak istimewa, mungkin bekerja di lokasi yang didistribusikan secara geografis dan pada 24 × 7 shift, Anda ingin dapat segera mencabut akses istimewa satu orang (misalnya, jika Anda mencurigai integritasnya). Jika semua orang menggunakan kata sandi root satu-satunya, dan Anda mengubahnya tanpa koordinasi sebelumnya, kekacauan dapat terjadi. ...
G-Man Mengatakan 'Reinstate Monica'
1
@HagenvonEitzen Saya tahu saya terlambat beberapa hari, tapi bagaimana ini bukan penipuan pertanyaan kami?
strugee

Jawaban:

65

Secara rinci ini bekerja dengan cara berikut:

  1. /usr/bin/sudofile yang dapat dieksekusi memiliki setuid bit yang ditetapkan, sehingga bahkan ketika dijalankan oleh pengguna lain, ia dijalankan dengan id pengguna pemilik file (root dalam kasus itu).

  2. sudomemeriksa dalam /etc/sudoersfile hak istimewa apa yang Anda miliki dan apakah Anda diizinkan untuk menjalankan perintah yang Anda minta. Secara sederhana, /etc/sudoersadalah file yang mendefinisikan pengguna mana yang dapat menjalankan perintah mana yang menggunakan sudomekanisme.

    Begitulah tampilan file itu di Ubuntu saya:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    Baris ketiga adalah apa yang mungkin menarik minat Anda. Ini memungkinkan siapa saja dalam grup "sudo" untuk menjalankan perintah apa pun sebagai pengguna apa pun.

    Ketika Ubuntu mengatur akun pertama selama instalasi, Ubuntu menambahkan akun itu ke grup "sudo". Anda dapat memeriksa grup mana yang menjadi milik pengguna dengan groupperintah.

  3. sudomeminta Anda untuk kata sandi. Mengenai fakta bahwa itu membutuhkan kata sandi pengguna, bukan kata sandi root, yang merupakan kutipan dari panduan sudoers :

    Otentikasi dan pencatatan

    Kebijakan keamanan sudoers mengharuskan sebagian besar pengguna mengotentikasi diri mereka sendiri sebelum mereka dapat menggunakan sudo. Kata sandi tidak diperlukan jika pengguna yang memanggil adalah root, jika pengguna target sama dengan pengguna yang memanggil, atau jika kebijakan telah menonaktifkan otentikasi untuk pengguna atau perintah. Tidak seperti su (1), ketika sudoers memerlukan otentikasi, itu sudo memvalidasi kredensial pengguna yang memohon, bukan kredensial pengguna target (atau root). Ini dapat diubah melalui rootpw, targetpw dan bendera runaspw, dijelaskan nanti.

    Namun, pada kenyataannya, sudotidak perlu kata sandi pengguna Anda untuk apa pun. Itu memintanya hanya untuk memastikan bahwa Anda benar-benar Anda dan untuk memberi Anda semacam peringatan (atau kesempatan untuk berhenti) sebelum memanggil beberapa perintah yang berpotensi berbahaya. Jika Anda ingin mematikan permintaan kata sandi, ubah entri sudoers ke:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Setelah otentikasi sudomemunculkan proses anak yang menjalankan perintah dipanggil. Anak mewarisi id pengguna root dari induknya - sudoproses.


Jadi, jawablah pertanyaan Anda dengan tepat:

Saya pikir saya telah beralih ke pengguna root untuk sebuah perintah.

Kamu benar. Setiap perintah diawali dengan sudodijalankan dengan id pengguna root.

Apakah ada pengguna root?

Ya, ada akun pengguna root, terpisah dari akun pengguna Anda yang dibuat selama instalasi sistem. Namun, secara default di Ubuntu Anda tidak diizinkan masuk ke terminal interaktif sebagai pengguna root.

Apakah saya root?

Tidak, Anda bukan root. Anda hanya memiliki hak istimewa untuk menjalankan perintah individual sebagai root , menggunakan sudomekanisme yang dijelaskan di atas.

Jadi mengapa saya diizinkan menjalankan perintah root dengan kata sandi pengguna saya?

Anda harus memasukkan kata sandi pengguna hanya karena sudomekanisme keamanan internal. Itu bisa dengan mudah dimatikan. Anda mendapatkan kekuatan root Anda karena setuid sedikit /usr/bin/sudo, bukan karena kata sandi yang Anda masukkan.

Piotr Jurkiewicz
sumber
6
Jawabannya harus benar-benar dimulai dengan bagian setuid, karena itulah alasan bahwa itu sebenarnya mungkin. / etc / sudoers hanyalah alasan untuk fleksibilitas perintah sudo.
daniel kullmann
Menarik. Saya tidak tahu bahwa Anda dapat menentukan yang sudodapat dijalankan tanpa memasukkan kata sandi saya. Jawaban bagus!
jwir3
1
Perhatikan bahwa sudo dapat dikonfigurasi untuk meminta kata sandi root dengan rootpwtanda masuk sudoers.
Pasang kembali Monica - M. Schröder
2
Anda dapat sebenarnya masuk sebagai user root: sudo su - rootakan melakukan hal itu dan memberikan terminal root. Namun Anda tidak dapat dengan mudah masuk ke sesi desktop sebagai root.
jmiserez
1
Pada dasarnya sudomemiliki hak istimewa root dengan sendirinya, dan ia memutuskan apakah akan memberikan itu kepada Anda berdasarkan file konfigurasi.
Siyuan Ren
15
  • Intinya sudoadalah memberi Anda hak istimewa orang lain (biasanya root) tanpa meminta kata sandi akun lain ini (tidak seperti su).

  • sudo meminta kata sandi Anda di sini hanya untuk memastikan orang yang lewat tidak akan menyalahgunakan terminal Anda yang tidak terkunci.

  • Ubuntu dan banyak Linux dan OS Unix lainnya memberikan akun awal yang dibuat pada saat instalasi hak untuk menjalankan perintah apa pun sebagai root.

  • Meskipun rootmasih merupakan akun di Linux, rootlogin langsung dinonaktifkan secara default untuk keamanan dan keterlacakan yang lebih baik.

Jlliagre
sumber
7
Meskipun login root langsung memang dinonaktifkan secara default, masih ada akun root dengan Ubuntu. Ini bukan lagi akun di setidaknya Solaris di mana ia secara default adalah peran.
jlliagre
Terima kasih banyak - Saya selalu bertanya-tanya bagaimana cara kerjanya, dan sekarang lebih masuk akal.
mikeserv
5

Piotr memberikan penjelasan yang sangat bagus tentang cara sudokerjanya. Namun, dia tidak benar-benar memotivasi mengapa ini bekerja seperti ini, jadi saya akan mencoba menambahkannya di sini.

Sebelum sudoperintah dibuat, kami memiliki superintah. Perintah ini memungkinkan satu pengguna untuk menjalankan perintah sebagai pengguna lain, biasanya root(seperti halnya sudo, ini adalah target pengguna default). Itu benar-benar tanpa diskriminasi, Anda dapat menjalankan perintah apa pun. Karena dapat digunakan oleh pengguna mana pun, secara efektif setara dengan masuk sebagai pengguna itu, itu mengharuskan Anda untuk mengetahui kata sandi pengguna target.

Pada titik tertentu, kontrol akses sedikit lebih ditambahkan: untuk menggunakan su, Anda harus menjadi anggota wheelgrup. Tetapi karena Anda masih bisa menjalankan perintah apa pun, masih masuk akal untuk meminta Anda mengetahui kata sandi mereka.

Namun, mengharuskan pengguna untuk saling mengetahui, atau superuser, kata sandi itu tidak terlalu aman. Seringkali Anda hanya ingin memberi pengguna tertentu akses terbatas ke beberapa akun lain (ini adalah bagian dari konsep keamanan yang disebut prinsip privilege paling tidak penting ). Ini juga mempersulit akuntabilitas: jika banyak orang mengetahui kata sandi akun, dan akun itu terlibat dalam kesalahan atau penyalahgunaan, Anda tidak dapat memberi tahu siapa di antara mereka yang benar-benar melakukannya.

Jadi sudodiciptakan. Alih-alih mengizinkan pengguna untuk mengeksekusi perintah apa pun, ia memiliki file konfigurasi yang rumit, disinggung secara singkat dalam jawaban Piotr, yang menentukan secara tepat siapa yang dapat menggunakannya, pengguna apa yang dapat mereka gunakan untuk beralih, dan perintah apa yang mereka boleh jalankan. Dengan kendali penuh atas siapa yang dapat melakukan apa kepada siapa, kita tidak perlu lagi memberikan kata sandi akun target kepada pengguna; jika kami melakukannya, mereka dapat dengan mudah mem-bypass semua kontrol dalam file konfigurasi dengan masuk sebagai pengguna itu. Sebagai gantinya, kami biasanya hanya mengharuskan mereka untuk membuktikan bahwa mereka adalah mereka yang masuk sebagai, dengan memasukkan kata sandi mereka sendiri - ini dimaksudkan untuk mencegah seseorang mengambil keuntungan dari sebuah akun jika terminal dibiarkan tanpa pengawasan.

Persyaratan ini dicabut untuk superuser - akun ini dapat melakukan hampir semua hal untuk sistem tanpa menggunakan sudo, sehingga dianggap berlebihan. Mungkin juga untuk menentukan dalam file konfigurasi bahwa pengguna tidak perlu memasukkan kata sandi sama sekali - beberapa organisasi menggunakan ini ketika mereka yakin keamanan fisik lingkungan workstation mereka cukup untuk mencegah penyalahgunaan.

Barmar
sumber
Saya belum menjelajahi ini, tapi saya mengerti salah satu fitur sudo yang su tidak miliki adalah su (yang bisa?) Menyimpan log tentang perintah apa yang dijalankan oleh pengguna untuk memudahkan melacak masalah kembali ke sumber mereka. Saya baru saja melihat sistem kubuntu saya dan tidak melihat log seperti itu, jadi mungkin ini bukan perilaku default.
Joe
Baru saja menemukan sudo masuk di /var/log/auth.log - bersama dengan banyak hal lain termasuk beberapa IP dari Cina yang mencoba mendapatkan akses ssh root ke sistem saya - jadi, jika Anda hanya ingin melihat sudo, Anda harus memfilter itu melalui grep atau serupa.
Joe
Benar. sujuga mencatat, tetapi karena itu baru memulai shell baru, itu hanya mencatat fakta bahwa seseorang menjalankannya.
Barmar
Anda tidak dapat mengandalkan log, siapa pun yang dapat mendapatkan root dapat mengubah log (kecuali jika Anda log ke mesin lain, dan memastikan bahwa Anda tidak memberikan akses sampai transaksi logging selesai). Namun sudomemang memungkinkan hak istimewa untuk dicabut, tanpa harus menerbitkan kembali kata sandi root untuk semua orang yang membutuhkannya.
ctrl-alt-delor
1
@richard Karena sudomemungkinkan Anda membatasi perintah mana yang dapat dijalankan pengguna, Anda dapat mencoba memastikan bahwa Anda tidak memberi mereka akses ke perintah yang akan menimpa log.
Barmar
3

Jawaban atas pertanyaan Anda adalah:

Ketika Anda menjalankan perintah dengan sudo , Anda menjalankan perintah dengan privilege yang ditinggikan , yaitu privilege root . Anda hanya perlu mengetikkan kata sandi pengguna normal Anda karena Anda (pengguna) telah ditambahkan ke file sudoers yang memberi Anda hak root .

sesuatu yang sesuatu
sumber
2
Kecuali sudo tidak menyiratkan hak yang lebih tinggi, hanya berbeda dengan pengguna saat ini. Misalnya Anda dapat menjalankan program sebagai pengguna normal yang tidak memiliki shell. Juga, berada di file sudoers tidak memberi root.
James Tocknell
1
@aragilar ya sudotidak selalu memberikan hak istimewa yang ditinggikan, tetapi itu berjalan pada hak istimewa yang ditinggikan, setelah melakukan hal tersebut (memeriksa otentikasi, ia dapat kehilangan hak istimewa). Perlu hak yang lebih tinggi untuk dapat mengubah pengguna.
ctrl-alt-delor
1
Tentu, sudomemang menggunakan hak istimewa yang ditinggikan (tapi itu tidak unik untuk sudo, mis. Mount juga), tetapi perintah yang Anda panggil yaitu commanddi sudo commandmungkin tidak (tergantung pada apa yang diatur dalam /etc/sudoers).
James Tocknell
1

Pertama, menonaktifkan akun biasanya dilakukan dengan mengatur kata sandi terenkripsi ke *, yang bukan nilai terenkripsi dari string apa pun. Saya tidak dapat memeriksa sekarang, tapi saya percaya itulah yang dilakukan Ubuntu untuk root juga. Jadi secara teknis, tidak ada kata sandi root di Ubuntu.

Tapi sudo mendahului Ubuntu; itu dirancang untuk sistem di mana tentu saja ada kata sandi root. Jadi mengapa tidak memerlukan kata sandi root? Pada dasarnya, sudo dirancang untuk memberikan izin untuk menjalankan perintah khusus untuk pengguna tertentu --- mis., Memungkinkan akses root pengembang untuk memulai kembali aplikasi web, tetapi tidak untuk memulai server yang sewenang-wenang. Sebaliknya, mengetahui kata sandi root memberi Anda akses tanpa batas; Anda dapat menggunakan login atau su untuk membuka shell root dan menjalankan perintah sewenang-wenang. Karena sudo harus bekerja untuk orang-orang tanpa tingkat akses itu, itu tidak bisa memerlukan kata sandi root untuk dijalankan.

Jonathan Cast
sumber
Ini juga memungkinkan seseorang untuk mencabut hak akses root pengguna tanpa harus mengubah kata sandi root.
Ian D. Scott