ส่วนที่ฉัน: วิธีการเข้าสู่ระบบ
เราจะสมมติว่าคุณทราบวิธีสร้างฟอร์มการเข้าสู่ระบบ + รหัสผ่าน HTML ซึ่งจะโพสต์ค่าไปยังสคริปต์ทางฝั่งเซิร์ฟเวอร์สำหรับการตรวจสอบสิทธิ์ ส่วนด้านล่างจะจัดการกับรูปแบบสำหรับการรับรองความถูกต้องด้านเสียงและวิธีหลีกเลี่ยงข้อผิดพลาดด้านความปลอดภัยที่พบบ่อยที่สุด
เพื่อ HTTPS หรือไม่ไปยัง HTTPS?
ยกเว้นว่าการเชื่อมต่อนั้นปลอดภัยแล้ว (นั่นคือการส่งสัญญาณผ่าน HTTPS โดยใช้ SSL / TLS) ค่าฟอร์มการเข้าสู่ระบบของคุณจะถูกส่งในรูปแบบข้อความธรรมดาซึ่งอนุญาตให้ทุกคนกำลังดักข้อมูลบนบรรทัดระหว่างเบราว์เซอร์และเว็บเซิร์ฟเวอร์จะสามารถอ่านการเข้าสู่ระบบได้ ตลอด การดักฟังโทรศัพท์ชนิดนี้ทำขึ้นเป็นประจำโดยรัฐบาล แต่โดยทั่วไปเราจะไม่พูดถึงสาย 'ที่เป็นเจ้าของ' นอกเหนือจากที่จะพูดสิ่งนี้: เพียงใช้ HTTPS
ในสาระสำคัญเพียงในทางปฏิบัติวิธีการป้องกันการดักฟังโทรศัพท์ / แพ็คเก็ตดมกลิ่นในระหว่างการเข้าสู่ระบบโดยใช้ HTTPS หรือหนังสือรับรองตามรูปแบบการเข้ารหัสอื่น (เช่นTLS ) หรือการพิสูจน์และทดสอบรูปแบบการตอบสนองความท้าทาย (เช่นDiffie-Hellman -Based SRP) วิธีการอื่นใดที่สามารถหลบหลีกได้โดยผู้โจมตีที่ดักฟัง
แน่นอนถ้าคุณยินดีที่จะทำสิ่งเล็กน้อยไม่ได้คุณสามารถใช้รูปแบบการตรวจสอบสิทธิ์แบบสองปัจจัยบางรูปแบบ (เช่นแอป Google Authenticator, สมุดรหัส 'สไตล์สงครามเย็น' ทางกายภาพหรือดองเกิลตัวสร้างคีย์ RSA) หากใช้อย่างถูกต้องสิ่งนี้สามารถทำงานได้แม้จะมีการเชื่อมต่อที่ไม่ปลอดภัย แต่ก็ยากที่จะจินตนาการได้ว่าผู้พัฒนาจะยินดีที่จะใช้การรับรองความถูกต้องสองปัจจัย แต่ไม่ใช่ SSL
(อย่า) การเข้ารหัส / hashing JavaScript ของคุณเอง
ด้วยค่าใช้จ่ายที่รับรู้ (ถึงตอนนี้สามารถหลีกเลี่ยงได้ ) การตั้งค่าใบรับรอง SSL บนเว็บไซต์ของคุณทำให้นักพัฒนาบางคนถูกล่อลวงให้มีการแฮ็กหรือการเข้ารหัสลับในเบราว์เซอร์ในเบราว์เซอร์ของตนเอง
ในขณะที่นี่เป็นความคิดอันสูงส่งมันไร้ประโยชน์เป็นหลัก (และอาจเป็นข้อบกพร่องด้านความปลอดภัย ) เว้นแต่จะรวมกับข้อใดข้อหนึ่งข้างต้น - นั่นคือไม่ว่าจะเป็นการรักษาความปลอดภัยด้วยการเข้ารหัสที่แข็งแกร่งหรือการทดสอบความท้าทาย กลไก (ถ้าคุณไม่รู้ว่ามันคืออะไรเพียงแค่รู้ว่ามันเป็นหนึ่งในวิธีที่ยากที่สุดในการพิสูจน์ยากที่สุดในการออกแบบและยากที่สุดที่จะใช้แนวคิดในการรักษาความปลอดภัยแบบดิจิทัล)
แม้ว่าการแฮ็กรหัสผ่านจะมีประสิทธิภาพต่อการเปิดเผยรหัสผ่านแต่ก็มีความเสี่ยงที่จะเกิดการโจมตีซ้ำการโจมตี / การไฮแจ็กของ Man-In-The-Middle (หากผู้โจมตีสามารถแทรกจำนวนไบต์ลงในหน้า HTML ที่ไม่ปลอดภัยก่อนถึง เบราว์เซอร์พวกเขาสามารถคอมเม้นท์การจู่โจมใน JavaScript) หรือการโจมตีแบบ brute-force (เนื่องจากคุณส่งผู้โจมตีทั้งชื่อผู้ใช้เกลือและรหัสผ่านที่แฮช)
CAPTCHAS ต่อมนุษยชาติ
CAPTCHAนั้นมีจุดประสงค์เพื่อป้องกันการโจมตีประเภทหนึ่งโดยเฉพาะ: พจนานุกรมอัตโนมัติ / การเดรัจฉานบังคับโดยไม่มีข้อผิดพลาด ไม่ต้องสงสัยเลยว่านี่เป็นภัยคุกคามที่แท้จริงอย่างไรก็ตามมีวิธีจัดการกับมันอย่างราบรื่นที่ไม่ต้องใช้ CAPTCHA ซึ่งออกแบบมาเป็นพิเศษสำหรับแผนการควบคุมปริมาณการเข้าสู่ระบบฝั่งเซิร์ฟเวอร์ - เราจะพูดถึงสิ่งต่อไป
รู้ว่าการใช้งานของ CAPTCHA นั้นไม่ได้สร้างเหมือนกัน พวกเขามักจะไม่ใช่มนุษย์ที่สามารถแก้ไขได้จริง ๆ แล้วพวกเขาส่วนใหญ่ไม่ได้ผลกับบอทพวกเขาทั้งหมดไม่ได้ผลกับแรงงานโลกราคาถูก (อ้างอิงจากOWASP , อัตรา sweatshop ปัจจุบันอยู่ที่ $ 12 ต่อการทดสอบ 500 ครั้ง) และการใช้งานบางอย่าง ผิดกฎหมายทางเทคนิคในบางประเทศ (ดูเอกสารรับรองการตรวจสอบสิทธิ์ OWASP ) หากคุณต้องใช้ CAPTCHA ให้ใช้reCAPTCHAของ Google เนื่องจากเป็น OCR-hard ตามคำนิยาม (เนื่องจากใช้การสแกนหนังสือ OCR ที่ไม่ได้จัดประเภทไว้แล้ว) และพยายามอย่างมากที่จะใช้งานง่าย
โดยส่วนตัวแล้วฉันมักจะพบว่า CAPTCHAS น่ารำคาญและใช้เป็นทางเลือกสุดท้ายเมื่อผู้ใช้ไม่สามารถเข้าสู่ระบบได้หลายครั้งและความล่าช้าในการควบคุมปริมาณได้สูงสุด สิ่งนี้จะเกิดขึ้นไม่มากพอที่จะยอมรับได้และจะเสริมสร้างระบบโดยรวม
การจัดเก็บรหัสผ่าน / การตรวจสอบการเข้าสู่ระบบ
นี่อาจเป็นความรู้ทั่วไปในที่สุดหลังจากการแฮ็กข้อมูลและการรั่วไหลของข้อมูลผู้ใช้ที่เราพบเห็นในช่วงไม่กี่ปีที่ผ่านมา แต่จะต้องมีการกล่าวว่า: อย่าเก็บรหัสผ่านในข้อความธรรมดาในฐานข้อมูลของคุณ ฐานข้อมูลผู้ใช้ถูกแฮ็ครั่วไหลหรือรวบรวมผ่านการฉีด SQL เป็นประจำและหากคุณเก็บรหัสผ่านแบบดิบๆซึ่งเป็นเกมที่เล่นง่ายเพื่อความปลอดภัยในการเข้าสู่ระบบของคุณ
ดังนั้นหากคุณไม่สามารถจัดเก็บรหัสผ่านได้คุณจะตรวจสอบว่าชุดค่าผสมของการลงชื่อเข้าใช้ + รหัสผ่าน POSTed จากแบบฟอร์มเข้าสู่ระบบถูกต้องอย่างไร คำตอบคือ hashing โดยใช้ฟังก์ชั่นที่สำคัญมา เมื่อใดก็ตามที่ผู้ใช้ใหม่ถูกสร้างขึ้นหรือเปลี่ยนรหัสผ่านคุณจะใช้รหัสผ่านและเรียกใช้ผ่าน KDF เช่น Argon2, bcrypt, scrypt หรือ PBKDF2 เปลี่ยนรหัสผ่าน cleartext ("ถูกต้องลงรหัสผ่าน") ซึ่งปลอดภัยมากในการจัดเก็บในฐานข้อมูลของคุณ เพื่อตรวจสอบการเข้าสู่ระบบคุณเรียกใช้ฟังก์ชันแฮชเดียวกันกับรหัสผ่านที่ป้อนเวลานี้ผ่านไปในเกลือและเปรียบเทียบสตริงแฮชผลลัพธ์กับค่าที่เก็บไว้ในฐานข้อมูลของคุณ Argon2, bcrypt และ scrypt เก็บเกลือด้วยแฮชแล้ว ลองดูบทความนี้ใน sec.stackexchange เพื่อดูข้อมูลโดยละเอียดเพิ่มเติม
เหตุผลเกลือถูกนำมาใช้เป็นที่คร่ำเครียดในตัวเองไม่เพียงพอ - คุณจะต้องการเพิ่มที่เรียกว่า 'เกลือ' เพื่อปกป้องกัญชากับตารางรุ้ง เกลือป้องกันรหัสผ่านสองรหัสที่ตรงกับการจัดเก็บเป็นค่าแฮชเดียวกันได้อย่างมีประสิทธิภาพป้องกันการสแกนฐานข้อมูลทั้งหมดในการรันครั้งเดียวหากผู้โจมตีทำการประมวลผลการเดารหัสผ่าน
ไม่ควรใช้แฮชการเข้ารหัสสำหรับการจัดเก็บรหัสผ่านเนื่องจากรหัสผ่านที่ผู้ใช้เลือกไม่แข็งแรงพอ (เช่นมักจะมีเอนโทรปีไม่เพียงพอ) และการโจมตีการเดารหัสผ่านอาจเสร็จสิ้นในเวลาอันสั้นโดยผู้โจมตีที่เข้าถึงแฮช นี่คือเหตุผลที่ใช้ KDF - "ยืดคีย์"อย่างมีประสิทธิภาพซึ่งหมายความว่ารหัสผ่านทุกอันเดาได้ว่าผู้โจมตีทำให้เกิดการซ้ำซ้อนหลายครั้งของอัลกอริทึมแฮชเช่น 10,000 ครั้งซึ่งทำให้ผู้โจมตีเดารหัสผ่านช้าลง 10,000 ครั้ง
ข้อมูลเซสชัน - "คุณเข้าสู่ระบบในฐานะ Spiderman69"
เมื่อเซิร์ฟเวอร์ตรวจสอบการเข้าสู่ระบบและรหัสผ่านกับฐานข้อมูลผู้ใช้ของคุณและพบว่าการจับคู่ระบบต้องการวิธีที่จะจำได้ว่าเบราว์เซอร์ได้รับการรับรองความถูกต้อง ความจริงเรื่องนี้ควรจัดเก็บในฝั่งเซิร์ฟเวอร์ในข้อมูลเซสชันเท่านั้น
หากคุณไม่คุ้นเคยกับข้อมูลเซสชันนี่คือวิธีการทำงาน: สตริงที่สร้างขึ้นแบบสุ่มเดียวจะถูกเก็บไว้ในคุกกี้ที่หมดอายุและใช้เพื่ออ้างอิงการรวบรวมข้อมูล - ข้อมูลเซสชัน - ซึ่งถูกเก็บไว้บนเซิร์ฟเวอร์ หากคุณกำลังใช้เฟรมเวิร์ก MVC สิ่งนี้จะถูกจัดการอย่างไม่ต้องสงสัย
หากเป็นไปได้ตรวจสอบให้แน่ใจว่าคุกกี้เซสชันมีการตั้งค่าสถานะที่ปลอดภัยและ HTTP เท่านั้นเมื่อส่งไปยังเบราว์เซอร์ การตั้งค่าสถานะ HttpOnly ให้การป้องกันคุกกี้ที่ถูกอ่านผ่านการโจมตี XSS การตั้งค่าสถานะที่ปลอดภัยช่วยให้มั่นใจได้ว่าคุกกี้จะถูกส่งกลับผ่าน HTTPS เท่านั้นดังนั้นจึงป้องกันการโจมตีจากการดมกลิ่นเครือข่าย ค่าของคุกกี้ไม่ควรคาดเดาได้ ที่ไหนคุกกี้อ้างอิงเซสชั่นที่ไม่มีอยู่จริงจะนำเสนอความคุ้มค่าควรจะเปลี่ยนทันทีเพื่อป้องกันการตรึงเซสชั่น
ส่วนที่ II: วิธีการคงการลงชื่อเข้าใช้ - ช่องทำเครื่องหมาย "จดจำฉัน" ที่น่าอับอาย
คุกกี้การเข้าสู่ระบบถาวร (ฟังก์ชั่น "จดจำฉัน") เป็นเขตอันตราย ในอีกด้านหนึ่งพวกเขามีความปลอดภัยเท่ากับการเข้าสู่ระบบทั่วไปเมื่อผู้ใช้เข้าใจวิธีการจัดการพวกเขา; และในทางกลับกันพวกเขามีความเสี่ยงด้านความปลอดภัยอย่างมากต่อผู้ใช้ที่ประมาทผู้ใช้คอมพิวเตอร์สาธารณะและลืมที่จะออกจากระบบและผู้ที่ไม่ทราบว่าคุกกี้ของเบราว์เซอร์คืออะไรหรือจะลบทิ้งอย่างไร
โดยส่วนตัวฉันชอบการลงชื่อเข้าใช้แบบถาวรสำหรับเว็บไซต์ที่ฉันเข้าชมเป็นประจำ แต่ฉันรู้วิธีจัดการอย่างปลอดภัย หากคุณมั่นใจว่าผู้ใช้ของคุณรู้เหมือนกันคุณสามารถใช้การเข้าสู่ระบบแบบถาวรด้วยความรู้สึกผิดชอบชั่วดี หากไม่เป็นเช่นนั้นคุณอาจสมัครสมาชิกกับปรัชญาที่ผู้ใช้ที่ไม่ใส่ใจกับข้อมูลรับรองการเข้าสู่ระบบของพวกเขานำพวกเขามาเองหากพวกเขาถูกแฮ็ก มันไม่เหมือนกับที่เราไปที่บ้านของผู้ใช้ของเราและฉีกโพสต์มันมันออกมาด้วยการใช้รหัสผ่านที่มีอยู่บนหน้าจอของพวกเขา
แน่นอนบางระบบไม่สามารถที่จะมีใด ๆบัญชีถูกแฮ็ก; สำหรับระบบดังกล่าวไม่มีวิธีที่คุณสามารถพิสูจน์ได้ว่ามีการเข้าสู่ระบบแบบถาวร
หากคุณตัดสินใจที่จะใช้คุกกี้เข้าสู่ระบบแบบถาวรนี่คือวิธีที่คุณทำ:
ก่อนอื่นใช้เวลาสักครู่เพื่ออ่านบทความของ Paragon Initiativeในหัวข้อ คุณจะต้องทำให้องค์ประกอบต่าง ๆ ถูกต้องและบทความนี้อธิบายได้ดีมาก
และเพียงเพื่อย้ำข้อผิดพลาดที่พบได้บ่อยที่สุดอย่าเก็บ COOKIE เข้าสู่ระบบของคุณไว้ในฐานข้อมูลของคุณเพียงแฮชของมัน! โทเค็นการเข้าสู่ระบบคือรหัสผ่านที่เทียบเท่าดังนั้นหากผู้โจมตีเข้ามาในฐานข้อมูลของคุณพวกเขาสามารถใช้โทเค็นเพื่อเข้าสู่บัญชีใด ๆ ราวกับว่าพวกเขาเป็นชุดรหัสผ่านเข้าสู่ระบบ cleartext ดังนั้นให้ใช้การแฮช (ตามhttps://security.stackexchange.com/a/63438/5002แฮชที่อ่อนแอจะทำได้ดีสำหรับวัตถุประสงค์นี้) เมื่อจัดเก็บโทเค็นการเข้าสู่ระบบแบบถาวร
ตอนที่ III: การใช้คำถามลับ
ไม่ใช้คำถาม 'ความลับ' คุณลักษณะ 'คำถามลับ' คือรูปแบบการรักษาความปลอดภัย อ่านกระดาษจากลิงค์หมายเลข 4 จากรายการต้องอ่าน คุณสามารถถาม Sarah Palin เกี่ยวกับเรื่องนี้หลังจากที่ Yahoo! บัญชีอีเมลถูกแฮ็กในระหว่างการชิงตำแหน่งประธานาธิบดีครั้งก่อนเนื่องจากคำตอบสำหรับคำถามเพื่อความปลอดภัยของเธอคือ ... "Wasilla High School"!
แม้ว่าจะมีคำถามที่ผู้ใช้ระบุ แต่ก็มีโอกาสสูงที่ผู้ใช้ส่วนใหญ่จะเลือก:
คำถามลับ 'มาตรฐาน' เช่นชื่อเดิมของแม่หรือสัตว์เลี้ยงตัวโปรด
เรื่องไม่สำคัญง่ายๆที่ทุกคนสามารถยกได้จากบล็อกโปรไฟล์ LinkedIn หรือสิ่งที่คล้ายกัน
คำถามใด ๆ ที่ตอบได้ง่ายกว่าการเดารหัสผ่าน ซึ่งสำหรับรหัสผ่านที่ดีทุกคำถามที่คุณสามารถจินตนาการได้
โดยสรุปแล้วคำถามด้านความปลอดภัยนั้นไม่ปลอดภัยในทุกรูปแบบและทุกรูปแบบและไม่ควรใช้ในรูปแบบการรับรองความถูกต้องด้วยเหตุผลใดก็ตาม
เหตุผลที่แท้จริงที่ว่าทำไมถึงมีคำถามเกี่ยวกับความปลอดภัยอยู่ในตัวเพราะพวกเขาประหยัดค่าใช้จ่ายในการโทรหาผู้ใช้ที่ไม่สามารถเข้าถึงอีเมลเพื่อรับรหัสเปิดใช้งานได้อย่างสะดวก นี่เป็นค่าใช้จ่ายด้านความปลอดภัยและชื่อเสียงของ Sarah Palin มันคุ้มค่าหรือไม่ อาจจะไม่.
ส่วนที่ 4: ฟังก์ชั่นรหัสผ่านที่ลืม
ฉันได้พูดไปแล้วว่าทำไมคุณไม่ควรใช้คำถามเพื่อความปลอดภัยในการจัดการรหัสผ่านผู้ใช้ที่ลืม / ทำหาย มันจะไปโดยไม่บอกว่าคุณไม่ควรอีเมลผู้ใช้รหัสผ่านจริงของพวกเขา มีข้อผิดพลาดที่พบบ่อยเกินกว่าทั้งหมดอย่างน้อยสองรายการเพื่อหลีกเลี่ยงในฟิลด์นี้:
อย่ารีเซ็ตรหัสผ่านที่ลืมไปเป็นรหัสผ่านที่รัดกุมที่สร้างอัตโนมัติ - รหัสผ่านดังกล่าวจำได้ยากซึ่งหมายความว่าผู้ใช้จะต้องเปลี่ยนหรือจดบันทึก - พูดด้วยโพสต์อิทเหลืองบนจอมอนิเตอร์ แทนที่จะตั้งรหัสผ่านใหม่เพียงให้ผู้ใช้เลือกใหม่ได้ทันที - ซึ่งเป็นสิ่งที่พวกเขาต้องการจะทำต่อไป (ข้อยกเว้นนี้อาจเกิดขึ้นหากผู้ใช้ใช้ตัวจัดการรหัสผ่านในการจัดเก็บ / จัดการรหัสผ่านโดยทั่วไปซึ่งเป็นไปไม่ได้ที่จะจำได้โดยไม่ต้องเขียนลง)
แฮชรหัสผ่าน / โทเค็นที่หายไปเสมอในฐานข้อมูล อีกครั้งรหัสนี้เป็นอีกตัวอย่างหนึ่งของรหัสผ่านที่เทียบเท่าดังนั้นจึงต้องมีการแฮชในกรณีที่ผู้โจมตีเข้าสู่ฐานข้อมูลของคุณ เมื่อรหัสรหัสที่หายไปมีการร้องขอส่งรหัส plaintext ไปยังที่อยู่อีเมลของผู้ใช้แล้วสับมันประหยัดกัญชาในฐานข้อมูลของคุณ - และโยนออกไปเดิม เช่นรหัสผ่านหรือโทเค็นการเข้าสู่ระบบแบบถาวร
หมายเหตุสุดท้าย: ให้แน่ใจว่าอินเทอร์เฟซของคุณสำหรับการป้อน 'รหัสผ่านที่หายไป' นั้นปลอดภัยอย่างน้อยเท่ากับรูปแบบการเข้าสู่ระบบของคุณเองมิฉะนั้นผู้โจมตีจะใช้สิ่งนี้เพื่อเข้าถึงแทน การทำให้แน่ใจว่าคุณสร้าง 'รหัสผ่านที่หายไป' เป็นเวลานาน (ตัวอย่างเช่นตัวอักษรและตัวเลขแบบตัวพิมพ์เล็ก - ตัวพิมพ์เล็กและตัวพิมพ์เล็กและตัวพิมพ์เล็กและตัวพิมพ์เล็กและตัวพิมพ์เล็กและตัวพิมพ์เล็กและตัวพิมพ์เล็ก) 16 ตัว
ส่วนที่ V: ตรวจสอบความแข็งแรงของรหัสผ่าน
ก่อนอื่นคุณจะต้องอ่านบทความเล็ก ๆ นี้เพื่อตรวจสอบความจริง: 500 รหัสผ่านที่พบบ่อยที่สุด
ตกลงดังนั้นรายการอาจไม่ใช่รายการรหัสผ่านที่เป็นที่ยอมรับมากที่สุดในระบบใด ๆก็ตามแต่ก็เป็นเครื่องบ่งชี้ที่ดีว่าผู้คนที่ไม่ดีจะเลือกรหัสผ่านเมื่อไม่มีนโยบายบังคับใช้ นอกจากนี้รายการจะดูใกล้บ้านอย่างน่ากลัวเมื่อเปรียบเทียบกับการวิเคราะห์รหัสผ่านที่ถูกขโมยล่าสุด
ดังนั้น: ไม่มีข้อกำหนดด้านความปลอดภัยของรหัสผ่านขั้นต่ำ 2% ของผู้ใช้จึงใช้รหัสผ่านทั่วไป 20 อันดับแรก ความหมาย: หากผู้โจมตีได้เพียง 20 ครั้งบัญชี 1 ใน 50 บัญชีในเว็บไซต์ของคุณจะแตกได้
การขัดขวางสิ่งนี้จำเป็นต้องมีการคำนวณเอนโทรปีของรหัสผ่านจากนั้นจึงใช้เก ณ ฑ์ สถาบันมาตรฐานและเทคโนโลยีแห่งชาติ (NIST) สิ่งพิมพ์พิเศษ 800-63มีชุดของคำแนะนำที่ดีมาก เมื่อรวมกับการวิเคราะห์เค้าโครงพจนานุกรมและแป้นพิมพ์ (ตัวอย่างเช่น 'qwertyuiop' เป็นรหัสผ่านไม่ถูกต้อง) สามารถปฏิเสธรหัสผ่านที่ได้รับการคัดเลือกต่ำทั้งหมด 99%ที่ระดับ 18 บิตของเอนโทรปี เพียงแค่คำนวณความแข็งแรงของรหัสผ่านและการแสดงเครื่องวัดความแรงของภาพให้ผู้ใช้เห็นว่าดี แต่ไม่เพียงพอ ผู้ใช้จำนวนมากมักจะเพิกเฉยต่อมันเว้นแต่จะมีการบังคับใช้
และเพื่อความสดชื่นในการใช้งานรหัสผ่านเอนโทรปีที่เป็นมิตรผู้ใช้ขอแนะนำให้ใช้Password Strength xkcdของ Randall Munroe
ใช้ประโยชน์จาก Troy Hunt ของฉันฉันได้รับ Pwned APIเพื่อตรวจสอบรหัสผ่านของผู้ใช้กับรหัสผ่านที่ถูกบุกรุกในช่องโหว่ข้อมูลสาธารณะ
ตอนที่ VI: อื่น ๆ อีกมากมาย - หรือ: การป้องกันความพยายามในการเข้าสู่ระบบไฟอย่างรวดเร็ว
ก่อนอื่นให้ดูที่ตัวเลข: ความเร็วในการกู้รหัสผ่าน - รหัสผ่านของคุณจะตั้งอยู่นานเท่าไร
หากคุณไม่มีเวลาสำรวจตารางในลิงค์ดังกล่าวนี่คือรายการของพวกเขา:
มันต้องใช้เวลาแทบไม่มีเวลาที่จะแตกรหัสผ่านที่อ่อนแอแม้ว่าคุณจะแตกมันด้วยลูกคิด
มันต้องใช้เวลาแทบไม่มีเวลาที่จะแตกตัวเลขและรหัสผ่าน 9 ตัวถ้ามันเป็นกรณีตาย
มันต้องใช้เวลาแทบไม่มีเวลาที่จะแตกซับซ้อนสัญลักษณ์และตัวอักษรและตัวเลขรหัสผ่านบนและตัวพิมพ์เล็กถ้ามันเป็นน้อยกว่า 8 ตัวอักษร (พีซีสามารถค้นหา Keyspace ทั้งหมดถึง 7 ตัวละครในเรื่อง วันหรือชั่วโมง)
อย่างไรก็ตามจะใช้เวลานานเกินไปในการถอดรหัสแม้แต่รหัสผ่าน 6 ตัวอักษรหากคุณ จำกัด การพยายามหนึ่งครั้งต่อวินาที!
ดังนั้นเราสามารถเรียนรู้อะไรจากตัวเลขเหล่านี้ ดีมาก แต่เราสามารถมุ่งเน้นไปที่ส่วนที่สำคัญที่สุด: ความจริงที่ว่าการป้องกันการเข้าสู่ระบบอย่างต่อเนื่องเป็นจำนวนมาก (เช่นการโจมตีด้วยกำลังดุร้าย ) นั้นไม่ยาก แต่การป้องกันไม่ให้ถูกต้องนั้นไม่ง่ายอย่างที่คิด
โดยทั่วไปคุณมีสามตัวเลือกที่มีประสิทธิภาพต่อการโจมตีแบบ brute-force (และการโจมตีแบบพจนานุกรม แต่เนื่องจากคุณใช้นโยบายรหัสผ่านที่เข้มงวดอยู่แล้วพวกเขาไม่ควรเป็นปัญหา) :
นำเสนอCAPTCHAหลังจากความพยายามที่ล้มเหลว N ครั้ง (น่ารำคาญเหมือนนรกและบ่อยครั้งที่ไม่ได้ผล - แต่ฉันกำลังทำซ้ำตัวเองที่นี่
การล็อคบัญชีและต้องการการยืนยันอีเมลหลังจากความพยายามที่ล้มเหลว N ครั้ง (นี่คือการโจมตี DoS ที่รอให้เกิดขึ้น)
และในที่สุดการควบคุมปริมาณการเข้าสู่ระบบ : นั่นคือการตั้งค่าการหน่วงเวลาระหว่างความพยายามหลังจากความพยายามที่ล้มเหลว N ครั้ง (ใช่การโจมตี DoS ยังคงเป็นไปได้ แต่อย่างน้อยก็มีโอกาสน้อยกว่าและมีความซับซ้อนมากกว่าที่จะดึงออก)
วิธีปฏิบัติที่ดีที่สุด # 1:การหน่วงเวลาสั้น ๆ ที่เพิ่มขึ้นตามจำนวนความพยายามที่ล้มเหลวเช่น:
- 1 ความพยายามที่ล้มเหลว = ไม่ล่าช้า
- 2 ความพยายามล้มเหลว = 2 วินาทีล่าช้า
- 3 ครั้งที่ล้มเหลว = 4 วินาทีล่าช้า
- 4 ครั้งที่ล้มเหลว = 8 วินาทีล่าช้า
- 5 ความพยายามที่ล้มเหลว = ความล่าช้า 16 วินาที
- เป็นต้น
DoS ที่โจมตีรูปแบบนี้จะไม่สามารถทำได้เนื่องจากเวลา lockout ที่เกิดขึ้นมีขนาดใหญ่กว่าผลรวมของเวลา lockout ก่อนหน้าเล็กน้อย
ในการชี้แจง: ความล่าช้าไม่ใช่ความล่าช้าก่อนที่จะตอบกลับไปยังเบราว์เซอร์ มันเป็นเหมือนการหมดเวลาหรือช่วงเวลาทนไฟในระหว่างที่พยายามเข้าสู่ระบบบัญชีเฉพาะหรือจากที่อยู่ IP ที่เฉพาะเจาะจงจะไม่ได้รับการยอมรับหรือประเมินเลย นั่นคือข้อมูลประจำตัวที่ถูกต้องจะไม่ส่งคืนในการเข้าสู่ระบบที่ประสบความสำเร็จและข้อมูลประจำตัวที่ไม่ถูกต้องจะไม่ก่อให้เกิดความล่าช้าเพิ่มขึ้น
วิธีปฏิบัติที่ดีที่สุด # 2:การหน่วงเวลาความยาวขนาดกลางที่จะมีผลบังคับใช้หลังจากความพยายามที่ล้มเหลว N ครั้งเช่น:
- ความพยายามล้มเหลว 1-4 ครั้ง = ไม่ล่าช้า
- 5 ครั้งที่ล้มเหลว = 15-30 นาทีล่าช้า
DoS ที่โจมตีแบบแผนนี้จะใช้การไม่ได้ แต่ทำได้อย่างแน่นอน นอกจากนี้อาจเกี่ยวข้องกับการสังเกตว่าการล่าช้าเป็นเวลานานอาจสร้างความรำคาญให้กับผู้ใช้ที่ชอบด้วยกฎหมาย ผู้ใช้ที่ลืมจะไม่ชอบคุณ
แนวปฏิบัติที่ดีที่สุด # 3:การรวมสองวิธีเข้าด้วยกัน - อาจเป็นการหน่วงเวลาแบบสั้นและคงที่ซึ่งจะมีผลบังคับใช้หลังจากความพยายามที่ล้มเหลว N ครั้งเช่น:
- ความพยายามล้มเหลว 1-4 ครั้ง = ไม่ล่าช้า
- 5+ ครั้งที่ล้มเหลว = 20 วินาทีล่าช้า
หรือความล่าช้าที่เพิ่มขึ้นโดยมีขอบเขตคงที่เช่น:
- 1 ความพยายามล้มเหลว = 5 วินาทีล่าช้า
- 2 ความพยายามล้มเหลว = 15 วินาทีล่าช้า
- 3+ ความพยายามล้มเหลว = 45 วินาทีล่าช้า
รูปแบบสุดท้ายนี้นำมาจากคำแนะนำการปฏิบัติที่ดีที่สุดของ OWASP (ลิงก์ 1 จากรายการต้องอ่าน) และควรได้รับการพิจารณาว่าเป็นแนวปฏิบัติที่ดีที่สุดแม้ว่าจะได้รับการยอมรับในด้านที่ จำกัด
อย่างไรก็ตามตามหลักการทั่วไปแล้วผมจะบอกว่ายิ่งนโยบายรหัสผ่านของคุณแข็งแกร่งมากเท่าไหร่คุณก็ยิ่งมีข้อผิดพลาดน้อยลงเท่านั้น หากคุณต้องการรหัสผ่านที่รัดกุม (ตัวอักษรและตัวเลขและตัวเลขและสัญลักษณ์ที่ต้องการ) 9+ ตัวอักษรคุณสามารถให้ผู้ใช้ 2-4 ครั้งโดยไม่ล่าช้ารหัสผ่านก่อนที่จะเปิดใช้งานการควบคุมปริมาณ
DoS ที่โจมตีรูปแบบการควบคุมปริมาณการเข้าสู่ระบบครั้งสุดท้ายนี้จะทำไม่ได้มาก และเป็นสัมผัสสุดท้ายให้อนุญาตการเข้าสู่ระบบ (คุกกี้) แบบถาวร (และ / หรือแบบฟอร์มการเข้าสู่ระบบที่ตรวจสอบโดย CAPTCHA) เสมอเพื่อให้ผู้ใช้ที่ถูกกฎหมายจะไม่ล่าช้าแม้ในขณะที่การโจมตีดำเนินอยู่ ด้วยวิธีนี้การโจมตี DoS ที่ใช้งานไม่ได้จะกลายเป็นการโจมตีที่ไม่สามารถทำได้อย่างมาก
นอกจากนี้มันสมเหตุสมผลที่จะทำการควบคุมปริมาณที่เข้มงวดขึ้นในบัญชีผู้ดูแลระบบเนื่องจากเป็นจุดเข้าที่น่าสนใจที่สุด
ตอนที่ 7: การโจมตีแบบ Brute Force แบบกระจาย
ผู้โจมตีขั้นสูงกว่าจะพยายามหลีกเลี่ยงการควบคุมปริมาณการเข้าสู่ระบบด้วยการ 'กระจายกิจกรรม':
การกระจายความพยายามใน botnet เพื่อป้องกันการตั้งค่าที่อยู่ IP
แทนที่จะเลือกผู้ใช้หนึ่งรายและลองใช้รหัสผ่านที่พบบ่อยที่สุด 50,000 รหัส (ซึ่งไม่สามารถทำได้เนื่องจากการควบคุมปริมาณของเรา) พวกเขาจะเลือกรหัสผ่านที่ใช้บ่อยที่สุดและลองใช้กับผู้ใช้ 50,000 รายแทน ด้วยวิธีนี้ไม่เพียง แต่พวกเขาจะได้รับมาตรการความพยายามสูงสุดเช่น CAPTCHA และการควบคุมปริมาณการเข้าสู่ระบบโอกาสในการประสบความสำเร็จก็เพิ่มขึ้นเช่นกันเนื่องจากรหัสผ่านที่พบบ่อยที่สุดหมายเลข 1 มีแนวโน้มมากกว่าหมายเลข 49.995
เว้นวรรคคำขอเข้าสู่ระบบสำหรับบัญชีผู้ใช้แต่ละบัญชีพูดกัน 30 วินาทีเพื่อแอบดูภายใต้เรดาร์
ที่นี่แนวทางปฏิบัติที่ดีที่สุดคือการบันทึกจำนวนการเข้าสู่ระบบที่ล้มเหลวทั้งระบบและการใช้ความถี่เฉลี่ยในการเข้าสู่ระบบที่ไม่ดีของไซต์ของคุณเป็นเกณฑ์สำหรับขีด จำกัด สูงสุดที่คุณกำหนดให้กับผู้ใช้ทั้งหมด
นามธรรมเกินไป? ให้ฉันใช้ถ้อยคำใหม่:
สมมติว่าไซต์ของคุณมีการเข้าสู่ระบบที่ไม่ดีเฉลี่ย 120 ครั้งต่อวันในช่วง 3 เดือนที่ผ่านมา เมื่อใช้ (โดยเฉลี่ย) ระบบของคุณอาจตั้งค่าขีด จำกัด ส่วนกลางเป็น 3 เท่านั่นคือ ความพยายามล้มเหลว 360 ครั้งในระยะเวลา 24 ชั่วโมง จากนั้นหากจำนวนความพยายามทั้งหมดที่ล้มเหลวในทุกบัญชีเกินจำนวนนั้นภายในหนึ่งวัน (หรือดีกว่านั้นให้ตรวจสอบอัตราการเร่งความเร็วและทริกเกอร์ตามเกณฑ์ที่คำนวณ) มันจะเปิดใช้การควบคุมปริมาณการเข้าสู่ระบบทั่วทั้งระบบ (ยังมีข้อยกเว้นของการเข้าสู่ระบบคุกกี้และ / หรือการเข้าสู่ระบบ CAPTCHA สำรอง)
ฉันยังโพสต์คำถามพร้อมรายละเอียดเพิ่มเติมและการสนทนาที่ดีมากเกี่ยวกับวิธีหลีกเลี่ยง pitfals หากินเพื่อป้องกันการโจมตีแบบเดรัจฉานแบบกระจาย
ส่วนที่ 8: การรับรองความถูกต้องแบบสองปัจจัยและผู้ให้บริการการตรวจสอบความถูกต้อง
ข้อมูลประจำตัวสามารถถูกบุกรุกไม่ว่าจะโดยการใช้ประโยชน์, รหัสผ่านที่ถูกเขียนและสูญหาย, แล็ปท็อปที่มีกุญแจถูกขโมยหรือผู้ใช้ที่เข้าสู่ระบบเข้าสู่เว็บไซต์ฟิชชิ่ง การเข้าสู่ระบบสามารถได้รับการป้องกันเพิ่มเติมด้วยการตรวจสอบสองปัจจัยซึ่งใช้ปัจจัยนอกวงเช่นรหัสแบบใช้ครั้งเดียวที่ได้รับจากการโทรศัพท์ข้อความ SMS แอพหรือดองเกิล ผู้ให้บริการหลายรายเสนอบริการตรวจสอบสิทธิ์แบบสองปัจจัย
การพิสูจน์ตัวตนสามารถมอบสิทธิ์ให้กับบริการ single sign-on ได้อย่างสมบูรณ์ซึ่งผู้ให้บริการรายอื่นจัดการรวบรวมข้อมูลประจำตัว สิ่งนี้จะผลักดันปัญหาไปยังบุคคลที่สามที่เชื่อถือได้ ทั้ง Google และ Twitter ให้บริการมาตรฐาน SSO ในขณะที่ Facebook ให้บริการโซลูชันที่คล้ายคลึงกัน
ต้องอ่านลิงก์เกี่ยวกับการตรวจสอบสิทธิ์ของเว็บ
- คู่มือ OWASP ในการรับรองความถูกต้อง / OWASP สูตรการตรวจสอบสิทธิ์
- Dos และ Don'ts ของการรับรองความถูกต้องของลูกค้าบนเว็บ (รายงานการวิจัย MIT ที่อ่านง่ายมาก)
- Wikipedia: คุกกี้ HTTP
- คำถามความรู้ส่วนบุคคลสำหรับการรับรองความถูกต้องสำรอง: คำถามเพื่อความปลอดภัยในยุคของ Facebook (บทความวิจัยของ Berkeley ที่อ่านง่ายมาก)