ฉันปกป้องเว็บโฟลเดอร์ด้วยโมดูล Auth_Basic ของ Nginx ปัญหาคือเราสามารถลองรหัสผ่านหลาย ๆ จนกว่ามันจะใช้งานได้ (การโจมตีแบบเดรัจฉานบังคับ) มีวิธี จำกัด จำนวนครั้งที่พยายามล้มเหลวอีกครั้งหรือไม่
ฉันปกป้องเว็บโฟลเดอร์ด้วยโมดูล Auth_Basic ของ Nginx ปัญหาคือเราสามารถลองรหัสผ่านหลาย ๆ จนกว่ามันจะใช้งานได้ (การโจมตีแบบเดรัจฉานบังคับ) มีวิธี จำกัด จำนวนครั้งที่พยายามล้มเหลวอีกครั้งหรือไม่
คำตอบ:
เท่าที่ผมรู้ว่าการตรวจสอบสิทธิ์พื้นฐานโมดูลไม่สนับสนุนคุณลักษณะนี้ แต่คุณสามารถทำเช่นนี้โดยใช้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
ตรงกับการกำหนดค่าของคุณ
ฉันประหลาดใจที่ไม่มีคนอื่นให้วิธีแก้ปัญหา / วิธีแก้ปัญหานี้
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)
ปี:
การกำหนดค่านี้ง่ายกว่ามากและป้องกันคนโง่ได้มากกว่าการตั้งค่าการ จำกัด คำขอ "อัจฉริยะ"
ฉันไม่เชื่อว่า nginx มีสิ่งอำนวยความสะดวกภายในเพื่อทำสิ่งนี้ หน้าเอกสารไม่ได้บอกว่ามันเป็นไปได้
คุณสามารถใช้ Fail2Ban เพื่อบล็อกที่อยู่ IP ที่พยายามเข้าสู่ระบบล้มเหลวซ้ำแล้วซ้ำอีก
วิกิพีเดีย fail2ban มีบางส่วนรูปแบบ Nginx เฉพาะ
Fail2Ban ควรจะพร้อมใช้งานเป็นแพ็คเกจสำหรับ distros ขนาดใหญ่ส่วนใหญ่
โมดูล Nginx-HTTP-Auth-Digestสามารถแทนที่โมดูล auth พื้นฐานด้วยคุณสมบัติเพิ่มเติมมากมายเช่นการลองอีกครั้งและหมดเวลา เอกสารเพิ่มเติมมีอยู่ที่นี่
ข้อเสียเพียงอย่างเดียวคืออาจต้องสร้าง nginx ใหม่
bcrypt
รหัสผ่านเอ็ดกับการตรวจสอบสิทธิ์ขั้นพื้นฐาน Nginx แต่เห็นได้ชัดว่าคุณไม่สามารถ