Apache: ตรวจสอบความน่าเชื่อถือ SSL เชนเพื่อป้องกันการโจมตี MITM?


11

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

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

ดังนั้นคำถามของฉันค่อนข้างง่าย: ฉันจะตรวจสอบ chain of trust บนฝั่งเซิร์ฟเวอร์ได้อย่างไร ฉันต้องการตรวจสอบให้แน่ใจว่าลูกค้าใช้ใบรับรองของเซิร์ฟเวอร์ของฉันและเชื่อถือได้เพียงหนึ่งเชน ฉันสงสัยว่าการตั้งค่า SSL ของ Apache สามารถทำได้หรือไม่ สิ่งนี้จะสะดวกเนื่องจากสามารถนำไปใช้กับแอปพลิเคชันมากมายได้อย่างง่ายดาย หากเป็นไปไม่ได้มีใครรู้วิธีการทำเช่นนี้ใน PHP หรือไม่? หรือคุณมีข้อเสนอแนะอื่น ๆ


1
มันก็โอเคถ้านายจ้างเห็นการจราจรของพนักงาน คุณกำลังใช้ทรัพยากรของนายจ้าง (พีซีการเชื่อมต่อเครือข่าย ฯลฯ ) สิ่งเหล่านี้ไม่ใช่ของคุณ และหากคุณกังวลว่าผู้ที่ทำงานหนักสามารถเห็นข้อมูลที่คุณส่งไปยังบัญชีธนาคารของคุณ - ทำที่บ้านไม่ใช่ที่ทำงาน และการพยายามละเมิดนโยบายความปลอดภัยของ บริษัท อาจเป็นเรื่องที่ศาลฟ้องคุณ
Crypt32

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

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

นั่นเป็นหนึ่งในข้อแตกต่างระหว่างสหรัฐฯกับยุโรป ข้อกำหนด @Randall อ้างถึงข้างต้นเป็นสิ่งผิดกฎหมายในประเทศยุโรปส่วนใหญ่
Aileron79

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

คำตอบ:


9

ฉันคิดว่าคำถามนี้เหมาะสมกว่าสำหรับsecurity.stackexchange.comซึ่งหัวข้อของ MITM ถูกกล่าวถึงในคำถามมากมาย แต่อย่างไรก็ตาม:

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

ในกรณีของการสกัดกั้น SSL ไคลเอนต์ TLS จากมุมมองของเซิร์ฟเวอร์คือการสกัดกั้น SSL / ไฟร์วอลล์ ดังนั้นปัญหาที่ฝั่งเซิร์ฟเวอร์คือการตรวจสอบว่ามีการพูดคุยกับลูกค้าที่คาดหวัง (เบราว์เซอร์) หรือไม่ (ไฟร์วอลล์ / AV) วิธีที่ปลอดภัยที่สุดในการทำเช่นนี้คือการใช้ใบรับรองไคลเอ็นต์เพื่อรับรองความถูกต้องของไคลเอ็นต์ - และในความเป็นจริงการสกัดกั้น SSL จะไม่ทำงานหากใช้การตรวจสอบสิทธิ์ไคลเอ็นต์เช่นการจับมือ TLS จะล้มเหลวเนื่องจาก MITM ไม่สามารถมอบใบรับรองไคลเอ็นต์ที่คาดหวัง

มีใช้ใบรับรองไคลเอ็นต์เท่านั้น นอกจากนี้การจับมือ TLS ที่ล้มเหลวไม่ได้หมายความว่าลูกค้าสามารถสื่อสารกับเซิร์ฟเวอร์โดยไม่มีการสกัดกั้น SSL แต่ลูกค้าไม่สามารถสื่อสารกับเซิร์ฟเวอร์ได้เลย อีกทางเลือกหนึ่งคือใช้ฮิวริสติกในการตรวจจับชนิดของไคลเอนต์ TLS โดยใช้ลายนิ้วมือของ TLS handshake เช่นชนิดและคำสั่งของยันต์ใช้ส่วนขยายเฉพาะ ... ในขณะที่พร็อกซี SSL สกัดกั้นในทางทฤษฎีอาจจำลองต้นฉบับ ลูกค้าส่วนใหญ่ไม่ได้สมบูรณ์แบบ ดูเพิ่มเติมตรวจหาคน-in-the-กลางในฝั่งเซิร์ฟเวอร์สำหรับ HTTPSหรือส่วนที่สาม TLS ดำเนิน Heuristicsในความปลอดภัยผลกระทบของ HTTPS สกัดกั้น


14

สำหรับฉันดูเหมือนว่านายจ้างใช้ตำแหน่งที่เหนือกว่าของเขาเพื่อสอดแนมการรับส่งข้อมูล SSL ของพนักงาน สำหรับฉันนี่ทำให้แนวคิดทั้งหมดของ SSL ที่ไม่น่าเชื่อถือ

ปัญหาไม่ได้อยู่ในแนวคิดของ SSLหรือในการใช้งานด้านเทคนิค แต่มีคนอื่นที่มีการควบคุมเต็มรูปแบบผ่านจุดปลายหนึ่งของการเชื่อมต่อนั่นคือเวิร์กสเตชันของคุณ
นั่นคือรากของความเสี่ยงด้านความปลอดภัยที่แท้จริง ...

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

ฉันจะตรวจสอบ chain of trust บนฝั่งเซิร์ฟเวอร์ได้อย่างไร?

คุณทำไม่ได้ นั่นคือฝั่งไคลเอ็นต์

ขึ้นอยู่กับกรณีการใช้งานของคุณสิ่งที่คุณสามารถทำได้คือRFC 7469 HTTP Public Key Pinningที่คุณส่งส่วนหัวเพิ่มเติมให้กับลูกค้าพร้อมกับรายการ (แฮช) ใบรับรอง SSL จริงของคุณหรือ CA ที่คุณใช้


4
HPKP จะไม่ช่วยเหลือเนื่องจากเบราว์เซอร์จะถูกเพิกเฉยหากใบรับรองถูกลงชื่อโดย CA ที่เพิ่มเข้ามาอย่างชัดเจน วิธีนี้ทำขึ้นเป็นพิเศษเพื่ออนุญาตการสกัดกั้น SSL โดยบุคคลที่เชื่อถือได้เช่นไฟร์วอลล์ขององค์กรหรือ AV บนเดสก์ท็อปท้องถิ่น
Steffen Ullrich

2
คุณถูกต้องที่นั่น: §2.6จาก RFC: "เป็นที่ยอมรับได้ว่าอนุญาตให้ปิดใช้งานการตรวจสอบความถูกต้องของพินสำหรับโฮสต์บางแห่งตามนโยบายท้องถิ่นตัวอย่างเช่น UA อาจปิดใช้งานการตรวจสอบความถูกต้องสำหรับ Pinned Hosts จุดยึดความเชื่อถือที่ผู้ใช้กำหนดเองแทนที่จะเป็นตัวยึดความไว้วางใจที่มีอยู่ใน UA (หรือแพลตฟอร์มพื้นฐาน) "
HBruijn

3

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


ใช่ฉันรู้ว่านี่อาจไม่สามารถป้องกันได้ในฝั่งเซิร์ฟเวอร์เพียงอย่างเดียว อย่างไรก็ตาม JS ฝั่งไคลเอ็นต์บางตัวอาจถูกหลอก BTW การสอดแนมพนักงานเป็นสิ่งผิดกฎหมายในประเทศแถบยุโรปส่วนใหญ่ ในฐานะผู้ดำเนินการเว็บไซต์ฉันต้องการป้องกันไม่ให้ลูกค้าของฉันถูกหลอกดังนั้นฉันสงสัยว่ามีวิธีใดที่ฉันสามารถตรวจสอบห่วงโซ่ความเชื่อมั่นในวิธีที่ปลอดภัย
Aileron79

อาจจะไม่ได้รับอนุญาต แต่ บริษัท ส่วนใหญ่ไม่ได้สอดแนมพนักงานที่ต้องการรักษาความปลอดภัยเครือข่ายของ บริษัท เท่านั้นและผู้ดูแลเว็บหรือสแกนเนอร์ส่วนใหญ่จะต้องแยกการเชื่อมต่อ SSL เพื่อตรวจสอบสิ่งนี้ ดังนั้นนี่คือนักกฎหมายในการโจมตีตรงกลาง
beli3ver

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

3
มันเป็นไปไม่ได้. เมื่อใบรับรองหลักมีการเปลี่ยนแปลงในไคลเอนต์คุณไม่มีวิธีการตรวจสอบ เซิร์ฟเวอร์ไม่ได้ทำการตรวจสอบลูกค้าทำการตรวจสอบ
beli3ver

3

คุณCOULD (ชนิดของ) แต่คำถามที่แท้จริงคือไม่ว่าคุณควร

แต่ระวังมันไม่มีที่ไหนง่ายเหมือนการเปลี่ยนธงใน apache.conf

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

  • คุณสามารถปรับใช้ TLS อีกครั้งใน javascriptและทำการตรวจสอบที่นั่นหากใบรับรองที่ลูกค้าเชื่อมต่ออยู่คือใบรับรองของเว็บไซต์ของคุณ

  • หากคุณโชคดีผู้ใช้อาจใช้เบราว์เซอร์ที่ Javascript ฝั่งไคลเอ็นต์สามารถรับข้อมูลเกี่ยวกับใบรับรองระยะไกลที่ใช้ (และตรวจสอบได้ง่ายจากค่าฮาร์ดโค้ดของใบรับรองเซิร์ฟเวอร์ของคุณ)

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

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


" คุณสามารถนำ TLS มาใช้ซ้ำใน javascript " ได้อย่างไร ที่ไหน?
curiousguy

@currigy ที่ข้อความ qouted เป็นลิงค์ - คลิกที่มันและมันจะนำคุณไปสู่คำถามและคำตอบอื่นและในที่สุดก็ถึงโครงการ digitalbazaar / Forge
Matija Nalis

ดังนั้นเมื่อไหร่จะใช้งานได้? เพื่อจุดประสงค์ใด
curiousguy

@crossguy ท่ามกลางสิ่งอื่น ๆ โดยเฉพาะอย่างยิ่งสำหรับวัตถุประสงค์ที่ถามในคำถาม Serverfault นี้ เมื่อคุณมี JS TLS ของคุณเองทำงานบนไคลเอนต์ JS ลูกค้านั้นจะรู้ว่าเซิร์ฟเวอร์ TLS ใดที่ไคลเอ็นต์เชื่อมต่ออยู่ (และเป็นกุญแจสาธารณะ) จากนั้นคุณสามารถเปรียบเทียบคีย์สาธารณะกับคีย์สาธารณะของเซิร์ฟเวอร์ที่ได้รับอนุญาต (เช่นฮาร์ดโค้ดใน JS ของคุณ) และหากคุณจะรู้ว่าพวกเขาเหมือนกันหรือไม่ หากพวกเขาไม่เหมือนกันการเชื่อมต่อของคุณได้ถูกขโมยโดย MiTM
Matija Nalis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.