๐บ ๋ชฉ์ฐจ ๐บ(๋ณด์๋ ค๋ฉด ์๋ ๋๋ณด๊ธฐ ๋ฅผ ๋๋ฌ์ฃผ์ธ์.)
1. Nginx + ModSecurity + Fail2ban + Docker => 1. ์ทจ์ฝํ ์น์ฌ์ดํธ
2. Nginx + ModSecurity + Fail2ban + Docker => 2. ModSecurity + Fail2ban ์ค์น
3. Nginx + ModSecurity + Fail2ban + Docker => 3. Fail2ban ์ค์ ๋ฐฉ๋ฒ
4. Nginx + ModSecurity + Fail2ban + Docker => 4. Nginx Limit req ์ค์
5. Nginx + ModSecurity + Fail2ban + Docker => 5. Dockerhub ์ด๋ฏธ์ง ์ฌ์ฉ
1. fail2ban ๋
์์์ ์ค์นํ fail2ban์ ์น์๋ฒ์ access.log ํ์ผ๊ณผ error.log ํ์ผ์ ๋ฐ๋ผ๋ณด๊ณ ์์ผ๋ฉด์, ์ผ์ ์๊ฐ์ ์ผ์ ํ์ ์ด์์ ์ ์ ์๋๋ ๋ก๊ทธ์ธ ์ค๋ฅ๊ฐ ๋ฐ์์ ํด๋น ์์ดํผ๋ฅผ ์ผ์ ์๊ฐ๋์ ์ฐจ๋จํด ๋ฒ๋ฆฌ๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
๋ํ, ์๋ฒ์ ssh ์ ์์ ์ํ ๋ฌด์ฐจ๋ณ ๋์ (brute force) ๊ณต๊ฒฉ ์ฐจ๋จ์๋ ๋ง์ด ํ์ฉ๋๊ณ ์์ต๋๋ค. ๋ค๋ง, ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ํด๋ผ์ฐ๋ ๋ฐฉํ๋ฒฝ ์ค์ ์์ 22๋ฒ ํฌํธ์ ๋ํด์๋ ํน์ ์์ดํผ๋ง ์ ์ ๊ฐ๋ฅํ๋๋ก ์ค์ ์ ํ์ฌ ์ฌ์ฉ์ ํฉ๋๋ค.
2. fail2ban ์ค์
1) docker/fail2ban ํด๋์ ๋ณด๋ฉด filter.d ํด๋๊ฐ ์์ผ๋ฉฐ, ๊ทธ ์์ ๊ฐ์ข ํํฐ๋ง ์ค์ ์ด ๋ค์ด์์ต๋๋ค. ์ด ํํฐ๋ง๊ฐ์ ์์ ํ์ฌ ์ํ๋ ์ ๋ณด๋ง์ ์ถ์ถ, ํ์ฉํ ์ ์์ต๋๋ค๋ง, ์ ๋ ์ด ๋ถ๋ถ์ ์ ๋ชฐ๋ผ์ ๊ทธ๋ฅ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.

2) docker/fail2ban/jail.conf ํ์ผ ์์
์ด ํ์ผ ๋งจ ์๋๋ฅผ ๋ณด์๋ฉด ์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์์ต๋๋ค.
์๋ ์ฝ๋๋ nginx์ access.log ํ์ผ์์ nginx-dos ํํฐ ํ์์ ๋ก๊ทธ๊ฐ 120์ด ๋์ 200๋ฒ ์ด์์ ๊ธฐ๋ก์ด ๋จ๊ฒจ์ง ๊ฒฝ์ฐ ํด๋น ์์ดํผ๋ฅผ 10๋ถ ๋์ ์ฐจ๋จ์ํค๋ฉฐ, 10๋ถ์ด ์ง๋๋ฉด ์๋์ผ๋ก ์ฐจ๋จ ํด์ ๊ฐ ๋๋ค๋ ๋ป์ ๋๋ค.
[nginx-dos] enabled = true port = http,https filter = nginx-dos logpath = /usr/local/nginx/logs/*access*.log findtime = 120 #์ผ๋ง ์๊ฐ๋์ maxretry = 200 #๋ช๋ฒ์ ์๋๊ฐ ๋์ผ๋ฉด bantime = 10m #์ฐจ๋จ์ ์ผ๋ง ์๊ฐ๋์ ์ํฌ ๊ฒ์ธ๊ฐ
์ ์ฝ๋๋ฅผ ํ ์คํธ ํด๋ณด๊ธฐ ์ํด, ์๊ฐ์ ์๋์ ๊ฐ์ด ์์ ์ ํ์์ต๋๋ค.
[nginx-dos] enabled = true port = http,https filter = nginx-dos logpath = /usr/local/nginx/logs/*access*.log findtime = 10 #10์ด ๋์ maxretry = 3 #3๋ฒ ์ด์์ ์ ์ ์๋๊ฐ ์์ ๊ฒฝ์ฐ bantime = 1m #1๋ถ๊ฐ ์ฐจ๋จํจ.
์ปจํ ์ด๋๋ฅผ ์๋ก ์์ฑํ ํ localhost๋ก ์ ์์ ํด๋ด ๋๋ค. ๊ทธ๋ผ access.log ํ์ผ์ ๊ธฐ๋ก์ด ๋จ๊ฒจ์ง ๊ฒ์ด๋ฉฐ, ์ด๊ฒ์ fail2ban์ด ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.

์ด์ ๋ธ๋ผ์ฐ์ ์์ ์๋ก๊ณ ์นจ์ 10์ด ์์ 4๋ฒ ์ด์์ ๋๋ฅด๋ฉด, ๋ก๊ทธ์ Ban์ด๋ผ๊ณ ์ฐํ๋ฉด์ ํด๋น ์์ดํผ๊ฐ ์ฐจ๋จ์ด ๋ฉ๋๋ค. ์ด์ ํด๋น ์์ดํผ์์๋ ๋ธ๋ผ์ฐ์ ๋ก ๋์ด์ ์ ์๋์ง ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.

1๋ถ์ด ์ง๋๋ฉด ์๋์ผ๋ก ๋ก๊ทธ์ Unban์ด ์ฐํ ํ ๋ค์ ํด๋น ์์ดํผ์์ ์ ์์ด ๋ฉ๋๋ค.

์ด์ ๋ค์ ์ํ์๋ ๊ฐ์ผ๋ก ์์ ์ ํด๋์ผ์๋ฉด ๋ฉ๋๋ค.
3. fail2ban๋ก ๋ก๊ทธ์ธ ๋ฌด์ฐจ๋ณ ๋์ (brute force) ๊ณต๊ฒฉ ์ฐจ๋จ ๋ฐฉ๋ฒ
1) ๋ก๊ทธ์ธ ํ์ด์ง(index.php)์์ ๋์ถฉ ์ ๋ณด๋ฅผ ์ ๋ ฅ ํ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด, login_ok.php ํ์ด์ง๋ก ์ด๋ํ๋ฉฐ ์ ๋ณด๋ฅผ ํ์ธํ๋ผ ํ๋ฉด์, ๋ค์ index.php๋ก ๋์์ต๋๋ค.
์ด๋ access.log๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ ์ ๋ณด๊ฐ ์์ต๋๋ค.

๋ง์ฝ ๋๊ตฐ๊ฐ๊ฐ ๋ฌด์ฐจ๋ณ ๋์ ๊ณต๊ฒฉ์ ์๋ํ๋ค๋ฉด, ์์ ๊ฐ์ ๋ก๊ทธ๊ฐ ์์ฒญ ์์ด๊ฒ ๋ ๊ฒ์ ๋๋ค.
2) docker/fail2ban/filter.d/nginx-login.conf ํ์ผ์ ์ด์ด ์๋์ ๊ฐ์ด ์์ ํด ์ค๋๋ค.
# # Login filter /etc/fail2ban/filter.d/nginx-login.conf: # # Blocks IPs that fail to authenticate using web application's log in page # # Scan access log for HTTP 200 + POST /sessions => failed log in # [Definition] #failregex = ^<HOST> -.*POST /wp-login.php.* HTTP/1\.." 200 failregex = ^<HOST> -.*POST /login_ok.php.* HTTP/1\.." 200 ignoreregex =
3) docker/fail2ban/jail.conf ํ์ผ์์ [nginx-login] ๋ถ๋ถ์ ์ฐพ์ ์๋์ ๊ฐ์ด enabled๋ฅผ true๋ก ์์ ํด ์ค ํ, ์ํ๋๋๋ก findtime, maxretry, bantim ๊ฐ์ ์ง์ ํฉ๋๋ค. (์๋ ์์๋ 1๋ถ๋์ ๋ก๊ทธ์ธ ์๋๊ฐ 2๋ฒ์ด ์ด๊ณผ๋๋ฉด, 1๋ถ๊ฐ ์ฐจ๋จ์ ํ๋ผ๊ณ ํ์ต๋๋ค.)
๊ทธ๋ฆฌ๊ณ , ์๋ชป๋ ๋ก๊ทธ์ธ ์๋๋ฅผ 3๋ฒ์งธ ํ๊ฒ๋๋ฉด, log์ Ban์ด๋ผ๊ณ ๋จ๋ฉฐ, ์๋์ ๊ฐ์ด ์ ์์ด ๋์ง ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋ฌผ๋ก 1๋ถ ํ๊ฐ ์ง๋๋ฉด ๋ค์ ํด์ ๊ฐ ๋ฉ๋๋ค.

์ด์ ์ ๋์ํ๋ ๊ฒ์ ํ์ธํ์์ผ๋, ๋ค์ ์ ๋นํ ๊ฐ์ผ๋ก ์์ ์ ํ์๊ธฐ ๋ฐ๋๋๋ค.
4. fail2ban ๋ช ๋ น์ด
1) fail2ban ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํด๋น ์ปจํ ์ด๋๋ก ๋ค์ด๊ฐ์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ front_nginx_cname ์ด๋ผ๊ณ ์ปจํ ์ด๋ ๋ช ์ ์ฃผ์๊ธฐ ๋๋ฌธ์, ์๋์ฐ์ฆ์ ๊ฒฝ์ฐ ํฐ๋ฏธ๋์ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํฐ์ด๋ ์์ผ๋ก ๋ค์ด๊ฐ๋๋ค. ๊ทธ๋ผ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋จ๊ฒ ๋ฉ๋๋ค.
docker exec -it front_nginx_cname /bin/sh

2) fail2ban ์ํ ํ์ธ
fail2ban-client status
์๋ ๊ทธ๋ฆผ์ ํ์ฌ ์ด์ํ๊ณ ์๋ ๊ฐ์ฅ์ด 5๊ฐ๋ผ๋ ๋ป...

3) fail2ban ๊ฐ์ฅ์ ๊ฐํ์๋ = ์ฐจ๋จ๋ ์์ดํผ ํ์ธ
์ด๋๋ ์๋์ ๊ฐ์ด ๊ฐ์ฅ ์ด๋ฆ์ ์ ๋ ฅํด ์ฃผ์ด์ผ ํฉ๋๋ค. ์ ์ ๊ฒฝ์ฐ nginx-dos๋ก ์ฐจ๋จ๋์ด ์์ต๋๋ค.
fail2ban-client status nginx-dos

4) nginx-dos ๊ฐ์ฅ์์ 172.22.0.1 ์ ํ์ด์ค์๋ค(์ฐจ๋จ ํด์ ).
fail2ban-client set nginx-dos unbanip 172.22.0.1

์ ๋ช ๋ น ์ค unbanip ๋์ banip ๋ผ๊ณ ์ ๋ ฅํ๋ฉด ํด๋น ์์ดํผ๋ฅผ ๋ฐ๋ก ์ฐจ๋จ์ํฌ ์ ์์ต๋๋ค.
์ด์ ์ปจํ ์ด๋์์ ๋น ์ ธ๋์ค๋ ค๋ฉด exit๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
5) ์ ๋ช ๋ น๋ค์ ์ปจํ ์ด๋ ์์ผ๋ก ๋ค์ด๊ฐ์ ๋ช ๋ น์ ๋ด๋ ธ๊ธฐ์ ์กฐ๊ธ ๊ท์ฐฎ์ต๋๋ค. ์ปจํ ์ด๋ ๋ฐ์์ ์๋์ ๊ฐ์ด ์ ๋ ฅํด๋ ์ํ ์กฐํ๊ฐ ๊ฐ๋ฅํ๊ณ , ํด๋น ์์ดํผ๋ฅผ ์ฐจ๋จ ํด์ ์ํฌ ์ ์์ต๋๋ค.
docker exec -it front_nginx_cname fail2ban-client set nginx-dos unbanip 172.22.0.1 docker exec -it front_nginx_cname fail2ban-client status nginx-dos

๐บ๐บ ์์ ํ ๋ชจ๋ ์์ค๋ ์๋ ๋งํฌ์์ ํ์ธํ์ค ์ ์์ต๋๋ค. ๐บ๐บ
https://github.com/mmssem/ModSecurityFail2ban/releases/tag/์ต์ข ํ์ผ
Release ์ต์ข ํ์ผ ยท mmssem/ModSecurityFail2ban
์ต์ข ํ์ผ
github.com