Saya menggunakan Debian 7 dan telah membuat pengguna baru (situs web) dengan direktori htdocs seperti ini:
$ sudo adduser website
$ sudo mkdir -p /home/website/htdocs
$ sudo chown -R website /home/website
Sekarang saya ingin pengguna grup lain (pengembang) memiliki akses ke direktori pengguna. Saya sudah mencoba:
$ sudo chown -R :developers /home/website
Saya dapat melihat bahwa grup tersebut ditetapkan (dengan ls -la
atau stat
) dan bahwa pengguna ada di grup, tetapi mereka tidak memiliki akses, kan?
drwxr-xr-x 3 website developers 4096 May 3 09:09 website
Saya juga ingin:
-
Izinkan grup lain, akses 'kontraktor' ke file situs web
-
Batasi akses pengguna situs web ke direktori beranda saja
-
Pastikan file situs web baru mewarisi izin ini
Apakah Anda harus menggunakan daftar kontrol akses – atau adakah cara yang lebih baik untuk melakukannya (seperti tidak menggunakan pengguna terpisah untuk setiap situs)?
Jawaban yang Diterima:
Sulit untuk memberikan perintah yang tepat tanpa mengetahui O/S atau distribusinya; dan ya! ACL akan berfungsi, tetapi ada juga cara standar.
Ada adduser
dan useradd
, salah satunya di distribusi Anda dapat membuat direktori home pengguna secara otomatis. Jika sudah, maka isi dari /etc/skel/
direktori akan disalin ke direktori home pengguna, izin ditetapkan, dan mungkin beberapa tindakan lain yang sesuai mungkin dilakukan.
Mungkin ada grup yang telah ditentukan sebelumnya untuk berbagi, seperti 'staf'; tapi, jika kita ingin membuat grup sendiri untuk berbagi, tidak ada salahnya. Jadi, buat grup baru atau gunakan grup yang sudah ada. Pastikan bahwa pengguna yang menjadi anggota grup telah ditentukan dengan usermod
, moduser
, atau vigr
mungkin, menurut sistem operasi. Setiap pengguna yang saat ini masuk harus keluar dan masuk kembali untuk menjadi anggota grup baru.
Buat direktori umum untuk semua pengguna, seperti /home/share_directory/
atau direktori lain yang paling masuk akal untuk situasi Anda. Praktik terbaik yang relevan adalah tidak menggunakan direktori di dalam direktori home pengguna mana pun. Jika tidak ada seorang pun kecuali pemilik dan grup yang dapat melihat file di direktori, maka ubah izin direktori menjadi 0770. Jika membaca ok oleh "orang lain", gunakan 0775. Pemilik direktori hampir pasti harus root.
chown root:group_name /home/share_directory/
Selanjutnya, ubah bit setuid.
chmod +s /home/share_directory/
Jika tidak ada pengguna yang dapat memodifikasi file pengguna lain, atur juga bit sticknya.
chmod +t /home/share_directory/
Contoh-contoh ini mengatur bit setuid dan sticky secara bersamaan menggunakan notasi oktal.
chmod 5775 /home/share_directory/
atau
chmod 5770 /home/share_directory/
Untuk pertanyaan yang diperbarui, sepertinya ACL adalah alat yang tepat. Sebagian besar distribusi Linux sekarang menyertakan acl
opsi di defaults
pilihan. Jika distribusi Anda tidak menyertakan acl
opsi secara default, maka ini sedikit kerja diperlukan untuk mulai menggunakannya. Pertama-tama pasang sistem file dengan acl
pilihan di /etc/fstab.
sudo vim /etc/fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,acl 0 1
Jika perlu, remount sistem file:sudo mount -o remount,acl /
. Kemudian buat grup tempat pengguna mungkin berada untuk tujuan ini. Anda mungkin juga perlu menginstal alat ACL:apt-get install acl
.
sudo groupadd developers
sudo usermod -a -G developers $username
(Atau grup tersebut mungkin adalah "kontraktor".) Pengguna yang saat ini masuk harus keluar dan masuk kembali untuk menjadi anggota grup baru. Tentu saja, jangan lakukan ini jika Anda memiliki konten di direktori /var/www yang ingin Anda simpan, tetapi hanya untuk mengilustrasikan pengaturannya untuk memulai:
sudo rm -rf /var/www
sudo mkdir -p /var/www/public
sudo chown -R root:developers /var/www/public
sudo chmod 0775 /var/www/public
sudo chmod g+s /var/www/public
sudo setfacl -d -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -d -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
Di atas, perbedaan antara setfacl
perintahnya adalah sebagai berikut:contoh pertama menggunakan grup default (pemilik grup direktori) sedangkan yang kedua menentukan grup secara eksplisit. -d
switch menetapkan topeng default (-m
) untuk semua objek sistem file baru di dalam direktori. Namun, kita juga perlu menjalankan perintah lagi tanpa -d
beralih untuk menerapkan ACL ke direktori itu sendiri. Kemudian ganti referensi ke “/var/www” dengan “/var/www/public” di file konfigurasi dan muat ulang.
sudo vim /etc/apache2/sites-enabled/000-default
sudo /etc/init.d/apache2 reload
Jika kami ingin membatasi hapus dan ganti nama dari semua kecuali pengguna yang membuat file:sudo chmod +t /var/www/public
. Dengan cara ini, jika kita ingin membuat direktori untuk kerangka kerja yang ada di luar root dokumen Apache atau mungkin membuat direktori yang dapat ditulis server, itu masih mudah.
Direktori log yang dapat ditulis oleh Apache:
sudo mkdir /var/www/logs
sudo chgrp www-data /var/www/logs
sudo chmod 0770 /var/www/logs
Direktori perpustakaan yang dapat dibaca Apache:
sudo mkdir /var/www/lib
sudo chgrp www-data /var/www/logs
sudo chmod 0750 /var/www/logs
Sedikit "bermain" di direktori yang tidak penting akan membantu membuat ini tepat untuk situasi Anda.
Pada pembatasan, saya menggunakan dua pendekatan berbeda:shell, rssh
, dibuat untuk menyediakan akses SCP/SFTP tetapi tidak ada akses SSH; atau, untuk membatasi penggunaan ke direktori home, Anda dapat menggunakan subsistem internal-sftp, yang dikonfigurasi di /etc/ssh/sshd_config
.
Subsystem sftp internal-sftp
Match group sftponly
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Buat grup bernama, misalnya, sftponly. Jadikan pengguna sebagai anggota grup sftponly. Ubah direktori home mereka menjadi /
karena chroot. Direktori, /home/username, harus dimiliki oleh root. Anda juga dapat mengatur shell pengguna ke /bin/false untuk mencegah akses SSH. Sebagian besar saya khawatir tentang akses interaktif, jadi umumnya gunakan rssh
jalur. (Mereka tidak dapat menulis di mana pun kecuali di mana saya telah mendefinisikan kemampuan menulis.)