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
.
permissions
files
account-restrictions
Manishearth
sumber
sumber
mysql
program akan ditempatkan? Pengguna harus dapat membacanya, dan semua perpustakaan dan file data yang dibutuhkan.Jawaban:
ACL negatif
Anda dapat mencegah pengguna mengakses bagian-bagian tertentu dari sistem file dengan mengatur daftar kontrol akses . Misalnya, untuk memastikan bahwa pengguna
abcd
tidak dapat mengakses file apa pun di bawah/home
:Pendekatan ini sederhana, tetapi Anda harus ingat untuk memblokir akses ke segala sesuatu yang Anda tidak ingin
abcd
dapat mengaksesnya.Chroot
Untuk mendapatkan kontrol positif atas apa yang
abcd
bisa dilihat, atur chroot , yaitu batasi pengguna hingga subtree dari sistem file.Anda perlu membuat semua file yang dibutuhkan pengguna (mis.
mysql
Dan semua dependensinya, jika Anda ingin pengguna dapat menjalankannyamysql
) di bawah chroot. Katakanlah jalan menuju chroot adalah/home/restricted/abcd
; yangmysql
Program 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:Anda juga dapat menyalin file (tetapi kemudian Anda harus berhati-hati karena mereka terbaru).
Untuk membatasi pengguna ke chroot, tambahkan
ChrootDirectory
arahan ke/etc/sshd_config
.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.
sumber
/var/www/allowfolder
dan subdirektori harus dapat diakses, bukan hanya/var/www/allowfolder
sendiri. 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/www
untuk mengakses/var/www/allowfolder
.Anda harus menggunakan
chroot
. Thechroot
perintah 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
dir
dengan tiga file:a
,b
,c
, danls
. Tiga yang pertama adalah file biasa.ls
adalah hardlink kels
biner nyata sehingga kita dapat membuat daftar file saat di chroot.Saya akan
chroot
kedir
. (Perhatikan bahwa saya mungkin lupa beberapa direktori di direktori root.)Inilah pengaturannya, dalam bentuk keluaran shell:
Sekarang saya akan
chroot
masukdir
. The/bin/bash
lagi memilih argumen apa yang memproses harus dijalankan dengan direktori root yang baru. Standarnya adalah/bin/sh
.Sekarang kita keluar dari
chroot
:Saya harap ini menggambarkan bagaimana
chroot
perintah itu bekerja. Pada dasarnya apa yang harus Anda lakukan untuk menyelesaikan masalah Anda adalah menjalankanchroot
perintah 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 mismysql
perintah, Anda akan menjalankan:sumber
chmod
. ketika Anda mengatakan "bukankah akan lebih mudah untuk menjalankan perintah ... jangan kehilangan akses ke mereka", perintah ituchroot
. 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
)chroot
diri sendiri atau memberi tahu saya apa yang tidak masuk akal. lebih baik lagi, lakukan keduanya. (dan baca