ฉันมีเซิร์ฟเวอร์มาตรฐานที่ค่อนข้างใช้งาน 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 webmasters
sudo adduser $USER webmasters
sudo chown -R root:webmasters /var/www
sudo 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
ยังอย่างไรโดยไม่ต้องเพิ่มลงในกลุ่มนั้น