อะไรคือวิธีที่ดีที่สุดในการจัดการการอนุญาตสำหรับผู้ใช้ www-data ของ Apache 2 ใน / var / www


214

มีใครมีวิธีที่ดีในการจัดการไฟล์/var/wwwหรือไม่ เรากำลังใช้ชื่อตามโฮสต์เสมือนและใช้ Apache 2 เป็นwww ข้อมูล

เรามีผู้ใช้ & รูทปกติสองคน ดังนั้นเมื่อล้อเล่นกับไฟล์/var/wwwแทนที่จะต้อง ...

chown -R www-data:www-data

... ตลอดเวลามีวิธีจัดการที่ดีอย่างไร

คำถามเพิ่มเติม: วิธีการที่ไม่ยอมใครง่ายๆแล้วคุณจะไปได้รับอนุญาต?

อันนี้มีปัญหาเสมอในสภาพแวดล้อมการพัฒนาความร่วมมือ


คำตอบ:


206

ความพยายามที่จะขยายคำตอบของ @ Zoredache เนื่องจากฉันให้สิ่งนี้ด้วยตนเอง:

  • สร้างกลุ่มใหม่ (www-pub) และเพิ่มผู้ใช้ในกลุ่มนั้น

    groupadd www-pub

    usermod -a -G www-pub usera ## ต้องใช้ -a เพื่อผนวกเข้ากับกลุ่มที่มีอยู่

    usermod -a -G www-pub userb

    groups usera ## แสดงกลุ่มสำหรับผู้ใช้

  • เปลี่ยนความเป็นเจ้าของของทุกสิ่งภายใต้ / var / www เป็น root: www-pub

    chown -R root:www-pub /var/www ## -R สำหรับการเรียกซ้ำ

  • เปลี่ยนการอนุญาตของโฟลเดอร์ทั้งหมดเป็น 2775

    chmod 2775 /var/www ## 2 = ตั้ง id กลุ่ม, 7 = rwx สำหรับเจ้าของ (root), 7 = rwx สำหรับกลุ่ม (www-pub), 5 = rx สำหรับโลก (รวม apache ผู้ใช้ www-data)

    Set group ID ( SETGID ) บิต (2) ทำให้กลุ่ม (www-pub) ถูกคัดลอกไปยังไฟล์ / โฟลเดอร์ใหม่ทั้งหมดที่สร้างในโฟลเดอร์นั้น ตัวเลือกอื่น ๆ คือ SETUID (4) เพื่อคัดลอก id ผู้ใช้และ STICKY (1) ซึ่งฉันคิดว่าจะอนุญาตเฉพาะเจ้าของไฟล์เท่านั้น

    มี-Rตัวเลือกแบบเรียกซ้ำ แต่จะไม่แยกแยะระหว่างไฟล์และโฟลเดอร์ดังนั้นคุณต้องใช้ findเช่น:

    find /var/www -type d -exec chmod 2775 {} +

  • เปลี่ยนไฟล์ทั้งหมดเป็น 0664

    find /var/www -type f -exec chmod 0664 {} +

  • เปลี่ยน umask สำหรับผู้ใช้ของคุณเป็น 0002

    umask ควบคุมการอนุญาตการสร้างไฟล์เริ่มต้น 0002 หมายถึงไฟล์จะมี 664 และไดเรกทอรี 775 การตั้งค่านี้ (โดยการแก้ไขumaskบรรทัดที่ด้านล่าง/etc/profileในกรณีของฉัน) หมายถึงไฟล์ที่สร้างโดยผู้ใช้รายหนึ่งจะสามารถเขียนได้โดยผู้ใช้รายอื่นใน www- กลุ่มโดยไม่จำเป็นต้องchmodให้พวกเขา

ls -lการทดสอบทั้งหมดนี้โดยการสร้างไฟล์และไดเรกทอรีและยืนยันเจ้าของกลุ่มและสิทธิ์กับ

หมายเหตุ: คุณจะต้องออกจากระบบ / เพื่อให้การเปลี่ยนแปลงในกลุ่มของคุณมีผล!


6
@Tom ดีมากที่จะเห็นว่าคุณแนะนำให้ใช้findคำสั่งนี้ หนึ่งเคล็ดลับประสิทธิภาพเล็กน้อยที่ฉันจะให้ถ้าคุณมีไฟล์ / ไดเร็กตอรี่จำนวนมากและคุณกำลังใช้ GNU find คือใช้+แทน\;คำสั่งนั้นจะทำงานบนไฟล์หลาย ๆ ไฟล์เพราะ"มันเร็วกว่าที่จะรันคำสั่งในไฟล์มากที่สุดเท่าที่จะทำได้ ครั้งละมากกว่าหนึ่งครั้งต่อไฟล์การทำเช่นนี้จะช่วยประหยัดเวลาที่ต้องใช้ในการเริ่มต้นคำสั่งในแต่ละครั้ง " นอกจากนี้ยังง่ายต่อการพิมพ์เนื่องจากไม่ต้องการแบ็กสแลช
aculich

2
อัปเดตด้วยคำแนะนำของ @ aculich เพื่อใช้ + ไม่ \;
Tom

1
@SunnyJ ลองใช้ (โดยไม่ต้องใส่เครื่องหมายอัญประกาศ): "find / var / www -type f -exec chmod 0664 '{}' \ +" ลองดู มีช่องว่างระหว่าง '{}' และ \ +
Buttle Butkus

1
@ ทอม - วิธีที่จะทำลายมันลงขอบคุณ เพียงแค่ทราบ - ฉันคิดว่า "SETUID (4) เพื่อคัดลอกรหัสผู้ใช้" ตามที่รวมอยู่ในคำตอบของคุณผิด - SETUID จะถูกละเว้นเมื่อนำไปใช้กับไดเรกทอรีใน Linux / Unix - อ้างอิง
Yarin

1
ตกลงดังนั้นโดยuseraและuserbคุณหมายถึงwww-dataและftpuser? ฉันพบว่าสิ่งนี้สับสนมากเมื่อพูดถึงเรื่องใดwww-dataซึ่งเป็นคำถามเดิม นอกจากนี้จุด / ประโยชน์ของการตั้งค่าเจ้าของrootคืออะไร? เราควรตั้งไว้ที่ftpuser?
gskema

60

ฉันไม่แน่ใจว่าคุณต้องการกำหนดค่าการอนุญาตอย่างไร แต่อาจเป็นจุดเริ่มต้น อาจมีวิธีที่ดีกว่า ฉันสมมติว่าคุณต้องการให้ผู้ใช้ทั้งสองสามารถเปลี่ยนแปลงอะไรก็ได้ภายใต้ / var / www /

  • สร้างกลุ่มใหม่ (www-pub) และเพิ่มผู้ใช้ในกลุ่มนั้น
  • เปลี่ยนความเป็นเจ้าของของทุกสิ่งภายใต้ / var / www เป็น root: www-pub
  • เปลี่ยนการอนุญาตของโฟลเดอร์ทั้งหมดเป็น 2775
  • เปลี่ยนไฟล์ทั้งหมดเป็น 0664
  • เปลี่ยน umask สำหรับผู้ใช้ของคุณเป็น 0002

ซึ่งหมายความว่าไฟล์ใหม่ใด ๆ ที่สร้างโดยผู้ใช้ของคุณควรเป็นชื่อผู้ใช้: www-pub 0664 และไดเรกทอรีใด ๆ ที่สร้างขึ้นจะเป็นชื่อผู้ใช้: www-pub 2775. Apache จะเข้าถึงการอ่านทุกอย่างผ่านองค์ประกอบ 'ผู้ใช้อื่น' บิต SETGID ในไดเรกทอรีจะบังคับให้ไฟล์ทั้งหมดที่สร้างขึ้นเพื่อเป็นเจ้าของโดยกลุ่มที่เป็นเจ้าของโฟลเดอร์ จำเป็นต้องปรับ umask เพื่อให้แน่ใจว่าบิตการเขียนถูกตั้งค่าเพื่อให้ทุกคนในกลุ่มสามารถแก้ไขไฟล์ได้

สำหรับวิธีการไม่ยอมใครง่ายๆที่ฉันไปสิทธิ์ มันขึ้นอยู่กับเว็บไซต์ / เซิร์ฟเวอร์อย่างสมบูรณ์ หากมีบรรณาธิการเพียง 1-2 คนและฉันต้องการป้องกันพวกเขาจากการทำสิ่งที่ไม่ดีเกินไปฉันก็จะไปได้อย่างง่ายดาย ถ้าธุรกิจต้องการบางสิ่งที่ซับซ้อนกว่านี้ฉันก็จะสร้างบางอย่างที่ซับซ้อนกว่า


1
นอกจากเป็นไปได้ - ตั้งแคช / อัปโหลด dirs ที่จะต้องเขียนไปโดยเว็บเซิร์ฟเวอร์เพื่อ www-ข้อมูล: www ข้อมูลและ 775
gacrux

มันจะทำงานเช่นกันเพื่อเพิ่มผู้ใช้ไปยังกลุ่ม apache แทนที่จะใช้สิทธิ์ 'อื่น ๆ ' หรือไม่ หากสิ่งที่คุณกำลังทำคือการอัปโหลดไฟล์และไฟล์เหล่านั้นจะต้องสามารถอ่านได้โดย apache กลุ่มที่ 3 ดูเหมือนจะมีประโยชน์หากคุณต้องการแก้ไขไฟล์เหล่านั้น
Simurr

1
โอกาสใดที่คุณสามารถขยาย @Zoredache เล็กน้อยนี้ได้ ฉันใช้งานพื้นฐานของบิต rwx, chmod, chown, adduser, usermod แต่คุณได้สูญเสียฉันไปกับหลักแรกที่เพิ่มเข้ามาในการอนุญาตเลขฐานแปด, umasks และทุกอย่าง คำสั่งตัวอย่างบางคำสั่งที่แสดงวิธีการที่ระบุไว้ของคุณจะได้รับการชื่นชมอย่างมาก
ทอม

1
วิธีนี้ผู้ใช้ทุกคนสามารถเข้าถึงไฟล์ผู้ใช้อื่น ๆ ได้! ซึ่งหมายความว่า userA สามารถอ่าน config.php ของ userB ... ยกตัวอย่างเช่นหนังสือรับรอง mysql
drAlberT

1
การใช้ acl คุณสามารถจัดการกับทั้งความปลอดภัยและการทำงานร่วมกันได้ดี
drAlberT

39

ฉันคิดว่าคุณอาจพบว่า POSIX ACL (รายการควบคุมการเข้าถึง) มีประโยชน์ อนุญาตให้ใช้โมเดลการอนุญาตที่ละเอียดยิ่งขึ้นเปรียบเทียบกับผู้ใช้: กลุ่ม: โมเดลอื่น ฉันพบว่ามันง่ายต่อการรักษาไว้ในหัวของฉันเนื่องจากฉันสามารถชัดเจนมากขึ้นและยังสามารถกำหนดพฤติกรรม "เริ่มต้น" สำหรับสาขาของระบบไฟล์

ตัวอย่างเช่นคุณสามารถระบุสิทธิ์ของผู้ใช้แต่ละคนอย่างชัดเจน:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

หรือคุณสามารถทำได้โดยใช้กลุ่มที่แบ่งปันบางกลุ่ม:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

และบางทีคุณอาจต้องการให้ผู้ใช้ Apache เป็นแบบอ่านอย่างเดียว

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

หน้าคน:

เกี่ยวกับการสอน


2
นั่นคือวิธี ! +1
drAlberT

ACL สำหรับการชนะ +1 ... สำหรับรายละเอียดเพิ่มเติมโปรดดูserverfault.com/a/360120/41823
Yarin

1
ฉันสงสัยว่ามีข้อเสียประสิทธิภาพใด ๆ สำหรับ ACL เทียบกับการอนุญาตขั้นพื้นฐาน
Buttle Butkus

2
น่าเสียดายที่ ACL มักจะขาดหายไปจากการติดตั้ง / การกระจายแบบมาตรฐาน การคอมไพล์เคอร์เนลในทุก ๆ เซิร์ฟเวอร์ที่ฉันจัดการหรือแย่กว่านั้นคือการเปลี่ยนระบบไฟล์ในบางครั้ง นอกจากนี้คุณจะต้องระมัดระวังเป็นอย่างมากเมื่อทำการสำรองไฟล์โดยเฉพาะถ้าคุณเปลี่ยนเซิร์ฟเวอร์ ACL นั้นยอดเยี่ยม แต่การสนับสนุนในปัจจุบันนั้นต่ำมากจนฉันอยากจะแนะนำสำหรับผู้ที่ไม่สามารถควบคุมทุกสิ่งบนเซิร์ฟเวอร์และสภาพแวดล้อมได้อย่างเต็มที่ แต่ +1 สำหรับการชี้ ACL ออกมาในที่ที่เหมาะสมจริงๆ!
Ninj

คำตอบที่ดี +1; หมายเหตุเกี่ยวกับการเปลี่ยนกระบวนการ apache อ่าน / เขียนสิทธิ์ ( www-dataตัวอย่าง) เป็นแบบอ่านอย่างเดียวสำหรับทั้งไซต์ (ผ่าน setfacl หรือ chmod - หรือทั้งสองอย่าง) -> สิ่งนี้จะบล็อกการเขียนทั้งหมดอย่างชัดเจน (อัปโหลด / ปลั๊กอิน / โมดูลจากเบราว์เซอร์บน ตัวอย่าง CMS ส่วนใหญ่) ฉันเชื่อว่าคนที่เป็นที่นิยมจำนวนมากยังทดสอบการเข้าถึงการเขียนในระดับการอนุญาตของผู้ใช้ไม่ใช่ระดับกลุ่ม คุณยังคงสามารถอัปเดตได้ แต่ต้องใช้การอัปเดตด้วยตนเองและสิทธิ์ที่กำหนดเองใด ๆ สำหรับการเขียนโฟลเดอร์ (บันทึก / temp / uploads / ฯลฯ ) อ่านอย่างเดียวคือการรักษาความปลอดภัยที่ยอดเยี่ยมหากเว็บไซต์ของคุณใช้งานได้ .. โดยส่วนใหญ่ไม่ได้
bshea

10

คำถามนี้ถูกถามอีกครั้งและตามที่กล่าวถึงในเมตาแนวทางปฏิบัติที่ดีที่สุดในปัจจุบันให้แนวทางที่ดีกว่าที่มีในปี 2009 เมื่อมีการถาม คำตอบนี้พยายามที่จะให้แก้ปัญหาในปัจจุบันบางอย่างสำหรับการจัดการสภาพแวดล้อมการพัฒนาเว็บการทำงานร่วมกันอย่างปลอดภัย


สำหรับเว็บเซิร์ฟเวอร์ที่ปลอดภัยและการพัฒนาร่วมกันมีมากกว่าสิทธิ์ของไฟล์:

  • มีผู้ใช้ที่แยกต่างหากสำหรับทุกเว็บไซต์www-dataคือไม่ได้ให้บริการเว็บไซต์ทั้งหมดใช้ สิ่งนี้มีความสำคัญเนื่องจากในปัจจุบัน Apache ไม่ค่อยให้บริการไฟล์เนื้อหาคงที่เพียงอย่างเดียวแต่ใช้งานเว็บไซต์แบบไดนามิก คำตอบนี้มุ่งเน้นที่ PHP เนื่องจากเป็นภาษาที่ใช้กันทั่วไปในเว็บไซต์เซิร์ฟเวอร์ แต่มีหลักการเดียวกันกับที่ใช้กับภาษาอื่นเช่นกัน

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

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

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

    นักพัฒนาทุกคนสามารถสร้าง keypair และเก็บเป็นความลับของคีย์ส่วนตัว จากนั้นรหัสสาธารณะจะถูกเพิ่มลงใน~/.ssh/authorized_keysไฟล์สำหรับทุกบัญชีผู้ใช้เว็บไซต์ที่ผู้พัฒนาทำงานอยู่ สิ่งนี้มีข้อดีหลายประการสำหรับการจัดการรหัสผ่านและการเข้าสู่ระบบ:

    • นักพัฒนาทุกคนสามารถเข้าถึงเว็บไซต์จำนวนเท่าใดก็ได้โดยไม่มีภาระในการจดจำหรือจัดเก็บรหัสผ่านทั้งหมดที่เกี่ยวข้องกับการจัดเรียงตามผู้ใช้

    • ไม่จำเป็นต้องเปลี่ยน & แชร์รหัสผ่านทุกครั้งที่มีคนออกจาก บริษัท

    • คุณสามารถใช้รหัสผ่านที่รัดกุมมากหรือปิดใช้งานการเข้าสู่ระบบตามรหัสผ่านทั้งหมด

  • ใช้ PHP-FPM มันเป็นวิธีการปัจจุบันสำหรับการใช้งาน PHP ในฐานะผู้ใช้ สร้างพูลใหม่สำหรับผู้ใช้ทุกคนเช่นหนึ่งพูลต่อทุกไซต์ นี่คือสิ่งที่ดีที่สุดสำหรับทั้งความปลอดภัยและประสิทธิภาพเนื่องจากคุณสามารถระบุจำนวนทรัพยากรที่ไซต์เดียวสามารถใช้

    ดูเช่น NeverEndingSecurity ของใช้ PHP-FPM แยกผู้ใช้ / UID และกลุ่มลินุกซ์ มีบทเรียนเช่น HowtoForge's ใช้ PHP-FPM กับ Apache บน Ubuntu 16.04ที่ไม่ได้ใช้ PHP-FPM เพื่อเพิ่มความปลอดภัยผ่านการแยกผู้ใช้แนะนำให้ใช้ซ็อกเก็ต FPM เดียวทั่วเซิร์ฟเวอร์

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