Saya menggunakan Apache Web Server yang memiliki pemilik diatur ke _www:_www
. Saya tidak pernah tahu apa praktik terbaik dengan izin file, misalnya ketika saya membuat proyek Laravel 5 baru.
Laravel 5 memerlukan /storage
folder yang dapat ditulis. Saya menemukan banyak pendekatan berbeda untuk membuatnya bekerja dan saya biasanya berakhir dengan membuatnya 777
chmod secara rekursif. Saya tahu itu bukan ide terbaik.
Doc resmi mengatakan:
Laravel mungkin memerlukan beberapa izin untuk dikonfigurasi: folder di dalam
storage
danvendor
memerlukan akses tulis oleh server web.
Apakah ini berarti bahwa web server membutuhkan akses ke storage
dan vendor
folder diri mereka terlalu atau hanya isinya saat ini?
Saya berasumsi bahwa yang jauh lebih baik adalah mengubah pemilik alih-alih izin. Saya mengubah semua izin file Laravel secara rekursif _www:_www
dan itu membuat situs berfungsi dengan benar, seolah-olah saya mengubah chmod 777
. Masalahnya adalah bahwa sekarang editor teks saya meminta kata sandi setiap kali saya ingin menyimpan file apa pun dan hal yang sama terjadi jika saya mencoba mengubah apa pun di Finder, seperti misalnya menyalin file.
Apa pendekatan yang benar untuk menyelesaikan masalah ini?
- Perubahan
chmod
- Ubah pemilik file agar sesuai dengan yang ada di server web dan mungkin atur editor teks (dan Finder?) Untuk melewati meminta kata sandi, atau membuatnya menggunakan
sudo
- Ubah pemilik server web agar sesuai dengan pengguna os (Saya tidak tahu konsekuensinya)
- Sesuatu yang lain
777
terlalu banyak kebebasan, karena itu mencakup semua izin untuk semua orang.storage
danbootstrap/cache
direktori harus dapat ditulis oleh server web AndaJawaban:
Hanya untuk menyatakan yang jelas bagi siapa saja yang melihat diskusi ini .... jika Anda memberikan salah satu folder Anda 777 izin, Anda mengizinkan SIAPAPUN untuk membaca, menulis, dan mengeksekusi file apa pun di direktori itu .... apa artinya ini yang telah Anda berikan SIAPAPUN (peretas atau orang jahat di seluruh dunia) mengizinkan untuk mengunggah file APA SAJA, virus, atau file apa pun lainnya, dan MAKA jalankan file itu ...
Pada dasarnya ada dua cara untuk mengatur kepemilikan dan izin Anda. Entah Anda memberikan diri Anda kepemilikan atau Anda menjadikan server web pemilik semua file.
Webserver sebagai pemilik (cara kebanyakan orang melakukannya, dan cara Laravel doc):
dengan asumsi www-data (bisa jadi yang lain) adalah pengguna server web Anda.
jika Anda melakukan itu, server web memiliki semua file, dan juga grup, dan Anda akan mengalami masalah dalam mengunggah file atau bekerja dengan file melalui FTP, karena klien FTP Anda akan login seperti Anda, bukan server web Anda, jadi tambahkan pengguna Anda ke grup pengguna server web:
Tentu saja, ini mengasumsikan server web Anda berjalan sebagai www-data (default Homestead), dan pengguna Anda adalah ubuntu (itu adalah omong kosong jika Anda menggunakan Homestead).
Kemudian Anda mengatur semua direktori Anda ke 755 dan file Anda ke 644 ... SET izin file
SET izin direktori
Pengguna Anda sebagai pemilik
Saya lebih suka memiliki semua direktori dan file (itu membuat bekerja dengan semuanya jauh lebih mudah), jadi saya lakukan:
Lalu saya memberikan izin untuk diriku dan server web:
Kemudian berikan server web hak untuk membaca dan menulis ke penyimpanan dan cache
Apa pun cara Anda mengaturnya, maka Anda harus memberikan izin baca dan tulis ke server web untuk penyimpanan, cache, dan direktori lain mana pun yang perlu diunggah atau ditulis server web (tergantung pada situasi Anda), jadi jalankan perintah dari bashy di atas:
Sekarang, Anda aman dan situs web Anda berfungsi, DAN Anda dapat bekerja dengan file dengan cukup mudah
sumber
anyone
konsep.anyone
Bendera Linux berarti setiap pengguna , bukan siapa pun. Anda masih memerlukan akses server.write
izin kepada grup?Izin untuk
storage
danvendor
folder harus tetap ada775
, untuk alasan keamanan yang jelas.Namun, baik komputer Anda dan Apache server Anda harus dapat menulis di folder ini. Mis: ketika Anda menjalankan perintah like
php artisan
, komputer Anda perlu menulis di file logstorage
.Yang perlu Anda lakukan adalah memberikan kepemilikan folder ke Apache:
Maka Anda perlu menambahkan komputer Anda (direferensikan olehnya
username
) ke grup yang menjadi milik server Apache. Seperti itu:CATATAN: Paling sering,
groupName
adalahwww-data
tetapi dalam kasus Anda, ganti dengan_www
sumber
chown
perintah harus menyertakan flag -R. Juga, di laravel 5.1 dan 5.2, alih-alih direktori vendor, Anda harus memberikan akses ke direktori bootstrap / cache.Kami telah mengalami banyak kasus tepi saat mengatur izin untuk aplikasi Laravel. Kami membuat akun pengguna terpisah (
deploy
) untuk memiliki folder aplikasi Laravel dan menjalankan perintah Laravel dari CLI, dan menjalankan server web di bawahwww-data
. Salah satu masalah yang disebabkan oleh hal ini adalah bahwa file log dapat dimiliki olehwww-data
ataudeploy
, tergantung pada siapa yang menulis ke file log terlebih dahulu, jelas mencegah pengguna lain dari menulis ke sana di masa depan.Saya telah menemukan bahwa satu-satunya solusi yang waras dan aman adalah dengan menggunakan ACL Linux. Tujuan dari solusi ini adalah:
deploy
).www-data
pengguna membaca akses ke kode aplikasi Laravel, tetapi tidak akses tulis.www-data
pengguna dan pengguna aplikasi (deploy
) menulis akses ke folder penyimpanan, terlepas dari pengguna mana yang memiliki file (jadi keduanyadeploy
danwww-data
dapat menulis ke file log yang sama misalnya).Kami mencapai ini sebagai berikut:
application/
folder dibuat dengan umask default0022
, yang menghasilkan folder yang memilikidrwxr-xr-x
izin dan file-rw-r--r--
.sudo chown -R deploy:deploy application/
(atau cukup gunakan aplikasi Anda sebagaideploy
pengguna, yang kami lakukan).chgrp www-data application/
untuk memberikanwww-data
grup akses ke aplikasi.chmod 750 application/
untuk memungkinkandeploy
pengguna membaca / menulis,www-data
pengguna hanya baca, dan untuk menghapus semua izin untuk pengguna lain.setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/
untuk mengatur izin default padastorage/
folder dan semua subfolder. Setiap folder / file baru yang dibuat dalam folder penyimpanan akan mewarisi izin ini (rwx
untuk keduanyawww-data
dandeploy
).setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/
untuk mengatur izin di atas pada file / folder yang ada.sumber
Ubah izin untuk folder proyek Anda untuk mengaktifkan baca / tulis / exec untuk setiap pengguna dalam grup yang memiliki direktori (yang dalam kasus Anda adalah
_www
):Kemudian tambahkan nama pengguna OS X Anda ke
_www
grup untuk memungkinkannya mengakses direktori:sumber
dseditgroup
disediakan oleh Anda, saya mendapatkan error:Username and password must be provided.
.sudo
di awal._www:_www
ataumyuser:_www
juga?_www:_www
, karena 775 berarti setiap pengguna dalam grup_www
akan memiliki izin penuh untuk membaca / menulis / exect di folder itu, dan Anda baru saja menambahkan nama pengguna Anda ke grup itu.chown myuser:_www
? Saya tahu yang pertama adalah pengguna dan yang kedua adalah grup, tetapi apakah ini berarti "pengguna ini DAN SIAPAPUN SIAPA PUN DARI grup ini" atau "pengguna ini TAPI HANYA JIKA DIA MILIK grup ini"?Sudah diposting
tapi saya menambahkan -R untuk perintah chown :
sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage
sumber
Sebagian besar folder harus "755" dan file normal, "644"
Laravel memerlukan beberapa folder agar dapat ditulis untuk pengguna server web. Anda dapat menggunakan perintah ini pada OS berbasis unix.
sumber
Setelah
composer install
sumber
The Laravel 5.4 docs mengatakan:
Ada banyak jawaban di halaman ini yang menyebutkan penggunaan
777
izin. Jangan lakukan itu. Anda akan mengekspos diri Anda ke peretas.Sebagai gantinya, ikuti saran orang lain tentang cara mengatur izin 755 (atau lebih ketat). Anda mungkin perlu mencari tahu pengguna mana yang menjalankan aplikasi Anda dengan menjalankan
whoami
di terminal dan kemudian mengubah kepemilikan direktori tertentu menggunakanchown -R
.Jika Anda tidak memiliki izin untuk menggunakan
sudo
karena begitu banyak jawaban lain memerlukan ...Server Anda mungkin merupakan host bersama seperti Cloudways.
(Dalam kasus saya, saya telah mengkloning aplikasi Laravel saya ke server Cloudways kedua saya, dan itu tidak sepenuhnya berfungsi karena izin dari
storage
danbootstrap/cache
direktori kacau.)Saya perlu menggunakan:
Cloudways Platform > Server > Application Settings > Reset Permission
Lalu aku bisa berlari
php artisan cache:clear
di terminal.sumber
Solusi yang diposting oleh bgles tepat bagi saya dalam hal mengatur izin dengan benar pada awalnya (saya menggunakan metode kedua), tetapi masih memiliki potensi masalah untuk Laravel.
Secara default, Apache akan membuat file dengan 644 izin. Jadi itu cukup banyak dalam penyimpanan /. Jadi, jika Anda menghapus konten storage / framework / views, maka akses halaman melalui Apache Anda akan menemukan tampilan cache telah dibuat seperti:
Jika Anda menjalankan "artisan serve" dan mengakses halaman yang berbeda, Anda akan mendapatkan izin yang berbeda karena CLI PHP berperilaku berbeda dari Apache:
Dalam dirinya sendiri ini bukan masalah besar karena Anda tidak akan melakukan semua ini dalam produksi. Tetapi jika Apache membuat file yang selanjutnya harus ditulis oleh pengguna, itu akan gagal. Dan ini dapat berlaku untuk file cache, tampilan cache dan log saat menggunakan menggunakan pengguna dan artisan login. Contoh yang mudah adalah "artisan cache: clear" yang akan gagal menghapus file cache apa pun yang merupakan www-data: www-data 644.
Ini dapat dikurangi sebagian dengan menjalankan perintah artisan sebagai www-data, jadi Anda akan melakukan / scripting semuanya seperti:
Atau Anda akan menghindari kebosanan ini dan menambahkan ini ke .bash_aliases Anda:
Ini cukup bagus dan tidak mempengaruhi keamanan dengan cara apa pun. Tetapi pada mesin pengembangan, menjalankan skrip pengujian dan sanitasi membuat ini sulit, kecuali jika Anda ingin membuat alias untuk menggunakan 'sudo -u www-data' untuk menjalankan phpunit dan segala sesuatu yang Anda periksa build Anda dengan yang dapat menyebabkan file dibuat.
Solusinya adalah dengan mengikuti saran bgles bagian kedua, dan tambahkan yang berikut ke / etc / apache2 / envvars, dan mulai ulang (tidak muat ulang) Apache:
Ini akan memaksa Apache untuk membuat file sebagai 664 secara default. Dalam dirinya sendiri, ini dapat menghadirkan risiko keamanan. Namun, pada lingkungan Laravel sebagian besar sedang dibahas di sini (Homestead, Vagrant, Ubuntu) server web berjalan sebagai data-pengguna www di bawah grup data-www. Jadi jika Anda tidak secara sewenang-wenang mengizinkan pengguna untuk bergabung dengan grup data-www, seharusnya tidak ada risiko tambahan. Jika seseorang berhasil keluar dari server web, mereka memiliki tingkat akses www-data sehingga tidak ada yang hilang (meskipun itu bukan sikap terbaik untuk berhubungan dengan keamanan diakui). Jadi pada produksi relatif aman, dan pada mesin pengembangan pengguna tunggal, itu tidak masalah.
Pada akhirnya ketika pengguna Anda berada di grup data-www, dan semua direktori yang berisi file-file ini adalah g + s (file selalu dibuat di bawah grup direktori induk), apa pun yang dibuat oleh pengguna atau oleh data-www akan menjadi r / untuk yang lain.
Dan itulah tujuannya di sini.
sunting
Saat menyelidiki pendekatan di atas untuk menetapkan izin lebih lanjut, masih terlihat cukup baik, tetapi beberapa penyesuaian dapat membantu:
Secara default, direktori adalah 775 dan file 664 dan semua file memiliki pemilik dan grup pengguna yang baru saja menginstal framework. Jadi asumsikan kita mulai dari titik itu.
Hal pertama yang kami lakukan adalah memblokir akses ke orang lain, dan menjadikan grup sebagai data-www. Hanya pemilik dan anggota www-data yang dapat mengakses direktori.
Untuk memungkinkan server web membuat services.json dan compiled.php, seperti yang disarankan oleh panduan instalasi Laravel resmi. Mengatur bit sticky grup berarti ini akan dimiliki oleh pembuatnya dengan grup data-www.
Kami melakukan hal yang sama dengan folder penyimpanan untuk memungkinkan pembuatan cache, log, sesi dan melihat file. Kami menggunakan find untuk secara eksplisit mengatur izin direktori secara berbeda untuk direktori dan file. Kami tidak perlu melakukan ini di bootstrap / cache karena tidak ada (biasanya) sub-direktori di sana.
Anda mungkin perlu menerapkan kembali flag yang dapat dieksekusi, dan menghapus vendor / * dan menginstal ulang dependensi komposer untuk membuat ulang tautan untuk phpunit et al, mis .:
Itu dia. Kecuali umask untuk Apache yang dijelaskan di atas, ini semua yang diperlukan tanpa membuat seluruh projectroot dapat ditulis oleh www-data, yang merupakan apa yang terjadi dengan solusi lain. Jadi sedikit lebih aman dengan cara ini karena penyusup berjalan karena www-data memiliki akses tulis yang lebih terbatas.
akhiri edit
Perubahan untuk Systemd
Ini berlaku untuk penggunaan php-fpm, tapi mungkin juga orang lain.
Layanan systemd standar perlu diganti, umask diatur dalam file override.conf, dan layanan restart:
sumber
Ini bekerja untuk saya:
Apa fungsinya:
Catatan: Mungkin Anda tidak bisa, atau tidak perlu, melakukannya dengan awalan sudo. itu tergantung pada izin pengguna Anda, grup, dll ...
sumber
Saya memutuskan untuk menulis skrip saya sendiri untuk meringankan rasa sakit mendirikan proyek.
Jalankan yang berikut di dalam root proyek Anda:
Tunggu bootstrap selesai dan Anda siap melakukannya.
Tinjau skrip sebelum digunakan.
sumber
Saya telah menginstal laravel pada contoh EC2 dan telah menghabiskan 3 hari untuk memperbaiki kesalahan izin dan akhirnya memperbaikinya. Jadi saya ingin berbagi pengalaman ini dengan yang lain.
masalah pengguna Ketika saya login contoh ec2, nama pengguna saya adalah pengguna ec2 dan usergroup adalah pengguna ec2. Dan situs web ini bekerja di bawah pengguna httpd: apache: apache jadi kita harus mengatur izin untuk apache.
izin folder dan file A. struktur folder terlebih dahulu, Anda harus memastikan bahwa Anda memiliki struktur folder seperti ini di bawah penyimpanan
penyimpanan
B. izin Pada awalnya, saya melihat instruksi untuk mengatur 777 di bawah penyimpanan untuk menghapus file_put_contents: gagal membuka kesalahan aliran. Jadi saya mengatur izin 777 ke penyimpanan chmod -R 777 penyimpanan Tapi kesalahan itu tidak diperbaiki. di sini, Anda harus mempertimbangkan satu: siapa yang menulis file ke penyimpanan / sesi dan tampilan. Itu bukan ec2-user, tetapi apache. Ya benar. "apache" pengguna menulis file (file sesi, file tampilan dikompilasi) ke sesi dan folder tampilan. Jadi, Anda harus memberikan apache untuk menulis izin ke folder ini. Secara default: SELinux mengatakan folder / var / www harus hanya-baca oleh apache deamon.
Jadi untuk ini, kita dapat mengatur selinux sebagai 0: setenforce 0
Ini dapat memecahkan masalah sementara, tetapi ini membuat mysql tidak berfungsi. jadi ini bukan solusi yang sangat baik.
Anda dapat mengatur konteks baca-tulis ke folder penyimpanan dengan: (ingat untuk menetapkan kekuatan 1 untuk mengujinya)
Maka masalah Anda akan diperbaiki.
dan jangan lupa komposer ini memperbarui cache artisan php: hapus
Perintah-perintah ini akan berguna setelah atau sebelum.
Saya harap Anda menghemat waktu Anda. Semoga berhasil. Retas
sumber
Saya memiliki konfigurasi berikut:
nginx
)Dan izin diterapkan dengan benar seperti @bgies disarankan dalam jawaban yang diterima. Masalah dalam kasus saya adalah pengguna dan grup berjalan php-fpm yang dikonfigurasikan yang awalnya
apache
.Jika Anda menggunakan NGINX dengan php-fpm, Anda harus membuka file konfigurasi php-fpm:
Dan ganti
user
dangroup
nilai opsi 'dengan satu NGINX dikonfigurasi untuk bekerja dengan; dalam kasus saya, keduanya adalahnginx
:... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...
Simpan dan mulai kembali layanan nginx dan php-fpm.
sumber
Untuk pengembang Laravel, masalah direktori bisa sedikit menyakitkan. Dalam aplikasi saya, saya berhasil membuat direktori dengan cepat dan memindahkan file ke direktori ini di lingkungan lokal saya. Kemudian di server, saya mendapatkan kesalahan saat memindahkan file ke direktori yang baru dibuat.
Inilah beberapa hal yang telah saya lakukan dan mendapatkan hasil yang sukses pada akhirnya.
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
mkdir($save_path, 0755, true);
Setelah membuat perubahan pada server produksi, saya berhasil membuat direktori baru dan memindahkan file ke sana.
Akhirnya, jika Anda menggunakan File fasad di Laravel, Anda dapat melakukan sesuatu seperti ini:
File::makeDirectory($save_path, 0755, true);
sumber
Saya menemukan solusi yang lebih baik untuk ini. Ini disebabkan karena php berjalan sebagai pengguna lain secara default.
jadi untuk memperbaikinya jangan ini
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
lalu edit
user = "put user that owns the directories" group = "put user that owns the directories"
kemudian:
sudo systemctl reload php7.0-fpm
sumber