วิธี จำกัด Nginx Auth_Basic ให้ลองใหม่อีกครั้ง


14

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

คำตอบ:


29

เท่าที่ผมรู้ว่าการตรวจสอบสิทธิ์พื้นฐานโมดูลไม่สนับสนุนคุณลักษณะนี้ แต่คุณสามารถทำเช่นนี้โดยใช้fail2ban

การทดสอบกับผู้ใช้ที่ไม่มีอยู่จริงคุณจะเห็นสิ่งต่าง ๆ ดังรายละเอียดข้างล่างในบันทึกข้อผิดพลาด:

2012/08/25 10:07:01 [error] 5866#0: *1 no user/password was provided for basic authentication, client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", host: "localhost:81" 2012/08/25 10:07:04 [error] 5866#0: *1 user "ajfkla" was not found in "/etc/nginx/htpasswd", client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", host: "localhost:81"

จากนั้นสร้างตัวกรองที่จำเป็น:

/etc/fail2ban/filter.d/nginx-auth.conf

[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
              user .* was not found in.*client: <HOST>
              user .* password mismatch.*client: <HOST>
ignoreregex = </host></host></host> 

/etc/fail2ban/jail.conf

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables[name=NoAuthFailures, port=80, protocol=tcp]
logpath = /var/log/nginx*/*error*.log
bantime = 3600 # 1 hour
maxretry = 3

การทดสอบกฎล้มเหลว 2 แบน:

fail2ban-regex /var/log/nginx/localhost.error_log /etc/fail2ban/filter.d/nginx-auth.conf

Failregex
|- Regular expressions:
|  [1] no user/password was provided for basic authentication.*client: <HOST>
|  [2] user .* was not found in.*client: <HOST>
|  [3] user .* password mismatch.*client: <HOST>
|
`- Number of matches:
   [1] 1 match(es)
   [2] 2 match(es)
   [3] 0 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
    127.0.0.1 (Sat Aug 25 10:07:01 2012)
[2]
    127.0.0.1 (Sat Aug 25 10:07:04 2012)
    127.0.0.1 (Sat Aug 25 10:07:07 2012)
[3]

PS: เนื่องจาก Fail2ban ดึงไฟล์บันทึกเพื่อแบนตรวจสอบให้แน่ใจว่าlogpathตรงกับการกำหนดค่าของคุณ


5

ฉันประหลาดใจที่ไม่มีคนอื่นให้วิธีแก้ปัญหา / วิธีแก้ปัญหานี้

Nginx basic-auth และhtpasswdสนับสนุนการเข้ารหัสรหัสผ่าน bcrypt พร้อมกับตัวแปรค่าใช้จ่ายเพิ่มเติม Bcrypt ได้รับการออกแบบให้ช้าดังนั้นจึงมีข้อ จำกัด อย่างหนักเกี่ยวกับความเร็วที่คุณสามารถลองใช้รหัสผ่านที่แตกต่างกัน

เมื่อสร้างชื่อผู้ใช้ / รหัสผ่านรับรองความถูกต้องขั้นพื้นฐานของคุณ

htpasswd -B -C 12 path/to/users.db <username>

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

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

เช่นที่ 10 ความพยายามในการใช้รหัสผ่านต่อการโจมตีแรงเดรัจฉานที่สองใน 8 ตัวอักษรและตัวเลขรหัสผ่านจะใช้เวลา 692,351 62**8 / (10*3600*24*365)ปี:

การกำหนดค่านี้ง่ายกว่ามากและป้องกันคนโง่ได้มากกว่าการตั้งค่าการ จำกัด คำขอ "อัจฉริยะ"


2
นี้จะเป็นประโยชน์ถ้าคุณสามารถใช้bcryptรหัสผ่านเอ็ดกับการตรวจสอบสิทธิ์ขั้นพื้นฐาน Nginx แต่เห็นได้ชัดว่าคุณไม่สามารถ
keune

ฉันลองแล้วมันใช้งานได้ดีจริง ๆ สำหรับฉัน ใช้มันในการผลิตทันที
SColvin

ไม่ทำงานกับ vanilla ngix บน ubuntu ตามที่ @keune กล่าว
Fabian Thommen

4
ไม่ควรพูดถึงว่านี่จะจำกัดความพยายามของรหัสผ่าน แต่เพียงเพราะเซิร์ฟเวอร์ของคุณจะโหลดมากเกินไปจากการคำนวณแฮชราคาแพง ในสภาพแวดล้อมการผลิตนี่อาจไม่ใช่สิ่งที่คุณต้องการ
Tomasz P. Szynalski

ทนทานและใช้ง่ายใช่ อนุญาตให้ DoS โจมตีการใช้งาน CPU
Rainer Rillke

1

ฉันไม่เชื่อว่า nginx มีสิ่งอำนวยความสะดวกภายในเพื่อทำสิ่งนี้ หน้าเอกสารไม่ได้บอกว่ามันเป็นไปได้

คุณสามารถใช้ Fail2Ban เพื่อบล็อกที่อยู่ IP ที่พยายามเข้าสู่ระบบล้มเหลวซ้ำแล้วซ้ำอีก

วิกิพีเดีย fail2ban มีบางส่วนรูปแบบ Nginx เฉพาะ

Fail2Ban ควรจะพร้อมใช้งานเป็นแพ็คเกจสำหรับ distros ขนาดใหญ่ส่วนใหญ่


0

โมดูล Nginx-HTTP-Auth-Digestสามารถแทนที่โมดูล auth พื้นฐานด้วยคุณสมบัติเพิ่มเติมมากมายเช่นการลองอีกครั้งและหมดเวลา เอกสารเพิ่มเติมมีอยู่ที่นี่

ข้อเสียเพียงอย่างเดียวคืออาจต้องสร้าง nginx ใหม่

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