Anda seharusnya tidak perlu menjalankan situs web dari dalam direktori home Anda . PERNAH. Anda sebaliknya harus memberikan server web kemampuan untuk melintasi/home/
untuk melihat struktur direktori, tetapi juga ke/home/$USER/
(direktori home pengguna Anda, di mana kami dapat mencoba dan melihat apa lagi yang ada di direktori pengguna Anda), serta subfolder lainnya. di sana. Server web yang tidak terkonfigurasi atau salah konfigurasi atau tidak ditambal dapat menyebabkan kebocoran data besar-besaran dengan cara ini, atau hilangnya kredensial dan semacamnya yang akan menempatkan data pribadi Anda dan login pada hal-hal yang berbeda berisiko. Pendekatan symlink yang Anda gunakan tidak membantu karena alasan yang sama dengan mencoba memberikan izin kepada Apache untuk membaca/home/andre/www/moodle
- server web harus dapat menelusuri direktori home Anda untuk sampai ke lokasi yang /var/www/html
ditunjuk symlink , yang masih mengandung risiko keamanan tersebut.
Pertama, gunakan sudo cp -r /home/andre/www/moodle/ /var/www/html/
. Ini akan menyalin file Anda ke /var/www/html
, dan menjauhkannya dari direktori home Anda sendiri. Kami kemudian akan mengulangi izin sehingga Anda dan server web dapat mengakses semua yang ada di direktori itu, dan memberikan pengguna Anda baca / tulis penuh untuk semua file dan direktori. Kemudian, Anda hanya perlu bekerja /var/www/html
untuk situs Anda.
Ini berlaku, empat langkah, setelah Anda menyalin kembali data Anda ke /var/www/html
:
- Berikan akses Apache ke folder dan file, sehingga dapat melayani situs tanpa 403 kesalahan.
- Berikan 'pemilik' kepada pengguna Anda di atas file dan folder, dan beri diri Anda baca / tulis pada semua file dan folder, serta kemampuan untuk menelusuri direktori.
- (Opsional tetapi disarankan) Atur sedemikian rupa sehingga semua file atau folder yang dibuat dari sini dalam keseluruhan struktur direktori memiliki kelompok yang ditetapkan
www-data
.
- (Opsional) Pembersihan keamanan akhir, tempat kami mengatur izin sehingga Anda dan server web dapat melihat data situs, tetapi pengguna lain tidak dapat mengakses file atau struktur direktori untuk situs tersebut.
(1) Izinkan Apache mengakses folder dan file.
sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +
Ini secara rekursif menetapkan 'grup' www-data
untuk folder dan file. Ini kemudian memberikan izin server web untuk recurse dan mendapatkan akses ke struktur direktori root dokumen situs ( +x
hanya untuk direktori). Ini kemudian juga memastikan server web telah membaca izin untuk semua file, sehingga data situs dapat diterima.
Mungkin ada beberapa kasus di mana Anda harus memberikan izin menulis server web ke file, atau ke direktori - ini dapat dicapai dengan melakukan sudo chmod g+w /var/www/html/PATH
(di mana PATH
path ke file atau folder dalam struktur direktori di mana Anda perlu menerapkan tulis izin untuk server web).
PEMBERITAHUAN : Ada banyak kasus di mana hal ini dapat memaparkan informasi 'aman' tentang konfigurasi situs (seperti kredensial akses basis data, dll.), Dan Anda harus menghapus izin akses 'lain' untuk data tersebut pada masing-masing file atau direktori dengan berikut ini: sudo chmod o-rwx /var/www/html/FILEPATH
(mengganti FILEPATH
dengan path relatif ke /var/www/html
folder untuk file).
Perhatikan juga bahwa Anda mungkin harus menjalankan kembali perintah ini di masa mendatang jika 'file baru' mendapatkan 403 masalah, untuk memberikan izin yang benar ke server web agar tetap dapat mengakses file dan folder yang dibuat atau disalin dan tidak www-data
mengatur grup dengan benar.
(2) Berikan pemilik Anda hak baca / tulis ke folder dan file, dan mengizinkan akses folder untuk melintasi struktur direktori.
sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +
Ganti USER
dalam perintah pertama dengan nama pengguna Anda sendiri!
Kami melakukan tiga hal di sini. Pertama, kami menetapkan pengguna Anda untuk menjadi "Pemilik" semua file dan direktori di /var/www/html
. Selanjutnya, kami menetapkan izin baca dan tulis pada folder, dan memungkinkan Anda untuk mengakses folder untuk masuk ke dalamnya ( +x
item pada item direktori). Kami kemudian mengatur semua file untuk memiliki izin baca / tulis untuk pemilik, yang baru saja kami atur.
(3) (Opsional) Pastikan setiap file baru setelah ini dibuat dengan www-data
sebagai pengguna 'akses'.
sudo find /var/www/html -type d -exec chmod g+s {} +
Ini menetapkan bit "set gid" untuk grup pada direktori. File dan folder yang dibuat di dalam direktori ini akan selalu memiliki www-data
sebagai grup, yang memungkinkan akses server web.
(4) (Opsional) Pembersihan keamanan akhir, jika Anda tidak ingin pengguna lain dapat melihat data
Kami membutuhkan pengguna Anda untuk melihat direktori dan file. Kami membutuhkan server web untuk melakukannya juga. Kami mungkin tidak ingin pengguna sistem lain (kecuali root) melihat data. Jadi jangan biarkan mereka memberikan akses itu, dan buatlah itu sehingga hanya pengguna dan server web Anda yang dapat melihat data.
sudo chmod -R o-rwx /var/www/html/
CATATAN: Anda tidak perlu menjalankannya kembali di lain waktu, atau mengedit izin untuk kategori izin 'lain' di sini. Jika pengguna 'lain' tidak dapat mengakses /var/www/html/
(mereka tidak memiliki +x
bit yang diperlukan /var/www/html
untuk melintasi struktur filestruktur dan direktori, atau +r
bit untuk membaca daftar file), maka izin pada item di bawah direktori itu untuk pengguna lain atau kelompok tidak akan terlalu berarti.
Ada solusi yang sedikit kurang invasif untuk ini, juga, meskipun itu tidak dijamin untuk semua file baru, juga tidak dijamin untuk bekerja pada semua sistem file , yang melibatkan daftar kontrol akses file. Ini memungkinkan Anda meninggalkan kepemilikan file www-data
untuk hal-hal, tetapi memberi Anda hak pemilik yang efektif, untuk semua maksud dan tujuan, meskipun Anda tidak memiliki file secara pribadi.
Solusi ini sedikit kurang invasif, dan memungkinkan Anda memiliki direktori dan semua file yang dimiliki oleh www-data:www-data
atau root:www-data
tetapi juga memberi Anda akses. Ini menggunakan Daftar Kontrol Akses , yang memungkinkan Anda memiliki beberapa pengguna memiliki izin tanpa mengatur masing-masing grup. Ini juga memungkinkan pengguna sistem root
atau www-data
memiliki file, tetapi juga memungkinkan Anda menambahkan izin tambahan berdasarkan kasus per kasus, dan menyempurnakan izin untuk pengguna tertentu sehingga mereka dapat membaca sesuatu tetapi tidak mengedit, dan semacamnya.
Dengan asumsi kami masih bekerja dengan /var/www/html/
, dan kami tidak ingin mengintai pengguna selain kami dan sistem (dan tentu saja root) untuk melihat data kami, kami harus melakukan hal-hal berikut:
- Berikan kepemilikan kembali kepada pengguna sistem server web
www-data
.
sudo chown -R www-data: www-data / var / www / html
- Secara rekursif memberi Anda membaca / menulis pada file, sementara memberi pengguna lain (tidak termasuk
www-data
dan root
tentu saja) tidak ada akses ke file.
sudo find / var / www / html -type f -exec setfacl -mu: YOURUSERNAME: rw -m other :: --- {} \;
- Secara rekursif beri diri Anda baca / tulis / lintasi direktori, hapus akses ke folder untuk pengguna lain (tidak termasuk
www-data
dan root
) dan tetapkan ini sebagai ACL 'default' untuk file baru di direktori.
sudo find / var / www / html -type d -exec setfacl -d -mu: YOURUSERNAME: rwx -mo :: --- {} \;
- Kita juga perlu mengatur
setgid
bit untuk semua direktori, sehingga jika Anda membuat file server web masih dapat mengaksesnya www-data
melalui izin grup.
sudo find / var / www / html -type d -exec chmod g + x {} \;
Dan sekarang Anda sudah memiliki akses ke semua direktori, dan Anda tidak perlu mengambil akses dari www-data
yang membantu karena server web masih dapat membuat file di mana saja seperti yang diperlukan (seperti antarmuka berbasis PHP yang memiliki direktori cache sendiri dan semacamnya. perlu dibuat dan ditulis untuk operasi yang tepat).
Satu-satunya peringatan: Jika Anda secara manual membuat file baru, Anda perlu chown sesuai dengan itu untuk memberikan kepemilikan kepada server web. Itu sederhana sudo chown www-data:www-data filename
, dan daftar kontrol akses harus tetap membiarkan Anda memiliki hak pemilik yang efektif untuk file tersebut.
Ada beberapa kasus di mana saya harus melakukan ini sebagai sysadmin untuk beberapa jenis akses non-standar tanpa mengubah pemilik file yang diberikan. Ini berfungsi, tetapi memiliki sakit kepala sendiri, karena tidak setiap sistem file mendukung daftar akses file.
+x
ke file akan memberikan izin yang dapat dieksekusi, dan kami tidak ingin file PHP dieksekusi, tentu saja, melalui baris perintah PHP atau sebagai yang dapat dieksekusi di server itu sendiri - kami ingin mereka diproses oleh parser PHP di server web (dan kami tidak perlu file PHP untuk memiliki+x
parser PHP untuk membaca dan memprosesnya). Direktori perlu+x
untuk mengizinkan traversal melalui direktori - yaitu, jika direktori tidak+x
dan saya tidak root, saya tidak bisa masuk ke direktori, yang merupakan masalah Anda dengan Apache tidak bekerja dengan symlink dan rumah Anda direktori.www-data
adalah grup sistem - ini bukan grup untuk pengguna standar./home/USER/...
server web. Anda salah membaca dan salah mengerti arti kata yang saya gunakan./var/www/*
adalah tempat yang relatif 'aman' untuk menjalankan situs web karena itu adalah folder / ruang khusus untuk itu. Namun,/var/www/html
BUKAN aman karena itu ditulis oleh webservers saat dipasang dan semacamnya, dan mengarah pada penghancuran data penting (jadi gunakan/var/www/SUBDIRECTORY
dengan masing-masing subdir situs)Seluruh gagasan menggunakan symlink untuk memecahkan masalah izin cacat dan tidak bisa berfungsi. Izin yang ditampilkan untuk symlink itu sendiri sebagian besar tidak relevan, mereka tidak dapat digunakan untuk menghindari izin direktori "nyata". Membuat symlink dari
/var/www/html/moodle
ke/home/andre/www/moodle/
tidak menghindari izin untuk/home/andre/www/moodle/
. Siapa pun, yang ingin melakukan hal-hal/var/www/html/moodle
hanya dapat melakukannya, jika ia telah mendapatkan izin yang diperlukan/home/andre/www/moodle/
.Eksekusi Anda
sudo chmod -R 775 moodle/
benar-benar melakukan memiliki efek, tetapi berbeda dari apa yang Anda pikir itu tidak mengubah izin dari symlink, tapi dari target symlink/home/andre/www/moodle/
.Kesalahan 403 yang Anda dapatkan di server web mungkin karena server web Anda tidak memiliki izin yang diperlukan untuk masuk
/home/andre
. Ini bukan "masalah tambahan", tetapi karena masalah izin yang sama.Jadi, alih-alih menggunakan symlink, Anda harus mencari izin yang memungkinkan Anda untuk mengedit file dan server web untuk mengaksesnya (atau bahkan mengeditnya, itu tergantung pada aplikasi). Apa sebenarnya izin itu, tergantung pada kasus penggunaan persis Anda (konfigurasi aplikasi dan server Anda).
Secara umum saya pikir itu ide yang baik bahwa Anda memiliki file dan memiliki izin rw, server web hanya membaca akses ke file melalui izin grup, dan semua pengguna lain tidak memiliki akses sama sekali.
Contoh izin (yang mungkin tidak berfungsi untuk kasus penggunaan Anda karena informasi yang hilang):
Anda dapat melihat bahwa direktori memiliki akses yang cukup bagi Anda sebagai pemilik untuk memasukkannya dan memodifikasi kontennya, server web (dalam grup
www-data
) dapat masuk dan membaca. File-file itu sendiri dapat dibaca dan ditulis untuk Anda (pemilik) dan dapat dibaca ke server web (dalam grupwww-data
). Semua pengguna lain tidak memiliki akses apa pun.Sekali lagi, tolong ambil ini hanya sebagai contoh. Pengguna / grup yang tepat dari server web Anda tergantung pada konfigurasi Anda. Dan aplikasi Anda (moodle) mungkin memerlukan izin berbeda, Anda harus membaca dokumentasinya.
sumber
Jawaban luar biasa oleh Thomas ward https://askubuntu.com/a/767534/717860
Anda dapat melakukan semua langkah yang disarankan hanya dalam 3 perintah, bukan 8 perintah:
3 perintah:
lakukan pekerjaan yang sama dengan 8 perintah berikut:
sumber