คำตอบส่วนใหญ่ที่นี่ไม่ได้เขียนโดยคำนึงถึงความปลอดภัย เป็นเรื่องดีที่ได้รับความรู้สึกว่าการวิ่งsudo
ในแต่ละครั้งนั้นไม่ฉลาด หากคุณพิมพ์ผิด (ตัวอย่างเช่นพื้นที่สีขาวเดียวในสถานที่ที่ไม่ถูกต้อง: sudo rm -rf / var/www/dir
ห้ามดำเนินการ! ) คุณอาจทิ้งระบบของคุณ
หมายเหตุ:เริ่มต้นด้วย Apache 2.4.7 / Ubuntu 14.04, /var/www
ถูกย้ายไปที่/var/www/html
ปรับคำสั่งในคำตอบนี้ตามลำดับ
ดู:
ความคิดที่ไม่ดี:
chmod 777
(sagarchalise) - อนุญาตให้ทุกคนที่มีสิทธิ์เข้าถึงระบบของคุณเขียนลงในไดเรกทอรีและไฟล์และทำให้ผู้บุกรุกสามารถรันโค้ดใด ๆ ภายใต้www-data
ผู้ใช้
chgrp -R www-data $HOME
(cob) - ใช้www-data
สำหรับอ่านหรือเขียนไฟล์ใด ๆ ในโฮมไดเร็กตอรี่ นี่ไม่ใช่การรักษากฎ Least Privilege ไว้ในใจ
chown -R $USER:$USER /var/www
(kv1dr) - หากโลกไม่ได้รับอนุญาตให้อ่าน/var/www
เว็บเซิร์ฟเวอร์ที่ทำงานภายใต้www-data
จะไม่สามารถอ่าน (ให้บริการ) ไฟล์ได้ หากไฟล์นั้นเป็นเอกสาร HTML ธรรมดาที่สาธารณชนเข้าถึงได้อาจเป็นปัญหาหากโลกไม่สามารถอ่านไฟล์ได้ แต่ถ้าไฟล์นั้นเป็นไฟล์ PHP ที่มีรหัสผ่านอยู่ก็เป็นได้
หมายเหตุ : ในโซลูชันด้านล่างฉันได้รับwww-data
สิทธิ์ในการเขียน อย่างไรก็ตาม/usr/share/doc/base-passwd/users-and-groups.txt.gz
รัฐ:
www ข้อมูล
เว็บเซิร์ฟเวอร์บางตัวทำงานเป็น www-data เนื้อหาเว็บไม่ควรเป็นของผู้ใช้รายนี้หรือเว็บเซิร์ฟเวอร์ที่ถูกบุกรุกจะสามารถเขียนเว็บไซต์ใหม่ได้ ข้อมูลที่เขียนโดยเว็บเซิร์ฟเวอร์จะเป็นของ www-data
ที่เป็นไปไม่ได้ให้สิทธิ์ในการเขียนไปยังwww-data
กลุ่ม www-data
จำเป็นต้องสามารถอ่านไฟล์ได้เท่านั้นเพื่อให้เว็บเซิร์ฟเวอร์สามารถให้บริการได้ กรณีเดียวที่www-data
จำเป็นต้องมีสิทธิ์ในการเขียนสำหรับไดเรกทอรีที่จัดเก็บการอัปโหลดและตำแหน่งอื่น ๆ ที่จำเป็นต้องเขียน
โซลูชันที่ 1
เพิ่มตัวคุณเองลงในwww-data
กลุ่มและตั้งค่าบิตบิตบน/var/www
ไดเรกทอรีเพื่อให้ไฟล์ที่สร้างขึ้นใหม่ทั้งหมดสืบทอดกลุ่มนี้เช่นกัน
sudo gpasswd -a "$USER" www-data
แก้ไขไฟล์ที่สร้างไว้ก่อนหน้า (สมมติว่าคุณเป็นผู้ใช้คนเดียว/var/www
):
sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;
(ยิ่งปลอดภัยยิ่งขึ้น: ใช้งาน640
หรือ2750
ด้วยตนเองchmod g+w file-or-dir
ที่จำเป็นต้องเขียนโดยเว็บเซิร์ฟเวอร์)
โซลูชันที่ 2
สร้าง symlink สำหรับแต่ละโครงการในโฮมไดเร็กตอรี่ของคุณ สมมติว่าโครงการของคุณตั้งอยู่ที่~/projects/foo
และคุณต้องการให้ตั้งอยู่ที่/var/www/foo
รัน:
sudo ln -sT ~/projects/foo /var/www/foo
หากโฮมไดเร็กตอรี่ของคุณไม่มีการตั้งค่าบิตรันไทม์ (ลงมา) สำหรับother
(เพื่อเหตุผลด้านความปลอดภัย), ให้เปลี่ยนกลุ่มของมันเป็นwww-data
, แต่ตั้งค่าบิตรันไทม์เท่านั้น (ไม่อ่าน / เขียน). ทำเช่นเดียวกันกับ~/projects
โฟลเดอร์เนื่องจากอาจมีโครงการอื่นที่ไม่ใช่ www (คุณไม่ต้องการsudo
หากคุณเพิ่มผู้ใช้ไปยังwww-data
กลุ่มก่อนหน้านี้)
sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects
ตั้งค่ากลุ่มเป็นwww-data
เปิด~/projects/foo
และอนุญาตให้เว็บเซิร์ฟเวอร์อ่านและเขียนไฟล์และไฟล์ + ไดเรกทอรีและลงสู่ไดเรกทอรี:
sudo chgrp www-data ~/projects/foo
find ~/projects/foo -type f -exec chmod 660 {} \;
find ~/projects/foo -type d -exec chmod 2770 {} \;
ปลอดภัยยิ่งขึ้น: ใช้ 640 และ 2750 โดยค่าเริ่มต้นและ chmod ไฟล์และไดเรกทอรีด้วยตนเองที่ผู้ใช้เว็บเซิร์ฟเวอร์ต้องเขียนได้ ควรเพิ่ม setgid บิตเฉพาะเมื่อคุณต้องการให้ทุกไฟล์ที่สร้างขึ้นใหม่~/projects/foo
สามารถเข้าถึงได้โดยกลุ่ม
จากนี้ไปคุณจะสามารถเข้าถึงเว็บไซต์ของคุณที่และแก้ไขไฟล์ในโครงการของคุณhttp://localhost/foo
~/projects/foo
ดูสิ่งนี้ด้วย