เมื่อตัดสินใจว่าจะใช้สิทธิ์ใดคุณต้องรู้ว่าผู้ใช้ของคุณคือใครและต้องการอะไร เว็บเซิร์ฟเวอร์โต้ตอบกับผู้ใช้สองประเภท
ผู้ใช้ที่ผ่านการรับรองความถูกต้องมีบัญชีผู้ใช้บนเซิร์ฟเวอร์และสามารถให้สิทธิ์พิเศษ ซึ่งมักจะรวมถึงผู้ดูแลระบบนักพัฒนาและบัญชีบริการ พวกเขามักจะทำการเปลี่ยนแปลงระบบโดยใช้ SSH หรือ SFTP
ผู้ใช้ที่ไม่ระบุชื่อคือผู้เข้าชมเว็บไซต์ของคุณ แม้ว่าพวกเขาจะไม่มีสิทธิ์ในการเข้าถึงไฟล์โดยตรง แต่พวกเขาสามารถร้องขอเว็บเพจและเว็บเซิร์ฟเวอร์ทำหน้าที่แทน คุณสามารถ จำกัด การเข้าถึงของผู้ใช้ที่ไม่ระบุชื่อด้วยความระมัดระวังเกี่ยวกับสิทธิ์ที่กระบวนการเซิร์ฟเวอร์เว็บมี ในลีนุกซ์หลายรุ่น, Apache ทำงานเป็นwww-data
ผู้ใช้ แต่อาจแตกต่างกันได้ ใช้ps aux | grep httpd
หรือps aux | grep apache
เพื่อดูว่า Apache ใช้งานอะไรในระบบของคุณ
หมายเหตุเกี่ยวกับการอนุญาต linux
Linux และระบบที่สอดคล้องกับ POSIX อื่น ๆ ใช้สิทธิ์ unix แบบดั้งเดิม มีบทความที่ยอดเยี่ยมเกี่ยวกับ Wikipedia เกี่ยวกับการอนุญาตของระบบไฟล์ดังนั้นฉันจะไม่ทำซ้ำทุกอย่างที่นี่ แต่มีบางสิ่งที่คุณควรระวัง
สคริปต์การตีความบิตเรียกใช้ (เช่น Ruby, PHP) ทำงานได้ดีโดยไม่ได้รับอนุญาตให้ดำเนินการ ไบนารีและสคริปต์เชลล์เท่านั้นที่ต้องใช้บิตเรียกใช้งาน เพื่อสำรวจ (ป้อน) ไดเรกทอรีคุณต้องมีสิทธิ์ดำเนินการในไดเรกทอรีนั้น เว็บเซิร์ฟเวอร์ต้องการการอนุญาตนี้เพื่อแสดงรายการไดเรกทอรีหรือให้บริการไฟล์ใด ๆ ที่อยู่ภายใน
ค่าเริ่มต้นการอนุญาตไฟล์ใหม่
เมื่อไฟล์ถูกสร้างขึ้นโดยปกติจะสืบทอดรหัสกลุ่มของผู้ที่สร้างไฟล์ขึ้นมา แต่บางครั้งคุณต้องการให้ไฟล์ใหม่ได้รับรหัสกลุ่มของโฟลเดอร์ที่สร้างขึ้นดังนั้นคุณจะเปิดใช้งานบิต SGID ในโฟลเดอร์หลัก
ค่าอนุญาตเริ่มต้นขึ้นอยู่กับ umask ของคุณ umask ลบการอนุญาตจากไฟล์ที่สร้างขึ้นใหม่ดังนั้นค่าทั่วไปของ 022 ส่งผลให้ไฟล์ถูกสร้างด้วย 755 เมื่อทำงานร่วมกับกลุ่มจะมีประโยชน์ในการเปลี่ยน umask ของคุณเป็น 002 เพื่อให้ไฟล์ที่คุณสร้างสามารถแก้ไขได้โดยสมาชิกกลุ่ม และถ้าคุณต้องการกำหนดสิทธิ์ของไฟล์ที่อัพโหลดคุณต้องเปลี่ยน umask สำหรับ apache หรือเรียกใช้ chmod หลังจากอัปโหลดไฟล์แล้ว
ปัญหากับ 777
เมื่อคุณchmod 777
เว็บไซต์ของคุณคุณไม่มีความปลอดภัยใด ๆ ผู้ใช้ในระบบสามารถเปลี่ยนแปลงหรือลบไฟล์ใด ๆ ในเว็บไซต์ของคุณ แต่ยิ่งจริงจังโปรดจำไว้ว่าเว็บเซิร์ฟเวอร์ทำหน้าที่ในนามของผู้เข้าชมเว็บไซต์ของคุณและตอนนี้เว็บเซิร์ฟเวอร์สามารถเปลี่ยนไฟล์เดียวกับที่ใช้งานอยู่ หากมีช่องโหว่การเขียนโปรแกรมในเว็บไซต์ของคุณพวกเขาสามารถใช้ประโยชน์ในการ deface เว็บไซต์ของคุณแทรกการโจมตีแบบฟิชชิงหรือขโมยข้อมูลจากเซิร์ฟเวอร์ของคุณโดยที่คุณไม่เคยรู้มาก่อน
นอกจากนี้หากเซิร์ฟเวอร์ของคุณทำงานบนพอร์ตที่รู้จักกันดี (ซึ่งควรป้องกันผู้ใช้ที่ไม่ใช่รูทจากการรับบริการการฟังที่เข้าถึงได้ทั่วโลก) นั่นหมายความว่าเซิร์ฟเวอร์ของคุณจะต้องเริ่มต้นด้วยรูท (แม้ว่าเซิร์ฟเวอร์ใด ๆ ไปยังบัญชีที่มีอภิสิทธิ์น้อยกว่าเมื่อพอร์ตถูกผูกไว้) กล่าวอีกนัยหนึ่งหากคุณใช้งานเว็บเซิร์ฟเวอร์ที่ปฏิบัติการหลักเป็นส่วนหนึ่งของการควบคุมเวอร์ชัน (เช่นแอป CGI) ออกจากการอนุญาต (หรือสำหรับเรื่องนั้นการอนุญาตของไดเรกทอรีที่มีอยู่เนื่องจากผู้ใช้สามารถเปลี่ยนชื่อได้ ปฏิบัติการ) ที่ 777 ช่วยให้การใด ๆให้ผู้ใช้สามารถทำงานใด ๆที่ปฏิบัติการเป็นราก
กำหนดข้อกำหนด
- นักพัฒนาต้องการการเข้าถึงแบบอ่าน / เขียนไฟล์เพื่อให้สามารถอัปเดตเว็บไซต์ได้
- นักพัฒนาต้องการอ่าน / เขียน / ดำเนินการในไดเรกทอรีเพื่อให้พวกเขาสามารถเรียกดูรอบ ๆ
- Apache ต้องการการเข้าถึงไฟล์และสคริปต์ที่แปลแล้ว
- Apache ต้องการการเข้าถึงแบบอ่าน / เรียกใช้ในไดเรกทอรีที่ให้บริการ
- Apache ต้องการเข้าถึงการอ่าน / เขียน / เรียกใช้ไดเรกทอรีสำหรับเนื้อหาที่อัปโหลด
ปรับปรุงโดยผู้ใช้คนเดียว
หากผู้ใช้เพียงรายเดียวเท่านั้นที่รับผิดชอบในการดูแลไซต์ให้ตั้งค่าเป็นเจ้าของผู้ใช้ในไดเรกทอรีเว็บไซต์และให้สิทธิ์ผู้ใช้แบบเต็ม rwx Apache ยังต้องการการเข้าถึงเพื่อให้สามารถให้บริการไฟล์ได้ดังนั้นให้ตั้งค่า www-data เป็นเจ้าของกลุ่มและให้สิทธิ์กลุ่ม rx
ในกรณีของคุณอีฟซึ่งมีชื่อผู้ใช้อาจeve
เป็นผู้ใช้รายเดียวที่ดูแลcontoso.com
:
chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
หากคุณมีโฟลเดอร์ที่ต้องเขียนโดย Apache คุณสามารถแก้ไขค่าสิทธิ์สำหรับเจ้าของกลุ่มเพื่อให้ข้อมูล www มีการเข้าถึงการเขียน
chmod g+w uploads
ls -l
drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
ประโยชน์ของการกำหนดค่านี้คือมันจะกลายเป็นยากขึ้น (แต่ไม่ใช่เป็นไปไม่ได้ *) สำหรับผู้ใช้อื่น ๆ ในระบบที่จะสอดแนมเนื่องจากมีเพียงผู้ใช้และเจ้าของกลุ่มเท่านั้นที่สามารถเรียกดูไดเรกทอรีเว็บไซต์ของคุณ สิ่งนี้มีประโยชน์หากคุณมีข้อมูลลับในไฟล์กำหนดค่าของคุณ ระวังเกี่ยวกับ umask ของคุณ! หากคุณสร้างไฟล์ใหม่ที่นี่ค่าอนุญาตอาจเป็นค่าเริ่มต้นที่ 755 คุณสามารถเรียกใช้umask 027
เพื่อให้ไฟล์ใหม่เริ่มต้นที่ 640 ( rw- r-- ---
)
ดูแลโดยกลุ่มผู้ใช้
หากผู้ใช้มากกว่าหนึ่งรายมีหน้าที่รับผิดชอบในการดูแลไซต์คุณจะต้องสร้างกลุ่มเพื่อใช้ในการกำหนดสิทธิ์ เป็นวิธีปฏิบัติที่ดีในการสร้างกลุ่มแยกสำหรับแต่ละเว็บไซต์และตั้งชื่อกลุ่มหลังจากเว็บไซต์นั้น
groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
ในตัวอย่างก่อนหน้านี้เราใช้เจ้าของกลุ่มเพื่อมอบสิทธิ์ให้ Apache แต่ตอนนี้ใช้สำหรับกลุ่มนักพัฒนา เนื่องจากเจ้าของผู้ใช้ไม่มีประโยชน์กับเราอีกต่อไปการตั้งค่าให้รูทเป็นวิธีที่ง่ายเพื่อให้แน่ใจว่าไม่มีการรั่วไหลของสิทธิ์ Apache ยังต้องการการเข้าถึงดังนั้นเราจึงให้สิทธิ์การอ่านแก่ผู้อื่นในโลก
chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
หากคุณมีโฟลเดอร์ที่ต้องเขียนโดย Apache คุณสามารถสร้าง Apache ได้ทั้งเจ้าของผู้ใช้หรือเจ้าของกลุ่ม ไม่ว่าจะด้วยวิธีใดก็จะสามารถเข้าถึงได้ทั้งหมดตามที่ต้องการ โดยส่วนตัวแล้วฉันชอบที่จะทำให้มันเป็นเจ้าของผู้ใช้เพื่อให้นักพัฒนายังสามารถเรียกดูและแก้ไขเนื้อหาของโฟลเดอร์ที่อัปโหลด
chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
แม้ว่านี่จะเป็นวิธีการทั่วไป แต่ก็มีข้อเสียคือ เนื่องจากผู้ใช้ทุกคนในระบบมีสิทธิ์เหมือนกันกับเว็บไซต์ของคุณเช่นเดียวกับ Apache ทำให้ผู้ใช้รายอื่นสามารถเรียกดูไซต์ของคุณและอ่านไฟล์ที่อาจมีข้อมูลลับเช่นไฟล์กำหนดค่าของคุณ
คุณสามารถมีเค้กของคุณและกินมันด้วย
นี้สามารถปรับปรุงเพิ่มเติมเมื่อ มันถูกกฎหมายอย่างสมบูรณ์สำหรับเจ้าของที่จะมีสิทธิ์น้อยกว่ากลุ่มดังนั้นแทนที่จะเสียเจ้าของผู้ใช้โดยการกำหนดให้กับรูทเราสามารถทำให้ Apache เป็นเจ้าของผู้ใช้ในไดเรกทอรีและไฟล์ในเว็บไซต์ของคุณ นี่คือการกลับรายการสถานการณ์ผู้ดูแลเดี่ยว แต่มันทำงานได้ดีเท่า ๆ กัน
chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
หากคุณมีโฟลเดอร์ที่ต้องเขียนโดย Apache คุณสามารถแก้ไขค่าสิทธิ์สำหรับเจ้าของผู้ใช้เพื่อให้ข้อมูล www มีการเข้าถึงการเขียน
chmod u+w uploads
ls -l
drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
สิ่งหนึ่งที่ต้องระวังเกี่ยวกับโซลูชันนี้คือเจ้าของผู้ใช้ไฟล์ใหม่จะจับคู่กับผู้สร้างแทนที่จะตั้งเป็น www-data ดังนั้นไฟล์ใหม่ที่คุณสร้างจะไม่สามารถอ่านได้โดย Apache จนกว่าคุณจะ chown พวกเขา
* การแยกสิทธิ์ Apache
ฉันได้กล่าวไปแล้วก่อนหน้านี้ว่าผู้ใช้รายอื่นสามารถสอดแนมไปรอบ ๆ เว็บไซต์ของคุณได้ไม่ว่าคุณจะใช้สิทธิ์ประเภทใด ตามค่าเริ่มต้นกระบวนการ Apache ทั้งหมดจะทำงานในลักษณะเดียวกับผู้ใช้ www-data ดังนั้นกระบวนการ Apache ใด ๆ จึงสามารถอ่านไฟล์จากเว็บไซต์อื่น ๆ ทั้งหมดที่กำหนดค่าบนเซิร์ฟเวอร์เดียวกันและบางครั้งก็ทำการเปลี่ยนแปลง ผู้ใช้ที่สามารถรับ Apache เพื่อเรียกใช้สคริปต์สามารถเข้าถึงแบบเดียวกับที่ Apache เองมี
เพื่อต่อสู้กับปัญหานี้มีหลายวิธีในการแยกสิทธิพิเศษใน Apache อย่างไรก็ตามแต่ละวิธีมาพร้อมกับประสิทธิภาพและข้อบกพร่องด้านความปลอดภัยที่หลากหลาย ในความคิดของฉันเว็บไซต์ใด ๆ ที่มีข้อกำหนดด้านความปลอดภัยที่สูงกว่าควรรันบนเซิร์ฟเวอร์เฉพาะแทนที่จะใช้ VirtualHosts บนเซิร์ฟเวอร์ที่ใช้ร่วมกัน
ข้อควรพิจารณาเพิ่มเติม
ฉันไม่ได้พูดถึงมันมาก่อน แต่โดยปกติแล้วมันเป็นการปฏิบัติที่ไม่ดีที่จะให้นักพัฒนาแก้ไขเว็บไซต์โดยตรง สำหรับไซต์ที่มีขนาดใหญ่กว่าคุณจะมีระบบการปล่อยบางอย่างที่ปรับปรุงเว็บเซิร์ฟเวอร์จากเนื้อหาของระบบควบคุมเวอร์ชัน วิธีการดูแลรักษาแบบครั้งเดียวน่าจะเหมาะ แต่แทนที่จะเป็นคนที่คุณมีซอฟต์แวร์อัตโนมัติ
หากเว็บไซต์ของคุณอนุญาตการอัปโหลดที่ไม่จำเป็นต้องให้บริการการอัปโหลดเหล่านั้นควรเก็บไว้ที่อื่นนอกรูทเว็บ มิฉะนั้นคุณอาจพบว่าผู้คนกำลังดาวน์โหลดไฟล์ที่ตั้งใจจะเป็นความลับ ตัวอย่างเช่นถ้าคุณอนุญาตให้นักเรียนส่งงานที่มอบหมายพวกเขาควรถูกบันทึกไว้ในไดเรกทอรีที่ Apache ไม่ได้ให้บริการ นี่เป็นวิธีที่ดีสำหรับไฟล์กำหนดค่าที่มีความลับ
สำหรับเว็บไซต์ที่มีความต้องการที่ซับซ้อนมากขึ้นคุณอาจต้องการที่จะมองเข้าไปในการใช้งานของรายการควบคุมการเข้าถึง สิ่งเหล่านี้ช่วยให้การควบคุมสิทธิพิเศษมีความซับซ้อนยิ่งขึ้น
หากเว็บไซต์ของคุณมีข้อกำหนดที่ซับซ้อนคุณอาจต้องการเขียนสคริปต์ที่ตั้งค่าการอนุญาตทั้งหมด ทดสอบอย่างละเอียดจากนั้นให้ปลอดภัย มันอาจมีค่าน้ำหนักเป็นทองคำหากคุณเคยพบว่าตัวเองต้องการสร้างเว็บไซต์ของคุณใหม่ด้วยเหตุผลบางประการ