현재 NGINX로 어뷰징 관련해서 제한하는 인프라와
NGINX 로그를 확인해서 로봇으로 의심되는 IP를 차단하는 fail2ban 인프라를 구축했다.
어뷰징 대응 목적으로 규정을 좀 빡빡하게 잡았는데
하루 사이에 걸린 IP만 7개다. 지금은 초기라서 그렇고 IP가 수집되면 나중엔 이렇게 빠르게 올라가지는 않을것이다.
대비해야 할건 이용자들의 IP가 차단될 수 있다는 점이다.
우선, IP가 차단되면 이를 디스코드에 알리고 어떤 이유로 차단됐는지도 함께 보내기로 했다.
로그를 보고서 로봇이 아닌 거 같으면 차단을 해제하는 것이다.
[Definition]
actionban = curl -X POST -H "Content-Type: application/json" -d '{
"content": null,
"embeds": [{
"title": "🚫 IP 차단 발생",
"description": "차단된 IP: <ip>\n차단 시간: $(date)\n\n최근 요청 로그:\n```\n$(grep <ip> /var/log/nginx/access.log | grep -E \"(429|404|500)\" | tail -n 5)\n```",
"color": 16711680
}]
}' "DISCORD_WEBHOOK_URL"
[Init]
디스코드 웹훅에 맞춰서 이렇게 보낸다.
이렇게 해도 안돼서
sudo fail2ban-regex --print-all-conf /etc/fail2ban/action.d/discord-notification.conf
문법 검사를 해보니 문법에 오류가 있었던것이다.
sudo nano로 하나씩 내용을 지우는 게 너무 귀찮았는데
ctrl+^을 하고서 ctrl+k를 하면 금방 지울 수 있었다.
sudo fail2ban-client -d //설정이 제대로 로드됐는지확인
-->지금은 action에서 discord관련 내용이 로드가 안됐다.
curl -X POST -H "Content-Type: application/json" -d '{"content": "Test message"}' discord-webhook
//curl로 메시지 보내보기 -->메시지는 잘 간다.
journalctl -u fail2ban //로그 보기
Dec 19 13:58:34 ip-10-0-0-215 fail2ban-server[373620]: 2024-12-19 13:58:34,213 fail2ban [373620]: ERROR Failed during configuration: Bad value substitution: option 'action' in section 'nginx-limit-req' contains an interpolation key 'action_with_ban' which is not a valid option name. Raw value: '%(action_with_ban)s'
action값을 읽는데서 문제가 생기고 있는 것이다.
왜 안되나 싶더니^^;;;
jail.conf에 내용을 쓰고 jail.local에 액션을 넣지 않았기 때문이었다. ㅎㅎㅎ
jail.conf는 jail.local에 오버라이딩 된다고 한다
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -X POST "<webhook>" \
-H "Content-Type: application/json" \
-d '{"username":"Fail2Ban", "content":":warning: **[<name>]** IP: `<ip>` has been banned for <bantime> hours after **<failures>** failure(s)."}'
actionunban =
[Init]
name = default
discord-webhook=
최종적으로는 위와같은 action을 만들었고 사용 중이다.
그럼 이렇게 디스코드에 차단된 ip가 웹훅으로 전달된다.