Bagaimana cara membatasi untuk menjalankan perintah di direktori tertentu melalui SUDOERS?

13

Saya dapat mengkonfigurasi sudo (melalui file sudoers) untuk memungkinkan pengguna untuk menjalankan chowndan chmodperintah pada file atau direktori dalam sistem. Namun, saya hanya ingin memberikan izin kepada pengguna untuk menjalankan perintah ini pada file yang berada di bawah /var/www/htmldirektori.

Bagaimana saya bisa membatasi perintah istimewa sehingga pengguna hanya dapat menjalankannya di direktori yang ditentukan sebelumnya?

Sebagai contoh: Perintah berikut memberikan 777 izin untuk index.htmlmengajukan.

sudo chmod 777 /var/www/html/index.html

Sekarang saya ingin melakukan dua tindakan

  1. Batasi sudosedemikian rupa sehingga pengguna hanya dapat berjalan chmoddan chowndari dalam/var/www/html

  2. Larang pengguna untuk menjalankan perintah ini di tempat lain di sistem (mis. Perintah tidak dapat dijalankan di /var/wwwatau /var/ftp)

PrashantB
sumber
1
Tolong jangan menyeberang - superuser.com/questions/456662/…
Ulrich Dangel
7
Apakah ini benar-benar jalan yang benar? Bagaimana dengan www-datakelompok yang menghilangkan kebutuhan untuk chmod/ chownapa saja?
sr_
Keren. Dengan begitu Anda mendapatkan root dengan cukup mudah. Ini adalah ide yang sangat buruk untuk diberikan chown. Selain itu saya tidak melihat alasan mengapa chmodharus dijalankan sebagai root.
Nils

Jawaban:

13

Apa yang Anda tanyakan itu sulit jika bukan tidak mungkin. Bahkan jika Anda memang membatasi aplikasi chowndan chmodke file di bawah direktori tertentu, seseorang masih bisa melewati tautan simbolik dan memengaruhi file di mana pun mereka suka.

Untungnya, sangat mungkin bahwa apa yang Anda coba lakukan bukanlah solusi yang tepat untuk masalah Anda yang sebenarnya, dan ada metode lain yang berhasil.

Biasanya, pengguna yang memerlukan izin tambahan untuk membuat dan memodifikasi file di bawah /var/wwwditambahkan ke grup (sering www-data, atau Anda mungkin memiliki grup berbeda untuk bagian situs yang berbeda). Anda dapat menggunakan kepemilikan grup dan direktori setgid: chgrp www-data /var/www/html; chmod g+ws /var/www/htmlmemungkinkan semua orang di www-datagrup untuk menulis ke /var/www/htmldirektori, dan file yang dibuat di direktori itu akan dimiliki oleh www-datagrup, bukan grup utama pengguna yang membuat file. Namun, ini sangat tidak fleksibel.

Yang mungkin harus Anda lakukan adalah mengatur daftar kontrol akses untuk file-file di bawah /var/www. Pertama, pastikan ACL diaktifkan: sistem file yang /var/wwwaktif harus dipasang dengan aclopsi. Lihat Membuat semua file baru di direktori yang dapat diakses oleh grup untuk bantuan tentang itu. Juga instal utilitas ACL ( getfacldan setfacl). Kemudian berikan izin tambahan ke pohon di bawah /var/www/htmlkepada pengguna yang seharusnya memilikinya. Anda dapat mengatur ACL per pengguna, tetapi seringkali lebih mudah untuk menempatkan pengguna yang memiliki hak yang sama pada bagian sistem file dalam grup dan mengatur ACL untuk grup itu. Misalnya, jika pengguna dalam grup html-writersharus memiliki akses baca-tulis ke hierarki di bawah /var/www/html:

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Mengenai "ini tidak terlalu fleksibel" (di akhir paragraf 3) - mengapa tidak? Apakah karena orang perlu berada dalam kelompok tertentu? (Saya hampir tidak tahu apa-apa tentang izin dan ACL dan hal-hal terkait.)
KajMagnus
3
@KajMagnus Tidak fleksibel karena root harus mengelola grup, dan file hanya dapat dimiliki oleh satu grup. ACL memungkinkan setiap pengguna memilih siapa yang dapat mengakses file miliknya, dan banyak pengguna dan grup dapat disebutkan dalam ACL.
Gilles 'SANGAT berhenti menjadi jahat'
2

Anda dapat membatasi perintah untuk digunakan oleh "pengguna saya" dengan semua argumen dalam /etc/sudoersfile dengan perintah visudoadd:

## Allows myuser to chmod the html dir and chmod 755 the html2 dir
myuser  ALL=NOPASSWD:/bin/chmod [0-7][0-5][0-5] /var/www/html/*,/bin/chown myuser:mygroup /var/www/html/*,/bin/chmod 755 /var/www/html2/myapp/*.txt 

aktifkan pencatatan untuk setiap operasi dengan menambahkan:

Defaults logfile=/var/log/sudo.log

output sampel:

[root@myhost /]# su - myuser
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/index.html 
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/*
-sh-3.1$ sudo /bin/chmod 777 /var/www/html2/myapp/*.txt
Sorry, user myuser is not allowed to execute '/bin/chmod 777 /var/www/html2/myapp/*.txt' as root on myhost.mydomain.
-sh-3.1$ sudo /bin/chmod 755 /var/www/html2/myapp/*.txt 
-sh-3.1$ 

Saat Anda menggunakan sudo, premisnya adalah bahwa "pengguna saya" adalah orang tepercaya. Hati-hati dengan izin file, tidak ada cara sederhana untuk menghentikan pengguna sudo berbahaya dari menautkan file dari sumber daya eksternal dan mengubahnya.

tombolinux
sumber
Saya telah mencobanya sebelumnya, tetapi memberikan kesalahan sebagai: Maaf, pengguna prashant tidak diizinkan untuk menjalankan '/ bin / chmod 777 / var / www / html / a' sebagai root pada prashant.xyz.com.
PrashantB
sudahkah Anda beralih pengguna dengan su - prashantatau su prashant?
tombolinux
Ya saya menjalankan perintah oleh pengguna prashant. Saya membaca forum, mereka mengatakan perintah menjalankan seluruh sistem. Tidak ada yang menulis tentang masalah seperti itu.
PrashantB
Saya menjalankannya whooo :). Tapi ini akan menjadi perintah statis. Bisakah kita menjadikannya umum sehingga saya dapat menerapkan izin apa pun pada file apa pun di bawah / var / www / html?
PrashantB
3
Ini benar-benar tidak aman: sudo /bin/chmod 666 /var/www/html/../../../etc/passwdDan jika Anda entah bagaimana memperbaikinya,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
Gilles 'SO- berhenti menjadi jahat'
1

Sebenarnya ada cara yang cukup sederhana untuk melakukan ini, dengan membuat skrip Bash (atau shell pilihan Anda) untuk membatasi modifikasi yang dilakukan pada file atau direktori tertentu.

Dalam contoh Anda, akan terlihat seperti ini:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Kemudian Anda akan mengubah file sudoers untuk memungkinkan www-data untuk mengeksekusi / usr / local / bin / mychmod.

Perlu diingat, bahwa mengizinkan input pengguna (misalnya, memungkinkan pengguna untuk mengubah file atau direktori mana yang di-chmodded) ke dalam ruang ini sangat berbahaya, dan Anda perlu tahu cara memfilter serangan injeksi jika Anda ingin melakukan hal seperti bahwa. Seorang penyerang dapat dengan mudah menjalankan perintah apa pun sebagai root dengan cara ini, secara efektif membahayakan keamanan sistem Anda.

Ernie
sumber
ini sangat berbahaya dan benar-benar tidak menyelesaikan solusinya ...
SomeGuy