Mengapa sistem memiliki /etc/sudoers.d? Bagaimana saya harus mengeditnya?

48

Terakhir kali, saya bertanya tentang risiko ini (di / etc / sudoers):

    user_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
    %group_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Ketika saya sedang memikirkan masalah ini, saya menemukan direktori /etc/sudoers.d . File dalam direktori harus memiliki fungsi yang mirip dengan / etc / sudoers (artinya skrip di atas masih bermasalah bahkan di /etc/sudoers.d), dan satu artikel mengatakan kita tidak boleh menggunakan direktori karena kita tidak dapat menggunakan visudountuk mengedit file di saya t. Artinya, kita kehilangan hak untuk menggunakan sudojika kita membuat kesalahan dalam direktori.

Jika itu benar, mengapa kita memiliki /etc/sudoers.d ? Atau apakah kita memiliki cara yang baik untuk mengedit file di /etc/sudoers.d ?

aob
sumber

Jawaban:

45

Perubahan yang dilakukan pada file /etc/sudoers.dtetap ada jika Anda meningkatkan sistem. Ini dapat mencegah penguncian pengguna saat sistem ditingkatkan. Ubuntu cenderung menyukai perilaku ini. Distribusi lain juga menggunakan tata letak ini.

Sudah pengalaman saya bahwa aturan pada file dalam direktori ini lebih longgar daripada untuk /etc/sudoers. Ini sudah termasuk:

  • Kesalahan dalam file tidak menyebabkan sudogagal. Namun, file tersebut diabaikan.
  • Aturan izin tampak kurang ketat. Ini memungkinkan grup yang berlaku atau yang lain untuk membaca file. Saya tidak percaya itu mungkin terjadi /etc/sudoers. Izin menulis harus dibatasi rootuntuk menjaga keamanan. Versi sudo Ubuntu saat ini memungkinkan izin baca untuk grup atau lainnya. (Kemampuan ini memungkinkan akses sudo untuk diaudit menggunakan tanpa memerlukan akses root.)

The visudoperintah saja defaultnya /etc/sudoers. Ini akan mengedit dan memverifikasi file apa pun yang Anda tentukan dengan -fopsi. Saya menggunakan kemampuan ini untuk mengedit file yang akan diinstal secara otomatis sebagai /etc/sudoersatau ke /etc/sudoders.d. Namun, definisi dari file lain mungkin tidak ditemukan. Yang terbaik adalah membuat file independen.

Kemampuan untuk memiliki file yang berdiri sendiri memudahkan aplikasi untuk mengaktifkan sudokemampuan instalasi dan menghapusnya saat tidak diinstal. Alat konfigurasi otomatis juga dapat menggunakan kemampuan ini.

Saya telah menggunakan kemampuan ini untuk mengisolasi perubahan yang diperlukan untuk memberikan akses ke grup pengguna tertentu pada sistem tertentu.

BillThor
sumber
1
Dua sifat sudoers.d yang Anda sebutkan tampak sangat penting dan bermanfaat. Terima kasih!
aob
Lihat jawaban dan peringatan saya tentang mengapa itu sebenarnya bukan sifat sudoers.
dragon788
1
Sangat tidak setuju dengan pernyataan 'Kesalahan dalam file tidak menyebabkan sudogagal'. Saya merusak sudo di RHEL dengan sintaks yang salah dalam file dari /etc/sudoers.d. Ini membutuhkan upaya yang signifikan untuk memperbaiki dan saya pikir rekomendasi harus selalu digunakan visudo -funtuk mengedit file-file itu.
79E09796
@ 79E09796 Saya telah merusak file di /etc/sudoers.d tanpa menyebabkan masalah dengan aturan di file lain. YMMV. Jika Anda merusak konfigurasi sudo yang membawa Anda ke sistem, Anda akan memiliki masalah. Jika Anda memiliki akses untuk reboot sistem, relatif mudah untuk reboot ke mode pemulihan dan memperbaiki file. Saya setuju bahwa ini adalah praktik terbaik untuk menggunakan visodo untuk mengedit, atau setidaknya memverifikasi perubahan pada file konfigurasi sudo.
BillThor
62

Ya, Anda dapat menggunakan visudountuk mengedit file-file itu. Yang harus Anda lakukan adalah menentukan nama file yang ingin Anda edit dengan -fopsi. Sebagai contoh:

visudo -f /etc/sudoers.d/somefilename

Atau, jika perlu:

sudo visudo -f /etc/sudoers.d/somefilename

Dokumentasi

Dari man visudo:

-f sudoers
Menentukan dan mengganti lokasi file sudoers. Dengan opsi ini, visudo akan mengedit (atau memeriksa) file sudoers pilihan Anda, alih-alih default, / etc / sudoers. File kunci yang digunakan adalah file sudoers yang ditentukan dengan ".tmp" yang ditambahkan. Dalam mode check-only saja, argumen ke -f mungkin "-", menunjukkan bahwa sudoers akan dibaca dari input standar.

Singkatnya:

  1. Sintaks: Keduanya visudodan visudo -f melakukan pemeriksaan sintaksis yang sama .

  2. Izin / Kepemilikan: Sebagai fitur yang ditambahkan untuk membantu administrasi sistem besar , file yang diedit di bawah visudo -ftidak diperiksa untuk kepemilikan atau izin: ini memungkinkan pemeriksaan sintaksis terhadap file secara offline atau sebagai bagian dari sistem kontrol revisi.

Mengapa menggunakan /etc/sudoers.d/

Biasanya di /etc/sudoersbawah kendali manajer paket distribusi Anda. Jika Anda telah membuat perubahan pada file itu dan manajer paket ingin memutakhirkannya, Anda harus memeriksa perubahan secara manual dan menyetujui bagaimana mereka digabungkan ke dalam versi baru. Dengan menempatkan perubahan lokal Anda ke file di /etc/sudoers.d/direktori, Anda menghindari langkah manual ini dan peningkatan dapat dilanjutkan secara otomatis.

Kapan sudomengabaikan file /etc/sudoers?

Jika /etc/sudoersfile Anda berisi baris:

#includedir /etc/sudoers.d

maka sudoakan membaca file di direktori /etc/sudoers.d.

Pengecualian adalah:

  1. File yang namanya berakhir dengan ~
  2. File yang namanya mengandung .karakter

Ini dilakukan (a) untuk kenyamanan manajer paket dan juga (b) sehingga file cadangan dari editor diabaikan.

John1024
sumber
Terima kasih, tapi saya punya satu keraguan. Apakah visudo -faman?
aob
5
Ya, visudo -fpengeditan dengan cara yang aman seperti biasa visudo. Itu sebabnya kami memiliki visudodan mengapa itu memberikan -fopsi.
John1024
Catatan bagus tentang bagaimana izin diabaikan ketika menggunakan -fkarena ini dapat byte seseorang yang kemudian menyalinnya ke /etc/sudoers.d/ tanpa mengeceknya.
dragon788
1
TERIMA KASIH untuk bagian pengecualian. Saya memberi nama file saya sesuatu seperti /etc/sudoers.d/mysudorules.sudodan tidak bisa seumur hidup saya mencari tahu mengapa aturan di dalamnya tidak diterapkan sebelum membaca jawaban Anda.
Zaroth
1
Terima kasih telah menyebutkan pengecualian. File saya di bawah /sudoers.d/mysite.co.uktidak berfungsi dan setelah mengubah nama menjadi mysiteberfungsi! :)
J86
20

mengapa kita memiliki /etc/sudoers.d?

Karena alat otomatis lebih mudah (seperti Chef atau Puppet) untuk memasukkan file individual ke direktori ini, daripada membuat perubahan /etc/sudoers, yang mungkin rapuh.

File-file yang ada di /etc/sudoers.d(dalam efek) digabungkan. Anda akan melihat beberapa contoh lain dari pola ini /etc, seperti /etc/cron.ddan /etc/logrotate.d.

Roger Lipscombe
sumber
Saya tidak tahu ada direktori serupa lainnya. Terima kasih.
aob
14

Manfaat lain menggunakan visudo -fseperti yang disebutkan dalam beberapa jawaban adalah ada opsi yang sesuai -catau --checkyang memverifikasi Anda tidak memiliki informasi yang tidak valid dalam file sudoers.d atau file lain yang mungkin ingin Anda masukkan ke sudoers.d. Ini SANGAT berguna dalam kasus yang disebutkan dengan alat otomatis, karena Anda dapat menjalankan mis

sudo visudo -c -q -f /home/myuser/mysudoers && \
sudo chmod 600 /home/myuser/mysudoers && \
sudo cp /home/myuser/mysudoers /etc/sudoers.d/mysudoers

Ini diam-diam memeriksa file (tidak ada output karena -q) dan hanya jika itu TIDAK mengembalikan kesalahan (keluar 1 berarti file sudoers tidak valid) maka itu akan menyalin file ke sudoers.d, dengan cara ini Anda dapat membuat file dan kerjakan tanpa harus memperbaikinya pertama kali (menggunakan sudo visudo -f /etc/sudoers.d/myfileharus berhasil atau membuang konten jika Anda tidak memperbaikinya).

Juga, kata hati - hati tentang pernyataan ini dari jawaban lain.

Sudah pengalaman saya bahwa aturan pada file dalam direktori ini lebih longgar daripada untuk / etc / sudoers. Ini sudah termasuk:

Kesalahan dalam file tidak menyebabkan sudo gagal. Namun, file tersebut diabaikan. Aturan izin tampak kurang ketat. Saya mengizinkan grup yang berlaku untuk membaca file. Saya tidak percaya itu mungkin dengan / etc / sudo.

File dalam /etc/sudoers.d harus mematuhi sintaksis yang sama dengan / etc / sudoers, karena di bawah sampul sistem hanya menyatukan semua file dengan yang terakhir di "menang" jika ada beberapa entri untuk hal yang sama pengaturan tunggal.

Jika izinnya sangat salah (dapat ditulis dunia) pada file di /etc/sudoers.d/ maka diabaikan, ini mungkin yang menyebabkan file yang tidak valid diabaikan, jika tidak, Anda dapat dengan serius melanggar sudoperintah dengan memiliki sudoers yang tidak valid. d file dengan izin yang benar.

Anda dapat mengizinkan file sudoers agar dapat dibaca dunia, jika Anda secara tidak sengaja mengizinkan 'lain' izin menulis yang Anda butuhkan untuk sudo sebagai pengguna lain atau dari terminal root menjalankan perintah ini. Ini juga dapat rusak jika file tersebut dimiliki oleh orang lain selain root: root.

sudo chmod 644 /etc/sudoers.d/mysudoers
sudo chown root:root /etc/sudoers.d/mysudoers

Saya baru saja mengkonfirmasi bahwa jika saya menjalankan chmod o+w /etc/sudoers.d/vagrantsaya tidak lagi dapat sudo sebagai pengguna gelandangan, itu meminta saya untuk kata sandi saya dan kemudian gagal.

Ketika saya berlari sudo -luntuk melihat izin perintah yang diterapkan sebagai pengguna sudo lain yang valid, saya juga menerima peringatan tentang izin file. Ini adalah perintah yang sama yang saya gunakan untuk mengkonfirmasi bahwa pengguna 'gelandangan' kehilangan sudo ketika saya menerapkan o+wizin ke file yang memberikan izin sudo pengguna.

dragon788
sumber
3

Hanya tambahan singkat untuk jawaban umum ... tidak ada jawaban lain yang memperbaiki masalah saya, yang mana urutannya penting.

Jika baris Anda berfungsi dalam sudoers tetapi bukan sudoers.d, coba pindahkan #include, atau ubah urutan file sudoers.d Anda (dengan awalan dengan angka). Tampaknya hal yang paling spesifik harus menjadi yang pertama dalam file.

Saya punya sesuatu seperti:

somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand

Dan yang ke-2 tidak berpengaruh karena yang pertama sudah cocok. NOPASSWD bukanlah suatu kondisi, tetapi beberapa cara untuk memodifikasi tindakan.

Dan itu tidak jelas karena itu tidak ada dalam satu file, karena direktori sudoers.d.

Peter
sumber