การตอบโต้ของ Brute Force ที่ดีที่สุดคืออะไร


151

ข้อแรกพื้นหลังเล็กน้อย: มันไม่มีความลับที่ฉันใช้ระบบ auth + auth สำหรับ CodeIgniter และจนถึงตอนนี้ฉันก็ชนะ (ดังนั้นพูด) แต่ผมเคยทำงานเป็นความท้าทายที่สวยไม่น่ารำคาญ (หนึ่งที่มากที่สุดห้องสมุดรับรองความถูกต้องพลาดทั้งหมด แต่ผมยืนยันในการจัดการอย่างถูกต้อง): วิธีการจัดการอย่างชาญฉลาดที่มีขนาดใหญ่กระจายตัวแปรชื่อผู้โจมตีแรงเดรัจฉาน

ฉันรู้ทุกเทคนิคปกติ:

  1. การ จำกัด จำนวน # ของความพยายามที่ล้มเหลวต่อ IP / โฮสต์และปฏิเสธการเข้าถึงผู้กระทำผิด (เช่น Fail2Ban) - ซึ่งไม่ทำงานอีกต่อไปเนื่องจาก botnets เติบโตอย่างชาญฉลาด
  2. การรวมรายการด้านบนกับบัญชีดำของ IP / โฮสต์ที่รู้จัก 'ไม่ดี' (เช่น DenyHosts) - ซึ่งขึ้นอยู่กับ botnets ที่ล้มลงในอันดับที่ 1 ซึ่งพวกเขาไม่ทำมากขึ้น
  3. รายการ IP / โฮสต์ที่รวมกับการรับรองความถูกต้องแบบดั้งเดิม (ไร้ประโยชน์เศร้ากับผู้ใช้ IP แบบไดนามิกและปั่นป่วนสูงในเว็บไซต์ส่วนใหญ่)
  4. การตั้งค่าจำกัด sitewideในจำนวน # ของความพยายามที่ล้มเหลวภายในระยะเวลา N นาที / ชั่วโมงและการควบคุมปริมาณ (การระงับ) ความพยายามในการเข้าสู่ระบบทั้งหมดหลังจากนั้นเป็นเวลาหลายนาที / ชั่วโมง (ด้วยปัญหาที่ DoS โจมตีคุณ
  5. ลายเซ็นดิจิทัลที่บังคับ(ใบรับรองกุญแจสาธารณะ) หรือโทเค็นฮาร์ดแวร์ RSA สำหรับผู้ใช้ทุกคนที่ไม่มีตัวเลือกเข้าสู่ระบบ / รหัสผ่าน (โดยไม่ต้องถามวิธีแก้ปัญหาที่มั่นคง แต่เฉพาะในทางปฏิบัติสำหรับบริการที่ปิดและทุ่มเทเท่านั้น)
  6. การบังคับใช้รหัสผ่านที่เข้มงวดเป็นพิเศษ (เช่น> 25 ตัวอักษรไร้สาระพร้อมสัญลักษณ์ - อีกครั้งไม่สามารถใช้งานได้สำหรับผู้ใช้ทั่วไป)
  7. และในที่สุดCAPTCHAs (ซึ่งสามารถทำงานได้ในกรณีส่วนใหญ่ แต่สร้างความรำคาญให้กับผู้ใช้และไร้ประโยชน์กับผู้โจมตีที่มุ่งมั่นและมีความมุ่งมั่น )

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

  • จะต้องมีความปลอดภัย (+) กับ DoS และการโจมตีแบบ brute-force และไม่แนะนำช่องโหว่ใหม่ใด ๆ ที่อาจทำให้บอทที่น่ากลัวออกไปเล็กน้อยสามารถทำงานภายใต้เรดาร์ได้

  • มันจะต้องเป็นไปโดยอัตโนมัติ หากต้องการให้ผู้ปฏิบัติงานมนุษย์ยืนยันแต่ละการเข้าสู่ระบบหรือตรวจสอบกิจกรรมที่น่าสงสัยมันจะไม่ทำงานในสถานการณ์จริง

  • มันจะต้องเป็นไปได้สำหรับการใช้งานเว็บหลัก (เช่น. ปั่นป่วนปริมาณสูงและการลงทะเบียนเปิดที่สามารถดำเนินการโดยโปรแกรมเมอร์ที่ไม่ใช่)

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

  • มันไม่สามารถเกี่ยวข้องกับลูกแมวได้เว้นแต่พวกมันจะปลอดภัยจริง ๆ กับลูกแมว

(+) โดย 'ปลอดภัย' ฉันหมายถึงอย่างน้อยที่สุดความปลอดภัยเท่ากับความสามารถของผู้ใช้หวาดระแวงที่จะเก็บรหัสผ่านเป็นความลับ

ดังนั้น - ลองฟังมันสิ! คุณจะทำอย่างไร คุณรู้จักแนวปฏิบัติที่ดีที่สุดที่ฉันไม่ได้กล่าวถึง (โปรดบอกว่าคุณทำ) ฉันยอมรับว่าฉันมีความคิดของตัวเอง (รวมความคิดจาก 3 และ 4) แต่ฉันจะให้ผู้เชี่ยวชาญที่แท้จริงพูดก่อนที่จะอายตัวเอง ;-)

คำตอบ:


68

เอาหละพอแล้วก็พอแล้ว นี่คือสิ่งที่ฉันเกิดขึ้นจนถึงตอนนี้

(ขออภัยโพสต์ยาวไปข้างหน้าจงกล้าหาญเพื่อนการเดินทางจะคุ้มค่า)

รวมวิธีการที่ 3 และ 4 จากตำแหน่งเดิมเป็นชนิดของ 'คลุมเครือ' หรือแบบไดนามิกรายการที่อนุญาตแล้ว - และนี่คือเคล็ดลับ - ไม่ได้ปิดกั้น IP ที่ไม่ใช่ที่อนุญาตพิเศษเพียงบีบรัดพวกเขาไปนรกและกลับ

โปรดทราบว่ามาตรการนี้มีไว้เพื่อป้องกันการโจมตีประเภทนี้โดยเฉพาะเท่านั้น ในทางปฏิบัติแน่นอนว่ามันจะทำงานร่วมกับแนวทางปฏิบัติอื่น ๆ ที่ดีที่สุดในการรับรองความถูกต้อง: การควบคุมปริมาณชื่อผู้ใช้คงที่, การควบคุมปริมาณไอพีต่อหนึ่ง IP, นโยบายบังคับใช้รหัสผ่านที่คาดเดาได้ยาก ใช้คำถามเพื่อความปลอดภัย ฯลฯ

สมมติฐานเกี่ยวกับสถานการณ์การโจมตี

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

ดังนั้นเราต้องทำอย่างอื่น

ส่วนแรกของการตอบโต้: รายการที่อนุญาต

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

ดังนั้นรูปแบบรายการที่อนุญาตของเราจะทำหน้าที่เป็น 'ประตูหน้า' ที่ล็อคซึ่งผู้ใช้จะต้องเชื่อมต่อจากหนึ่งใน 'ดี' IP ที่ได้รับการยอมรับของเขาเพื่อเข้าสู่ระบบเลย การโจมตีที่ดุร้ายกับ 'ประตูหน้า' จะเป็นไปไม่ได้ในทางปฏิบัติ (+)

(+) ยกเว้นว่าผู้โจมตี 'เป็นเจ้าของ' ไม่ว่าจะเป็นเซิร์ฟเวอร์กล่องผู้ใช้ของเราทั้งหมดหรือการเชื่อมต่อเอง - และในกรณีเหล่านั้นเราไม่มีปัญหา 'การรับรองความถูกต้อง' อีกต่อไปเรามีการดึงขนาดแฟรนไชส์ของแท้ - เสียบสถานการณ์ FUBAR

ส่วนที่สองของการตอบโต้: การควบคุมปริมาณของ IP ที่ไม่รู้จัก

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

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

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

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

  • ไม่ว่าจะโดยการเชื่อมต่อจากหนึ่งใน IP ที่ได้รับการยอมรับ
  • หรือโดยใช้คุกกี้การเข้าสู่ระบบแบบถาวร (จากที่ใดก็ได้)

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

เพื่ออนุญาตให้ผู้ใช้กลุ่มย่อยขนาดเล็กนี้บีบผ่านประตูแมวที่ถูกปิดผนึกไว้เป็นอย่างอื่นแม้ในขณะที่บอทยังคงใช้งานอยู่ผมก็จะใช้รูปแบบการเข้าสู่ระบบ 'สำรอง' กับ CAPTCHA ดังนั้นเมื่อคุณแสดงข้อความ "ขออภัย แต่คุณไม่สามารถลงชื่อเข้าใช้จากที่อยู่ IP นี้ได้ในขณะนี้" ให้ใส่ลิงก์ที่ระบุว่า " การสำรองข้อมูลที่ปลอดภัย - มนุษย์เท่านั้น ( บอท: ไม่โกหก ) " ติดตลกเมื่อพวกเขาคลิกลิงค์นั้นให้พวกเขากรอกแบบฟอร์มการเข้าสู่ระบบรับรองความถูกต้อง reCAPTCHA ที่ข้ามการควบคุมปริมาณไซต์ ด้วยวิธีนี้หากพวกเขาเป็นมนุษย์และรู้รหัสผ่าน + ที่ถูกต้อง (และสามารถอ่าน CAPTCHA) พวกเขาจะไม่ถูกปฏิเสธบริการแม้ว่าพวกเขาจะเชื่อมต่อจากโฮสต์ที่ไม่รู้จักและไม่ได้ใช้คุกกี้ autologin

โอ้และเพิ่งจะอธิบาย: เนื่องจากฉันถือว่า CAPTCHAs เป็นความชั่วร้ายโดยทั่วไปตัวเลือกการเข้าสู่ระบบ 'สำรองข้อมูล' จะปรากฏเฉพาะเมื่อการควบคุมปริมาณใช้งานได้เท่านั้น

ไม่มีการปฏิเสธว่าการโจมตีที่ยั่งยืนเช่นนั้นจะยังคงเป็นรูปแบบของการโจมตี DoS แต่ด้วยระบบที่อธิบายไว้ในสถานที่มันจะส่งผลกระทบต่อสิ่งที่ฉันสงสัยว่าจะเป็นผู้ใช้ย่อยเพียงเล็กน้อยนั่นคือคนที่ไม่ได้ใช้ คุกกี้ "จดจำฉัน" และเข้าสู่ระบบในขณะที่มีการโจมตีเกิดขึ้นและไม่ได้ลงชื่อเข้าใช้จาก IP ปกติใด ๆ ของพวกเขาและผู้ที่ไม่สามารถอ่าน CAPTCHA ได้ เฉพาะผู้ที่ไม่สามารถบอกได้ว่าเกณฑ์ทั้งหมดเหล่านั้น - โดยเฉพาะบอทและผู้พิการที่โชคร้ายจริงๆเท่านั้นที่จะถูกผละออกจากการโจมตีของบอท

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

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


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


1
บางทีคุณอาจสร้างรหัสผ่าน 'พิเศษ' สำหรับผู้ใช้แต่ละคนที่สามารถใช้หากในโหมดล็อคดาวน์ (และพวกเขากำลังเชื่อมต่อจาก IP ใหม่ ฯลฯ ) รหัสผ่านพิเศษนั้นมีความซับซ้อนเพียงพอที่ไม่สามารถบังคับได้หรือไม่
Douglas Leeder

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

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

1
@Abtin: ความคิดที่ดียกเว้นว่าจะเป็น 'เข้าสู่การแข่งขันอาวุธ' - เช่น เริ่มต้น 'ผู้ที่สามารถชิงไหวชิงพริบผู้ที่อยู่กับผู้ที่สร้างรายการรหัสผ่านสำหรับการโจมตีพจนานุกรม ผมคิดว่าเป็นวิธีที่ดีกว่าจะบังคับใช้นโยบายรหัสผ่านที่แข็งแกร่งจึงมีอยู่ไม่มีรหัสผ่านที่อ่อนแอ
Jens Roland

1
@OrestisP: คุณพลาดจุดของการโจมตีแบบกระจาย - จำนวนความพยายามที่ไม่ถูกต้องจากแต่ละ IP นั้นน้อยมากดังนั้นการปิดกั้นต่อ IP ไม่สามารถทำได้ นอกจากนี้คำถามยังอธิบายถึงการโจมตีด้วยกำลังดุร้ายโดยอัตโนมัติดังนั้น 1) ผู้โจมตีไม่ใช่มนุษย์ แต่เป็นบ็อตเน็ตของเครื่องจักรซอมบี้ (ที่ไม่สามารถใช้การล็อกอินแบบ captcha); และ 2) ลักษณะที่ดุร้ายของการจู่โจมนั้นจำเป็นต้องใช้ความพยายามในการลงชื่อเข้าใช้จำนวนมากเพื่อให้แน่ใจว่าประสบความสำเร็จซึ่งหมายถึงการทำแคปต์ชาที่ถูกแก้ที่ร้านขายเหงื่อที่ไหนสักแห่งไม่สามารถทำได้ (แม้ว่าจะเป็นไปได้ พอ).
Jens Roland

17

ขั้นตอนง่ายๆ:

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

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

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


ความคิดที่ดี ฉันวางแผนที่จะใช้นโยบายรหัสผ่านอัตโนมัติที่แตกต่างกันไปตามระดับสิทธิ์ของผู้ใช้ แนวคิด honeypot อาจใช้ได้กับการโจมตีบางประเภท แต่ถ้าการโจมตีกระจายออกไปการบล็อก IP ที่ล้มลงจะไม่ได้ผล
Jens Roland

ด้วยความเคารพต่อ 'เวลาพยายามเข้าสู่ระบบครั้งล่าสุด' ซึ่งเป็นกลยุทธ์ที่ดีสำหรับผู้ใช้ระดับสูง (ซึ่งฉันพนันได้ว่าเป็นเพราะเหตุใด) แต่มีจุดอ่อนสองประการ: (a) ไม่ได้แก้ไขปัญหาการบุกรุก เพียงรายงานว่ามันอาจจะเกิดขึ้นและ (ข) ผู้ใช้ส่วนใหญ่เป็นเพียงแค่จำไม่ได้ / การดูแล
Jens Roland

1
ใช่แล้ว honeypot และการรายงานของผู้ใช้นั้นเกี่ยวกับการรวบรวมข้อมูล พวกเขาอาจมีตัวชี้วัดที่มีค่าบางอย่างเพื่อแจ้งให้คุณทราบว่า / เมื่อมีการโจมตีด้วยกำลังดุร้ายอย่างช้าๆ
patros

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

11

หากฉันเข้าใจ MO ของการโจมตีแบบเดรัจฉานอย่างถูกต้องชื่อผู้ใช้หนึ่งชื่อขึ้นไปจะถูกพยายามอย่างต่อเนื่อง

มีข้อเสนอแนะสองข้อที่ฉันไม่คิดว่าฉันเคยเห็น:

  • ฉันมักจะคิดว่าการฝึกแบบมาตรฐานคือต้องมีความล่าช้าเล็กน้อย (หนึ่งหรือสองวินาที) หลังจากการล็อกอินผิดสำหรับผู้ใช้ทุกคน สิ่งนี้ขัดขวางการใช้กำลังอย่างดุเดือด แต่ฉันไม่รู้ว่าการหน่วงเวลาหนึ่งวินาทีจะทำให้การโจมตีพจนานุกรมอยู่ที่ใด (พจนานุกรม 10,000 คำ == 10,000 วินาที == ประมาณ 3 ชั่วโมงอืมไม่ดีพอ)
  • แทนที่จะทำให้ไซต์ช้าลงทำไมไม่เค้นชื่อผู้ใช้ เค้นมากขึ้นเรื่อย ๆ กับความพยายามที่ผิดแต่ละครั้ง (ถึงขีด จำกัด ฉันเดาเพื่อให้ผู้ใช้ที่แท้จริงยังคงสามารถเข้าสู่ระบบ)

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

หากชื่อผู้ใช้ถูกบีบอัดแม้แต่การโจมตีชื่อผู้ใช้ที่มีการประสานงาน (หลาย IP, การเดาต่อหนึ่ง IP, ชื่อผู้ใช้เดียวกัน) จะถูกจับได้ ชื่อผู้ใช้แต่ละคนจะได้รับการปกป้องโดยคันเร่งแม้ว่าผู้โจมตีจะมีอิสระที่จะลองใช้ชื่อผู้ใช้ / รหัสผ่านอื่นในช่วงหมดเวลา

จากมุมมองของผู้โจมตีในระหว่างการหมดเวลาคุณอาจสามารถเดารหัสผ่านครั้งแรกได้ที่ 100 ครั้งและค้นหารหัสผ่านที่ผิดหนึ่งบัญชีต่อหนึ่งบัญชีได้อย่างรวดเร็ว คุณสามารถเดาได้ 50 วินาทีในช่วงเวลาเดียวกัน

จากมุมมองบัญชีผู้ใช้มันยังคงใช้จำนวนการคาดเดาเฉลี่ยเท่าเดิมเพื่อทำลายรหัสผ่านแม้ว่าการเดานั้นมาจากหลายแหล่ง

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

การปรับแต่งพิเศษ:

  • ตรวจสอบ IP ที่คาดเดาหลายบัญชี - 408 คำขอหมดเวลา
  • ตรวจสอบ IP ที่คาดเดาบัญชีเดียวกัน - 408 คำขอหมดเวลาหลังจากคาดเดาจำนวนมาก (100 ข้อ)

แนวคิด UI (อาจไม่เหมาะสมในบริบทนี้) ซึ่งอาจปรับแก้ด้านบน:

  • ถ้าคุณอยู่ในการควบคุมของการตั้งค่ารหัสผ่านแล้วแสดงให้เห็นการใช้วิธีการที่แข็งแกร่งรหัสผ่านของพวกเขาคือสนับสนุนให้พวกเขาที่จะเลือกหนึ่งที่ดีกว่า
  • หากคุณสามารถควบคุมหน้าเข้าสู่ระบบหลังจากเดาชื่อผู้ใช้เพียงครั้งเดียว (พูดน้อย 10 ข้อ) ให้เสนอ CAPTCHA

throttle ชื่อผู้ใช้และ throttle IP นั้นใช้ได้กับการโจมตีแบบ fixed-ชื่อผู้ใช้หรือ fixed-IP และทำให้การโจมตีพจนานุกรมแบบดั้งเดิมเป็นไปไม่ได้ แต่ถ้าผู้โจมตีเปลี่ยนชื่อผู้ใช้อย่างต่อเนื่องเขาจะหลบหนีโดยไม่ทริกเกอร์ชื่อผู้ใช้ซ้ำ นั่นคือสิ่งที่ฉันต้องการที่จะตอบโต้
Jens Roland

2
ขอบคุณสำหรับการแก้ไข jamesh ตอนนี้เรากำลังพูดถึง ฉันชอบความคิดของ 408 อย่างไรก็ตามถึงแม้จะมีการควบคุมปริมาณชื่อผู้ใช้อย่างเข้มงวดบ็อตเน็ตที่โจมตีผู้ใช้หลายคนก็ยังคงใช้งานได้ และการตรวจสอบรหัสผ่าน 5000 อันดับแรกกับผู้ใช้คนหนึ่งมีโอกาสน้อยกว่าที่จะประสบความสำเร็จมากกว่าการตรวจสอบรหัสผ่านชั้นนำ 1 อันดับแรกสำหรับผู้ใช้ 5,000 ราย
Jens Roland

ไม่มีอะไรเหมือนวันเกิดที่ผิดธรรมดา ในกลุ่มขนาดใหญ่หลายคนจะใช้รหัสผ่านที่ไม่ปลอดภัยและมีแนวโน้มว่าจะใช้รหัสผ่านที่ได้รับความนิยม จะมีคนจำนวนมากพอ ๆ กับฉันที่ไม่ถูกโจมตีจากการโจมตีเช่นนี้
David Thornley

2
ที่จริงแล้วฉันอาจต้องตรวจสอบคณิตศาสตร์ในคำสั่งก่อนหน้าของฉันอีกครั้ง เมื่อคุณตัดรหัสผ่านที่พบบ่อยที่สุด N อันดับแรกแล้วความน่าจะเป็นของผู้ใช้ที่มีรหัสผ่าน # (N + 1) อาจเพิ่มขึ้นพอที่จะทำให้เกิดความแตกต่างได้ แม้ว่าโค้งก็เพียงพอที่อาจจะสูงชันสำหรับการที่ไม่ได้เป็นกรณี
Jens Roland

9

การตรวจสอบสิทธิ์มีสามปัจจัย:

  1. ผู้ใช้รู้บางสิ่ง (เช่นรหัสผ่าน)
  2. ผู้ใช้มีบางสิ่ง (เช่นคีย์ fob)
  3. ผู้ใช้เป็นบางสิ่ง (เช่นการสแกนเรตินา)

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

หากคุณสามารถสร้างแบบสุ่มประมาณ 256 ตัวอักษรคุณสามารถสร้างโครงสร้างนั้นในตาราง 16 × 16 แล้วขอให้ผู้ใช้ให้ค่าในตารางเซลล์ A-14 ให้คุณ เมื่อผู้ใช้ลงชื่อสมัครใช้หรือเปลี่ยนรหัสผ่านให้กำหนดตารางและแจ้งให้ผู้ใช้พิมพ์และบันทึก

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

แนวคิดอื่น (ซึ่งเกี่ยวข้องกับลูกแมว) คือสิ่งที่ BOA เรียกว่า SiteKey (ฉันเชื่อว่าพวกเขาเป็นเครื่องหมายการค้าของชื่อ) สั้น ๆ คุณมีผู้ใช้อัปโหลดภาพเมื่อพวกเขาลงทะเบียนและเมื่อพวกเขาพยายามที่จะเข้าสู่ระบบขอให้พวกเขาเลือกภาพของพวกเขาจาก 8 หรือ 15 คน (หรือมากกว่า) แบบสุ่ม ดังนั้นหากผู้ใช้อัปโหลดภาพของลูกแมวของพวกเขาในทางทฤษฎีเท่านั้นที่พวกเขารู้ว่าภาพที่เป็นของพวกเขาออกมาจากลูกแมวอื่น ๆ ทั้งหมด (หรือดอกไม้หรืออะไรก็ตาม) ช่องโหว่ที่แท้จริงเพียงวิธีเดียวที่มีคือการโจมตีจากคนตรงกลาง

อีกแนวคิดหนึ่ง (ที่ไม่มีลูกแมว) คือการติดตาม IP ที่ผู้ใช้เข้าถึงระบบด้วยและต้องการให้พวกเขาทำการพิสูจน์ตัวตนเพิ่มเติม (captcha, เลือก kitty, หยิบกุญแจจากตารางนี้) เมื่อพวกเขาเข้าสู่ระบบจากที่อยู่ที่พวกเขาอยู่ ก่อนหน้านี้ นอกจากนี้คล้ายกับ GMail อนุญาตให้ผู้ใช้ดูว่าพวกเขาลงชื่อเข้าใช้จากที่ไหนเมื่อไม่นานมานี้

แก้ไขแนวคิดใหม่:

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

กุญแจในกรณีนี้เป็นสิ่งสำคัญที่สุด วิธีการทั่วไปในการสร้างพวกเขาคือการรวมกันของข้อมูลผู้ใช้ IP ของพวกเขาและเวลาที่ส่ง


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

(ต่อ) มันอาจจะไม่ยากเกินกว่าที่จะเลือกภาพที่ถูกต้องเนื่องจากผู้คนมักจะเลือกประเภทของภาพที่คาดเดาได้ (แม้ภาพจากอัลบั้ม Flickr ของพวกเขาเอง!)
Jens Roland

2
ใช่ฉันคิดถึงจุดที่คุณตื่นขึ้นเมื่อคืนหลังจากที่ฉันกลับบ้าน ฉันคิดว่าวิธีการแก้ไขคือเมื่อผู้ใช้เข้าสู่ระบบและให้รหัสผ่านที่ถูกต้องให้แสดงภาพและสุ่มอื่น ๆ จำนวนหนึ่ง เมื่อพวกเขาไม่ได้ให้รหัสผ่านที่ถูกต้องแสดงจำนวนสุ่ม
davethegr8

1
images + 1 ซึ่งอาจรวมหรือไม่รวมภาพของตนเอง นอกจากนี้ฉันมีความคิดอื่นดูการแก้ไขในโพสต์ แต่ใช่ความคิดเหล่านี้ค่อนข้างยาก / ซับซ้อน
davethegr8

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

7

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

คุณไม่สามารถป้องกันการโจมตี DoS ได้ง่ายๆเพียงผูกมัดการควบคุมปริมาณไอพีหรือชื่อผู้ใช้ไว้ เฮ้คุณไม่สามารถป้องกันการเข้าสู่ระบบอย่างรวดเร็วด้วยวิธีนี้ได้

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

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

CREATE TABLE failed_logins(
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(16) NOT NULL,
    ip_address INT(11) UNSIGNED NOT NULL,
    attempted DATETIME NOT NULL
) engine=InnoDB charset=UTF8;

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


10 failed attempts = 1 second
20 failed attempts = 2 seconds
30 failed attempts = reCaptcha

ค้นหาตารางทุกครั้งที่พยายามลงชื่อเข้าใช้ล้มเหลวเพื่อค้นหาจำนวนการเข้าสู่ระบบที่ล้มเหลวในช่วงเวลาที่กำหนดพูด 15 นาที:


SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute);

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

// array of throttling
$throttle = array(10 => 1, 20 => 2, 30 => 'recaptcha');

// assume query result of $sql is stored in $row
$sql = 'SELECT MAX(attempted) AS attempted FROM failed_logins';
$latest_attempt = (int) date('U', strtotime($row['attempted']));
// get the number of failed attempts
$sql = 'SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute)';
// assume the number of failed attempts was stored in $failed_attempts
krsort($throttle);
foreach ($throttle as $attempts => $delay) {
    if ($failed_attempts > $attempts) {
        // we need to throttle based on delay
        if (is_numeric($delay)) {
            $remaining_delay = time() - $latest_attempt - $delay;
            // output remaining delay
            echo 'You must wait ' . $remaining_delay . ' seconds before your next login attempt';
        } else {
            // code to display recaptcha on login form goes here
        }
        break;
    }
}

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


6

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

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


(คุณหมายถึงจะบอกว่าถ้าคำตอบคือ 'ไม่' -. คือว่าค่าใช้จ่ายของการโจมตีของบ็อตเน็ตไม่สูงเกินไปในความสัมพันธ์กับบัญชี)
Jens Roland

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

มันจะไม่ปกป้องความลับระดับชาติไม่ว่าจะเกิดอะไรขึ้น (ระบบอย่างเป็นทางการต้องการการรับรองพิเศษและฉันค่อนข้างแน่ใจว่าไม่มีสิ่งใดที่สร้างขึ้นบน PHP สามารถผ่านการรับรอง) แต่เว็บแอปพลิเคชันทั้งหมดต้องการการรับรองความถูกต้องอย่างปลอดภัย ต้องการจะขาดความรับผิดชอบอย่างไม่น่าเชื่อว่าจะไม่ใช้ปฏิบัติที่ดีที่สุดทุกที่ที่ฉันสามารถ
Jens Roland

1
ดังนั้นคำตอบสั้น ๆ ของฉันคือ: ฉันกำลังสร้างสิ่งนี้เพราะ 99.9% ของเว็บไซต์และแอปที่นั่นมีความปลอดภัยที่น่าตกใจ (แม้ในลีกที่ยิ่งใหญ่: AOL, Twitter, MySpace ถูกบุกรุกมาก่อน) และในกรณีส่วนใหญ่เพราะพวกเขา ใช้ห้องสมุด autod ต่ำ
Jens Roland

นอกจากนี้อ่านกระดาษ "To Catch A Predator" โดย Niels Provos และคณะ จากการดำเนินการตามกฎหมาย USENIX ในปี 2008 (ลิงก์: usenix.org/events/sec08/tech/small.html ) มันเป็นเครื่องเปิดตา: 2 เดือนหนึ่ง honeypot: 368,000 โจมตีจาก IP ที่แตกต่างกันเกือบ 30,000 ครั้งซึ่งมาจาก 5,600 botnets!
Jens Roland

5

เพื่อสรุปโครงร่างของ Jens ให้เป็นไดอะแกรมการเปลี่ยนสถานะหลอก / กฎฐาน:

  1. user + password -> รายการ
  2. รหัสผ่านผู้ใช้ +! -> ถูกปฏิเสธ
  3. ผู้ใช้ + known_IP (ผู้ใช้) -> ประตูหน้า // never throttle
  4. user + unknown_IP (ผู้ใช้) -> catflap
  5. (#denied> n) ผ่าน catflaps (ไซต์) -> catflaps เค้น (ไซต์) // slow the bots
  6. catflap + throttle + password + captcha -> รายการ // humans still welcome
  7. catflap + throttle + password +! captcha -> ถูกปฏิเสธ // a correct guess from a bot

ข้อสังเกต:

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

ข้อสังเกตเหล่านี้ครอบคลุมการโจมตีประเภทต่าง ๆ กับสิ่งที่คุณพยายามโต้กลับ


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

นอกจากนี้ฉันคิดว่าแผนภาพการเปลี่ยนสถานะของคุณต้องการรายละเอียดสองสามข้อ: # 3 และ # 4 ควรมีรหัสผ่าน # 1 และ # 2 ควรรวม known_IP (ผู้ใช้) เนื่องจากการเข้าสู่ระบบมักจะมี IP ที่รู้จักหรือไม่รู้จักเสมอ และ # 6 คือ 'รายการแม้จะเค้น'
Jens Roland

4

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


แรงเดรัจฉานอย่างรวดเร็วจริงเกินไป ฉันหวังว่าจะผ่อนปรนแรงเดรัจฉานผู้ใช้คงที่ (การควบคุมปริมาณเพียง 20 วินาที) แต่ในเว็บไซต์ที่มีผู้ใช้ 50k ที่จะทำให้กำลังดุร้ายผู้ใช้ตัวแปรที่รวดเร็วเป็นไปได้ (สมมติว่า 20+ วินาทีเพื่อหมุนเวียนผู้ใช้) และที่พวกเขากล่าวว่าจะดูด ..
Jens Roland

แรงเดรัจฉานรวดเร็วดีจากโฮสต์เดียวใช้ iptables หรือสิ่งที่คุณใช้ไฟร์วอลล์
Björn Raupach

ฉันหมายถึงการกระจายกำลังดุร้ายอย่างรวดเร็ว มันหายาก แต่ก็อาจเป็นที่น่ารังเกียจมาก
Jens Roland

3

ข้อความปฏิเสธความรับผิดชอบ: ฉันทำงานให้กับ บริษัท ที่มีสองปัจจัย แต่ไม่ได้อยู่ที่นี่เพื่อเสียบ นี่คือข้อสังเกต

คุกกี้สามารถถูกขโมยด้วย XSS และเบราว์เซอร์ ผู้ใช้ทั่วไปเปลี่ยนเบราว์เซอร์หรือล้างคุกกี้

แหล่งที่อยู่ IP ของแหล่งที่มานั้นแปรผันและเปลี่ยนแปลงได้ในเวลาเดียวกัน

แคปต์ชามีประโยชน์ แต่ไม่รับรองความถูกต้องของมนุษย์โดยเฉพาะ

สามารถรวมหลายวิธีเข้าด้วยกันได้สำเร็จ แต่รสชาติที่ดีย่อมเป็นไปตามลำดับ

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

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

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

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

การรักษาความปลอดภัยที่ดีที่สุดมาจากปัจจัยที่สองของการรับรองความถูกต้องซึ่งเป็น out-of-band เมื่อเทียบกับครั้งแรก ดังที่คุณกล่าวว่าโทเค็นของฮาร์ดแวร์ใน "สิ่งที่คุณมี" นั้นยอดเยี่ยม แต่ส่วนมาก (ไม่ใช่ทั้งหมด) มีผู้ดูแลระบบจริงที่เกี่ยวข้องกับการแจกจ่าย ฉันไม่รู้จัก "สิ่งที่คุณเป็น" ไบโอเมตริกซ์ที่ดีสำหรับเว็บไซต์ โซลูชันสองปัจจัยบางตัวทำงานร่วมกับผู้ให้บริการ openid บางรายมี PHP / Perl / Python SDK


คะแนนที่ยอดเยี่ยมทั้งหมด - ฉันไม่เห็นด้วย จุดเกี่ยวกับความไม่มั่นคงของคุกกี้นั้นถูกต้องมาก แต่หากไม่มีปัจจัยที่สองของโทเค็นทางกายภาพหรือรหัสผ่านครั้งเดียว (กระจายผ่านสายที่ปลอดภัย) คุณจะไม่สามารถป้องกันจุดอ่อนที่มีจุดอ่อนได้ หากกล่อง / เบราว์เซอร์ของผู้ใช้ถูกบุกรุกดังนั้นการเข้าสู่ระบบของเขาจะเป็นเช่นนั้น
Jens Roland

1

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

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


1
  1. ต้องการรหัสผ่านแบบใช้ครั้งเดียวก่อนป้อนรหัสผ่านปกติ นั่นจะทำให้เห็นได้ชัดว่ามีใครบางคนกำลังโจมตีก่อนที่พวกเขาจะมีโอกาสมากมายที่จะเดารหัสผ่านหลัก?

  2. เก็บการนับทั่วโลก / อัตราความล้มเหลวในการเข้าสู่ระบบ - นี่คือตัวบ่งชี้สำหรับการโจมตี - ในระหว่างการโจมตีจะเข้มงวดมากขึ้นเกี่ยวกับความล้มเหลวในการเข้าสู่ระบบเช่นแบน IP IP ได้เร็วขึ้น


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

0

ฉันไม่เชื่อว่ามีคำตอบที่สมบูรณ์แบบ แต่ฉันอยากจะเข้าใกล้มันโดยอาศัยการพยายามทำให้หุ่นยนต์สับสนหากรู้สึกว่ามีการโจมตี

ปิดใจของฉัน:

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

แบบฟอร์มใด ๆ ที่ส่งมาพร้อมกับข้อมูลในเขตข้อมูลที่ไม่ถูกต้องจะถือว่ามาจากหุ่นยนต์ - การเข้าสู่ระบบล้มเหลว, ระยะเวลาและ IP ที่ถูกควบคุม ตรวจสอบให้แน่ใจว่าชื่อเขตข้อมูลสุ่มไม่ตรงกับชื่อเขตข้อมูลที่ถูกต้องเพื่อให้ใครบางคนที่ใช้บางสิ่งที่จำรหัสผ่านนั้นไม่ได้หลอกลวง

ขั้นต่อไปเกี่ยวกับ captcha ประเภทอื่น: คุณมีคำถามหลายข้อที่ไม่ทำให้เกิดปัญหากับมนุษย์ อย่างไรก็ตามพวกเขาจะไม่สุ่ม เมื่อการโจมตีเริ่มขึ้นทุกคนจะได้รับคำถาม # 1 หลังจากทิ้งคำถาม # 1 ไปหนึ่งชั่วโมงแล้วจะไม่ถูกใช้อีกและทุกคนจะได้รับคำถาม # 2 และอื่น ๆ

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


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

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

คุณไม่มีจุด ผู้โจมตีไม่สามารถตรวจสอบล่วงหน้าได้เพราะมันจะแสดงการป้องกันแบบพิเศษเมื่อการโจมตีปรากฏขึ้น
Loren Pechtel

แน่นอนว่ามนุษย์จะได้เห็นว่าคำถามคืออะไร - แต่เขาต้องสื่อสารกับบอตของเขาทั้งหมด นั่นเป็นเส้นทางการสื่อสารที่ทำให้บ็อตเน็ตล่ม
Loren Pechtel

ฉันไม่คิดว่าฉันพลาดจุดนี้ ผมไม่ได้หมายความว่าเขาจะต้องวิ่งการโจมตีก่อนหน้านี้ในการตรวจสอบมาตรการรักษาความปลอดภัยของเราผมหมายความว่าเขาจะต้องอ่านกระทู้นี้และตรวจสอบ (เปิด) รหัสแหล่งที่มาเพื่อตรวจสอบ weknesses :)
Jens Roland

0

เนื่องจากหลาย ๆ คนรวมถึง CAPTCHA เป็นกลไกมนุษย์ทางเลือกฉันจึงเพิ่มคำถาม StackOverflow และเธรดประสิทธิภาพของ CAPTCHA ก่อนหน้านี้

reCaptcha ถูกแคร็ก / แฮ็ค / OCR'd / พ่ายแพ้ / แตก?

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


0

คุณสามารถเร่งความเร็วตามความแข็งแกร่งของรหัสผ่านผู้ใช้

เมื่อผู้ใช้ลงทะเบียนหรือเปลี่ยนรหัสผ่านคุณคำนวณคะแนนความแข็งแกร่งสำหรับรหัสผ่านให้พูดระหว่าง 1 ถึง 10

บางอย่างเช่น "รหัสผ่าน" ให้คะแนน 1 ในขณะที่ "c6eqapRepe7et * Awr @ ch" อาจทำคะแนนได้ 9 หรือ 10 และยิ่งคะแนนยิ่งสูงเท่าไหร่ก็ยิ่งใช้การควบคุมปริมาณได้นานขึ้นเท่านั้น


2
ฉันเข้าใจแนวคิดดังกล่าว แต่นั่นจะทำให้ข้อมูลเกี่ยวกับรหัสผ่านรั่วไหลทางอ้อมแจ้งให้ผู้โจมตีทราบว่ารหัสผ่านนั้นคุ้มค่าที่จะแฮ็คหรือไม่ นั่นอาจดูเหมือนเป็นทฤษฎี แต่ผู้ใช้หลายคนใช้รหัสผ่านซ้ำดังนั้นหากฉันต้องการเจาะเข้าสู่ Strong_Throttling_Website.com ฉันสามารถโจมตีบัญชี (สิทธิพิเศษ) โดยการสุ่มจนกว่าฉันจะพบผู้ใช้ 'Freddy' ซึ่งมีรหัสผ่านที่อ่อนแอ (เช่น การควบคุมปริมาณเร็ว) จากนั้นไปที่ Less_Secure_Website.edu และทำการโจมตีพจนานุกรมง่าย ๆ ในบัญชีของ Freddy มันมีส่วนเกี่ยวข้องเล็ก ๆ น้อย ๆ แต่แน่นอนในทางปฏิบัติ
Jens Roland

0

คำตอบแรกที่ฉันมักจะได้ยินเมื่อถามคำถามนี้คือการเปลี่ยนพอร์ต แต่ลืมไปแล้วปิดการใช้งาน IPv4 หากคุณอนุญาตให้ไคลเอนต์จากเครือข่าย IPv6 เท่านั้นคุณจะไม่ต้องสวดอ้อนวอนเพื่อสแกนเครือข่ายอย่างง่ายอีกต่อไปและผู้โจมตีจะหันไปใช้การค้นหา DNS อย่าใช้ที่อยู่เดียวกับ Apache (AAAA) / Sendmail (MX-> AAAA) / สิ่งที่คุณมอบให้ทุกคน (AAAA) ตรวจสอบให้แน่ใจว่าโซนของคุณไม่สามารถเป็น xferd ได้หรือไม่รอให้ใครดาวน์โหลดโซนของคุณหรือไม่

หากบอทค้นหาชื่อโฮสต์ใหม่ให้ตั้งค่าเซิร์ฟเวอร์เพียงแค่ให้ความหมายบางอย่างกับชื่อโฮสต์ของคุณและเปลี่ยนที่อยู่ของคุณ ปล่อยชื่อเก่าและตั้งค่า ** ชื่อ honeypot สำหรับ bot net เพื่อหมดเวลา

** ทดสอบเร็กคอร์ด reverse (PTR) ของคุณ (ภายใต้ ip6.arpa.) เพื่อดูว่าพวกเขาสามารถใช้เป็นศูนย์ใน / 4 ของที่มีระเบียน VS / 4s ที่ไม่ โดยทั่วไปแล้ว ip6.arpa จะมีที่อยู่ ~ 32 "" แต่การลองทำสิ่งที่หายไปในช่วงสองสามวินาทีสุดท้ายอาจทำให้บล็อคเครือข่ายที่มีการบันทึก VS อื่น ๆ ที่ไม่ได้ทำ หากคุณดำเนินการต่อไปคุณจะสามารถข้ามส่วนที่มีขนาดใหญ่ของพื้นที่ที่อยู่ได้

ในกรณีที่เลวร้ายที่สุดผู้ใช้จะต้องตั้งค่าอุโมงค์ IPv6 ไม่ใช่ว่าพวกเขาจะต้องไปไกลเท่า VPNing ใน DMZ ... แม้ว่าใครจะสงสัยว่าทำไมมันไม่ใช่ตัวเลือกแรก

Kerberos ก็เท่เช่นกัน แต่ IMHO LDAP ก็ระเบิด (มีอะไรผิดปกติทางเทคนิคกับ NISPlus? ฉันอ่านแล้วว่า Sun ตัดสินใจว่าผู้ใช้ต้องการ LDAP และด้วยเหตุนี้พวกเขาจึงทำ NIS +) Kerberos ทำงานได้ดีโดยไม่มี LDAP หรือ NIS เพียงแค่ต้องจัดการผู้ใช้บนโฮสต์โดยโฮสต์ การใช้ Kerberos ช่วยให้คุณใช้งานง่ายหากไม่ใช่อัตโนมัติ PKI


0

สายไปเล็กน้อยที่นี่ แต่ฉันคิดว่าสมมติว่าเป็นกรณีที่ยาก - ผู้โจมตีใช้ IP สุ่มจำนวนมากชื่อผู้ใช้แบบสุ่มและรหัสผ่านแบบสุ่มที่เลือกจากรายการ 10,000 ที่ได้รับความนิยมสูงสุด

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

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