วิธีแก้ไขช่องโหว่ 'logjam' ใน Apache (httpd)


56

เมื่อเร็ว ๆ นี้มีการเผยแพร่ช่องโหว่ใหม่ใน Diffie-Hellman อย่างไม่เป็นทางการซึ่งเรียกว่า 'logjam' ซึ่งมีการรวบรวมหน้านี้เพื่อแนะนำวิธีการแก้ไขช่องโหว่:

เรามีคำแนะนำสามข้อสำหรับการปรับใช้ Diffie-Hellman สำหรับ TLS อย่างถูกต้อง:

  1. ปิดใช้งานการส่งออกชุดรหัส แม้ว่าเบราว์เซอร์รุ่นใหม่จะไม่สนับสนุนชุดการส่งออกอีกต่อไป แต่การโจมตี FREAK และ Logjam ทำให้ผู้โจมตีในระดับกลางสามารถหลอกเบราว์เซอร์ให้ใช้การเข้ารหัสระดับการส่งออกหลังจากนั้นการเชื่อมต่อ TLS สามารถถอดรหัสได้ เลขศูนย์ส่งออกเป็นส่วนที่เหลือของนโยบายยุค 90 ที่ป้องกันไม่ให้โปรโตคอลการเข้ารหัสลับที่แข็งแกร่งจากการถูกส่งออกจากประเทศสหรัฐอเมริกา ไม่มีลูกค้าสมัยใหม่ที่ใช้ชุดส่งออกและมีข้อเสียเล็กน้อยในการปิดใช้งาน
  2. จัดวาง (Ephemeral) Elliptic-Curve Diffie-Hellman (ECDHE) การแลกเปลี่ยนคีย์แบบ Elliptic-Curve Diffie-Hellman (ECDH) หลีกเลี่ยงการโจมตีแบบ cryptanalytic ที่เป็นไปได้ทั้งหมดและเว็บเบราว์เซอร์สมัยใหม่ต้องการ ECDHE มากกว่าแบบดั้งเดิมขอบเขต จำกัด Diffie-Hellman อัลกอริธึมการบันทึกที่ไม่ต่อเนื่องที่เราใช้ในการโจมตีกลุ่ม Diffie-Hellman มาตรฐานไม่ได้รับประโยชน์อย่างมากจากการ precomputation และแต่ละเซิร์ฟเวอร์ไม่จำเป็นต้องสร้างเส้นโค้งรูปไข่ที่ไม่ซ้ำกัน
  3. สร้างแรง, ไม่ซ้ำ Diffie Hellman กลุ่ม มีกลุ่มที่ใช้งานคงที่จำนวนไม่กี่เซิร์ฟเวอร์ซึ่งทำให้เป็นเป้าหมายที่ดีที่สุดสำหรับการคำนวณล่วงหน้าและการดักฟังที่อาจเกิดขึ้น ผู้ดูแลระบบควรสร้างกลุ่ม Diffie-Hellman ที่ไม่ซ้ำใคร 2048 บิตหรือมากกว่าโดยใช้ช่วงเวลา "ปลอดภัย" สำหรับแต่ละเว็บไซต์หรือเซิร์ฟเวอร์

ขั้นตอนปฏิบัติที่ดีที่สุดที่ฉันควรทำเพื่อรักษาความปลอดภัยเซิร์ฟเวอร์ของฉันตามคำแนะนำข้างต้นคืออะไร


คำตอบ:


82

จากบทความที่คุณเชื่อมโยงมีสามขั้นตอนที่แนะนำเพื่อป้องกันตัวเองจากช่องโหว่นี้ โดยหลักการแล้วขั้นตอนเหล่านี้ใช้กับซอฟต์แวร์ใด ๆ ที่คุณอาจใช้กับ SSL / TLS แต่ที่นี่เราจะจัดการกับขั้นตอนเฉพาะเพื่อนำไปใช้กับ Apache (httpd) เนื่องจากเป็นซอฟต์แวร์ที่เป็นปัญหา

  1. ปิดใช้งานการส่งออกชุดรหัส

จัดการกับการเปลี่ยนแปลงการกำหนดค่าที่เราจะทำใน 2 ด้านล่าง ( !EXPORTใกล้ถึงจุดสิ้นสุดของSSLCipherSuiteบรรทัดคือวิธีที่เราจะปิดการใช้งานชุดรหัสการส่งออก)

  1. Deploy (Ephemeral) Elliptic-Curve Diffie-Hellman (ECDHE)

สำหรับนี้คุณจำเป็นต้องแก้ไขการตั้งค่าบางอย่างใน config ไฟล์ของ Apache - คือSSLProtocol, SSLCipherSuite, SSLHonorCipherOrderที่จะมีการติดตั้ง "ปฏิบัติที่ดีที่สุด" สิ่งต่อไปนี้จะพอเพียง:

SSLProtocol             all -SSLv2 -SSLv3

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

SSLHonorCipherOrder     on

หมายเหตุ: สำหรับSSLCipherSuiteการตั้งค่าที่จะใช้สิ่งนี้จะเปลี่ยนแปลงอยู่ตลอดเวลาและเป็นความคิดที่ดีที่จะศึกษาแหล่งข้อมูลเช่นที่อยู่นี้เพื่อตรวจสอบการกำหนดค่าที่แนะนำล่าสุด

3. สร้างกลุ่ม Diffie Hellman ที่แข็งแกร่งและเป็นเอกลักษณ์

ในการทำเช่นนั้นคุณสามารถเรียกใช้

openssl dhparam -out dhparams.pem 2048.

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

วิธีใช้สิ่งที่สร้างขึ้นใหม่dhparamsใน Apache จากเอกสาร Apache :

หากต้องการสร้างพารามิเตอร์ DH ที่กำหนดเองให้ใช้คำสั่ง openssl dhparam อีกทางหนึ่งคุณสามารถผนวกพารามิเตอร์DHA 1024-บิตมาตรฐานต่อไปนี้จาก RFC 2409, ส่วน 6.2 ไปยังไฟล์ SSLCertificateFile ที่เกี่ยวข้อง :

(เน้นที่เหมือง)

ซึ่งตามมาด้วยพารามิเตอร์ DH 1024- บิตมาตรฐาน จากนี้เราสามารถสรุปได้ว่าพารามิเตอร์ DH ที่สร้างขึ้นเองนั้นสามารถผนวกเข้ากับSSLCertificateFileคำถามที่เกี่ยวข้องได้

ในการทำเช่นนั้นให้เรียกใช้บางสิ่งที่คล้ายกับตัวอย่างต่อไปนี้:

cat /path/to/custom/dhparam >> /path/to/sslcertfile

อีกทางหนึ่งตามส่วนย่อย Apacheของบทความที่คุณเชื่อมโยงตั้งแต่แรกคุณอาจระบุไฟล์ dhparams แบบกำหนดเองที่คุณสร้างขึ้นหากคุณไม่ต้องการแก้ไขไฟล์ใบรับรองเอง:

SSLOpenSSLConfCmd DHParameters "/path/to/dhparams.pem"

การกำหนดค่า Apache ใดที่เกี่ยวข้องกับการใช้งาน SSL / TLS เฉพาะของคุณโดยทั่วไปจะอยู่ในconf.d/ssl.confหรือconf.d/vhosts.confแต่จะแตกต่างกันไปขึ้นอยู่กับวิธีที่คุณกำหนดค่า Apache

มันเป็นที่น่าสังเกตว่าตามลิงค์นี้ ,

ก่อน Apache 2.4.7 พารามิเตอร์ DH จะถูกตั้งค่าเป็น 1024 บิตเสมอและไม่สามารถกำหนดได้โดยผู้ใช้ สิ่งนี้ได้รับการแก้ไขใน mod_ssl 2.4.7 ที่ Red Hat ได้ backported ลงในการกระจาย RHEL 6 Apache 2.2 ด้วย httpd-2.2.15-32.el6

ใน Debian Wheezy อัปเกรด apache2 เป็น 2.2.22-13 + deb7u4 หรือใหม่กว่าและ openssl เป็น 1.0.1e-2 + deb7u17 SSLCipherSuite ข้างต้นใช้งานไม่ได้อย่างสมบูรณ์แทนที่จะใช้สิ่งต่อไปนี้ตามบล็อกนี้ :

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!DHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-CAMELLIA128-SHA:!DHE-RSA-CAMELLIA256-SHA

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

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


1
สำหรับโหลดที่วางบนเซิร์ฟเวอร์โดยการสร้าง params คุณสามารถสร้างพวกมันบนเครื่องอื่นได้ตลอดเวลาและเพียงแค่คัดลอกหรือวางไฟล์ไปยังเซิร์ฟเวอร์เป้าหมาย ไม่จำเป็นต้องสร้าง params ในเซิร์ฟเวอร์การผลิต
Erathiel

2
หลังจากที่คุณเปลี่ยนการกำหนดค่าคุณอาจต้องการเรียกใช้การตรวจสอบที่SSLLabs.comและเพื่อให้แน่ใจ
user2428118

2
มีวิธีแก้ไขช่องโหว่นี้ใน Apache / 2.2.22 (Ubuntu 12.04) หรือไม่? ฉันผนวก dhparams.pem ไปที่ certificate.crt แต่weakdh.org/sysadmin.htmlยังคงบ่นอยู่
tersmitten

2
@tersmitten นั่นเป็นคำถามที่แยกจากกันโดยสิ้นเชิงสำหรับคำถามนี้
Michael Hampton

3
คุณสามารถรันการสร้างคีย์โดยคำสั่ง 'nice' ดังนั้นคุณสามารถใส่มันเป็น: ดี 19 openssl dhparam -out dhparams.pem 2048 สิ่งนี้จะทำงานได้นานขึ้น แต่จะใช้เวลา cpu ที่ไม่ได้ใช้เท่านั้น
Znik

1

ตามแพทช์ของ Winni Neessen ฉันได้เผยแพร่การแก้ไขสำหรับ Apache / 2.2.22 (Debian Wheezy อาจใช้งานบน Ubuntu ได้): https://flo.sh/debian-wheezy-apache2-logjam-fix/ - thx . สำหรับข้อเสนอแนะของคุณ


3
นี่เป็นแฮ็คที่แฮ็คมากกว่าทางออก การวาง nginx ไว้ข้างหน้าของอาปาเช่ของคุณในฐานะ reverse-proxy จะง่ายกว่ามากและอีกอันหนึ่งไม่ได้ใช้งานของบุคคลที่สาม
ผู้ชายคนนั้นจากที่นั่น

6
ทำไมเราควรไว้วางใจไบนารีเหล่านี้
CVn

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

อยากจะแนะนำว่าคนไม่บ่นเกี่ยวกับแพทช์แก้ไขปัญหาในซอฟต์แวร์ opensource
Florian Heigl

@FlorianHeigl ฉันไม่แน่ใจด้วยซ้ำว่าจะให้ความคิดเห็นนั้น ...
BE77Y

-7

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

ฉันเปลี่ยนไปอย่างสมบูรณ์ ช่วยให้ฉันประหยัดเวลาได้มากในการแก้ปัญหาเกี่ยวกับ TLS และ - สำหรับการกำหนดค่าของเรา - มันยังช่วยเพิ่ม RAM จำนวนมากในเวลาเดียวกัน ในความเป็นจริงฉันพบว่าการจ้างงานของ nginx เรียบง่ายและตรงไปตรงมาเมื่อเทียบกับภาวะแทรกซ้อนที่เกิดจาก config มากมายของ httpd / apache ที่ฉันคุ้นเคย อาจเป็นเรื่องของรสนิยมฉันมีความคล่องแคล่วใน httpd / apache rewrite / config / maintenance ก่อนที่ฉันจะเปิดและมันง่ายกว่าที่ฉันกลัวว่ามันจะเป็น มีข้อมูลล่าสุดที่เหมาะสมเกี่ยวกับการกำหนดค่า nginx ทางออนไลน์และฐานผู้ใช้มีขนาดใหญ่ใช้งานได้ดีและเป็นมิตรกับการสนับสนุน https://news.netcraft.com/wp-content/uploads/2018/11/wpid-wss-top-1m-share.png


3
การตั้งค่า nginx เพื่อให้สามารถส่งออกเลขศูนย์ได้จะมีความเสี่ยงต่อการโจมตี Logjam ได้อย่างแน่นอนเนื่องจากเซิร์ฟเวอร์ Apache ตั้งค่าให้อนุญาตให้ส่งออกรหัสลับได้ นอกจากนี้คำถามจะขอคำตอบใน Apache
CVn

2
ที่จริงแล้วโซลูชัน:เปลี่ยนไปใช้การแจกจ่ายที่ให้แพคเกจที่เป็นปัจจุบันมากขึ้นสำหรับซอฟต์แวร์ที่คุณต้องการเวอร์ชันที่ใหม่กว่าอย่างแน่นอน (ไม่ใช่แค่การแก้ไขข้อบกพร่อง backported อย่างเช่นกรณีที่มี Debian หรือ CentOS) หรือสร้างแพ็คเกจด้วยตัวเอง จากแหล่งที่มา (มันไม่ยาก) และติดตั้งโดยใช้ตัวจัดการแพคเกจหรือการติดตั้งแบบเก่าธรรมดาจากซอร์สโค้ด (ก็ไม่ยาก แต่ใช้เวลามากขึ้นในการจัดการ) สำหรับคำถามที่ถามว่า "ฉันจะลดช่องโหว่ X ภายในซอฟต์แวร์ Y ได้อย่างไร" คำตอบที่ระบุว่า "แทนที่ซอฟต์แวร์ Y ด้วยซอฟต์แวร์ Z" มักไม่ใช่คำตอบที่เป็นประโยชน์
CVn

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

1
ดังนั้นการกำหนดค่าซอฟต์แวร์อย่างถูกต้องเพื่อให้ปลอดภัยจากการโจมตีที่รู้จักกันคือ "เส้นทางที่ซับซ้อนของแฮ็ก"? ฉันได้รับ A + บน ssllabs.com ด้วยการกำหนดค่า apache แบบง่ายคุณเพียงแค่ใช้เวลาของคุณและทำการวิจัยเพื่อทำความเข้าใจวิธีการกำหนดค่าซอฟต์แวร์ที่คุณใช้อย่างถูกต้องโดยไม่แฮ็กที่นี่ ...
Chazy Chaz

1
@Julius - downvotes มีแนวโน้มที่จะทำอย่างไรกับการขาดคุณค่าในคำตอบของคุณเกี่ยวกับคำถามที่ถามกว่าคน "วาระ" ที่ซ่อนอยู่ใด ๆ ที่เห็นได้ชัดอาจมีต่อ nginx vs apache เมื่อมันเกิดขึ้นฉันใช้ nginx โดยเฉพาะเนื่องจากความชอบของฉัน - แต่เป็นฉันที่ตอบคำถามนี้ "เปลี่ยนเป็นซอฟต์แวร์อื่น" ไม่ใช่คำตอบที่ยอมรับได้สำหรับ "วิธีแก้ไข (ปัญหาใด ๆ )" ไม่ต้องพูดถึงคุณยังพลาดจุดช่องโหว่ที่เกิดขึ้นจริง - มันเป็นการแลกเปลี่ยนคีย์ diffie-hellman ไม่ใช่ apache (หรือ nginx หรือ sshd หรือ ... )
BE77Y
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.