วิธีตั้งค่าการอนุญาตไฟล์สำหรับ Laravel


233

ฉันใช้ Apache Web Server _www:_wwwที่มีการตั้งค่าให้เจ้าของ ฉันไม่เคยรู้ว่าวิธีปฏิบัติที่ดีที่สุดเกี่ยวกับสิทธิ์ของไฟล์คืออะไรเมื่อฉันสร้างโครงการ Laravel 5 ใหม่

Laravel 5 ต้องการ/storageโฟลเดอร์ที่สามารถเขียนได้ ฉันพบวิธีการที่แตกต่างกันมากมายเพื่อให้มันทำงานได้และฉันมักจะจบด้วยการทำให้มันเป็น777แบบซ้ำ ๆ ฉันรู้ว่ามันไม่ใช่ความคิดที่ดีที่สุด

หมออย่างเป็นทางการพูดว่า:

Laravel อาจต้องการสิทธิ์ในการกำหนดค่า: โฟลเดอร์ภายใน storageและvendorต้องการสิทธิ์การเข้าถึงเพื่อเขียนโดยเว็บเซิร์ฟเวอร์

หมายความว่าเว็บเซิร์ฟเวอร์ต้องการการเข้าถึงstorageและvendorโฟลเดอร์ด้วยหรือเพียงแค่เนื้อหาปัจจุบัน

ฉันถือว่าสิ่งที่ดีกว่าคือการเปลี่ยนเจ้าของแทนการอนุญาต ผมเปลี่ยนทุก Laravel ของสิทธิ์ไฟล์ซ้ำไป_www:_wwwและที่ทำให้การทำงานของเว็บไซต์ได้อย่างถูกต้องเช่นถ้าผมเปลี่ยน chmod 777ไป ปัญหาคือตอนนี้โปรแกรมแก้ไขข้อความของฉันขอรหัสผ่านทุกครั้งที่ฉันต้องการบันทึกไฟล์ใด ๆ และสิ่งเดียวกันจะเกิดขึ้นหากฉันพยายามเปลี่ยนสิ่งใด ๆ ใน Finder เช่นคัดลอกไฟล์

แนวทางที่ถูกต้องในการแก้ไขปัญหาเหล่านี้คืออะไร?

  1. เปลี่ยนแปลง chmod
  2. เปลี่ยนเจ้าของไฟล์ให้ตรงกับในเว็บเซิร์ฟเวอร์และอาจตั้งค่าเครื่องมือแก้ไขข้อความ (และ Finder?) เพื่อข้ามการขอรหัสผ่านหรือทำให้พวกเขาใช้ sudo
  3. เปลี่ยนเจ้าของเว็บเซิร์ฟเวอร์ให้ตรงกับผู้ใช้ระบบปฏิบัติการ (ฉันไม่ทราบผลที่ตามมา)
  4. อื่น ๆ อีก

4
ฉันคิดว่า777เป็นอิสระมากเกินไปเพราะมันรวมสิทธิ์ทั้งหมดสำหรับทุกคน
Robo Robok

จากเอกสาร Laravel: ไดเรกทอรีภายในstorageและbootstrap/cacheไดเรกทอรีควรจะเขียนได้โดยเว็บเซิร์ฟเวอร์ของคุณ
joshuamabina

1
ใช้ FCGI และคุณก็สามารถ 755/644 ทั้งหมด (รวมส่วนกลางจัดเก็บ /.)
Jeffz

@ jww เห็นด้วยเราสามารถย้ายคำถามไปที่เซิร์ฟเวอร์ผิดแทนที่จะหยุดพักได้หรือไม่
wp78de

คำตอบ:


588

เพียงระบุสถานะที่ชัดเจนสำหรับทุกคนที่กำลังดูการสนทนานี้ .... หากคุณให้สิทธิ์ใด ๆ กับโฟลเดอร์ของคุณ 777 สิทธิ์คุณอนุญาตให้ทุกคนอ่านเขียนและดำเนินการไฟล์ใด ๆ ในไดเรกทอรีนั้น .... สิ่งนี้หมายความว่าคุณได้รับ ทุกคน (แฮ็กเกอร์หรือบุคคลที่เป็นอันตรายทั่วโลก) ได้รับอนุญาตให้อัปโหลดไฟล์ไวรัสหรือไฟล์อื่น ๆ จากนั้นเรียกใช้ไฟล์นั้น ...

หากคุณตั้งค่าสิทธิ์สำหรับโฟลเดอร์เป็น 777 คุณได้เปิดเซิร์ฟเวอร์ของคุณไว้กับใครก็ตามที่สามารถค้นหาไดเรกทอรีนั้นได้ ชัดเจนเพียงพอ :)

โดยทั่วไปมีสองวิธีในการตั้งค่าความเป็นเจ้าของและการอนุญาตของคุณ ไม่ว่าคุณจะให้สิทธิ์การเป็นเจ้าของหรือสร้างเว็บเซิร์ฟเวอร์ให้กับเจ้าของไฟล์ทั้งหมด

เว็บเซิร์ฟเวอร์ในฐานะเจ้าของ (วิธีที่คนส่วนใหญ่ทำและวิธีของ Laravel doc):

สมมติว่าข้อมูล www (อาจเป็นอย่างอื่น) เป็นผู้ใช้เว็บเซิร์ฟเวอร์ของคุณ

sudo chown -R www-data: www-data / path / to / your / laravel / root / ไดเรกทอรี

หากคุณทำเช่นนั้นเว็บเซิร์ฟเวอร์จะเป็นเจ้าของไฟล์ทั้งหมดและเป็นกลุ่มและคุณจะมีปัญหาในการอัปโหลดไฟล์หรือทำงานกับไฟล์ผ่าน FTP เพราะไคลเอนต์ FTP ของคุณจะถูกลงชื่อเข้าใช้ในขณะที่คุณไม่ใช่เว็บเซิร์ฟเวอร์ของคุณ ผู้ใช้ของคุณไปยังกลุ่มผู้ใช้เว็บเซิร์ฟเวอร์:

sudo usermod -a -G www-data Ubuntu

แน่นอนว่าสิ่งนี้ถือว่าเว็บเซิร์ฟเวอร์ของคุณทำงานเป็น www-data (ค่าเริ่มต้นของ Homestead) และผู้ใช้ของคุณคือ Ubuntu (เป็นคนจรจัดถ้าคุณใช้ Homestead)

จากนั้นคุณตั้งไดเรกทอรีทั้งหมดของคุณเป็น 755 และไฟล์ของคุณเป็น 644 ... การตั้งค่าการอนุญาตไฟล์

sudo find / path / to / your / laravel / root / directory -type f -exec chmod 644 {} \;    

สิทธิ์ในการตั้งค่าไดเรกทอรี

หา sudo / path / to / your / laravel / root / ไดเร็กตอรี่ -type d -exec chmod 755 {} \;

ผู้ใช้ของคุณในฐานะเจ้าของ

ฉันชอบที่จะเป็นเจ้าของไดเรกทอรีและไฟล์ทั้งหมด (มันทำให้การทำงานกับทุกอย่างง่ายขึ้นมาก) ดังนั้นฉันจึง:

sudo chown -R my-user: www-data / path / to / your / laravel / root / ไดเรกทอรี

จากนั้นฉันให้สิทธิ์ทั้งตัวฉันและเว็บเซิร์ฟเวอร์:

หา sudo / path / to / your / laravel / root / directory -type f -exec chmod 664 {} \;    
หา sudo / path / to / your / laravel / root / ไดเร็กตอรี่ -type d -exec chmod 775 {} \;

จากนั้นให้สิทธิ์แก่เว็บเซิร์ฟเวอร์ในการอ่านและเขียนไปยังที่เก็บข้อมูลและแคช

ไม่ว่าคุณจะตั้งค่าแบบไหนก็ตามคุณต้องให้สิทธิ์การอ่านและเขียนแก่เว็บเซิร์ฟเวอร์สำหรับการจัดเก็บแคชและไดเรกทอรีอื่น ๆ ที่เว็บเซิร์ฟเวอร์ต้องการอัปโหลดหรือเขียนด้วย (ขึ้นอยู่กับสถานการณ์ของคุณ) ดังนั้นให้เรียกใช้คำสั่งจาก bashy ด้านบน:

sudo chgrp -R www-data bootstrap / cache
sudo chmod -R ug + rwx ที่เก็บ bootstrap / cache

ตอนนี้คุณปลอดภัยแล้วและเว็บไซต์ของคุณทำงานได้และคุณสามารถทำงานกับไฟล์ได้อย่างง่ายดาย


4
ตัวอย่างที่ดีถ้าไม่มีผู้ใช้ www-data ให้ใช้ apache: apache แทน www-data (ใน distros บางแห่ง)
Denis Solakovic

53
ฉันคิดว่าคนเข้าใจผิดanyoneแนวคิดมากเกินไป anyoneธงของ Linux หมายถึงผู้ใช้ทุกคนไม่ใช่บุคคลใด ๆ คุณยังต้องการการเข้าถึงเซิร์ฟเวอร์
Marco Aurélio Deleu

3
@ andreshg112 www-data ตัวแรกคือชื่อของผู้ใช้และ www-data ตัวที่สองคือชื่อของกลุ่ม ดังนั้นจึงหมายความว่าเจ้าของ apache และ apache (กลุ่มนี้) ใช้ www-data: www-data หรือเพิ่มผู้ใช้ของคุณในกลุ่มนั้น (CLI: ชื่อผู้ใช้เพิ่ม -G {ชื่อกลุ่ม} ชื่อผู้ใช้) และคุณสามารถเลือกชื่อผู้ใช้: www-group
Denis Solakovic

2
@fs_tigre ฉันไม่คิดว่าจะมีความแตกต่างกันมากสำหรับความปลอดภัย ... ยกเว้นฉันเดาว่ามีผู้ใช้สองคนที่จะเดารหัสผ่านแทนหนึ่งและแน่นอนฉันเข้าสู่ระบบตลอดเวลาด้วยบัญชีผู้ใช้ของฉันดังนั้นหาก ฉันทำมันด้วยวิธีที่ไม่ปลอดภัย (FTP ปกติและการใช้รหัสผ่านเป็นต้น) มันอาจทำให้ไซต์เสียหาย แต่ฉันลงชื่อเข้าใช้ด้วย Putty และ SSH เท่านั้นและเมื่อฉันใช้ FTP มันคือ SFTP ดังนั้นจึงไม่มีปัญหาเลย แนะนำให้ใช้คำสั่งที่แนะนำโดย bashy เนื่องจากพวกเขาตั้งค่า sticky bit ดังนั้นหากเว็บเซิร์ฟเวอร์ของคุณสร้างไดเรกทอรีย่อยพวกเขาจะมีเจ้าของ / สิทธิ์เหมือนกันกับ parent
bgies

3
ในวิธีแรกผู้ใช้จะไม่สามารถอัปโหลดไฟล์ได้เนื่องจากคุณไม่ได้ให้writeสิทธิ์แก่กลุ่มใช่หรือไม่
Fahmi

44

สิทธิ์สำหรับstorageและvendorโฟลเดอร์ควรอยู่ที่775ด้วยเหตุผลด้านความปลอดภัยที่ชัดเจน

อย่างไรก็ตามทั้งคอมพิวเตอร์และเซิร์ฟเวอร์ Apache ของคุณต้องสามารถเขียนลงในโฟลเดอร์เหล่านี้ได้ Ex: เมื่อคุณเรียกใช้คำสั่งเช่นความต้องการเครื่องคอมพิวเตอร์ของคุณที่จะเขียนในแฟ้มบันทึกในphp artisanstorage

สิ่งที่คุณต้องทำคือให้สิทธิ์การเป็นเจ้าของโฟลเดอร์กับ Apache:

sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage

จากนั้นคุณต้องเพิ่มคอมพิวเตอร์ของคุณ (อ้างอิงโดยusername) ไปยังกลุ่มที่เซิร์ฟเวอร์ Apache เป็นเจ้าของ ชอบมาก

sudo usermod -a -G www-data userName

หมายเหตุ:บ่อยที่สุดgroupNameคือwww-dataแต่ในกรณีของคุณให้แทนที่ด้วย_www


10
+1 ฉันชอบวิธีนี้ แต่ฉันเชื่อว่าchownคำสั่งควรรวมถึงแฟล็ก -R นอกจากนี้ใน laravel 5.1 และ 5.2 แทนที่จะเป็นไดเรกทอรีผู้ขายคุณควรให้สิทธิ์เข้าถึงไดเรกทอรี bootstrap / cache
Jason Wheeler

มีวิธีการทดสอบว่านี้จะทำงานได้ดีหรือไม่? ฉันหมายถึงถ้าไฟล์บันทึกใหม่ถูกสร้างขึ้นในที่เก็บ / ล็อก dir ที่จะมีสิทธิ์ที่ถูกต้องฉันจะตรวจสอบได้อย่างไร?
Chaudhry Waqas

20

เราพบกรณีขอบจำนวนมากเมื่อตั้งค่าการอนุญาตสำหรับแอปพลิเคชัน Laravel เราสร้างบัญชีผู้ใช้แยกต่างหาก ( deploy) สำหรับการเป็นเจ้าของโฟลเดอร์แอปพลิเค Laravel และรันคำสั่ง Laravel จาก CLI www-dataและเรียกใช้เว็บเซิร์ฟเวอร์ที่อยู่ภายใต้ ปัญหาหนึ่งที่ทำให้เกิดปัญหานี้คือไฟล์บันทึกอาจเป็นของwww-dataหรือdeployขึ้นอยู่กับผู้ที่เขียนไปยังไฟล์บันทึกก่อนป้องกันไม่ให้ผู้ใช้รายอื่นเขียนถึงมันในอนาคต

ฉันพบว่าทางออกที่มีเหตุผลและปลอดภัยเท่านั้นคือการใช้ Linux ACL เป้าหมายของการแก้ปัญหานี้คือ:

  1. เพื่ออนุญาตให้ผู้ใช้ที่เป็นเจ้าของ / ปรับใช้แอปพลิเคชันอ่านและเขียนการเข้าถึงแอปพลิเคชันรหัส Laravel (เราใช้ชื่อผู้ใช้deploy)
  2. เพื่ออนุญาตให้www-dataผู้ใช้สามารถอ่านรหัสแอปพลิเคชัน Laravel แต่ไม่สามารถเข้าถึงการเขียน
  3. เพื่อป้องกันไม่ให้ผู้ใช้รายอื่นเข้าถึงรหัสแอปพลิเคชัน Laravel / ข้อมูลได้เลย
  4. เพื่ออนุญาตให้ทั้งwww-dataผู้ใช้และผู้ใช้แอปพลิเคชัน ( deploy) เขียนการเข้าถึงโฟลเดอร์ที่เก็บข้อมูลโดยไม่คำนึงถึงผู้ใช้ที่เป็นเจ้าของไฟล์ (ดังนั้นทั้งสองdeployและwww-dataสามารถเขียนไปยังล็อกไฟล์เดียวกันได้)

เราทำสิ่งนี้สำเร็จดังนี้:

  1. ไฟล์ทั้งหมดที่อยู่ในapplication/โฟลเดอร์ที่สร้างขึ้นด้วย umask เริ่มต้น0022ซึ่งจะส่งผลในโฟลเดอร์ที่มีสิทธิ์และไฟล์ที่มีdrwxr-xr-x-rw-r--r--
  2. sudo chown -R deploy:deploy application/(หรือปรับใช้แอปพลิเคชันของคุณในฐานะdeployผู้ใช้ซึ่งเป็นสิ่งที่เราทำ)
  3. chgrp www-data application/เพื่อให้www-dataกลุ่มเข้าถึงแอปพลิเคชัน
  4. chmod 750 application/เพื่ออนุญาตให้deployผู้ใช้อ่าน / เขียนwww-dataผู้ใช้เป็นแบบอ่านอย่างเดียวและเพื่อลบสิทธิ์ทั้งหมดให้กับผู้ใช้รายอื่น
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/เพื่อตั้งค่าการอนุญาตเริ่มต้นในstorage/โฟลเดอร์และโฟลเดอร์ย่อยทั้งหมด โฟลเดอร์ / ไฟล์ใหม่ใด ๆ ที่สร้างขึ้นในโฟลเดอร์หน่วยเก็บข้อมูลจะสืบทอดสิทธิ์เหล่านี้ ( rwxสำหรับทั้งสองwww-dataและdeploy)
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ เพื่อตั้งค่าการอนุญาตข้างต้นในไฟล์ / โฟลเดอร์ใด ๆ ที่มีอยู่

15

เปลี่ยนสิทธิ์สำหรับโฟลเดอร์โปรเจ็กต์ของคุณเพื่อเปิดใช้งานการอ่าน / เขียน / exec สำหรับผู้ใช้ใด ๆ ภายในกลุ่มที่เป็นเจ้าของไดเรกทอรี (ซึ่งในกรณีของคุณคือ_www):

chmod -R 775 /path/to/your/project

จากนั้นเพิ่มชื่อผู้ใช้ OS X ของคุณไปยัง_wwwกลุ่มเพื่อให้สามารถเข้าถึงไดเรกทอรี:

sudo dseditgroup -o edit -a yourusername -t user _www

เมื่อฉันdseditgroupให้คุณฉันได้รับข้อผิดพลาด: Username and password must be provided..
Robo Robok

ความผิดพลาดของฉันคุณต้องเรียกใช้คำสั่งนั้นกับผู้ใช้ที่มีสิทธิ์ที่เหมาะสมดังนั้นเพียงเพิ่มsudoที่จุดเริ่มต้น
Bogdan

ดังนั้นผมจึงจำเป็นต้องเปลี่ยนเจ้าของไฟล์เหล่านั้นไป_www:_wwwหรือmyuser:_wwwเช่นกัน?
Robo Robok

คุณสามารถออกได้_www:_wwwเพราะ 775 หมายถึงผู้ใช้ในกลุ่ม_wwwจะมีสิทธิ์อย่างเต็มที่ในการอ่าน / เขียน / ออกในโฟลเดอร์นั้นและคุณเพิ่งเพิ่มชื่อผู้ใช้ของคุณไปยังกลุ่มนั้น
Bogdan

คุณบอกฉันได้ไหม มันหมายความว่าchown myuser:_wwwอะไร? ฉันรู้ว่าคนแรกคือผู้ใช้และคนที่สองคือกลุ่ม แต่มันหมายถึง "ผู้ใช้นี้และทุกคนจากกลุ่มนี้" หรือ "ผู้ใช้รายนี้ แต่เฉพาะในกรณีที่เขาอยู่ในกลุ่มนี้"
Robo Robok

8

ตามที่โพสต์ไปแล้ว

สิ่งที่คุณต้องทำคือให้สิทธิ์การเป็นเจ้าของโฟลเดอร์กับ Apache:

แต่ฉันเพิ่ม-Rสำหรับคำสั่ง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


3
ทำไมเราต้องให้สิทธิ์แก่ไดเรกทอรีผู้ขาย การจัดเก็บทำให้รู้สึกถึงการเขียนไปยังไฟล์บันทึก ฯลฯ แต่ผู้ขาย? ทำไม?
Ali Haris

ตามที่เขียนไว้ข้างต้นในความคิดเห็นบางส่วน: "อย่างไรก็ตามทั้งคอมพิวเตอร์ของคุณและ Apache เซิร์ฟเวอร์ของคุณต้องสามารถเขียนในโฟลเดอร์เหล่านี้ได้ Ex: เมื่อคุณเรียกใช้คำสั่งเช่น php artisan คอมพิวเตอร์ของคุณต้องเขียนลงในแฟ้มบันทึกในที่เก็บ"
Stanislav Potapenko

ข้อผิดพลาดใน mac: chown: www-data: ชื่อกลุ่มที่ผิดกฎหมาย
Sunil Kumar


7

โฟลเดอร์ส่วนใหญ่ควรเป็นปกติ "755" และไฟล์ "644"

Laravel ต้องการบางโฟลเดอร์ที่สามารถเขียนได้สำหรับผู้ใช้เว็บเซิร์ฟเวอร์ คุณสามารถใช้คำสั่งนี้กับระบบปฏิบัติการยูนิกซ์

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

7

เพิ่มใน composer.json

"scripts": {
    "post-install-cmd": [
      "chgrp -R www-data storage bootstrap/cache",
      "chmod -R ug+rwx storage bootstrap/cache"
    ]
}

หลังจาก composer install


2
นี่เป็นคำตอบที่ไม่ดี คุณไม่จำเป็นต้องใช้ 777 สำหรับโฟลเดอร์ใด ๆ หากคุณกำหนดค่าเว็บเซิร์ฟเวอร์อย่างถูกต้อง การใช้ 777 จะเป็นการเปิดเซิร์ฟเวอร์ของคุณเพื่อให้แฮ็กเกอร์ใด ๆ อัพโหลดไฟล์และดำเนินการไฟล์ดังกล่าวหากพวกเขารู้ว่าโฟลเดอร์อยู่ที่ใด
mbozwood

2
ตกลง. คุณเสนออะไร
Davron Achilov

และถ้าเป็นเช่นนั้นมันจะถูกต้อง? chown -R $ USER: www-data storage, chown -R $ USER: www-data bootstrap / cache
Davron Achilov

ดูคำตอบที่ถูกต้องมันมีข้อมูลที่จำเป็นทั้งหมดที่คุณสามารถใส่ลงในการอัปเดตได้อย่างแน่นอน :)
mbozwood

6

Laravel 5.4 เอกสารบอกว่า:

หลังจากติดตั้ง Laravel แล้วคุณอาจต้องกำหนดค่าสิทธิ์บางอย่าง ไดเรกทอรีภายในstorageและbootstrap/cacheไดเรกทอรีควรเขียนได้โดยเว็บเซิร์ฟเวอร์ของคุณหรือ Laravel จะไม่ทำงาน หากคุณใช้เครื่องเสมือน Homestead ควรจะตั้งค่าการอนุญาตเหล่านี้ไว้เรียบร้อยแล้ว

มีคำตอบมากมายในหน้านี้ที่กล่าวถึงการใช้การ777อนุญาต อย่าทำอย่างนั้น คุณต้องการเปิดเผยตัวเองให้แฮ็กเกอร์ทราบ

ให้ทำตามคำแนะนำของผู้อื่นเกี่ยวกับวิธีตั้งค่าการอนุญาต 755 (หรือ จำกัด มากขึ้น) คุณอาจจะต้องคิดออกที่ผู้ใช้แอปของคุณทำงานได้โดยการทำงานในการเป็นเจ้าของการเปลี่ยนแปลงขั้วแล้วของไดเรกทอรีบางอย่างที่ใช้whoamichown -R

หากคุณไม่ได้รับอนุญาตให้ใช้sudoเนื่องจากคำตอบอื่น ๆ ต้องการ ...

เซิร์ฟเวอร์ของคุณอาจเป็นโฮสต์ที่แชร์เช่น Cloudways

(ในกรณีของฉันฉันได้เลียนแบบแอปพลิเคชั่น Laravel ของฉันไปยังเซิร์ฟเวอร์ Cloudways แห่งที่สองของฉันและมันก็ไม่ทำงานอย่างสมบูรณ์เพราะสิทธิ์ของstorageและbootstrap/cacheไดเรกทอรีถูกทำให้ยุ่งเหยิง)

ฉันต้องการใช้:

Cloudways Platform > Server > Application Settings > Reset Permission

จากนั้นฉันก็สามารถเรียกใช้php artisan cache:clearในสถานี


4

โซลูชันที่โพสต์โดย bgles เป็นจุดเริ่มต้นสำหรับฉันในแง่ของการตั้งค่าสิทธิ์อย่างถูกต้องในตอนแรก (ฉันใช้วิธีที่สอง) แต่ก็ยังมีปัญหาที่อาจเกิดขึ้นสำหรับ Laravel

โดยค่าเริ่มต้น Apache จะสร้างไฟล์ที่มีสิทธิ์ 644 นั่นคือทุกอย่างในการจัดเก็บ / ดังนั้นหากคุณลบเนื้อหาของการจัดเก็บ / กรอบ / มุมมองจากนั้นเข้าถึงหน้าผ่าน Apache คุณจะพบว่ามุมมองแคชถูกสร้างขึ้นเช่น:

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2

หากคุณเรียกใช้ "artisan เสิร์ฟ" และเข้าถึงหน้าอื่นคุณจะได้รับสิทธิ์ที่แตกต่างกันเนื่องจาก CLI PHP ทำงานแตกต่างจาก Apache:

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e

ในตัวเองนี่ไม่ใช่เรื่องใหญ่เพราะคุณจะไม่ทำสิ่งนี้ในการผลิต แต่ถ้า Apache สร้างไฟล์ที่ผู้ใช้ต้องเขียนในเวลาต่อมามันจะล้มเหลว และสิ่งนี้สามารถนำไปใช้กับไฟล์แคชมุมมองแคชและบันทึกเมื่อปรับใช้โดยใช้ผู้ใช้และช่างฝีมือเข้าสู่ระบบ ตัวอย่างแบบง่าย ๆ คือ "artisan cache: clear" ซึ่งจะไม่สามารถลบไฟล์แคชใด ๆ ที่เป็นข้อมูล www: ข้อมูล www 644

สิ่งนี้สามารถลดลงได้บางส่วนโดยการใช้คำสั่งช่างเป็น www-data ดังนั้นคุณจะทำ / สคริปต์ทุกอย่างเช่น:

sudo -u www-data php artisan cache:clear

หรือคุณจะหลีกเลี่ยงความน่าเบื่อของสิ่งนี้และเพิ่มลงใน. bash_aliases ของคุณ:

alias art='sudo -u www-data php artisan'

สิ่งนี้ดีพอและไม่มีผลต่อความปลอดภัย แต่อย่างใด แต่สำหรับเครื่องที่พัฒนาแล้วการรันสคริปต์ทดสอบและการสุขาภิบาลทำให้สิ่งนี้ไม่น่าเชื่อถ้าคุณต้องการตั้งชื่อแทนให้ใช้ 'sudo -u www-data' เพื่อเรียกใช้ phpunit และทุกอย่างที่คุณตรวจสอบบิลด์ของคุณอาจทำให้ไฟล์ถูกสร้างขึ้น

วิธีแก้ไขคือทำตามส่วนที่สองของคำแนะนำ bgles และเพิ่มต่อไปนี้ใน / etc / apache2 / envvars และรีสตาร์ท (ไม่รีโหลด) Apache:

umask 002

สิ่งนี้จะบังคับให้ Apache สร้างไฟล์เป็น 664 โดยค่าเริ่มต้น ในตัวเองนี้สามารถนำเสนอความเสี่ยงด้านความปลอดภัย อย่างไรก็ตามในสภาพแวดล้อม Laravel ส่วนใหญ่ถูกกล่าวถึงที่นี่ (Homestead, Vagrant, Ubuntu) เว็บเซิร์ฟเวอร์ทำงานเป็นผู้ใช้ www-data ภายใต้กลุ่ม www-data ดังนั้นหากคุณไม่อนุญาตให้ผู้ใช้เข้าร่วมกลุ่ม www-data โดยพลการไม่ควรมีความเสี่ยงเพิ่มเติม หากมีคนจัดการทำลายเว็บเซิร์ฟเวอร์พวกเขามีระดับการเข้าถึงข้อมูลดาต้าดาต้าอยู่แล้วดังนั้นจึงไม่มีอะไรสูญหาย ดังนั้นในการผลิตมันค่อนข้างปลอดภัยและบนเครื่องที่พัฒนาโดยผู้ใช้คนเดียวมันก็ไม่เป็นปัญหา

ท้ายที่สุดเมื่อผู้ใช้ของคุณอยู่ในกลุ่ม www-data และไดเรกทอรีทั้งหมดที่มีไฟล์เหล่านี้คือ g + s (ไฟล์จะถูกสร้างขึ้นภายใต้กลุ่มของไดเรกทอรีหลัก) ทุกสิ่งที่สร้างโดยผู้ใช้หรือโดย www-data จะเป็น r / w สำหรับคนอื่น ๆ

และนั่นคือจุดมุ่งหมายที่นี่

แก้ไข

ในการตรวจสอบวิธีการข้างต้นเพื่อตั้งค่าการอนุญาตเพิ่มเติมมันยังดูดีพอ แต่การปรับแต่งเล็กน้อยสามารถช่วยได้:

ตามค่าดีฟอลต์แล้วไดเร็กทอรีคือ 775 และไฟล์คือ 664 และไฟล์ทั้งหมดมีเจ้าของและกลุ่มของผู้ใช้ที่เพิ่งติดตั้งเฟรมเวิร์ก สมมติว่าเราเริ่มจากจุดนั้น

cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./

สิ่งแรกที่เราทำคือบล็อกการเข้าถึงทุกคนและทำให้กลุ่มเป็นข้อมูล www มีเพียงเจ้าของและสมาชิกของ www-data เท่านั้นที่สามารถเข้าถึงไดเรกทอรี

sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache

เพื่ออนุญาตให้เว็บเซิร์ฟเวอร์สร้าง services.json และ compiled.php ตามที่แนะนำโดยคู่มือการติดตั้ง Laravel อย่างเป็นทางการ การตั้งค่ากลุ่มจุดยึดหมายความว่าผู้สร้างเหล่านี้เป็นเจ้าของด้วยกลุ่มข้อมูล www

find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage

เราทำสิ่งเดียวกันกับโฟลเดอร์หน่วยเก็บข้อมูลเพื่ออนุญาตให้สร้างแคชบันทึกเซสชันและดูไฟล์ เราใช้ find เพื่อตั้งค่าการอนุญาตไดเรกทอรีอย่างชัดเจนสำหรับไดเรกทอรีและไฟล์ เราไม่จำเป็นต้องทำเช่นนี้ใน bootstrap / cache เนื่องจากไม่มีไดเรกทอรีย่อยอยู่ในนั้น

คุณอาจจำเป็นต้องใช้แฟล็กที่สามารถเรียกใช้งานได้อีกครั้งและลบผู้ขาย / * และติดตั้งการอ้างอิงผู้แต่งเพื่อติดตั้งลิงก์ใหม่สำหรับ phpunit และ al เช่น:

chmod +x .git/hooks/*
rm vendor/*
composer install -o

แค่นั้นแหละ. ยกเว้น umask สำหรับ Apache ที่อธิบายไว้ข้างต้นนี่คือทั้งหมดที่จำเป็นโดยไม่ต้องทำให้ projectroot ทั้งหมดสามารถเขียนได้โดยข้อมูล www ซึ่งเป็นสิ่งที่เกิดขึ้นกับโซลูชันอื่น ๆ ดังนั้นจึงปลอดภัยกว่าด้วยวิธีนี้เมื่อผู้บุกรุกที่ทำงานในรูปแบบข้อมูล www มีการเข้าถึงการเขียนที่ จำกัด มากขึ้น

สิ้นสุดการแก้ไข

การเปลี่ยนแปลงสำหรับ Systemd

สิ่งนี้ใช้กับการใช้ php-fpm แต่อาจใช้กับคนอื่นด้วย

เซอร์วิส systemd มาตรฐานจำเป็นต้องถูกเขียนทับการตั้ง umask ในไฟล์ override.conf และเซอร์วิสรีสตาร์ท:

sudo systemctl edit php7.0-fpm.service
Use:
    [Service]
    UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service

3

สิ่งนี้ใช้ได้กับฉัน:

cd [..LARAVEL PROJECT ROOT]
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/

มันทำอะไร:

  • เปลี่ยนการอนุญาตไฟล์ทั้งหมดเป็น 644
  • เปลี่ยนการอนุญาตของโฟลเดอร์ทั้งหมดเป็น 755
  • สำหรับการจัดเก็บและ bootstrap แคช (โฟลเดอร์พิเศษที่ใช้โดย laravel สำหรับการสร้างและดำเนินการไฟล์ที่ไม่พร้อมใช้งานจากภายนอก) ตั้งค่าการอนุญาตเป็น 777 สำหรับทุกสิ่งภายใน

หมายเหตุ: บางทีคุณไม่สามารถหรือไม่จำเป็นต้องทำด้วยคำนำหน้า sudo ขึ้นอยู่กับการอนุญาตของผู้ใช้กลุ่ม ฯลฯ ...


2

ฉันตัดสินใจเขียนสคริปต์ของตัวเองเพื่อบรรเทาความเจ็บปวดจากการตั้งค่าโปรเจ็กต์

รันสิ่งต่อไปนี้ภายในรูทโปรเจ็กต์ของคุณ:

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

รอ bootstrapping ให้เสร็จและคุณก็พร้อมที่จะไป

ตรวจสอบสคริปต์ก่อนใช้


2

ฉันติดตั้ง laravel บนอินสแตนซ์ของ EC2 และใช้เวลา 3 วันในการแก้ไขข้อผิดพลาดในการอนุญาตและในที่สุดก็ทำการแก้ไข ดังนั้นฉันต้องการแบ่งปันประสบการณ์นี้กับอีกคนหนึ่ง

  1. ปัญหาผู้ใช้เมื่อฉันเข้าสู่ระบบในอินสแตนซ์ ec2 ชื่อผู้ใช้ของฉันคือผู้ใช้ ec2 และกลุ่มผู้ใช้คือผู้ใช้ ec2 และเว็บไซต์ทำงานภายใต้ผู้ใช้ httpd: apache: apache ดังนั้นเราควรตั้งค่าการอนุญาตสำหรับ apache

  2. การอนุญาตให้ใช้โฟลเดอร์และไฟล์ A. โครงสร้างโฟลเดอร์ก่อนคุณควรตรวจสอบให้แน่ใจว่าคุณมีโครงสร้างโฟลเดอร์เช่นนี้ภายใต้ที่เก็บข้อมูล

    การเก็บรักษา

    • กรอบ
      • ขุมทรัพย์
      • การประชุม
      • มุมมอง
    • บันทึกโครงสร้างโฟลเดอร์อาจแตกต่างกันไปตามรุ่น laravel ที่คุณใช้ รุ่น laravel ของฉันคือ 5.2 และคุณสามารถค้นหาโครงสร้างที่เหมาะสมตามรุ่นของคุณ

B. การอนุญาตในตอนแรกฉันเห็นคำแนะนำในการตั้งค่า 777 ภายใต้ที่เก็บข้อมูลเพื่อลบ file_put_contents: ไม่สามารถเปิดข้อผิดพลาดในการสตรีม ดังนั้นฉันจึงตั้งค่าสิทธิ์ 777 สำหรับการจัดเก็บ chmod -R 777 การจัดเก็บ แต่ข้อผิดพลาดไม่ได้รับการแก้ไข ที่นี่คุณควรพิจารณาอย่างใดอย่างหนึ่ง: ผู้เขียนไฟล์ไปยังที่เก็บข้อมูล / เซสชันและมุมมอง นั่นไม่ใช่ผู้ใช้ ec2 แต่เป็น apache ใช่ถูกต้อง. ผู้ใช้ "apache" เขียนไฟล์ (ไฟล์เซสชัน, ไฟล์มุมมองที่รวบรวม) ไปยังเซสชันและโฟลเดอร์มุมมอง ดังนั้นคุณควรให้ apache เขียนการอนุญาตไปยังโฟลเดอร์เหล่านี้ โดยค่าเริ่มต้น: SELinux บอกว่าโฟลเดอร์ / var / www ควรเป็นแบบอ่านอย่างเดียวโดย apache deamon

ดังนั้นสำหรับสิ่งนี้เราสามารถตั้งค่า selinux เป็น 0: setenforce 0

สิ่งนี้สามารถแก้ปัญหาชั่วคราวได้ แต่สิ่งนี้ทำให้ mysql ไม่ทำงาน ดังนั้นนี่ไม่ใช่ทางออกที่ดี

คุณสามารถตั้งค่าบริบทการอ่าน - เขียนไปยังโฟลเดอร์หน่วยเก็บข้อมูลด้วย: (อย่าลืม setenforce 1 เพื่อทดสอบ)

chcon -Rt httpd_sys_content_rw_t storage/

จากนั้นปัญหาของคุณจะได้รับการแก้ไข

  1. และอย่าลืมผู้แต่งอัปเดต php artisan cache: clear

    คำสั่งเหล่านี้จะเป็นประโยชน์หลังจากหรือก่อนหน้า

    ฉันหวังว่าคุณจะประหยัดเวลาของคุณ โชคดี. ฮัคเค่น


คุณพยายามโทรหาสคริปต์บรรทัดคำสั่งจากเว็บเซิร์ฟเวอร์หรือไม่ ฉันมีปัญหาเนื่องจากไม่ได้พิมพ์ผลลัพธ์ใด ๆ
Volatil3

0

ฉันมีการกำหนดค่าต่อไปนี้:

  • NGINX (ที่ทำงานของผู้ใช้: nginx)
  • PHP-FPM

และใช้การอนุญาตอย่างถูกต้องตามที่ @bgies แนะนำในคำตอบที่ยอมรับ ปัญหาในกรณีของฉันคือ php-fpm ที่กำหนดค่าผู้ใช้และกลุ่มซึ่งเดิมทีapacheแต่เดิม

หากคุณใช้ NGINX กับ php-fpm คุณควรเปิดไฟล์ปรับแต่งของ php-fpm:

nano /etc/php-fpm.d/www.config

และแทนที่userและgroupค่าของตัวเลือกด้วยหนึ่ง NGINX ถูกกำหนดค่าให้ทำงานกับ; ในกรณีของฉันทั้งคู่คือnginx:

... ; 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 ...

บันทึกและรีสตาร์ทเซอร์วิส nginx และ php-fpm


0

สำหรับนักพัฒนา Laravel ปัญหาเกี่ยวกับสารบบอาจเป็นความเจ็บปวดเล็กน้อย ในแอปพลิเคชันของฉันฉันกำลังสร้างไดเรกทอรีทันทีและย้ายไฟล์ไปยังไดเรกทอรีนี้ในสภาพแวดล้อมท้องถิ่นของฉันได้สำเร็จ จากนั้นบนเซิร์ฟเวอร์ฉันได้รับข้อผิดพลาดขณะย้ายไฟล์ไปยังไดเรกทอรีที่สร้างขึ้นใหม่

นี่คือสิ่งที่ฉันได้ทำและได้รับผลสำเร็จในตอนท้าย

  1. 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 {} \;
  2. chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
  3. ในขณะที่สร้างไดเรกทอรีใหม่ได้ทันทีฉันใช้คำสั่ง mkdir($save_path, 0755, true);

หลังจากทำการเปลี่ยนแปลงเหล่านั้นบนเซิร์ฟเวอร์ที่ใช้งานจริงฉันได้สร้างไดเรกทอรีใหม่และย้ายไฟล์ไปยังพวกเขา

สุดท้ายถ้าคุณใช้ File ซุ้มใน Laravel คุณสามารถทำสิ่งนี้: File::makeDirectory($save_path, 0755, true);


-1

ฉันพบวิธีแก้ปัญหาที่ดีกว่านี้ มันเกิดเพราะ php ทำงานเป็นผู้ใช้อื่นโดยค่าเริ่มต้น

ดังนั้นเพื่อแก้ไขสิ่งนี้ทำ

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

จากนั้นแก้ไข user = "put user that owns the directories" group = "put user that owns the directories"

แล้ว:

sudo systemctl reload php7.0-fpm


หากผู้เข้าชมหน้าเว็บจัดการเพื่อแยกออกจากเว็บเซิร์ฟเวอร์พวกเขาจะมีสิทธิ์การเข้าถึงของ "ผู้ใช้ที่เป็นเจ้าของไดเรกทอรี" หากผู้ใช้นั้นเป็นข้อมูล www มีจำนวนของความเสียหายที่ จำกัด ที่พวกเขาสามารถทำได้และนี่คือเหตุผลที่ apache ทำงานในฐานะผู้ใช้ที่ จำกัด หากผู้ใช้นั้นไม่ จำกัด พวกเขาสามารถทำความเสียหายได้มากขึ้น หากผู้ใช้นั้นมีสิทธิ์ sudo พวกเขาสามารถทำความเสียหายได้มากขึ้น
markdwhite

มันเป็นข้อตกลงเดียวกันกับอาปาเช่ BTW ฉันเรียกใช้ nignx เหมือนเด็กใหญ่ตอนนี้
เซซิล merrel aka bringrainfire
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.