การตั้งค่าพร็อกซี SSL แบบโปร่งใส


14

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

ฉันได้เขียนกฎต่อไปนี้สำหรับ iptables:

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

ใน 192.168.2.1:1337 ฉันมี http proxy โปร่งใสโดยใช้ Charles ( http://www.charlesproxy.com/ ) สำหรับการบันทึก

ทุกอย่างดีสำหรับพอร์ต 80 แต่เมื่อฉันเพิ่มกฎที่คล้ายกันสำหรับพอร์ต 443 (SSL) ที่ชี้ไปที่พอร์ต 1337 ฉันได้รับข้อผิดพลาดเกี่ยวกับข้อความที่ไม่ถูกต้องผ่านทาง Charles

ฉันเคยใช้ SSL proxying บนคอมพิวเตอร์เครื่องเดียวกันมาก่อนกับ Charles ( http://www.charlesproxy.com/documentation/proxying/ssl-proxying/ ) แต่ไม่ประสบความสำเร็จในการทำสิ่งนี้อย่างโปร่งใสด้วยเหตุผลบางประการ แหล่งข้อมูลบางแห่งที่ฉัน googled บอกว่าเป็นไปไม่ได้ - ฉันยินดีที่จะยอมรับว่าเป็นคำตอบถ้ามีคนอธิบายได้ว่าทำไม

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

ขอบคุณ!

แก้ไข: หลังจากเล่นกับมันเพียงเล็กน้อยฉันก็สามารถทำให้มันทำงานกับโฮสต์ที่เฉพาะเจาะจงได้ เมื่อฉันแก้ไข iptables ของฉันต่อไปนี้ (และเปิด 1338 ใน charles สำหรับ reverse proxy):

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.2.1:1338
-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 1338

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

ฉันสามารถรับการตอบกลับ แต่ไม่มีโฮสต์ปลายทาง ใน reverse proxy ถ้าฉันเพียงระบุว่าทุกอย่างตั้งแต่ปี 1338 ไปยังโฮสต์เฉพาะที่ฉันต้องการกดมันจะทำการจับมืออย่างถูกต้องและฉันสามารถเปิดใช้ SSL พร็อกซี่เพื่อตรวจสอบการสื่อสาร

การตั้งค่าน้อยกว่าอุดมคติเพราะฉันไม่ต้องการคิดทุกอย่างตั้งแต่ปี 1338 ไปที่โฮสต์นั้น - มีความคิดใดว่าเหตุใดโฮสต์ปลายทางจึงถูกถอดออก

ขอบคุณอีกครั้ง


คุณกำลังมีปัญหาเฉพาะอะไร เป็นไปได้เนื่องจากคุณเชื่อถือใบรับรองที่สร้างแบบไดนามิก - อาจเป็น MITM และจับข้อความธรรมดาของการสื่อสารและการเชื่อมต่อยังคงได้รับความไว้วางใจจากลูกค้า
Shane Madden

ฉันแก้ไขโพสต์ของฉัน - ฉันเชื่อว่าโฮสต์ปลายทางถูกถอดออก
badunk

คำตอบ:


10

ปัญหาที่คุณเห็นเหมือนกันว่าป้องกันการใช้ใบรับรองการหลายคนในที่อยู่ / IP พอร์ตเดียว (โดยไม่ใช้ชื่อเซิร์ฟเวอร์บ่งชี้)

ใน HTTP ธรรมดาพร็อกซีโปร่งใสของคุณสามารถบอกได้ว่าไคลเอ็นต์ต้องการเชื่อมต่อกับโฮสต์ใดโดยดูที่Hostส่วนหัว

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

  • เพื่อให้ได้ชื่อโฮสต์ที่คาดไว้พร็อกซี MITM จะต้องอ่านHostส่วนหัวในข้อความ HTTP ซึ่งสามารถเกิดขึ้นได้หลังจากการจับมือสำเร็จเท่านั้น
  • เพื่อให้มีการจับมือที่ประสบความสำเร็จพร็อกซี MITM จำเป็นต้องสร้างใบรับรองการปลอมแปลงที่ตรงกับชื่อโฮสต์ที่คาดหวัง

ดังนั้นพร็อกซี MITM จึงไม่สามารถรู้ได้ว่าใบรับรองใดที่จะสร้างก่อนการจับมือกัน

สิ่งนี้สามารถทำงานกับพร็อกซี MITM แบบไม่โปร่งใสได้เพราะอย่างน้อยคุณจะได้รับชื่อโฮสต์ที่ต้องการผ่านCONNECTวิธีHTTP


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

1
@badunk ฉันไม่คิดว่าคุณทำได้เว้นแต่คุณจะปิดใช้งานการตรวจสอบใบรับรองทั้งหมดในฝั่งไคลเอ็นต์
Bruno

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

mitmproxy เป็น HTTPS proxy คุณไม่จำเป็นต้องปิดการใช้งานการตรวจสอบใบรับรองทั้งหมด แต่คุณต้องติดตั้งใบรับรอง mitmproxy เนื่องจากจะใช้สำหรับการเชื่อมต่อ https ทั้งหมด
ไทเลอร์

3

เพียงข้อมูลพื้นฐานเกี่ยวกับหัวข้อนี้

มีอุปกรณ์เพียงไม่กี่ตัวที่ฉันรู้ว่าสามารถลดการกระทำนี้ได้สำเร็จ อย่างไรก็ตามพวกเขาจะไม่สามารถใช้ได้กับประชาชนทั่วไปจริงๆ ฉันเองกำลังใช้ Fortinet Fortigate กับ SSL Offloading

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

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

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

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


1

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

กฎ iptables ดูเหมือนว่าใช้ได้ แต่ฉันไม่รู้ว่าซอฟต์แวร์พร็อกซีที่คุณใช้นั้นสามารถทำสิ่งที่คุณพยายามทำได้หรือไม่ เอกสารนี้อ้างว่าเป็นกรณีอย่างแน่นอน


0

เพื่อเพิ่มวิธีการแก้ปัญหาของ Bruno ฉันตรวจสอบเล็กน้อยและต้องการแบ่งปันว่าฉันได้รับการแก้ไขด่วนแบบอื่นที่ไม่เหมาะ

หลังจากตั้งค่า iptables เหล่านั้นฉันสามารถใส่ reverse proxy บนพอร์ต 1338 และส่งต่อไปยัง localhost บนพอร์ต 1337 เนื่องจากพอร์ต 1337 เป็น HTTP http โปร่งใสและข้อมูลถูกถอดรหัสมันจะใช้ส่วนหัวของโฮสต์และทำให้เป็นปลายทาง เจ้าภาพ

ข้อเสียที่สำคัญคือฉันได้แปลงการเชื่อมต่อ https เป็น http - ซึ่งไม่ได้ทำงานกับเซิร์ฟเวอร์ทุกเครื่องเสมอไป (ไม่ต้องพูดถึงช่องโหว่ความปลอดภัยที่ฉันพบเห็น

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


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