Nginx Auth_Basic 재 시도를 제한하는 방법은 무엇입니까?


14

Nginx의 Auth_Basic 모듈로 웹 폴더를 보호했습니다. 문제는 작동 할 때까지 여러 암호를 시도 할 수 있다는 것입니다 (강제 공격). 재시도 실패 횟수를 제한하는 방법이 있습니까?

답변:


29

내가 아는 한 Auth Basic 모듈은이 기능을 지원하지 않지만 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

Fail2Ban 규칙 테스트 :

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]

추신 : Fail2ban은 금지 할 로그 파일을 가져 오기 때문에 logpath구성과 일치 하는지 확인하십시오 .


5

다른 사람 이이 솔루션 / 해결 방법을 제공하지 않은 것에 놀랐습니다.

Nginx 기본 인증 및 htpasswd선택적 비용 변수를 사용하여 bcrypt 비밀번호 암호화를 지원합니다. Bcrypt는 느리도록 설계되었으므로 다른 암호를 얼마나 빨리 시도 할 수 있는지에 대한 제한을 제공합니다.

기본 인증 사용자 이름 / 암호 사용을 만들 때

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

12의 비용으로 서버는 초당 몇 번 이상 암호를 시도 할 수 없을 것입니다. 14로 말하면 암호 시도 당 약 1 초를 볼 것입니다.

이 구성을 사용하면 공격자가 몇 년 동안 암호를 지속적으로 시도하더라도 합리적인 암호가 무차별 대입 공격에 영향을받지 않습니다.

예를 들어, 8 자의 영숫자 암호에 대한 초당 10 번의 암호 시도로 692,351 년이 소요 62**8 / (10*3600*24*365)됩니다.

이는 "지능형"요청 제한을 설정하는 것보다 구성하기가 훨씬 쉽고 바보가 아닙니다.


2
이것은 bcryptNginx의 기본 인증과 함께 ed 암호를 사용할 수 있지만 분명히 할 수없는 경우 유용합니다 .
keune

나는 그것을 시도했다, 그것은 나를 위해 절대적으로 잘 작동합니다. 현재 프로덕션 환경에서 사용 중입니다.
SColvin

@keune 말했듯이 우분투에 바닐라 ngix 작동하지
파비안 톰넨

4
이로 인해 암호 시도가 제한되지만 값 비싼 해시 계산으로 서버에 과부하가 걸리기 때문입니다. 프로덕션 환경에서는 아마도 이것이 원하는 것이 아닙니다.
Tomasz P. Szynalski

강력하고 쉽습니다. CPU 사용에 대한 DoS 공격을 허용합니다.
Rainer Rillke

1

나는 nginx가 이것을 할 수있는 내부 시설을 가지고 있다고 생각하지 않습니다. 문서 페이지는 그것이 가능하다고 제안하지 않습니다.

Fail2Ban을 사용하여 로그인 시도에 실패한 IP 주소를 차단할 수 있습니다.

Fail2Ban 위키에는 몇 가지 nginx 관련 패턴이 있습니다.

Fail2Ban은 대부분의 대형 배포판에 패키지로 제공되어야합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.