ผู้ใช้ควร apache และ PHP ทำงานในลักษณะใด? ไฟล์ / var / www ควรมีการอนุญาตอะไรบ้าง


41

ฉันเพิ่งหมุนกล่อง Ubuntu 11.10 แล้ววิ่งapt-get install apache2 php5ไปติดตั้ง apache2 และ PHP 5 บนกล่อง ตอนนี้มันทำงานเป็น "เว็บเซิร์ฟเวอร์" และโหลด "It Works!" หน้า. ตอนนี้ฉันพยายามกระชับความปลอดภัยและฉันมีคำถามต่อไปนี้เกี่ยวกับเว็บเซิร์ฟเวอร์ linux:

  1. ใครควรใช้ apache เป็น?
  2. ผู้ใช้นี้ควรอยู่ในกลุ่มใด
  3. แพคเกจใดที่สามารถทำให้ PHP (และ Apache?) ทำงานเป็นเจ้าของไฟล์ได้ (เช่นบนโฮสต์เว็บที่ใช้ร่วมกัน) ฉันควรใช้แพ็คเกจเหล่านี้หรือไม่ ง่ายต่อการรักษาบนระบบขนาดเล็กหรือไม่?
  4. สิทธิ์เริ่มต้นควรเป็นอย่างไรสำหรับไฟล์และโฟลเดอร์ที่ให้บริการในเว็บโดยที่ apache ทำงานเป็นwww-data? สำหรับ apache / php ที่ทำงานในฐานะผู้ใช้?

ฉันได้ทำสิ่งต่าง ๆ ต่อไปนี้เพื่อตรวจสอบการตั้งค่าเริ่มต้น:

โครงสร้างไฟล์

เมื่อฉันcd /และทำls -alรายการเนื้อหาฉันเห็น/var:

drwxr-xr-x 13 root root  4096 2012-02-04 20:47 var/

ถ้าฉันcdเป็นvarและls -alฉันเห็น:

drwxr-xr-x  2 root root  4096 2012-02-04 20:47 www/

ในที่สุด/var/wwwฉันเห็น:

drwxr-xr-x  2 root root 4096 2012-02-04 20:47 ./
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 ../
-rw-r--r--  1 root root  177 2012-02-04 20:47 index.html

กุญแจสำคัญของฉันคือจนถึงทุกอย่างของไฟล์เหล่านี้root:rootไฟล์มีสิทธิ์ 644 และไดเรกทอรีมีสิทธิ์ 755

สิทธิ์ของ Apache

ถ้าฉันสร้างไฟล์เป็น root /var/www/test.phpด้วยเนื้อหา:

<?php echo shell_exec('whoami');

และโหลดไฟล์นั้นลงในเบราว์เซอร์ที่จะบอกฉันwww-dataซึ่งเป็นเช่นเดียวกับใน/etc/apache2/envvarsไฟล์:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

ถ้าฉันps aux | grep -i apacheฉันเห็นต่อไปนี้:

root      1916  1.2 104664  7488 Ss   20:47 /usr/sbin/apache2 -k start
www-data  1920  0.8 105144  5436 S    20:47 /usr/sbin/apache2 -k start
www-data  1921  1.0 105144  6312 S    20:47 /usr/sbin/apache2 -k start
www-data  1922  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1923  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1924  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1925  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start

ดังนั้น apache ที่ทำงานเป็นใคร ดูเหมือนว่ากระบวนการแรกrootอาจจะมาจาก/etc/init.d/apacheสคริปต์เมื่อระบบเริ่มทำงานและอีกกระบวนการหนึ่งwww-dataเริ่มจากครั้งแรก ถูกต้องไหม

ต่อไปถ้าฉันพิมพ์ฉันgroups www-dataก็จะเห็นwww-data : www-data- ดังนั้นจึงดูเหมือนอยู่ในwww-dataกลุ่มเท่านั้น ฉันเดาว่านี่เป็นมาตรฐานการปฏิบัติเช่นกัน

แชร์โฮสติ้งและความปลอดภัย

ดังนั้นหากฉันเข้าใจสิ่งต่าง ๆ อย่างถูกต้องหาก apache ทำงานเป็นwww-dataและฉันต้องการให้ apache สามารถอ่านไดเรกทอรีได้xบิตต้องถูกตั้งค่าสำหรับกลุ่มโลก (อื่น ๆ ) ( o+x) และต้องตั้งค่าบนพาเรนต์ทั้งหมดด้วย ไดเรกทอรีทุกทางจนถึงห่วงโซ่ ( www, var) และถ้าฉันต้องการให้อาปาเช่สามารถอ่านจากไฟล์ได้o+rจำเป็นต้องตั้งค่าบิต

น่าเสียดายที่ฉันเชื่อว่านี่เป็นการแนะนำช่องโหว่ด้านความปลอดภัยสำหรับแอปพลิเคชั่นหลายตัวและ / หรือผู้ใช้หลายคนในกล่อง linux เดียวกัน: ไฟล์เว็บทั้งหมดต้องสามารถอ่านได้ทั่วโลกดังนั้นพวกเขาจึงสามารถเข้าถึงได้โดยแอปพลิเคชันอื่น ๆ หากแอปพลิเคชันหนึ่งที่ติดตั้งในระบบมีช่องโหว่ด้านความปลอดภัยที่อนุญาตให้ผู้ใช้ป้อนข้อมูลดิบและไม่ผ่านการตรวจสอบซึ่งถูกดำเนินการโดย PHP ผู้โจมตีระยะไกลสามารถเรียกดูไฟล์อื่น ๆ ทั้งหมดบนระบบเว็บที่โลกอ่านได้ ในทำนองเดียวกันหากกล่องมีผู้ใช้หลายคนและผู้ใช้รู้จักเส้นทางของไฟล์เว็บของผู้ใช้คนอื่นเขาก็สามารถอ่านเนื้อหาไฟล์ (และดูสิ่งที่ละเอียดอ่อนเช่นสตริงการเชื่อมต่อฐานข้อมูล ฯลฯ )

ฉันได้ยินสองแพคเกจsuphpและการphpsuexecจัดการกับการอนุญาตให้ใช้ไฟล์ของผู้ใช้ "เป็นพวกเขา" ในระบบที่ใช้ร่วมกัน หนึ่งในสิ่งนี้คือมันช่วยให้เว็บแอปพลิเคชั่น (เช่น Wordpress) สามารถสร้างและแก้ไขไฟล์ได้ - มีประโยชน์มากสำหรับการเพิ่มธีมปลั๊กอินและซอฟต์แวร์อัพเกรด แน่นอนว่ามันอาจจะปลอดภัยกว่าในการทำสิ่งเหล่านี้ด้วยตนเอง แต่การประนีประนอมอาจจะทำได้ด้วยแพ็คเกจใดแพ็คเกจหนึ่งที่กล่าวถึงข้างต้น หรืออาจจะใช้chownเพื่อทำให้กลุ่มไดเรกทอรี wordpress เป็นของwww-dataและตั้งค่าบิตเหนียวในกลุ่ม ( g+s)?

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

กลับไปที่คำถาม

  1. ใครควรใช้ apache เป็น?
  2. ผู้ใช้นี้ควรอยู่ในกลุ่มใด
  3. แพคเกจใดที่สามารถทำให้ PHP (และ Apache?) ทำงานเป็นเจ้าของไฟล์ได้ (เช่นบนโฮสต์เว็บที่ใช้ร่วมกัน) ฉันควรใช้แพ็คเกจเหล่านี้หรือไม่ ง่ายต่อการรักษาบนระบบขนาดเล็กหรือไม่?
  4. สิทธิ์เริ่มต้นควรเป็นอย่างไรสำหรับไฟล์และโฟลเดอร์ที่ให้บริการในเว็บโดยที่ apache ทำงานเป็นwww-data? สำหรับ apache / php ที่ทำงานในฐานะผู้ใช้?

สำเนาซ้ำที่เป็นไปได้ของserverfault.com/questions/339948/…
AD7six

คำตอบ:


17
  1. ไม่รูต
  2. ไม่รูต
  3. suexec
  4. ขึ้นอยู่กับ 644 สำหรับไฟล์และ 755 สำหรับโฟลเดอร์เป็นค่าเริ่มต้นที่ปลอดภัย

อย่าเปลี่ยนความเป็นเจ้าของสิ่งใดเป็นข้อมูล www เว้นแต่ว่าคุณต้องการให้ php สามารถแก้ไขเนื้อหาของไฟล์ / โฟลเดอร์นั้น

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

หากคุณไม่ได้เขียนไฟล์ใด ๆ ผ่านแอปพลิเคชัน php ของคุณคุณสามารถปล่อยให้คุณเป็นเจ้าของไฟล์: คุณ ในกรณีนี้การอนุญาตของโลก (xx4 / 5) เป็นสิ่งที่ใช้

หากคุณปล่อยให้ไฟล์เป็นของคุณ: คุณมีสิทธิ์ในการใช้ไฟล์ 644 (ไฟล์) สิ่งที่จะหมายถึงคือมีเพียงคุณเท่านั้นที่สามารถแก้ไขไฟล์เว็บไซต์ได้ - www-data ไม่ใช่คุณ - ดังนั้นจึงไม่สามารถแก้ไขไฟล์ได้

หากคุณต้องการที่จะ จำกัด การเข้าถึง Apache + chown -R you:www-data *คุณและปิดกั้นทางเข้าออกอื่น ด้วยสิทธิ์การใช้ไฟล์ 640 และการอนุญาตโฟลเดอร์ 750 คุณสามารถแก้ไขข้อมูล www สามารถอ่านได้ - เพราะจากนั้น apache จะอ่านการอนุญาตกลุ่ม (x4 / 5x)

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

โปรดทราบว่า "คุณ" ไม่ควรเป็นรูต การอนุญาตให้เข้าถึง ssh โดยตรงในฐานะรูทเป็นตัวบ่งชี้ความปลอดภัยอื่น ๆ (เช่นไม่อนุญาตให้ลงชื่อเข้าใช้ด้วยรหัสผ่าน) แต่นั่นเป็นคำถามทั้งหมด


10

ดังนั้นหากฉันเข้าใจสิ่งต่าง ๆ อย่างถูกต้องหาก apache ทำงานเป็น www-data และฉันต้องการให้ apache สามารถอ่านไดเรกทอรีได้บิต x จะต้องถูกตั้งค่าสำหรับกลุ่มโลก (อื่น ๆ ) (o + x) และนั่นก็เป็นเช่นนั้น จำเป็นต้องตั้งค่าในไดเรกทอรีหลักทั้งหมดจนสุดโซ่ (www, var) และถ้าฉันต้องการให้ Apache สามารถอ่านจากไฟล์ได้ดังนั้นต้องตั้งค่าบิต o + r

สิ่งนี้ไม่เป็นความจริงคุณไม่จำเป็นต้องตั้งค่าrwxเป็น 'อื่น ๆ ' คุณควรเปลี่ยนเจ้าของและ / หรือกลุ่มของโฟลเดอร์ / ไฟล์เฉพาะที่คุณพยายามปกป้อง เช่น:

chown -R cwd:www-data /var/www/cwd.com
chmod 750 /var/www/cwd.com

ตอนนี้เฉพาะสมาชิกของกลุ่มที่www-dataสามารถอ่าน/var/www/cwd.comได้ และมีเพียงคุณเท่านั้นที่สามารถเขียนถึงมันได้ หากคุณต้องการอนุญาตให้แอปพลิเคชันของคุณ (ผ่าน Apache) สามารถเขียน / แก้ไขไฟล์ในไดเรกทอรีนั้นได้เช่นกันคุณต้องเปลี่ยนเป็น 770

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


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

@cwd คุณคิดออกยังไง?
Ricky Boyce

@cwd นี่เป็นคำถามที่แน่นอนที่ฉันมี นั่นเป็นเหตุผลที่ฉันถามสิ่งนี้: serverfault.com/questions/807723/…
Nandakumar Edamana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.