Web Hosting

[AWS LAMP] 보안 강화를 위한 Fail2Ban 설치 방법과 운영방법

아래 내용을 주제로 보안을 강화하기 위한 조치를 취하였습니다.

신생도메인이 생기면, 해커들(?)은 어떻게 알고 bot 공격시도를 하는 것일까?

Fail2Ban은 리눅스 서버 보안의 필수 아이템이며, 오픈 소스 소프트웨어라 100% 무료입니다.

기본 원리는 간단합니다. 서버 로그(access.log, auth.log 등)를 실시간으로 감시하다가, 특정 IP가 짧은 시간 내에 여러 번 접속 실패를 일으키면 해당 IP를 방화벽(iptables/nftables) 레벨에서 일정 시간 동안 차단(Jail)해 버리는 방식입니다.


1. Fail2Ban 설치 방법 (Ubuntu/Debian 기준)

AWS Lightsail의 LAMP 인스턴스는 대개 Ubuntu 기반이므로 아래 명령어로 간단히 설치할 수 있습니다.

Bash

# 패키지 목록 업데이트 및 설치
sudo apt update
sudo apt install fail2ban -y

# 서비스 상태 확인
sudo systemctl status fail2ban

2. 운영 및 설정 방법

Fail2Ban은 기본 설정 파일인 jail.conf 대신, 사용자가 직접 수정하는 jail.local 파일을 만들어 관리하는 것이 정석입니다.

① 설정 파일 생성

Bash

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local

② 주요 설정값 (필수 수정 항목)

파일 내에서 아래 항목들을 찾아 본인의 환경에 맞게 수정하세요.

  • bantime: 차단할 시간 (예: 1h는 1시간, 1d는 하루)
  • findtime: 실패 횟수를 계산할 시간 범위 (예: 10m 동안 5번 실패하면 차단)
  • maxretry: 허용되는 최대 실패 횟수
  • ignoreip: 본인의 IP 주소를 꼭 넣으세요. 실수로 본인이 차단되는 것을 방지합니다. (예: 127.0.0.1/8 ::1 211.xxx.xxx.xxx)

③ SSH 및 Apache 보호 활성화

파일 하단부의 [sshd][apache-auth] 항목 아래에 enabled = true를 추가합니다.

Ini, TOML

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

3. 유용한 운영 명령어 (관리자 필독)

설정을 마친 후에는 반드시 서비스를 재시작해야 적용됩니다.

  • 설정 적용: sudo systemctl restart fail2ban
  • 차단 현황 확인: sudo fail2ban-client status sshd (현재 차단된 IP 목록 확인)
  • 실수로 차단된 IP 해제: sudo fail2ban-client set sshd unbanip [IP주소]
  • 전체 로그 확인: tail -f /var/log/fail2ban.log (누가 차단되고 있는지 실시간 확인 가능)

4. 주의사항

  • 서버 자원: Fail2Ban은 로그 파일을 계속 읽기 때문에, 로그가 수 기가바이트(GB) 단위로 커지면 CPU 점유율이 올라갈 수 있습니다. 주기적인 로그 로테이션(logrotate)이 설정되어 있는지 확인하세요.
  • AWS 방화벽과의 관계: Fail2Ban은 서버 내부(OS 레벨) 방화벽을 제어합니다. AWS Lightsail 콘솔에서 설정한 네트워크 방화벽보다 안쪽에서 작동하는 2차 방어선이라고 생각하시면 됩니다.

지금 바로 fail2ban-client status 명령어를 입력해 보세요. 이미 누군가 차단되어 있는 모습을 보며 “아, 설치하길 잘했다”는 생각이 드실 겁니다.



AWS Lightsail LAMP 인스턴스에서 가장 일반적으로 사용되는 SSH 보호Apache(웹 서버) 보호를 포함한 jail.local 설정 파일 만들기

아래 내용을 복사해서 사용하시되, ignoreip 부분에 본인의 IP를 꼭 추가하셔야 본인이 차단되는 불상사를 막을 수 있습니다.


1. 설정 파일 생성 및 편집

먼저 터미널에서 아래 명령어를 입력하여 설정 파일을 엽니다.

Bash

sudo vi /etc/fail2ban/jail.local

2. 설정 내용 (복사해서 붙여넣으세요)

Ini, TOML

[DEFAULT]
# 차단 대상에서 제외할 IP (본인 공인 IP를 꼭 추가하세요. 예: 211.xxx.xxx.xxx)
# 여러 개일 경우 공백으로 구분합니다.
ignoreip = 127.0.0.1/8 ::1

# 차단 시간 (1h = 1시간, 1d = 하루, -1 = 영구차단)
bantime   = 1h

# 실패 횟수를 계산할 시간 범위 (10분 동안 5번 실패하면 차단)
findtime  = 10m

# 최대 허용 실패 횟수
maxretry = 5

# 차단 방법 (기본값)
banaction = iptables-multiport

# [SSH 보호]
[sshd]
enabled = true
port    = ssh
logpath = /var/log/auth.log
maxretry = 3

# [Apache 인증 실패 보호]
# .htaccess 등으로 걸어둔 비밀번호를 계속 틀릴 때 차단
[apache-auth]
enabled = true
port    = http,https
logpath = /var/log/apache2/error.log
maxretry = 3

# [Apache 악성 봇 및 스캔 차단]
# 존재하지 않는 페이지(404)를 짧은 시간에 너무 많이 요청하는 IP 차단
[apache-noscript]
enabled = true
port    = http,https
logpath = /var/log/apache2/error.log
maxretry = 3

# [Apache 포트 스캔 및 공격 시도 차단]
[apache-overflows]
enabled = true
port    = http,https
logpath = /var/log/apache2/error.log
maxretry = 2

3. 적용 및 확인 방법

1) 설정 저장 후 Fail2Ban 재시작 편집기(vi)에서 :wq를 입력해 저장하고 나온 뒤, 아래 명령어로 재시작합니다.

Bash

sudo systemctl restart fail2ban

2) 작동 상태 확인 현재 어떤 필터들이 활성화되어 있는지 확인합니다.

Bash

sudo fail2ban-client status

3) 실제 차단된 IP 목록 확인 (예: sshd) 실제로 공격을 시도하다 차단된 IP가 있는지 보려면 아래 명령어를 씁니다.

Bash

sudo fail2ban-client status sshd


💡 팁

  • 본인 IP 확인: 네이버나 구글에 “내 아이피”라고 검색하면 나오는 주소를 ignoreip에 넣으세요.
  • 강력한 차단: 만약 공격이 너무 심하다면 bantime1d(하루)나 1w(일주일)로 늘리시는 것이 좋습니다.
  • 로그 경로: Lightsail LAMP 표준 설정을 따랐으나, 혹시 작동하지 않는다면 /var/log/apache2/ 경로에 실제 로그 파일이 있는지 확인해 보세요.

이제 이 설정만으로도 내 도메인주소로 들어오는 무차별 대입 공격(Brute-force)의 상당수를 자동으로 방어할 수 있습니다.


참고사항 : 로그 로테이션의 의미


로그 로테이션(Logrotate)은 서버의 로그 파일이 무한정 커져서 디스크 용량을 모두 잡아먹는 것을 방지하기 위해, 특정 기준(용량 또는 시간)에 따라 기존 로그를 백업하고 새로운 로그 파일을 만드는 프로세스를 말합니다.

AWS Lightsail의 LAMP 인스턴스(Ubuntu/Debian)에는 기본적으로 이 기능이 설치되어 작동하고 있습니다.


1. 로그 로테이션의 핵심 동작 방식

보통 다음과 같은 순서로 진행됩니다.

  1. 분리: 현재 기록 중인 access.log 파일을 access.log.1로 이름을 바꿉니다.
  2. 생성: 비어 있는 새로운 access.log 파일을 만들어 이후의 로그를 기록합니다.
  3. 압축: 이전 파일(access.log.2 등)을 .gz 형태로 압축하여 용량을 줄입니다.
  4. 삭제: 설정된 보관 기간(예: 14일 또는 5개 파일)이 지나면 가장 오래된 파일을 삭제합니다.

2. 설정 확인 및 수정 방법

Fail2Ban이 로그를 읽을 때 혼란을 겪지 않도록, 그리고 서버 용량을 관리하기 위해 설정을 확인해 볼 필요가 있습니다.

  • 설정 파일 위치:/etc/logrotate.d/ 디렉토리 안에 서비스별 설정이 있습니다.
    • Apache: /etc/logrotate.d/apache2
    • Fail2Ban: /etc/logrotate.d/fail2ban
  • 주요 설정 옵션:
    • daily / weekly: 매일 또는 매주 로테이트 수행
    • rotate 14: 로그 파일을 14개까지 보관 (그 이상은 삭제)
    • compress: 이전 로그를 압축하여 보관
    • size 100M: 파일 크기가 100MB를 넘으면 날짜와 상관없이 로테이트

3. Fail2Ban과의 관계 (중요!)

Fail2Ban은 로그 파일을 실시간으로 감시합니다. 로그 로테이션이 일어나서 파일 이름이 바뀌면 Fail2Ban이 길을 잃을 수 있는데, 이를 방지하기 위한 설정이 이미 포함되어 있습니다.

  • postrotate 스크립트: 로그가 교체된 직후, Fail2Ban에게 “파일이 바뀌었으니 새 파일을 읽어라”라고 신호를 보냅니다.
  • 주의: 만약 수동으로 로그 파일을 지우거나 이름을 바꾸면 Fail2Ban이 에러를 내며 작동을 멈출 수 있으니 반드시 logrotate 설정을 통해 관리해야 합니다.

4. 현재 상태 확인하기

지금 서버에서 로그 로테이션이 잘 돌고 있는지 궁금하시다면 아래 명령어를 입력해 보세요.

Bash

ls -lh /var/log/apache2/

파일 목록 중에 access.log.1, error.log.2.gz 같은 파일들이 보인다면 이미 아주 잘 작동하고 있는 것입니다.

팁: 만약 신생 도메인이라 공격 트래픽이 너무 많아 로그 파일이 하루 만에 수 GB씩 쌓인다면, daily 설정을 size 500M 정도로 수정하여 용량 기준으로 더 자주 분리해 주는 것이 서버 안정성에 도움이 됩니다.


연관글

신규 도메인주소 구입 후 보통 받는 공격 패턴 정리

Hi, I’m 관리자