ฉันควรเลียนแบบ PHP ผ่าน FastCGI หรือไม่


16

ฉันกำลังติดตั้ง PHP เวอร์ชันล่าสุดลงบน IIS 7.5 ผ่าน FastCGI และคำแนะนำทั้งหมดบอกว่า FastCGI ควรแอบอ้างเป็นลูกค้าที่โทรโดยการตั้งค่า

 fastcgi.impersonate = 1

หากเว็บไซต์ของฉันจะมีการกำหนดค่านี้

  • พูลแอ็พพลิเคชันเฉพาะ
  • application pool identity ของ ApplicationPoolIdentity
  • การพิสูจน์ตัวตนแบบไม่ระบุชื่อเท่านั้น (เป็น IUSR)

เหตุใดฉันจึงต้องการแอบอ้างบุคคลอื่น

ฉันมาจากพื้นหลัง ASP.NET ที่ IUSR ได้รับสิทธิ์อ่านอย่างเดียวและข้อมูลประจำตัวของกลุ่มแอพลิเคชันได้รับสิทธิ์ในการเขียนใด ๆ การให้สิทธิ์การเข้าถึงแบบเขียนไปยัง IUSR มักเปิดประตูสำหรับช่องโหว่ WebDAV ดังนั้นฉันลังเลที่จะปล่อยให้ PHP ทำงานเป็น IUSR

ฉันไม่สามารถหาคนมากมายที่ถามคำถามนี้ ( 1 | 2 ) ดังนั้นฉันคิดว่าฉันต้องคิดถึงบางสิ่ง บางคนสามารถอธิบายเรื่องนี้ให้ฉันได้ไหม

คำตอบ:


17

13 เดือนต่อมาฉันต้องการทบทวนคำถามของฉันอีกครั้ง ในเวลานั้นฉันได้โอนเว็บไซต์ครึ่งโหลจาก IIS 6 ไปเป็น IIS 7.5 และกำหนดค่าด้วยวิธีที่ฉันต้องการ ทั้งหมดที่ฉันสามารถพูดได้ก็คือเว็บไซต์ใช้งานได้พวกเขาไม่ได้มีปัญหาด้านความปลอดภัย (ไม่ใช่ว่าเป็นเว็บไซต์ยอดนิยม) และในความคิดของฉันการตั้งค่านั้นมีความปลอดภัยมากกว่าสิ่งที่ learn.iis.net แนะนำ

สำหรับลูกหลานนี่เป็นการตั้งค่าที่เกี่ยวข้อง ใน PHP INI:

cgi.force_redirect = 0
cgi.fix_pathinfo=1
fastcgi.impersonate = 0

ใน IIS:

  • Application Pool> เอกลักษณ์> ApplicationPoolIdentity
  • เว็บไซต์> การพิสูจน์ตัวตน> การพิสูจน์ตัวตนแบบไม่ระบุชื่อ> ผู้ใช้เฉพาะ: IUSR

สิทธิ์ NTFS และตำแหน่งที่จะใช้:

  • IUSR - อนุญาตให้อ่านปฏิเสธเขียน
    • ไดเรกทอรีรากของเว็บไซต์ IIS ตัวอย่างเช่นในโครงการ Zend Framework สิ่งนี้จะเป็น / public directory
    • หากแอปพลิเคชันของคุณอัปโหลดไฟล์และบันทึกไว้ในไดเรกทอรีสาธารณะคุณจะต้องใช้สิทธิ์นี้กับไดเรกทอรีอัปโหลดชั่วคราว เนื่องจากmove_uploaded_fileจะรักษาสิทธิ์ของไดเรกทอรีอัปโหลด นี่คือข้อเสียเปรียบที่ใหญ่ที่สุดของการตั้งค่าการอนุญาตนี้ที่ฉันได้พบ
  • ApplicationPoolIdentity ( IIS AppPool\<<YourApplicationPoolName>>) - ให้สิทธิ์การอ่าน & รายการ
    • รากของแอพพลิเคชัน PHP ของคุณ ตัวอย่างเช่นในโครงการ Zend Framework สิ่งนี้จะเป็นโครงการทั้งหมด
    • ไลบรารีภายนอกใด ๆ (Zend, Doctrine ฯลฯ ) รวมอยู่ในแอปพลิเคชันของคุณซึ่งไม่ได้อยู่ในโฟลเดอร์แอปพลิเคชัน
  • ApplicationPoolIdentity - อนุญาตให้ปรับเปลี่ยน
    • สถานที่ใด ๆ ที่ใบสมัครของคุณจะเขียนเช่นupload_tmp_dir, และsession.save_patherror_log
    • บางครั้งผมก็ต้องเพิ่มสิทธิ์นี้ไปยังรากของโปรแกรม PHP ในการพัฒนาสภาพแวดล้อมของฉันที่จะสนับสนุนสิ่งที่เหมือนคำสอนของรถยนต์รุ่นผู้รับมอบฉันทะ
  • ApplicationPoolIdentity - รายการสิทธิ์
    • หากแอปพลิเคชันของคุณอยู่ในไดเรกทอรีเสมือนคุณจะต้องเพิ่มสิทธิ์นี้ในรูทของเว็บไซต์ สิ่งนี้ทำให้แอปพลิเคชันของคุณอ่าน parent web.config ตัวอย่างเช่นหากรูทแอปพลิเคชันของคุณคือhttp://example.com/MyPHPAppให้ตั้งค่าการอนุญาตนี้ในเว็บไดเรกทอรี example.com คุณต้องใช้เฉพาะกับ "โฟลเดอร์และไฟล์นี้", "ภายในคอนเทนเนอร์นี้เท่านั้น"

ฉันหวังว่านี่จะช่วยคนอื่นที่ตัดสินใจว่าคำแนะนำ learn.iis.net นั้นไม่เหมาะ


ขอบคุณมากสำหรับสิ่งนี้! เพิ่มแบทช์สคริปต์เพื่อทำให้เป็นอัตโนมัติ ทำงานได้ดีสำหรับการติดตั้งของฉัน
ฝ่าบาท

คุณควรเปิดใช้งาน impersanation และตั้งค่าการรับรองความถูกต้อง> การเข้าถึงแบบไม่ระบุชื่อ> แก้ไขเป็น Application Pool Identity จากนั้นเพียงกำหนดสิทธิ์ของระบบไฟล์ใช้ IIS AppPool \ <แอพลิเคชันชื่อ>
Monstieur

@Kurian ใช่วิธีการนั้นง่ายกว่าและตามคำแนะนำ learn.iis.net มันให้ผลประโยชน์อื่น ๆ หรือไม่? ฉันเลือกระบบที่อธิบายไว้ข้างต้นเพราะแยกการอนุญาตของแอปพลิเคชันออกจากการอนุญาตของผู้ใช้เว็บ
WimpyProgrammer

มันป้องกันแอปพลิเคชั่นหลายตัวจากการเข้าถึงข้อมูลของกันและกัน หากไม่มี ApplicationPoolIdentity หากแอปพลิเคชันหนึ่งถูกแฮ็กก็สามารถใช้เพื่อแฮ็กแอปพลิเคชันอื่น ๆ บนเซิร์ฟเวอร์นั้นได้ ประการที่สองจะช่วยให้คุณสามารถจัดการกับ FastCGI ได้เช่นเดียวกับ ASP.NET เท่าที่ได้รับอนุญาต
Monstieur

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

1

ดู: http://www.php.net/manual/en/install.windows.iis6.php

การแอบอ้างบุคคลอื่นและการเข้าถึงระบบไฟล์

ขอแนะนำให้เปิดใช้งานการรับบทบาท FastCGI ใน PHP เมื่อใช้ IIS สิ่งนี้ถูกควบคุมโดยคำสั่ง fastcgi.impersonate ในไฟล์ php.ini เมื่อเปิดใช้งานการรับบทบาท PHP จะดำเนินการระบบไฟล์ทั้งหมดในนามของบัญชีผู้ใช้ที่ได้รับการกำหนดโดยการรับรองความถูกต้องของ IIS

ตามเอกสารมันอนุญาตให้ fastcgi ดำเนินการในนามของลูกค้าโดยใช้การอนุญาตเดียวกันทั้งหมด (ในกรณีของคุณคือสิ่งที่ดูเหมือนบัญชี IUSR) กล่าวอีกนัยหนึ่งคือการกระทำทั้งหมดที่ได้รับอนุญาตตามข้อมูลประจำตัวของลูกค้า (หรืออานนท์) ไม่มากไม่น้อย. หากไม่มีฉากนี้ฉันก็นึกภาพ fastcgi ที่ไม่ดีจะถูกทำให้ง่อย


นั่นคือกรณีในสถานการณ์ของเขามันจะเข้าถึงตามบัญชีแขกหรืออะไร
Matt

ขอบคุณสำหรับคำตอบของคุณ Matt และ Bob! ฉันเริ่มคิดว่าจะไม่มีใครถูกแทง
WimpyProgrammer

2
เมื่อ PHP รันโดยไม่มีการเลียนแบบมันจะทำงานเป็นข้อมูลเฉพาะตัวของพูลแอ็พพลิเคชัน สิ่งนี้ทำให้ฉันให้สิทธิ์แบบอ่านอย่างเดียวแก่ผู้ใช้ anon และให้สิทธิ์การเขียนเพื่อเข้าถึงข้อมูลประจำตัวแอป ดังนั้น PHP จึงไม่ช่วยตัวเองหากไม่มีการแอบอ้างบุคคลอื่น ฉันสร้างการทดสอบที่อาจทำให้ชัดเจน IUSR (อานนท์): อนุญาตให้อ่านปฏิเสธเขียน ข้อมูลประจำตัวของแอป: ได้รับการอ่าน / เขียน เมื่อปิดการรับบทบาทฉันยังคงสามารถเขียนไฟล์ผ่านรหัสได้ ฉันไม่สามารถทำได้ แต่ฉันไม่ต้องการให้ IUSR มีสิทธิ์เข้าถึงเพื่อเขียน ฉันคิดว่าฉันจะถามคำถามในฟอรัมอื่นและกลับมาที่นี่เมื่อฉันรู้เพิ่มเติม
WimpyProgrammer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.