ฉันมีเซิร์ฟเวอร์มาตรฐานที่ค่อนข้างใช้งาน Apache และ PHP www-dataแอปผมใช้สร้างไฟล์และเหล่านี้จะเป็นเจ้าของโดยผู้ใช้อาปาเช่ ไฟล์ที่ผมอัปโหลดผ่าน SFTP charlesrเป็นเจ้าของโดยผู้ใช้เป็นของตัวเอง ไฟล์ทั้งหมดเป็นส่วนหนึ่งของwww-dataกลุ่ม ปัญหาของฉันคือฉันไม่สามารถแก้ไขหรือเขียนทับไฟล์ใด ๆ ผ่าน SFTP ที่เป็นเจ้าของwww-dataแม้ว่าจะcharlesrเป็นส่วนหนึ่งของwww-dataกลุ่ม ฉันสามารถแก้ไขไฟล์ได้โดยไม่มีปัญหาผ่านเซสชัน SSH
ดังนั้นฉันไม่แน่ใจว่าจะทำอย่างไร ฉันจะให้สิทธิ์เซสชัน SFTP ของฉันเพื่อแก้ไขwww-dataไฟล์ที่เป็นเจ้าของได้อย่างไร
สำหรับพื้นหลังเล็กน้อยเหล่านี้คือโน้ตที่ฉันเขียนเองเมื่อติดตั้งเซิร์ฟเวอร์:
Now set up permissions on `/var/www` where your files are served from by
default:
$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www
Now log out and log in again to make the changes take hold.
The previous set of commands does the following:
1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.
จากนั้นฉันก็อธิบายตัวเองว่าการตั้งค่า SGID บิตหมายถึงอะไร (เช่นไฟล์ทั้งหมดที่สร้างขึ้น/var/wwwเป็นส่วนหนึ่งของwww-dataกลุ่มโดยอัตโนมัติ)
UPDATE
ดูเหมือนว่าปัญหาเกิดจากแอปเองหรือโดยเฉพาะอย่างยิ่งเฟรมเวิร์กแอปพลิเคชัน ( Kohana ) ที่ตั้งค่าไฟล์บางไฟล์ที่มันเขียนถึง 0644 (rw-r - r--); เช่นไม่ได้เขียนเป็นกลุ่ม สิ่งนี้ประกอบกับความจริงที่ว่าไฟล์นั้นเป็นของwww-dataฉันหมายความว่าฉันไม่สามารถแก้ไขไฟล์ผ่าน SFTP เมื่อลงชื่อเข้าใช้charlesrด้วย ฉันไม่แน่ใจว่าทำไมฉันสามารถแก้ไขไฟล์ผ่าน SSH ฉันเดาว่าฉันต้องใช้ sudo
นี่คือกลยุทธ์การอนุญาตที่ฉันใช้ในตอนนี้ด้วยความช่วยเหลือที่ไม่รู้จักเหน็ดเหนื่อยของ Marty Friedผู้ชี้ให้เห็นข้อบกพร่องในกลยุทธ์ก่อนหน้านี้ของฉันและยังช่วยฉันในการเดินขบวนในโลกของการอนุญาต Linux จนกระทั่งในที่สุดฉันก็รุกมัน ขอบคุณมาร์ตี้!
ภาพรวม
- ไฟล์และไดเรกทอรี
/var/wwwควรเป็นของroot:webmasters - devs ทั้งหมดควรเป็นสมาชิกของ
webmastersกลุ่ม - ไดเร็กทอรีทั้งหมดใน
/var/wwwควรตั้งค่าเป็น:2775หรือu=rwx,g=rwxs,o=rx(rwxrwx-rx) - ไฟล์ทั้งหมดใน
/var/wwwควรตั้งค่าเป็น:0664หรือug=rw,o=r(rw-rw-r--)
ต่อไปนี้ควรเป็นของwww-data:webmasters(เช่นเหล่านี้เป็นไดเรกทอรีที่ Apache ต้องสามารถเขียนถึง):
- แอพลิเคชัน / แคช
- แอพลิเคชัน / บันทึก
- อัปโหลด
- client_helpers / อัปโหลด
ทำอย่างไร
หากต้องการตั้งค่าการอนุญาต/var/wwwว่าไฟล์ของคุณให้บริการโดยค่าเริ่มต้น:
sudo addgroup webmasterssudo adduser $USER webmasterssudo chown -R root:webmasters /var/wwwsudo find /var/www -type f -exec chmod 664 {} \;sudo find /var/www -type d -exec chmod 775 {} \;sudo find /var/www -type d -exec chmod g+s {} \;sudo chown -R www-data:webmasters application/cache/[ ฯลฯ ... ]
ตอนนี้ออกจากระบบและลงชื่อเข้าใช้อีกครั้งเพื่อทำการเปลี่ยนแปลง
ชุดคำสั่งก่อนหน้าทำสิ่งต่อไปนี้:
- สร้างกลุ่มใหม่ที่เรียกว่า
webmasters; ผู้ใช้ทั้งหมดที่ต้องการสิทธิ์การเขียนเพื่อเข้าถึงไฟล์แอพจะถูกเพิ่มในกลุ่มนี้ - เพิ่มผู้ใช้ปัจจุบัน (
$USER) ลงในwebmastersกลุ่ม - เปลี่ยนเจ้าของของ
/var/wwwเป็นrootและกลุ่มเป็นwebmastersกลุ่ม - เพิ่ม664 สิทธิ์ (-rw-RW-r--)
/var/wwwไฟล์ทั้งหมดใน - เพิ่ม775 สิทธิ์ (drwxrwxr-x)
/var/wwwเพื่อไดเรกทอรีทั้งหมดใน - ตั้งค่าบิต SGID บน
/var/wwwและไดเรกทอรีทั้งหมดในนั้น จุดสุดท้ายนี้หมีอธิบายบางอย่าง โปรดทราบว่าคุณยังสามารถใส่ 2 ที่ด้านหน้า chmod octal ของคุณ (เช่น 2644) เพื่อทำสิ่งเดียวกัน - กำหนดให้เจ้าของ
www-data(ผู้ใช้ Apache)webmasterและกลุ่มของไดเรกทอรีจ่ายให้กับ สิ่งนี้ทำให้มั่นใจได้ว่าไดเรกทอรีนั้นสามารถเขียนได้โดย Apache และทุกคนในwebmastersกลุ่ม ทำเช่นเดียวกันสำหรับไดเรกทอรีอื่นทั้งหมดที่จำเป็นต้องเขียนได้
/var/wwwยังอย่างไรโดยไม่ต้องเพิ่มลงในกลุ่มนั้น