สิทธิ์ SFTP ถูกปฏิเสธในไฟล์ที่เป็นเจ้าของโดย www-data


23

ฉันมีเซิร์ฟเวอร์มาตรฐานที่ค่อนข้างใช้งาน 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ว่าไฟล์ของคุณให้บริการโดยค่าเริ่มต้น:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [ ฯลฯ ... ]

ตอนนี้ออกจากระบบและลงชื่อเข้าใช้อีกครั้งเพื่อทำการเปลี่ยนแปลง

ชุดคำสั่งก่อนหน้าทำสิ่งต่อไปนี้:

  1. สร้างกลุ่มใหม่ที่เรียกว่าwebmasters; ผู้ใช้ทั้งหมดที่ต้องการสิทธิ์การเขียนเพื่อเข้าถึงไฟล์แอพจะถูกเพิ่มในกลุ่มนี้
  2. เพิ่มผู้ใช้ปัจจุบัน ( $USER) ลงในwebmastersกลุ่ม
  3. เปลี่ยนเจ้าของของ/var/wwwเป็นrootและกลุ่มเป็นwebmastersกลุ่ม
  4. เพิ่ม664 สิทธิ์ (-rw-RW-r--) /var/wwwไฟล์ทั้งหมดใน
  5. เพิ่ม775 สิทธิ์ (drwxrwxr-x) /var/wwwเพื่อไดเรกทอรีทั้งหมดใน
  6. ตั้งค่าบิต SGID บน/var/wwwและไดเรกทอรีทั้งหมดในนั้น จุดสุดท้ายนี้หมีอธิบายบางอย่าง โปรดทราบว่าคุณยังสามารถใส่ 2 ที่ด้านหน้า chmod octal ของคุณ (เช่น 2644) เพื่อทำสิ่งเดียวกัน
  7. กำหนดให้เจ้าของwww-data(ผู้ใช้ Apache) webmasterและกลุ่มของไดเรกทอรีจ่ายให้กับ สิ่งนี้ทำให้มั่นใจได้ว่าไดเรกทอรีนั้นสามารถเขียนได้โดย Apache และทุกคนในwebmastersกลุ่ม ทำเช่นเดียวกันสำหรับไดเรกทอรีอื่นทั้งหมดที่จำเป็นต้องเขียนได้

คำตอบ:


10

Ubuntu.com มี serverguides ที่ดีงามเช่นคู่มือ Apache คุณได้รับขั้นตอนการทำงานของคุณจากที่ใด ฉันไม่เคยต้องไปเจอปัญหามากมายสำหรับเซิร์ฟเวอร์ใด ๆ ที่ฉันตั้งค่าถึงแม้ว่าฉันจะเปิดโอกาสให้ฉันไม่ได้ทำถูกต้อง - เช่นกันฉันยังไม่ได้ติดตั้งเซิร์ฟเวอร์สำหรับ อะไรก็ตามที่เป็นสาธารณะหรือมีขนาดใหญ่มากอาจมีช่องโหว่ที่ฉันไม่รู้

อย่างไรก็ตามฉันไม่จำเป็นต้องเป็นสมาชิกของกลุ่ม www-data และไม่มีไฟล์ต้นฉบับใน www ที่เป็นเจ้าของโดย www-data ความเข้าใจของฉันคือว่า Apache ใช้สำหรับไฟล์ของตัวเองเท่านั้นและมันจะไม่มีสิทธิ์เขียนไปยังไฟล์อื่น ๆ ของตัวเองเพราะในทางทฤษฎีแล้วไม่มีไฟล์สำคัญใด ๆ ที่จะอนุญาตให้ www-data มีสิทธิ์ในการเขียน ฉันเดาว่าไฟล์ที่ www-data เป็นเจ้าของจะให้สิทธิ์แบบอ่านอย่างเดียวแก่ทุกคนและไม่มีใครควรมีสิทธิ์เขียนลงไฟล์ แน่นอนว่าฉันอาจผิดทั้งหมดและถ้าฉันหวังว่าจะมีใครบางคนบอกฉันและชี้ให้ฉันไปที่เอกสารจริงที่อธิบายแตกต่างกัน (ไม่ใช่ฟอรัมบางแห่งที่มีผู้ใช้อินเทอร์เน็ตแบบสุ่มเช่นฉัน

บางทีฉันอาจจะพลาดบางสิ่ง แต่ปัญหาของคุณควรตรงไปตรงมา ผู้ใช้ที่เข้าสู่ระบบโดยใช้ sftp จำเป็นต้องเป็นสมาชิกของกลุ่ม www-data และไฟล์ที่คุณพยายามแก้ไขจะต้องมีสิทธิ์ในการเขียนสำหรับกลุ่ม www-data มันไม่สมเหตุสมผลสำหรับฉันที่คุณสามารถแก้ไขไฟล์โดยใช้ ssh แต่ไม่ใช้ sftp; คุณแน่ใจหรือว่าคุณกำลังเข้าสู่บัญชีเดียวกันสำหรับทั้งสอง ใน sftp คุณสามารถป้อนคำสั่งเช่น!groupsเพื่อแสดงรายการกลุ่มของคุณหรือ!whoamiเพื่อตรวจสอบชื่อล็อกอินที่คุณใช้ ผลลัพธ์ควรตรงกับสิ่งที่คุณเห็นโดยใช้ ssh (ด้วยคำสั่งเดียวกันลบเครื่องหมายอัศเจรีย์)

คุณควรจะสามารถใช้ chmod, chown, chgrp จาก sftp ได้หากคุณได้รับอนุญาต

อย่างไรก็ตามฉันคิดว่ารายการของคุณมีคำสั่งที่ไม่ดีอย่างน้อยหนึ่งคำ:

sudo chmod -R g+rw /var/www

สิ่งนี้ให้สิทธิ์การเขียนทั่วโลกแก่ทุกไฟล์และโฟลเดอร์ใน / var / www ฟังดูเหมือนความคิดที่ไม่ดี โดยปกติแล้วเฉพาะ root เท่านั้นที่มีสิทธิ์เขียนไปยังไดเร็กทอรีเหล่านี้ยกเว้นว่าบางคนจะต้องการสิทธิ์เพิ่มเติมโดยปกติจะเป็นเพียงไดเรกทอรีเดียวเท่านั้น

หมายเหตุ: นี่เป็นข้อผิดพลาดในส่วนของฉัน ขอบคุณ DonalLafferty ที่ชี้ให้เห็นว่ามันระบุ "g" ไม่ใช่ "a" ดังนั้นมันจะเปลี่ยนเฉพาะการอนุญาตของกลุ่ม ตาเก่าล้าของฉัน (หรือตัวอักษรที่ไม่ดี) ต้องอ่านเป็น "a"

แก้ไขเพื่อความกระจ่าง

โดยปกติแล้วไฟล์ที่สร้างโดย Apache จะอ่านได้อย่างเดียวสำหรับกลุ่ม www-data และผู้ใช้อื่นทั้งหมดเช่นเดียวกับไฟล์ที่เป็นเจ้าของรูทใน / var / www ดังนั้นจึงไม่มีเหตุผลที่จะทำให้ทุกคนเป็นสมาชิกของ www-data ปัญหาคือให้ทุกคนเข้าถึงการเขียนซึ่งเป็นกรณีที่แตกต่างกัน สิ่งนี้ควรทำโดยการทำให้ไดเรกทอรีเฉพาะพร้อมใช้งานในไซต์ของคุณและทำได้โดยใช้ chmod ไม่ว่าจะด้วย sudo เนื่องจากมันอาจเป็นเจ้าของโดย root หรือโดยการทำให้เจ้าของเป็นเจ้าของและไม่ใช้ sudo

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

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

แก้ไขเพิ่มเติม

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

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

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

นี่คือการตั้งค่าพื้นฐานทั้งหมดของ Linux ไม่ใช่ Apache จริงๆ Apache สนใจเฉพาะการเข้าถึงจากภายในเว็บเซิร์ฟเวอร์เท่านั้นและนั่นคือไฟล์ config ด้วยเหตุนี้ลิงก์เอกสาร Ubuntu ที่ฉันรวมอยู่ในโพสต์ของฉันจึงถือว่าเป็นแหล่งที่ดีกว่าวิกิสาธารณะ

อย่างไรก็ตาม O'Reilly Apache Cookbook กล่าวว่า "ไดเรกทอรีเอกสารเช่น htdocs, cgi-bin และไอคอนจะต้องมีการอนุญาตที่กำหนดไว้ในแบบที่เหมาะสมที่สุดสำหรับรูปแบบการพัฒนาของเว็บไซต์ของคุณโดยเฉพาะ แต่ภายใต้สถานการณ์ที่ไม่ควรมีไดเรกทอรีหรือไฟล์ใด ๆ ที่มีอยู่ในนั้นสามารถเขียนได้โดยผู้ใช้เว็บเซิร์ฟเวอร์ "

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


สวัสดี @ มาร์ตี้ผัดขอบคุณสำหรับคำตอบมันทำให้ฉันมีความลองมากมาย เรื่อง คำถามของคุณ. ฉันรวบรวมข้อมูลจากแหล่งต่าง ๆ (ดังนั้นทำไมฉันจึงเขียนลงในคู่มือการใช้งานของตัวเอง) และจำแหล่งที่แน่นอนไม่ได้ แม้ว่าฉันจะไม่ได้ใช้แหล่งข้อมูลเฉพาะนี้(โซลูชันที่ 1) (ฉันเพิ่งค้นพบ) มันให้เหตุผลที่ดีสำหรับการตัดสินใจของฉัน ใน Apache แนะนำคุณพูดถึงมันแนะนำให้สร้างกลุ่มที่เรียกว่า 'ผู้ดูแลเว็บ' แต่ถ้าฉันทำอย่างนั้น Apache จะเขียนไป/var/wwwยังอย่างไรโดยไม่ต้องเพิ่มลงในกลุ่มนั้น
Charles Roper

และฉันไม่จำเป็นต้องให้ผู้ใช้งานอื่นเข้าถึง/var/wwwดังนั้นฉันคิดว่าให้เข้าถึงกลุ่มwww-dataและทำให้ทุกคนเป็นสมาชิกของกลุ่มที่จะเป็นทางออกที่ดี ตอนนี้ฉันเห็นได้ว่าปัญหาของ Apache ที่สามารถเขียนทับไฟล์ใด ๆในนั้นได้ เนื่องจากมีเพียง 2 devs (ซึ่งรวมถึงตัวฉันเอง) ที่สามารถเข้าถึงรหัสได้จึงค่อนข้างปลอดภัยในระยะสั้น
Charles Roper

1
ขอบคุณมาร์ตี้ ส่วนนี้จากตำราอาหาร Apache ทำให้ฉันหัวเราะ: "คุณควรระวังว่าถ้าคุณขอให้คน 12 คนหาวิธีที่ถูกต้องในการตั้งค่าการอนุญาตไฟล์บนเซิร์ฟเวอร์ Apache ของคุณคุณจะได้คำตอบที่แตกต่างกันนับสิบข้อ" คุณให้ทุกสิ่งกับฉันมากที่สุดที่ฉันต้องทำให้ก้าวหน้าในตอนนี้ ขอบคุณมากสำหรับเวลาของคุณ :-)
Charles Roper

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

1
AFAIK, sudo chmod -R g + rw / var / www ให้การเข้าถึงแบบ 'กลุ่ม' ใช้ 'a + rw' สำหรับการเข้าถึงทั่วโลก
Donal Lafferty

7

chownผมสังเกตเห็นว่าคุณไม่ได้ใช้

หากต้องการตั้งค่าความเป็นเจ้าของไฟล์ / โฟลเดอร์อย่างถูกต้องคุณสามารถตั้งค่าไดเรกทอรีทั้งหมดด้วยวิธีนี้: chown -R www-data:www-data

ชุดนี้เป็นเจ้าของกลุ่มwww-dataและผู้ใช้www-data

นอกจากนี้คุณสามารถทำเช่นนี้เป็นการแก้ปัญหาชั่วคราว:

chmod 777 /var/data/<filename> หรือ chmod 777 /var/data/<foldername>

แก้ไขไฟล์ตามต้องการจากนั้น

chmod 644 /var/data/<filename> หรือ chmod 755 /var/data/<foldername>

ระวังการใช้สวิตช์ "-R" เนื่องจากจะเปลี่ยนการอนุญาตของไฟล์ย่อยและโฟลเดอร์ทั้งหมดด้วย

664 เป็นสิทธิ์การใช้งานไฟล์มาตรฐานของ Apache และการอนุญาตของโฟลเดอร์มาตรฐาน 755

หวังว่าจะช่วย :)

ดาว


สวัสดีขอบคุณที่สละเวลาตอบมันเป็นที่ชื่นชมมาก อย่างไรก็ตามมันไม่ได้ช่วยจริงๆ การ Chowning ไฟล์ทำให้พวกมันทั้งหมดไม่สามารถแก้ไขได้เมื่อใช้ SFTP (ตรงข้ามกับสิ่งที่ฉันเป็น! ฉันไม่สามารถใช้วิธีแก้ปัญหา chmod ได้จริงๆเพราะก) ฉันไม่มีสิทธิ์ใช้งาน chmod ใน SFTP; b) ฉันไม่ต้องการเข้าสู่ระบบผ่านทาง SSH เปลี่ยนการอนุญาตทำ SFTPing เปลี่ยนกลับ ฯลฯ และ c) บางไฟล์มีสิทธิ์ที่แตกต่างกันสำหรับเหตุผลด้านความปลอดภัยดังนั้นฉันจึงไม่สามารถ chmod en masse ได้
Charles Roper

คือ/var/dataอะไร นอกจากนี้คุณแนะนำไดเรกทอรีใดให้เขาใช้คำสั่งchown -R www-data:www-data? /var/wwwหวังว่าจะไม่
Marty ผัด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.