การโฮสต์หลายไซต์ - ช่องโหว่ที่สำคัญที่พลาดไม่ได้ที่จะทำให้ไซต์ปลอดภัยจากกันคืออะไร?


9

แก้ไข # 2 23 กรกฎาคม 2558: ค้นหาคำตอบใหม่ที่ระบุรายการความปลอดภัยที่สำคัญที่ไม่ได้รับในการตั้งค่าด้านล่างหรืออาจให้เหตุผลที่จะเชื่อว่าทุกอย่างครอบคลุม

แก้ไข # 3 29 กรกฎาคม 2015: ฉันกำลังมองหาการกำหนดค่าผิดพลาดโดยเฉพาะอย่างยิ่งโดยไม่ได้ตั้งใจอนุญาตให้บางสิ่งบางอย่างที่สามารถใช้ประโยชน์เพื่อหลีกเลี่ยงข้อ จำกัด ด้านความปลอดภัยหรือแย่ลง แต่ยังเปิดกว้าง

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

นี่คือสิ่งที่ฉันมี:

  • ตรวจสอบให้แน่ใจว่าสคริปต์ PHP ทำงานเป็นบัญชีผู้ใช้และกลุ่ม Linux ของเว็บไซต์และถูกจำคุก (เช่นใช้ CageFS) หรืออย่างน้อยก็ถูก จำกัด อย่างถูกต้องโดยใช้สิทธิ์ระบบไฟล์ Linux
  • ใช้ suexec เพื่อให้แน่ใจว่าสคริปต์ CGI ไม่สามารถทำงานได้ในฐานะผู้ใช้ Apache
  • หากต้องการการสนับสนุนด้านเซิร์ฟเวอร์ (เช่นในไฟล์ shtml) ให้ใช้Options IncludesNOEXECเพื่อป้องกัน CGI ไม่ให้สามารถทำงานได้เมื่อคุณไม่คาดหวังให้ใช้ (แม้ว่าจะไม่ควรกังวลมากนักหากใช้ suexec)
  • มีการป้องกันการโจมตี symlink ในสถานที่เพื่อให้แฮกเกอร์ไม่สามารถหลอก Apache ให้แสดงไฟล์ของเว็บไซต์อื่น ๆ ให้เป็นข้อความธรรมดาและเปิดเผยข้อมูลที่เป็นประโยชน์เช่นรหัสผ่านฐานข้อมูล
  • กำหนดค่าAllowOverride/ AllowOverrideListอนุญาตเฉพาะคำสั่งที่แฮ็กเกอร์ไม่สามารถใช้ประโยชน์ได้ ฉันคิดว่านี่เป็นเรื่องน่ากังวลน้อยกว่าหากรายการด้านบนทำอย่างถูกต้อง

ฉันจะไปกับ MPM ITK ถ้ามันไม่ช้าและไม่ได้ทำงานในฐานะรูท แต่เราต้องการใช้ Apache ที่ใช้ร่วมกันโดยเฉพาะ

ฉันพบhttp://httpd.apache.org/docs/2.4/misc/security_tips.htmlแต่ไม่ครอบคลุมในหัวข้อนี้

หากมีประโยชน์ที่จะรู้เรากำลังวางแผนที่จะใช้ CloudLinux กับ CageFS และ mod_lsapi

มีอะไรอีกบ้างที่จะต้องทำหรือรู้เกี่ยวกับ?

แก้ไข 20 กรกฎาคม 2558: ผู้คนส่งโซลูชันทางเลือกที่ดีซึ่งมีค่าโดยทั่วไป แต่โปรดทราบว่าคำถามนี้มีจุดมุ่งหมายเพียงเกี่ยวกับความปลอดภัยของการตั้งค่า Apache ที่ใช้ร่วมกัน มีบางสิ่งที่ไม่ได้กล่าวถึงข้างต้นซึ่งทำให้ไซต์หนึ่งสามารถเข้าถึงไฟล์ของไซต์อื่นหรือประนีประนอมเว็บไซต์อื่นได้หรือไม่?

ขอบคุณ!


รอเพื่อเป็นคุณหรือคุณไม่ได้ปิดกั้นคำสั่งเช่น shell_exec
ไมเคิลเบลีย์

หรือฟังก์ชั่นแทน ไม่ใช่คำสั่ง
Michael Bailey

1
ถูกต้อง - เราไม่ได้ปิดกั้นคำสั่งเหล่านั้น เนื่องจาก CageFS แยก PHP ให้อยู่ในระดับสูงการ จำกัด คำสั่งดังกล่าวซึ่งเป็นส่วนหนึ่งของการป้องกันในเชิงลึกจึงไม่คุ้มค่าเนื่องจากเราใช้ประโยชน์เพื่อวัตถุประสงค์ที่ถูกต้องตามกฎหมายในบางครั้ง หากเซิร์ฟเวอร์เป็นเป้าหมายที่มีค่าสูงสำหรับแฮ็กเกอร์ (เช่นข้อมูลบัตรเครดิตที่เก็บไว้หรืออะไรทำนองนั้น) ประโยชน์นั้นอาจมีมากกว่าข้อเสียเปรียบ แต่ในกรณีของเราฉันไม่คิดว่าข้อ จำกัด นี้จะได้รับการรับประกัน นั่นเป็นสิ่งที่ควรค่าแก่การพิจารณาสำหรับผู้ที่ไม่ได้ใช้ CageFS หรือโซลูชันที่เทียบเท่ากัน
sa289

1
น่าเศร้าที่คุณได้ลดคำตอบที่ดีเพราะ CPanel - ส่วนที่เหลือคือประวัติ
user9517

2
นี่คือบทสรุปของเหตุผลที่ฉัน "ลดราคา" คำตอบเหล่านั้น Apache เฉพาะสำหรับแต่ละไซต์หรือคอนเทนเนอร์ Docker - ต้องใช้ IP สาธารณะที่เฉพาะเจาะจงมากขึ้นหรือเพิ่มความซับซ้อนของ reverse proxy Selinux - ต้องการกำหนดค่าและเรียกใช้ selinux ในโหมดบังคับใช้ VMs - ต้องการทรัพยากรระบบเพิ่มเติมผ่านการตั้งค่าที่ไม่ใช่ VM ฉันคิดว่าพวกเขาทั้งหมดเป็นทางออกที่ดีไม่เพียง แต่ไม่มีข้อเสียที่ฉันไม่อยากไปด้วย
sa289

คำตอบ:


9

ฉันเห็นด้วยกับรายการที่คุณมีจนถึงตอนนี้

ฉันเคยใช้งานการติดตั้งแบบผู้ใช้หลายคนเมื่อไม่กี่ปีที่ผ่านมาและโดยทั่วไปฉันพบการแลกเปลี่ยนที่เหมือนกัน: mod_php นั้นรวดเร็ว (ส่วนหนึ่งเป็นเพราะทุกอย่างทำงานในกระบวนการเดียวกัน) และ suexec ช้า แต่ปลอดภัย (เพราะทุกคำขอขอใหม่ กระบวนการ). ฉันไปกับ suexec เพราะต้องมีการแยกผู้ใช้

ขณะนี้มีตัวเลือกที่สามที่คุณอาจพิจารณา: มอบ php-fpm daemon ให้ผู้ใช้ทุกคน ไม่ว่าสิ่งนี้จะเป็นไปได้หรือไม่นั้นขึ้นอยู่กับจำนวนผู้ใช้เพราะทุกคนต้องได้รับ php-fpm อย่างน้อยหนึ่งกระบวนการโดยใช้บัญชีผู้ใช้ของพวกเขา (จากนั้นภูตก็ใช้ prefork เช่นกลไกในการปรับขนาดตามคำขอดังนั้นจำนวนกระบวนการและ การใช้หน่วยความจำอาจ จำกัด ปัจจัย) คุณจะต้องสร้างการกำหนดค่าอัตโนมัติบางอย่าง แต่ควรจะทำได้ด้วยสคริปต์เชลล์บางตัว

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


แก้ไขให้ถูกต้องถ้าฉันผิด แต่ฉันคิดว่า mod_lsapi + CageFS ทางออกที่เราวางแผนไว้แล้วว่าจะใช้กับ PHP นั้นดีอย่างน้อยถ้าไม่ดีกว่า PHP-FPM ใช่ไหม? ขอบคุณ
sa289

ฉันไม่เคยมีประสบการณ์กับ mod_lsapi และจะมีการจองที่ไว้วางใจโซลูชันแหล่งเดียวที่ปิด แต่ตามโฆษณาหน้ามันควรจะดีและเร็วใช่ - ประเด็นหนึ่งที่ฉันจะพิจารณาก็คือวิธีที่มันวางไข่กระบวนการใหม่ (ตามคำขอใหม่) และวิธีการเปลี่ยนรหัสผู้ใช้ที่มีประสิทธิภาพของพวกเขาให้กับผู้ใช้ เกี่ยวกับความปลอดภัยซึ่งเป็นจุดอ่อนที่สุด เอกสาร suexec มีคำอธิบายที่ดีเกี่ยวกับสิ่งที่ต้องระวัง
mschuett

ฉันคิดว่ามีเหตุผลที่จะไม่ไว้วางใจทั้ง hehe ปิดและโอเพนซอร์ส (Shellshock ใช้เวลา 25 ปีในการค้นพบ Heartbleed 2 ปีและใครจะรู้เกี่ยวกับ TrueCrypt) โชคดีที่ฉันคิดว่า mod_lsapi เป็นไปตามการเสนอโอเพนซอร์สของ LiteSpeed ​​ดังนั้นอย่างน้อยก็มีคู่ค้าบางรายที่กำลังดูอยู่บ้างรวมถึงผู้ที่ต้องการดูรหัสโอเพ่นซอร์สที่ใช้ ฉันกำลังมองหาสิ่งที่สำคัญด้านความปลอดภัยที่อาจหายไปในการตั้งค่าที่เสนอ (เช่นทำให้ PHP ทำงานในฐานะผู้ใช้ของเว็บไซต์ แต่ลืม suEXEC สำหรับสคริปต์ CGI) ขอบคุณ
sa289

เราใช้วิธีนี้ (เว็บเซิร์ฟเวอร์กับ php-fpm) ในเว็บไซต์ขนาดใหญ่มาก (ที่ฟาร์มเว็บเซิร์ฟเวอร์เชื่อมต่อกับฟาร์ม php-fpm ผ่าน load-balancer) ความสวยงามของการกำหนดค่าที่โฮสต์เสมือนถูกแยกออกจากกันในระดับระบบปฏิบัติการและขอบเขตนั้นไม่ได้ถูกหลีกเลี่ยงได้ง่าย (เพียงตรวจสอบให้แน่ใจว่าโฮมไดเรกทอรีของโฮสต์เสมือนมีสิทธิ์เช่น 0710 ด้วยความเป็นเจ้าของของผู้ใช้ vhost และกลุ่มกระบวนการเว็บเซิร์ฟเวอร์ ถ้าเป็นโลกของไฟล์ที่อ่านได้มันจะเข้าถึงได้โดยเว็บเซิร์ฟเวอร์)
กาแล็

4

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

ข้อเสนอแนะของฉันคือการใช้ซอฟต์แวร์ VM (VMware, VirtualBox, Qemu และอื่น ๆ ) เพื่อให้แต่ละไซต์เป็นคุกระบบปฏิบัติการของตัวเอง สิ่งนี้ช่วยให้คุณในฐานะผู้ดูแลระบบไม่ต้องกังวลกับเว็บไซต์ที่ถูกบุกรุกเพียงไซต์เดียว หากแฮ็กเกอร์ได้รับรูทจากการใช้ประโยชน์จาก php (หรือซอฟต์แวร์อื่น ๆ ) บน VM ของเว็บไซต์เพียงแค่หยุดการทำงานของ VM และแยกออกในภายหลังให้ใช้การแก้ไขหรือย้อนกลับไปสู่สถานะที่ไม่เสียหาย นอกจากนี้ยังช่วยให้ผู้ดูแลระบบของไซต์สามารถใช้ซอฟต์แวร์หรือการตั้งค่าความปลอดภัยที่เฉพาะเจาะจงกับสภาพแวดล้อมของไซต์เฉพาะ (ซึ่งอาจทำให้ไซต์อื่นเสียหาย)

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

การตั้งค่าประเภทนี้จะลดจำนวนพาหะของการโจมตีที่คุณต้องตรวจสอบและช่วยให้คุณสามารถมุ่งเน้นไปที่ความปลอดภัยของเครื่องโฮสต์และจัดการกับทุกสิ่งบนไซต์ตามไซต์


ฉันเห็นด้วยพวกเขาให้ความปลอดภัยที่ดีขึ้นและมีประโยชน์อื่น ๆ แต่พวกเขาก็มีข้อเสียบางอย่างที่คุณพูดถึง สถานที่ตั้งของคำถามนี้แม้ว่าจะมี Apache ที่ใช้ร่วมกัน ด้วย CageFS อัตราต่อรองของการใช้ประโยชน์จากรูทควรลดลง - ไม่ได้มีประสิทธิภาพเท่ากับ VM แต่เป็นระดับที่ฉันรู้สึกดีเกี่ยวกับเว็บไซต์ที่เราใช้งาน เป้าหมายหลักของฉันคือการหลีกเลี่ยงความผิดพลาดใด ๆ ในการรักษาความปลอดภัยที่เหมาะสมเช่นนั้นจะต้องเป็นพายุที่สมบูรณ์แบบสำหรับใครบางคนในการเข้าถึงรูท ตัวอย่างเช่นฉันสามารถเห็นได้อย่างง่ายดายไม่รู้ว่าเกี่ยวกับการโจมตี symlink ในอดีตและนั่นเป็นข้อผิดพลาดร้ายแรง ขอบคุณ
sa289

4

ฉันขอแนะนำให้แต่ละไซต์ทำงานภายใต้ Apache daemon ของตัวเองและ chrooting Apache ฟังก์ชัน php ของระบบทั้งหมดจะล้มเหลวเนื่องจากสภาพแวดล้อม Apache chroot จะไม่สามารถเข้าถึง / bin / sh นี่ก็หมายความว่าฟังก์ชั่น mail ของ php ยังไม่สามารถใช้งานได้ แต่หากคุณใช้ผู้ให้บริการอีเมลภายนอกเพื่อส่งอีเมลจากแอปพลิเคชันอีเมลของคุณสิ่งนี้ไม่ควรเป็นปัญหาสำหรับคุณ


ฉันต้องการทำเช่นนี้ - เราเคยทำเช่นนั้นในอดีต (ลบ chrooting) แต่น่าเสียดายที่มันป้องกันเราจากการใช้การตั้งค่าแผงควบคุมมาตรฐานและใช้ที่อยู่ IP เฉพาะเพิ่มเติมเว้นแต่จะทำมากกว่านี้ - การตั้งค่าพร็อกซี่ย้อนกลับที่ซับซ้อนพร้อม Apache ฟังที่อยู่ IP ภายในเช่นเอกสารของเว็บไซต์ Apache
sa289

อาใช่นั่นเป็นจุดที่ดีที่คุณพูดถึงที่นั่น มันจะต้องมีมากกว่า IP เฉพาะ IP หรือเปลี่ยนกลับเป็น reverse proxy
Alpha01

หากใครก็ตามที่อ่านคำตอบนี้สนใจเอกสารประกอบสำหรับการตั้งค่าพร็อกซีย้อนกลับให้ดูที่wiki.apache.org/httpd/DifferentUserIDsUsingReverseProxy
sa289

4

SELinux mod_selinuxอาจจะเป็นประโยชน์กับ วิธีการอย่างรวดเร็วมีคุณลักษณะที่นี่:

ฉันจะใช้ SELinux เพื่อ จำกัด สคริปต์ PHP ได้อย่างไร

เนื่องจากคำแนะนำค่อนข้างล้าสมัยฉันจึงตรวจสอบว่าใช้งานได้กับ RHEL 7.1:

ฉันใช้เวอร์ชันของ Fedora 19และรวบรวมกับเยาะเย้ยกับ RHEL 7.1 + EPEL

YMMV ถ้าคุณใช้การจำลอง epel config พื้นฐานมาพร้อมกับ:

[mockbuild@fedora mod_selinux]$ mock -r rhel-7-x86_64 --rebuild \
    mod_selinux-2.4.3-2.fc19.src.rpm

อัพเกรดระบบเป้าหมายของคุณก่อนเพื่อให้แน่ใจว่าselinux-policyเป็นปัจจุบัน

ติดตั้งที่กล่องเป้าหมาย (หรือวางไว้บนกระจกในเครื่องของคุณก่อน):

yum localinstall mod_selinux-2.4.3-2.el7.x86_64.rpm

ตอนนี้คุณต้องกำหนดโฮสต์เสมือนแต่ละรายการในหมวด Apache selinuxDomainValนี้จะกระทำโดยการเพิ่มบรรทัดเช่นในตัวอย่างด้านล่างเรียกว่า

<VirtualHost *:80>
    DocumentRoot /var/www/vhosts/host1
    ServerName host1.virtual
    selinuxDomainVal *:s0:c0
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/vhosts/host2
    ServerName host2.virtual
    selinuxDomainVal *:s0:c1 
</VirtualHost>

ถัดไปในรูทเอกสารสำหรับแต่ละโฮสต์ให้ติดฉลากรูทเอกสารของตนใหม่กับหมวดหมู่เดียวกับที่ติดป้ายกำกับไว้ใน httpd config

chcon -R -l s0:c0 /var/www/vhosts/host1
chcon -R -l s0:c1 /var/www/vhosts/host2

หากคุณต้องการให้การติดฉลากได้รับเกียรติหากคุณติดตั้งระบบใหม่คุณควรปรับปรุงนโยบายท้องถิ่นด้วย!

semanage fcontext -a -t httpd_sys_content_t -r s0-s0:c0 '/var/www/vhosts/host1(/.*)?' 
semanage fcontext -a -t httpd_sys_content_t -r s0-s0:c1 '/var/www/vhosts/host2(/.*)?'

ฉันชอบความคิดนี้ แต่ฉันต้องเปิด selinux บนเซิร์ฟเวอร์ซึ่งอาจทำให้เกิดปัญหาอื่น ๆ +1 เนื่องจากฉันคิดว่ามันอาจเป็นทางออกที่ดีสำหรับผู้ที่ไม่สนใจ
sa289

4

มีคำตอบทางเทคนิคที่ดีให้ไว้มากมาย (โปรดดูที่นี่: https://security.stackexchange.com/q/77/52572และเคล็ดลับสำหรับการรักษาความปลอดภัยเซิร์ฟเวอร์ LAMP ) แต่ฉันยังอยากจะพูดถึงที่นี่ จุดสำคัญ (จากมุมมองอื่น ๆ ) เกี่ยวกับการรักษาความปลอดภัย: การรักษาความปลอดภัยเป็นกระบวนการ ฉันแน่ใจว่าคุณได้พิจารณาเรื่องนี้แล้ว แต่ฉันก็ยังหวังว่ามันอาจจะมีประโยชน์

ตัวอย่างเช่นในคำถามของคุณคุณจะเน้นไปที่มาตรการทางเทคนิคเป็นหลัก: "คำถามนี้มีเป้าหมายเฉพาะเกี่ยวกับความปลอดภัยของการตั้งค่า Apache ที่ใช้ร่วมกันโดยเฉพาะมีขั้นตอนการรักษาความปลอดภัยที่สำคัญที่จะต้องทำ Apache และ PHP "

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

  1. ก่อนอื่นอย่าลืมว่าการรักษาความปลอดภัยนั้นเป็นกระบวนการและโดยเฉพาะอย่างยิ่งเกี่ยวกับวงจร "ทำ - ตรวจสอบ - ปฏิบัติตามกฎหมาย" ตามที่ได้รับการแนะนำโดยมาตรฐานหลายฉบับรวมถึง ISO 27001 ( http://www.isaca.org/ วารสาร / จดหมายเหตุ / 2011 / เล่มที่ 4 / หน้า / การวางแผนสำหรับและดำเนินการตามมาตรฐาน ISO27001.aspx ) โดยทั่วไปหมายความว่าคุณต้องแก้ไขมาตรการความปลอดภัยอัปเดตและทดสอบเป็นประจำ

  2. อัปเดตระบบของคุณเป็นประจำ สิ่งนี้จะไม่ช่วยในการโจมตีเป้าหมายโดยใช้ช่องโหว่แบบ zero-day แต่จะช่วยต่อต้านการโจมตีอัตโนมัติเกือบทั้งหมด

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

    นี่คือสิ่งที่สถิติบอกเกี่ยวกับเรื่องนี้: "เวลาเฉลี่ยจากการแทรกซึมสู่การค้นพบคือ 173.5 วัน" ( http://www.triumfant.com/detection.html ), "205 จำนวนวันเฉลี่ยก่อนการตรวจจับ" ( https: // www2 .fireeye.com / rs / fireye / images / rpt-m-Trends-2015.pdf ) และฉันหวังว่าตัวเลขเหล่านี้ไม่ใช่สิ่งที่เราทุกคนต้องการ

    มีโซลูชั่นมากมาย (รวมถึงฟรี) ไม่เพียง แต่สำหรับการตรวจสอบสถานะของบริการ (เช่น Nagios) แต่ยังมีระบบตรวจจับการบุกรุก (OSSEC, Snort) และระบบ SIEM (OSSIM, Splunk) หากมันซับซ้อนเกินไปอย่างน้อยคุณสามารถเปิดใช้งานบางอย่างเช่น 'fail2ban' และ / หรือส่งต่อคุณบันทึกไปยังเซิร์ฟเวอร์ syslog แยกต่างหากและมีการแจ้งเตือนทางอีเมลเกี่ยวกับเหตุการณ์สำคัญ

    อีกครั้งจุดที่สำคัญที่สุดที่นี่ไม่ได้ระบบที่คุณเลือกการตรวจสอบที่สำคัญที่สุดคือการที่คุณมีการตรวจสอบและแก้ไขมันอย่างสม่ำเสมอตามที่ "Plan-Do-Check-Act ของคุณ" วงจร

  4. ระวังช่องโหว่ เหมือนกับการตรวจสอบ เพียงสมัครสมาชิกรายการช่องโหว่ที่ต้องแจ้งเมื่อพบช่องโหว่ที่สำคัญสำหรับ Apache หรือบริการอื่น ๆ ที่สำคัญสำหรับการตั้งค่าของคุณ เป้าหมายจะได้รับแจ้งเกี่ยวกับสิ่งที่สำคัญที่สุดที่ปรากฏก่อนการอัพเดทครั้งต่อไปของคุณ

  5. มีแผนว่าจะทำอย่างไรในกรณีที่เกิดเหตุการณ์ (และปรับปรุงและแก้ไขอย่างสม่ำเสมอตามวัฏจักร หากคุณถามคำถามเกี่ยวกับการกำหนดค่าที่ปลอดภัยหมายความว่าระบบความปลอดภัยของคุณมีความสำคัญสำหรับคุณ อย่างไรก็ตามคุณควรทำอย่างไรในกรณีที่ระบบของคุณถูกแฮกแม้จะมีมาตรการรักษาความปลอดภัยทั้งหมด อีกครั้งฉันไม่ได้หมายถึงเฉพาะมาตรการทางเทคนิคที่นี่เช่น "ติดตั้งระบบปฏิบัติการ": คุณควรรายงานอุบัติเหตุตามกฎหมายที่บังคับใช้ที่ไหน? คุณได้รับอนุญาตให้ปิด / ตัดการเชื่อมต่อเซิร์ฟเวอร์ของคุณทันที (ราคาเท่าไหร่สำหรับ บริษัท ของคุณ)? ใครควรได้รับการติดต่อหากผู้รับผิดชอบหลักอยู่ในช่วงลาหยุด / ป่วย?

  6. มีเซิร์ฟเวอร์สำรองข้อมูลเก็บถาวรและ / หรือทดแทน / จำลองแบบ ความปลอดภัยหมายถึงความพร้อมใช้งานของบริการของคุณ ตรวจสอบการสำรองข้อมูล / เก็บถาวร / การจำลองแบบของคุณเป็นประจำและทดสอบขั้นตอนการกู้คืนอย่างสม่ำเสมอ

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


1
นอกจากนี้ที่ดีสำหรับคนที่จะทราบ ในกรณีที่เป็นประโยชน์กับทุกคนฉันใช้เวลาเยอะในการอ่านลิงก์สองลิงก์แรกที่คุณโพสต์และสิ่งที่พวกเขาเชื่อมโยงเพื่อดูว่าฉันสามารถหาสิ่งที่สำคัญที่ฉันพลาดไปได้หรือไม่ ทรัพยากรที่เชื่อมโยงจากที่ผมคิดว่าเป็นประโยชน์มากที่สุดคือbenchmarks.cisecurity.org/downloads/show-single/...และiase.disa.mil/stigs/app-security/web-servers/Pages/index.aspxแม้ว่า มีการทับซ้อนกันระหว่างคนทั้งสองในปริมาณที่เหมาะสม ฉันไม่เจอสิ่งใดที่สำคัญ แต่ก็ยังคุ้มค่าที่จะอ่านว่าระบบความปลอดภัยเป็นสิ่งสำคัญยิ่ง
sa289

3

กรณีการใช้งานของคุณเหมาะสำหรับคอนเทนเนอร์นักเทียบท่า

แต่ละคอนเทนเนอร์สามารถเป็นตัวแทนลูกค้าหรือลูกค้าด้วย ID ผู้ใช้ที่ไม่ซ้ำกันซึ่งกำหนดให้กับแต่ละกลุ่มคอนเทนเนอร์ Apache เพื่อเพิ่มความปลอดภัย กุญแจสำคัญคือการปล่อยสิทธิ์รูทเมื่อเริ่มต้นคอนเทนเนอร์ก่อนเริ่ม apache stack ของคุณ ลูกค้าแต่ละรายจะได้รับบริการ DB ของตัวเองด้วยรหัสผ่านที่เป็นเอกลักษณ์ของตนเองโดยไม่ต้องปวดหัวในการยืนขึ้นเครื่องเสมือนหลายสิบเครื่องโดยแต่ละคนต้องใช้เมล็ดเกล็ดหิมะพิเศษและค่าใช้จ่ายอื่น ๆ ท้ายที่สุดหัวใจของนักเทียบท่าก็คือ chroot บริหารอย่างถูกต้องฉันจะนำสิ่งนั้นไปใช้กับคลัสเตอร์เสมือนทั่วไปทุกวัน


นี่หมายความว่าจะมี Apache daemon เฉพาะสำหรับลูกค้าหรือไม่ ถ้าเป็นเช่นนั้นฉันคิดว่าข้อเสียเปรียบจะคล้ายกับคำตอบของ Alpha01
sa289

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

ขอบคุณ แม้ว่าจะไม่มีแผงควบคุม แต่ฉันก็ยังคงหลีกเลี่ยงที่จะทำ reverse proxy ไม่เช่นนั้นจะต้องใช้ IP สาธารณะที่มากขึ้นเว้นแต่ฉันจะเข้าใจผิดว่าการตั้งค่านี้จะทำงานอย่างไร
sa289

1
ร้านค้าส่วนใหญ่ที่ฉันเคยเห็น (ใหญ่และเล็ก) ใช้วิธี reverse proxy ฉันใช้ HAProxy เป็นการส่วนตัวมันเหมาะอย่างยิ่งกับการแยกขนาดใหญ่ที่คุณกำลังมองหา มันมีประสิทธิภาพสูงและช่วยให้คุณสามารถปรับขนาดแนวนอนได้อย่างมีประสิทธิภาพและไม่ต้องการความซับซ้อนแปลกใหม่ที่ปรากฏชัดในโซลูชันของ mschuett
เตฟาน

2

คำแนะนำที่ดีมากมายอยู่ที่นี่แล้ว มีสิ่งที่ไม่ได้รับในการสนทนาจนถึงแม้ว่า

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

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

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

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

ชัดเจนน้อยกว่าคือวิธี apache ตัดสินใจว่าเป็นไฟล์แบบคงที่อย่างไรก็ตาม เช่นมันจะมีอะไรทำอะไรกับ*.php.gifหรือ*.php.enไฟล์? หากกลไกนี้หรือคนอื่นโง่การแยกแยะเป็นไฟล์แบบคงที่เป็นไปได้ไหมที่ apache จะเรียกใช้ php จากนอกคุก? ฉันจะตั้งค่าเว็บเซิร์ฟเวอร์น้ำหนักเบาแยกต่างหากสำหรับเนื้อหาแบบสแตติกซึ่งไม่ได้กำหนดค่าด้วยโมดูลใด ๆ สำหรับการดำเนินการเนื้อหาแบบไดนามิกและมี load balancer ตัดสินใจว่าจะส่งคำขอใดไปยังเซิร์ฟเวอร์แบบสแตติกและแบบไดนามิก

เกี่ยวกับข้อเสนอแนะของนักเชื่อมต่อของสเตฟานมันเป็นไปได้ที่จะมีเว็บเซิร์ฟเวอร์เดียวที่อยู่นอกคอนเทนเนอร์และพูดคุยกับ php daemons ในแต่ละคอนเทนเนอร์สำหรับเนื้อหาแบบไดนามิกในขณะที่ยังมีเว็บเซิร์ฟเวอร์ที่สองซึ่งอยู่ในคอนเทนเนอร์ของนักเทียบท่า ซึ่งแบ่งปันปริมาณการใช้เนื้อหาของพวกเขาและจึงสามารถให้บริการเนื้อหาคงที่ซึ่งจะเหมือนกับในวรรคก่อน ฉันขอชมเชยนักเทียบท่าท่ามกลางวิธีการคุมขังแบบต่างๆ แต่ด้วยวิธีการคุมขังแบบนี้หรือแบบอื่น ๆ คุณจะมีปัญหาอื่น ๆ อีกมากมายให้จัดการ การอัปโหลดไฟล์ทำงานอย่างไร คุณใส่ daemons การถ่ายโอนไฟล์ในแต่ละคอนเทนเนอร์หรือไม่? คุณใช้วิธีการตามสไตล์คอมไพล์ PAAS? คุณสร้างบันทึกได้อย่างไรภายในคอนเทนเนอร์ที่เข้าถึงได้ และม้วนพวกเขามากกว่า? คุณจัดการและรันงาน cron ได้อย่างไร? คุณจะให้การเข้าถึงเชลล์แก่ผู้ใช้หรือไม่และหากเป็นเช่นนั้น daemon อื่นภายในคอนเทนเนอร์หรือไม่ ฯลฯ


ขอบคุณ เพื่อตอบคำถามของคุณ - เป็นไปไม่ได้ที่ PHP จะทำงานนอกคุกแม้ว่าจะใช้นามสกุลไฟล์อื่นเนื่องจาก CageFS เท่าที่ฉันสามารถบอกได้ ฉันลองทั้งสองSetHandlerและAddTypeสร้างส่วนขยายใหม่ให้ดำเนินการเป็น PHP และถูกจำคุก ฉันไม่ทราบว่ามีวิธีแก้ไขปัญหานี้หรือไม่ แต่นั่นคือสิ่งที่ฉันหวังว่าจะมีใครบางคนชี้ให้เห็นว่าฉันพลาดอะไรไปหรือเปล่า ใช่ Apache กำลังอ่านจากคุกโดยตรง จุดที่ดีในการดูงาน cron - ดูเหมือนว่าสิ่งต่าง ๆ เช่นที่ทำงานเป็นรูตเป็นแหล่งที่มาของช่องโหว่ที่รายงานจำนวนมาก
sa289

RE: .htaccessใน conf ที่ผมใช้ AllowOverrideList Add{Charset,DefaultCharset,Encoding,Handler,OutputFilter,OutputFilterByType,Type} Allow Auth{GroupFile,Name,Type,UserFile} Deny DirectoryIndex ErrorDocument Expires{Active,ByType,Default} FileETag ForceType Header IndexIgnore Order php_flag php_value Redirect RedirectMatch Remove{Handler,Type} RequestHeader Require Rewrite{.various.} Satisfy Set{Env,EnvIf,EnvIfNoCase,Handler} SSLRequireSSLเพื่อเปิดโอกาสให้เหล่านี้: ความกังวลของฉันคือ AddType, AddHandler และ SetHandler แต่ Drupal ใช้ SetHandler เพื่อการป้องกันในเชิงลึกในการอัปโหลดไฟล์เช่น
sa289

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

จุดดี! ฉันยืนยันSetHandler server-infoหรือSetHandler server-statusในไฟล์ htaccess เป็นวิธีหนึ่งที่ใครบางคนสามารถทำการโจมตีได้ง่ายขึ้นหรือเปิดเผยข้อมูลที่ไม่ควรเปิดเผยเช่น VirtualHosts ทั้งหมดบนเซิร์ฟเวอร์ (ซึ่งสามารถใช้สำหรับการหลอกลวงแบบฟิชชิ่ง) หรือปริมาณการใช้งานปัจจุบันไปยังไซต์อื่น ๆ . ฉันอาจต้องรีสอร์ทเพื่อลบบางส่วนของผู้ Handler / AllowOverrideListประเภทจากฉัน คุณรู้หรือไม่ว่ามีรายการใดบ้างที่เป็นไปได้สำหรับการกระทำ / ตัวจัดการ ฉันพยายามค้นหาออนไลน์ แต่ไม่พบคำตอบที่ดี
sa289

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

1

สิ่งแรกที่ฉันไม่เห็นคือการจัดการกระบวนการดังนั้นกระบวนการหนึ่งจึงไม่สามารถอดกระบวนการ CPU หรือ RAM อื่น (หรือ I / O สำหรับเรื่องนั้นแม้ว่าระบบไฟล์ของคุณอาจได้รับการออกแบบมาเพื่อป้องกันไม่ให้เกิดปัญหา) ข้อได้เปรียบที่สำคัญอย่างหนึ่งของวิธี "คอนเทนเนอร์" สำหรับอินสแตนซ์ PHP ของคุณกับการพยายามเรียกใช้ทั้งหมดในอิมเมจ "OS" หนึ่งคือคุณสามารถ จำกัด การใช้ทรัพยากรได้ดีกว่า ฉันรู้ว่านั่นไม่ใช่การออกแบบของคุณ แต่เป็นสิ่งที่ต้องพิจารณา

อย่างไรก็ตามกลับไปที่กรณีการใช้งานของ PHP ที่ทำงานอยู่เบื้องหลัง Apache โดยทั่วไปจะทำหน้าที่เป็นพร็อกซี suexec ไม่ได้ป้องกันบางสิ่งบางอย่างจากการทำงานในฐานะผู้ใช้ apache - มันให้ความสามารถในการทำงานในฐานะผู้ใช้รายอื่น ดังนั้นหนึ่งในความกังวลเป็นไปได้เพื่อให้แน่ใจว่าจะทำทุกอย่างถูกต้อง - หน้าสำหรับ doc มันเรียกว่าอันตรายที่อาจเกิด: https://httpd.apache.org/docs/2.2/suexec.html ดังนั้นคุณรู้ไหมเม็ดเกลือและทุกสิ่ง

จากมุมมองของการรักษาความปลอดภัยก็สามารถเป็นประโยชน์ที่จะมีชุดที่ จำกัด ของไบนารีผู้ใช้ในการทำงานร่วมกับ (ซึ่ง CageFS ซัพพลาย) โดยเฉพาะอย่างยิ่งถ้าพวกเขาจะรวบรวมที่แตกต่างกันหรือกับห้องสมุดที่แตกต่างกัน (เช่นหนึ่งที่ไม่ได้รวมถึงความสามารถที่ไม่พึงประสงค์) แต่อันตรายคือ ณ จุดนั้นคุณไม่ได้ติดตามการเผยแพร่ที่รู้จักอีกต่อไปสำหรับการอัปเดตคุณกำลังติดตามการกระจาย (Cagefs) ที่แตกต่างกันสำหรับการติดตั้ง PHP ของคุณ (อย่างน้อยก็เกี่ยวกับเครื่องมือพื้นที่ผู้ใช้) แม้ว่าเนื่องจากคุณอาจติดตามการกระจายที่เฉพาะเจาะจงกับ cloudlinux ซึ่งเป็นความเสี่ยงที่เพิ่มขึ้น แต่ก็ไม่น่าสนใจสำหรับตัวเอง

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

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

นั่นคือสมองของฉัน หวังว่าจะมีสิ่งที่มีประโยชน์ราง ๆ อยู่ในนั้น :)


ขอบคุณ เพื่อช่วยแก้ปัญหาทรัพยากรที่คุณกล่าวถึง CloudLinux มีสิ่งที่เรียกว่า Lightweight Virtual Environment (LVE) และผู้ว่าราชการ MySQL
sa289

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