Fail2ban 및 상류 서버 조치에 실패한 로그인 시도를 기록

Discourse가 설정을 통해 활성화해야 하는 기능이라도, 잘못된 로그인 시도를 로그 파일에 기록할 수 있기를 희망합니다. 그렇게 된다면 discourse를 위한 커스텀 필터와 제일을 만들 수 있을 것입니다.

저는 중앙 집중식 fail2ban 서버를 사용합니다. 이 시스템의 작동 방식은 모든 컨테이너, Docker 이미지, VM에 커스텀 ban 액션을 적용하는 것입니다:

fail2ban에서는 제일(jail)에서 취할 액션을 지정합니다. 예를 들어:
action = iptables-allports

그 다음 해당 액션을 편집하기만 하면 됩니다:
sudo nano /etc/fail2ban/action.d/iptables-allports.conf

actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
      curl -s "https://fail2ban.YourDomain.com:35553/fail2ban.php?token=D2f3Ydy45f6y5FRTfyeFrtYErt&action=add&source=TEST_HOST&reason=TEST_FILTER&ip=111.222.333.444"

이 구성을 사용하면 컨테이너/docker/VM이 로컬에서 fail2ban을 실행하는 동시에 이 정보를 중앙 fail2ban 서버로 전달합니다. 중앙 서버는 수집된 모든 IP를 txt 형식의 banlist로 제공하도록 할 수 있습니다. 예를 들어: https://fail2ban.YourDomain.com/banned.txt

그런 다음 pfsense 방화벽이 이 banlist를 구독하도록 설정할 수 있으며, 다른 pfsense 라우터와도 목록을 공유할 수 있습니다. 이렇게 하면 한 애플리케이션에 침입을 시도하면 모든 곳에서 차단됩니다. 이 방식은 수년간 저에게 잘 작동해 왔습니다.

discourse에 이를 구현하기 위해 제가 필요한 것은 잘못된 로그인 시도가 있을 때 discourse가 로그 파일에 항목을 기록하게 하는 것뿐입니다 :slight_smile:

1개의 좋아요

이걸 어떻게 훅하거나 로그를 기록하는지 알아내셨나요?

감사합니다

1개의 좋아요

업데이트. 정말 좋은 아이디어인 것 같습니다!

Discourse가 로그를 어디에 저장하고 표시합니까?

NGINX 로그
간혹 NGINX 로그에 유용한 정보가 포함될 수 있습니다. 위치는 다음과 같습니다:

cd /var/discourse
./launcher enter app
cd /var/log/nginx
해당 디렉터리에는 access.log와 error.log 파일 및 회전된 압축 파일들이 있습니다. less access.log.2.gz 명령을 실행하면 자동으로 압축을 해제하여 로그 파일을 표시해 줍니다.

이 디렉터리는 호스트의 /var/discourse/shared/standalone/log/var-log/nginx 경로에서도 접근할 수 있습니다.

불행히도 nginx의 error.log와 access.log 파일에는 잘못된 로그인 시도가 기록되지 않습니다.

다른 해결 방법을 제안해 주실 수 있나요?

감사합니다.

1개의 좋아요

동의합니다. fail2ban 같은 자동화된 지수 백오프 메커니즘을 연동할 수 있다면 좋겠습니다.

1개의 좋아요

궁금한 점이 있는데, 이 기능 요청이 현재 추적 중이거나 계획에 포함되어 있나요? 좋은 보안 기능이 될 것 같습니다.

IP 주소별 로그인 실패 시도를 로그로 기록하거나 (또는 훅을 통해 처리하거나) 해주세요.

감사합니다!

1개의 좋아요

nginx의 access.log 파일에는 이 작업에 필요한 로그인 라우트에 대한 403 응답이 포함된 줄이 있어야 합니다. 로그를 확인해 보셨나요?

1개의 좋아요

아, 감사합니다! 도커 이미지/컨테이너 외부에서 어떻게 접근하는지 궁금합니다.

안녕하세요 @Falco. 답변 감사합니다. 방금 바로 로그를 확인해 봤는데, 제 생각에는 올바른 비밀번호 시도와 잘못된 비밀번호 시도가 동일하게 보입니다 (200 응답):

(IP 주소와 도메인은 마스킹 처리했으며, 나머지는 원본 그대로입니다)

잘못된 비밀번호:

[20/Dec/2021:08:07:31 -0800] "community.example.com" 10.111.222.33 "GET /session/csrf HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/csrf" 200 1185 "https://community.example.com/" 0.016 0.017 "-"
[20/Dec/2021:08:07:32 -0800] "community.example.com" 10.111.222.33 "POST /session HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/create" 200 1111 "https://community.example.com/" 0.552 0.550 "-"

올바른 비밀번호:

[20/Dec/2021:08:24:50 -0800] "community.example.com" 10.111.222.33 "GET /session/csrf HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/csrf" 200 1185 "https://community.example.com/" 0.020 0.020 "-"
[20/Dec/2021:08:24:51 -0800] "community.example.com" 10.111.222.33 "POST /session HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/create" 200 2251 "https://community.example.com/" 1.216 1.216 "-"

따라서 둘 다 200 응답을 반환하므로, 이를 fail2ban에 사용할 수 없습니다. 올바른 비밀번호를 입력한 사용자가든, 잘못된 비밀번호를 입력한 사용자가든 모두 차단하게 될 것입니다.

2개의 좋아요

Twitter는 잘못된 비밀번호에 대해 400을 반환하지만, Facebook, LinkedIn, Google, Amazon은 200을 반환합니다. 제 생각에는 200이 옳지 않은 것 같지만, 이것이 일반적인 것인 것 같습니다?

아래 메서드에 훅을 연결하는 플러그인으로 시작해 보시면 어떨까요?

그리고 필요한 작업을 수행하면 됩니다.

3개의 좋아요

멋지네요, 답변 감사합니다! 조금이라도 시간이 나면 이 정보를 생성하는 플러그인을 만들어 볼게요! (필요한 건 단순히 잘못된 비밀번호로 로그인 시도를 하면 IP 주소가 파일에 기록되는 것뿐이에요. 예: 10.111.222.33 IP에서 잘못된 로그인 시도)

3개의 좋아요

감사합니다! 이 플러그인을 사용해보고 싶습니다. 사용할 수 있게 해주시면 알려주세요.

혹시 이 방법을 성공적으로 적용해 보신 적 있으신가요? 저도 Discourse 인스턴스에 fail2ban을 사용하고 싶어서 관심이 많습니다.

셀프메이드 웹마스터와 순수한 최종 사용자의 역할에 대해 쓰고 있는데…

정의상 잘못된 로그인은 에러 200입니다. 물론 앱의 내부 에러로 처리되고, 나중에 403 에러나 복구 링크 전송 같은 다른 결과를 생성할 수는 있지만, 즉시 그런 일이 일어나서는 안 되며 그럴 수도 없습니다.

Fail2ban은 좋은 도구이지만 과대평가되고 있습니다. 도커는 모든 것을 더 어렵게 만들므로 잊어버리기로 합시다. 하지만 VPS의 iptables를 우회할 수 있다는 사실 자체가 제게는 정말로 혼란스러운 문제입니다. 하지만 봇들은 보통 3회 시도마다 IP를 변경하는 경향이 있어, 순수한 로그인 브루트포스 공격에 대해 Fail2ban은 무력해집니다.

스크립트 키디는 물론 또 다른 이야기입니다. 그들은 찾은 모든 것을 복사&붙여넣기하고, 살짝 바꿔본 후 IP를 건드리지 않습니다. 그런 경우 Fail2ban은 그들을 막을 수 있지만, 그들은 거의 해를 끼치지 못하고 부하를 증가시킬 뿐입니다. 즉각적인 플러드가 있을 때의 실제 문제는 스크립트 키디의 수입니다.

하지만 VPS가 그런 상황을 처리할 수 있는 한 그것은 중요하지 않습니다. 지금은 2023년이고, 대부분 그 무책임한 녀석들은 디스코스 사이트에서 워드프레스의 오래된 취약점을 노리고 있습니다. :wink:

하지만 일상적인 위협이 아니더라도, 끊임없는 로그인을 막을 논리가 있어야 한다고 생각합니다.