أذونات السيرفر

Alhoqbaniمنذ 5 سنوات

في هذا الدرس سنقوم بمعالجة الخطأ المتعلق بأذونات السيرفر، والذي بسببه لم يتمكن تطبيق لارافال من كتابة ملفات جديدة على السيرفر، وسوف نستعرض طرق مختلفة للتعامل مع هذا الخطأ.

بسم الله الرحمن الرحيم

لا تترد في طرح أسئلتك المتعلقة بمواضيع الدورة في التعليقات.

في الدرس السابق بعد تثبيت تطبيق Laravel ظهرت لدينا صفحة الخطأ الخاصة بـLaravel والتي تفيد بوجود خطأ على السيرفر عند محاولة التطبيق كتابة بعض الملفات الجديدة في المسار /var/www/html/laravel-app/storage/logs/laravel.log

والسبب في ذلك أن المستخدم الذي يعمل من خلال php ليس لديه الصلاحية في الكتابة في هذا المجلد. فلو قمت بتنفيذ الأمر ps aux | grep php ستجد بأن العمليات التي تتبع لـphp تعمل بواسطة المستخدم www-data وبالتالي php تستمد الصلاحيات من هذه المستخدم. 

ولو نظرنًا إلى صلاحيات المجلد /var/www/html/laravel-app/storage/logs الذي يحاول تطبيق Laravel الكتابة إليه باستخدام الأمر ls -al /var/www/html/laravel-app/storage  سنجد بأن المجلد يمتلكه المستخدم root وأن الصلاحيات للمجلد logs هي drwxr-xr-x والتي تعني بأن المالك لهذا المجلد هو الوحيد الذي يستطيع إنشاء ملفات جديدة داخل هذا المجلد.

وبالتالي فإن المستخدم www-data الذي يعمل من خلاله Laravel لا يستطيع كتابة الملفات في هذا المجلد.

وفيه هذا الدرس سوف نستعرض بعض الحلول الممكنة للتعامل مع المشكلة.

الطريقة الأخيرة (مستخدم الويب) هي المفضلة لدي، والتي سوف نقوم باستخدامها في هذه الدورة.

تغيير الأذونات

أبسط الحلول الممكنة هو تغيير الأذونات للمجلدات التي نرغب بالسماح لتطبيق Laravel وphp بالكتابة فيها، وذلك بتغيير الأذونات لهذه المجلدات حيث يصبح بإمكان أي مستخدم على السيرفر الكتابة في هذه المجلدات. ويمكن القيام بذلك باستخدام الأمر chmod واختيار أذونات أكثر سماحًا مثل 777 والتي تسمح للجميع بالقراءة والكتابة والتنفيذ على هذه المجلدات.

# logs تغيير الأذونات للمجلد
sudo chmod 777 /var/www/html/laravel-app/storage/logs

بعد القيام بالأمر السابق وعند تحديثك للصفحة في المتصفح ستجد أن الخطأ قد تغير، حيث أن Laravel يحاول الكتابة في مجلد آخر وهو /var/www/html/laravel-app/storage/framework/views ولذك سنحتاج أيضًا إلى تغيير الأذونات لهذا المجلد

# views تغيير الأذونات للمجلد
sudo chmod 777 /var/www/html/laravel-app/storage/framework/views

وسيعمل تطبيق Laravel بشكل صحيح. 

ولكن هذه الطريقة غير عملية لأن تغيير الأذونات إلى 777 يجعل هذه المجلدات متاحة لجميع المستخدمين على السيرفر، وكذلك أن هناك مجلدات أخرى يحتاج التطبيق الكتابة فيها وبالتالي ستضطر إلى تغيير الأذوانات لهذه المجلدات. وإذا كنت تستخدم إطار عمل مختلف عن Laravel فستختلف المجلدات التي يجب تعديل أذوناتها. 

يقوم Laravel عادة بالكتابة في المجلد storage ومجلد bootstrap ونستطيع تغيير الأذونات لهذه المجلدات وما تحتويه من ملفات ومجلدات بالأمر التالي:

# Laravel تعديل الأذونات للمجلدات التي يستخدمها 
sudo chmod -R 777 /var/www/html/laravel-app/storage/
sudo chmod -R 777 /var/www/html/laravel-app/bootstrap/

منح الصلاحيات

في هذه الطريقة سوف نقوم بمنح المستخدم www-data فقط الصلاحيات على المجلدات التي نرغب في الكتابة إليها بدلًا من تغيير الأذونات والسماح لجميع المستخدمين بالوصول إلى هذه المجلدات. وسوف نقوم بذلك باستخدام Access Control Lists(ACL) والتي توفر إعدادات إضافية لتعديل الأذونات. 

وإذا أردت إعادة الأذونات إلى ما كانت عليه قبل تنفيذ الخطوات في الطريقة الأولى وإظهار نفس الخطأ المتعلق بالأذونات يمكن تنفيذ الأوامر التالية:

# تغيير الأذونات إلى ما كانت عليها للملفات والمجلدات
sudo find /var/www/html/laravel-app/storage -type f -exec sudo chmod 644 {} \;
sudo find /var/www/html/laravel-app/storage -type d -exec sudo chmod 755 {} \;

# Laravel حذف الملفات التي قام بإنشائها 
sudo rm /var/www/html/laravel-app/storage/logs/*.log
sudo rm /var/www/html/laravel-app/storage/framework/views/*.php

للاطلاع على الإعدادات الحالية يمكنك تنفيذ الأمر sudo getfacl /var/www/html/laravel-app/storage/ وستجد بأن المستخدم المالك لهذا المجلد هو root وهو الوحيد الذي لديه صلاحية الكتابة w

ويمكننا إعطاء المستخدم www-data الصلاحيات على هذا المجلد بالأمر التالي:

# www-data تعيين الصلاحيات للمستخدم
sudo setfacl -R -m u:www-data:rwx /var/www/html/laravel-app/storage

تغيير المالك

يمكننا تغيير المستخدم الذي يملك هذه المجلدات إلى المستخدم www-data وبالتالي سيكون له جميع الصلاحيات على هذه الملفات، إلأ انك إذا قمت بنقل الملفات من جهازك مثلًا فسيتغير المالك إلى المستخدم الذي قام بنقل الملفات، وبالتالي ستضطر إلى تغيير المالك في كل مرة تقوم فيها بنقل الملفات إلى السيرفر.

ولتغير مالك المجلدات نستخدم الامر chown

# www-data تغيير مالك المجلدات إلى 
sudo chown -R www-data /var/www/html/laravel-app/storage
sudo chown -R www-data /var/www/html/laravel-app/bootstrap

مستخدم الويب

في هذه الطريقة سوف نقوم بإنشاء مستخدم جديد عادي على السيرفر، ومن دون أي صلاحيات. هذا المستخدم سوف يكون هو المالك الجديد لعمليات الـnginx وphp بمعنى أن هذه البرامج سوف تعمل تحت هذا المستخدم الجديد. كما سوف نقوم بنقل تطبيق Laravel والـroot لـnginx إلى داخل المجلد الأساسي Home directory لهذا المستخدم، وبالتالي سوف يكون لـphp جميع الصلاحيات على ملفات ومجلدات التطبيق. وسوف تكون هذه الطريقة مفيدة عند رغبتك بنقل الملفات من جهازك إلى السيرفر، حيث يمكنك الاتصال بالسيرفر بواسطة المستخدم الجديد عن طريق ssh ونقل الملفات دون مواجهة أي مشكلة في الأذونات.

إنشاء مستخدم جديد

سوف نقوم بإنشاء مستخدم جديد باسم webuser ونقل ملفات الموقع لمجلد هذا المستخدم. وبالتالي سوف يكون موقع تطبيقنا بداخل المسار: /home/webuser/www/laravel-app وللقيام بذلك نقوم بتنفيذ الأوامر التالية:

# إنشاء مستخدم جديد
sudo adduser webuser
# Enter قم باختيار كلمة مرور جديدة للمستخدم والإجابة على الأسئلة بالضغط على 

# إنشاء مجلد ليكون الموقع الجديد للتطبيق
sudo mkdir /home/webuser/www

# نقل تطبق لارافال إلى الموقع الجديد
sudo mv /var/www/html/laravel-app /home/webuser/www
# تغيير المالك للتطبيق إلى المستخدم الجديد
sudo chown -R webuser: /home/webuser/www

إعدادات php 

حتى يكون بإمكان php من القراءة والكتابة في ملفات التطبيق، سوف نقوم بتغيير مستخدم php إلى المستخدم الجديد webuser

# phpعرض المستخدم الحالي لـ
ps aux | grep php
# www-data نلاحظ أن المستخدم الحالي هو 

# php تغيير اعدادات 
sudo nano /etc/php/7.2/fpm/pool.d/www.conf
# سوف نقوم بتغيير المستخدم والمجموعة في موقعين
# الأول في السطر رقم 23 تقريبا
# ابحث عن السطرين 
user = www-data
group = www-data
# واستبدل اسم المستخدم كالتالي
user = webuser
group = webuser

# nginx و php الموقع الثاني لتغيير مالك الملف الذي يربط بين 
# ابحث عن السطرين 
listen.owner = www-data
listen.group = www-data
# واستبدلهما بالتالي
listen.owner = webuser
listen.group = webuser

# الخروج من المحرر وحفظ التعديلات
# Ctrl + o  احفظ التغييرات بالضغط على 
# enter ثم الضغط على
# Ctrl + x وللخروج من المحرر

# php إعادة تشغيل 
sudo service php7.2-fpm restart

# phpعرض المستخدم الحالي لـ
ps aux | grep php
# webuser نلاحظ أن المستخدم تغير إلى 

إعدادات Nginx

في الخطوة السابقة قمنا تغيير إعدادات php وتغيير المستخدم إلى webuser، ونتيجة لذلك فإن الملف الذي يربط بين php و nginx سيكون مملوكًا لـwebuser وبالتالي سنقوم بتغيير مستخدم nginx ليكون webuser وبالتالي يتمكن من قراءة هذا الملف.

# nginx تغيير مستخدم 
sudo nano /etc/nginx/nginx.conf

# قم بتغيير السطر الأول في الملف
user www-data;
# ليصبح  
user webuser;

# الخروج من المحرر وحفظ التعديلات
# Ctrl + o  احفظ التغييرات بالضغط على 
# enter ثم الضغط على
# Ctrl + x وللخروج من المحرر

# nginx إعادة تشغيل 
sudo service nginx restart

الخطوة الأخيرة هي تعديل الـroot للموقع وتوجيهه إلى المجلد /home/webuser/www/laravel-app/public الخاص بتطبيق Laravel

# تعديل الموقع الرئيسي للتطبيق
sudo nano /etc/nginx/sites-available/default

# ابحث عن السطر التالي
root /var/www/html/laravel-app/public;
# واستبدله كالتالي
root /home/webuser/www/laravel-app/public;

# الخروج من المحرر وحفظ التعديلات
# Ctrl + o  احفظ التغييرات بالضغط على 
# enter ثم الضغط على
# Ctrl + x وللخروج من المحرر


# nginx إعادة تحميل 
sudo service nginx reload

 

 

 

 

الدرس السابق       الدرس التالي
         
تطبيق لارافال Laravel       قاعدة البيانات MySQL
         

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !