Berikan akses baca / tulis pengguna ke hanya satu direktori

18

Saya menjalankan server, dan saya perlu memberikan akses baca / tulis ke direktori tertentu untuk satu pengguna. Saya sudah mencoba yang berikut ini:

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

Tampaknya di atas berfungsi, tetapi memberikan pengguna akses baca-saja ke seluruh server.

Bagaimana saya bisa mengatur izin sehingga pengguna hanya bisa membaca dan menulis ke folder tertentu? Pengguna juga harus dapat menjalankan program seperti mysql.

Manishearth
sumber
2
Jawaban singkatnya: gunakan chroot.
Chris Down
@ Chris Care ingin menjelaskannya dalam jawaban? Manish dan saya telah berjuang dengan ini dan sepertinya tidak bisa membuatnya bekerja.
Undo
Di mana mysqlprogram akan ditempatkan? Pengguna harus dapat membacanya, dan semua perpustakaan dan file data yang dibutuhkan.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Hmm. Ini adalah instalasi mysql standar dari apt-get, sejauh yang saya tahu (bukan sistem saya, ini Undo).
Manishearth

Jawaban:

18

ACL negatif

Anda dapat mencegah pengguna mengakses bagian-bagian tertentu dari sistem file dengan mengatur daftar kontrol akses . Misalnya, untuk memastikan bahwa pengguna abcdtidak dapat mengakses file apa pun di bawah /home:

setfacl -m user:abcd:0 /home

Pendekatan ini sederhana, tetapi Anda harus ingat untuk memblokir akses ke segala sesuatu yang Anda tidak ingin abcddapat mengaksesnya.

Chroot

Untuk mendapatkan kontrol positif atas apa yang abcdbisa dilihat, atur chroot , yaitu batasi pengguna hingga subtree dari sistem file.

Anda perlu membuat semua file yang dibutuhkan pengguna (mis. mysqlDan semua dependensinya, jika Anda ingin pengguna dapat menjalankannya mysql) di bawah chroot. Katakanlah jalan menuju chroot adalah /home/restricted/abcd; yang mysqlProgram harus tersedia di bawah /home/restricted/abcd. Tautan simbolis yang menunjuk ke luar chroot tidak baik karena pencarian tautan simbolis dipengaruhi oleh chroot jail. Di Linux, Anda dapat menggunakan bind mounts dengan baik:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

Anda juga dapat menyalin file (tetapi kemudian Anda harus berhati-hati karena mereka terbaru).

Untuk membatasi pengguna ke chroot, tambahkan ChrootDirectoryarahan ke /etc/sshd_config.

Match User abcd
    ChrootDirectory /home/restricted/abcd

Anda dapat mengujinya dengan: chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

Kerangka keamanan

Anda juga dapat menggunakan kerangka kerja keamanan seperti SELinux atau AppArmor. Dalam kedua kasus, Anda perlu menulis konfigurasi yang cukup rumit, untuk memastikan Anda tidak meninggalkan lubang.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Tidak bisakah cara yang lebih mudah untuk memberikan izin baca dan tulis ke direktori tertentu adalah dengan membuat grup? Misalnya dia bisa membuat grup baru dan menggunakan chown untuk membuat pemilik grup direktori grup yang dibuat dan menambahkan pengguna ke grup. Terakhir berikan direktori baca dan tulis izin untuk grup.
Qasim
@Qasim Itu mensyaratkan bahwa semua file memiliki izin dan kepemilikan yang ditetapkan sesuai keinginan. Ada begitu banyak hal yang bisa salah (file disalin dari tempat lain atau diekstraksi dari arsip dengan izin mereka dipertahankan, file yang perlu milik grup lain, file yang tidak boleh dibaca grup, pengguna yang membuat kesalahan atau bisa ' Jangan diganggu untuk memastikan aksesibilitas grup tetap seperti yang diinginkan ...) bahwa grup tidak benar-benar menyelesaikan masalah ini.
Gilles 'SO- stop being evil'
Maksud saya, saya tidak melihat bagaimana file harus memiliki izin mereka sendiri jika izin grup pada direktori diatur dengan cara di mana tidak ada pengguna yang dapat "cd" ke dalam direktori atau "ls" direktori.
Qasim
@Qasim Setiap file di bawah /var/www/allowfolderdan subdirektori harus dapat diakses, bukan hanya /var/www/allowfoldersendiri. Dan sebaliknya file lain tidak boleh diakses. Bahkan solusi yang hanya didasarkan pada izin file dan ACL tidak dapat sepenuhnya memenuhi persyaratan: setidaknya akan memungkinkan pengguna untuk menguji apakah nama yang diberikan ada di bawah /var/www, karena mereka perlu memiliki x izin /var/wwwuntuk mengakses /var/www/allowfolder.
Gilles 'SO- stop being evil'
Oh ok saya mengerti tetapi jika kita mengecualikan direktori / var dari ini dan katakanlah kita berbicara tentang direktori normal di direktori / home / user?
Qasim
5

Anda harus menggunakan chroot. The chrootperintah mengubah direktori root bahwa semua proses anak melihat. Saya akan memberikan contoh untuk menunjukkan cara kerjanya.

Ini ditulis di tempat; Saya sebenarnya tidak di depan mesin UNIX sekarang. Dalam contoh ini, ada sebuah direktori yang disebut dirdengan tiga file: a, b, c, dan ls. Tiga yang pertama adalah file biasa. lsadalah hardlink ke lsbiner nyata sehingga kita dapat membuat daftar file saat di chroot.

Saya akan chrootke dir. (Perhatikan bahwa saya mungkin lupa beberapa direktori di direktori root.)

Inilah pengaturannya, dalam bentuk keluaran shell:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

Sekarang saya akan chrootmasuk dir. The /bin/bashlagi memilih argumen apa yang memproses harus dijalankan dengan direktori root yang baru. Standarnya adalah /bin/sh.

$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

Sekarang kita keluar dari chroot:

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

Saya harap ini menggambarkan bagaimana chrootperintah itu bekerja. Pada dasarnya apa yang harus Anda lakukan untuk menyelesaikan masalah Anda adalah menjalankan chrootperintah sebagai pengguna itu setiap kali mereka masuk. Mungkin memasukkannya ke dalam skrip startup?

Hardlink ke file akan terus bekerja di dalam chroot, bahkan jika file itu tidak dapat diakses dengan cara lain (ini berfungsi karena hardlink menunjuk ke inode, bukan path). Jadi, untuk memungkinkan pengguna mengakses mis mysqlperintah, Anda akan menjalankan:

ln /usr/bin/mysql /path/to/chroot/target
strugee
sumber
Tapi bukankah ini mengharuskan saya untuk mengatur seluruh lingkungan chroot dengan semua symlink? Bukankah lebih mudah menjalankan perintah sehingga pengguna baru tidak memiliki akses ke direktori lain, tetapi program seperti apache tidak kehilangan akses ke sana?
Manishearth
Pada dasarnya, adakah cara (melalui chmod) untuk membuat pengguna kehilangan akses baca ke seluruh fs tanpa mempengaruhi akses pengguna lain?
Manishearth
@ Spanishearth tidak ada cara sederhana chmod. ketika Anda mengatakan "bukankah akan lebih mudah untuk menjalankan perintah ... jangan kehilangan akses ke mereka", perintah itu chroot. jika Anda menjelaskan apa yang Anda maksud dengan "seluruh lingkungan chroot", atau mengapa ini akan menjadi masalah, mungkin saya akan lebih mengerti. (catatan bahwa Anda dapat memberikan akses ke semua executable dengan oneliner a: ln /bin/* /path/to/chroot/target)
strugee
@Manishearth jika contoh saya tidak masuk akal, saya akan mendorong Anda untuk bermain dengan chrootdiri sendiri atau memberi tahu saya apa yang tidak masuk akal. lebih baik lagi, lakukan keduanya. (dan baca
manualnya
@Manishearth jika jawaban ini cukup membantu Anda untuk mengarahkan Anda ke jawabannya, Anda harus mempertimbangkan menerimanya.
strugee