fail2ban으로 Linux 서버를 보호하는 방법

fail2ban은 리눅스 시스템에서 과도한 연결 실패를 보이는 IP 주소를 자동으로 차단하여 자체적으로 보안을 강화하는 강력한 도구입니다. 여기서는 fail2ban의 사용법에 대해 상세히 알아보겠습니다.

보안의 중요성

유명한 말처럼, “보안은 아무리 강조해도 지나치지 않습니다.” 오늘날과 같이 연결된 세상에서 컴퓨터 시스템은 무차별 대입 공격과 같은 다양한 위협에 직면해 있습니다. 특히 SSH 연결, 웹 서버, 이메일 서버 등 외부 연결을 허용하는 시스템의 경우 이러한 공격으로부터 보호하는 것이 중요합니다.

이를 위해 로그인 실패 시도를 모니터링하고, 짧은 시간 내에 반복적인 실패가 발생하면 해당 IP 주소를 차단해야 합니다. 이 과정을 자동화하는 것이 효율적인데, 바로 fail2ban이 이 역할을 담당합니다. fail2ban은 모니터링, 차단, 그리고 차단 해제까지 자동화하여 시스템 보안을 크게 향상시켜줍니다.

fail2ban은 리눅스 방화벽인 iptables와 통합되어 작동합니다. fail2ban은 의심스러운 IP 주소를 차단하기 위해 방화벽 규칙을 추가합니다. 설명의 간결성을 위해 여기서는 비어 있는 규칙 세트의 iptables를 사용하지만, 실제 환경에서는 기존 방화벽 규칙과 함께 fail2ban을 구성할 수 있습니다. fail2ban은 방화벽에 규칙을 추가하고 제거하여 기존 방화벽 설정을 그대로 유지하면서 보안을 강화할 수 있습니다.

현재 방화벽 규칙 상태는 다음 명령어로 확인할 수 있습니다.

sudo iptables -L

fail2ban 설치

fail2ban 설치는 대부분의 리눅스 배포판에서 간단하게 수행할 수 있습니다. 예를 들어 Ubuntu 20.04에서는 다음 명령어를 사용합니다.

sudo apt-get install fail2ban

Fedora 32의 경우:

sudo dnf install fail2ban

Manjaro 20.0.1에서는 pacman을 사용합니다.

sudo pacman -Sy fail2ban

fail2ban 설정

fail2ban을 설치하면 기본 설정 파일인 jail.conf가 생성됩니다. 하지만 이 파일은 fail2ban 업그레이드 시 덮어쓰여질 수 있으므로, 설정을 변경하려면 jail.local 파일을 사용해야 합니다. jail.conf 파일을 jail.local로 복사한 후 설정을 변경하면 업그레이드 후에도 설정이 유지됩니다.

다음 명령어를 사용하여 파일을 복사합니다.

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

이제 편집기를 사용하여 jail.local 파일을 엽니다. 예를 들어 gedit를 사용하면 다음과 같습니다.

sudo gedit /etc/fail2ban/jail.local

파일 내에서 [DEFAULT] 및 [sshd] 섹션을 찾아야 합니다. 이 섹션들은 파일의 상단 부분에도 나타나지만, 실제 설정은 더 아래쪽에 있습니다.

[DEFAULT] 섹션은 대략 40번째 줄에 있으며, 여러 주석과 설명이 포함된 긴 섹션입니다.

90번째 줄 근처에서 다음과 같은 네 가지 설정을 찾을 수 있습니다.

  • ignoreip: 차단하지 않을 IP 주소 목록으로, 기본적으로 로컬 호스트(127.0.0.1)와 IPv6 주소(::1)가 포함되어 있습니다. 필요한 경우 다른 IP 주소를 추가할 수 있습니다.
  • bantime: IP 주소가 차단되는 시간으로, 분 단위(“m”), 시간 단위(“h”), 또는 초 단위(단위 없이 숫자만 입력)로 설정할 수 있습니다. -1 값은 영구 차단을 의미합니다.
  • findtime: IP 주소가 차단 대상이 되는 연결 시도 실패를 감지하는 시간입니다.
  • maxretry: 지정된 findtime 내에 차단을 유발하는 최대 연결 시도 실패 횟수입니다.

동일한 IP 주소가 findtime 동안 maxretry 횟수만큼 연결 시도에 실패하면, bantime 동안 해당 IP 주소가 차단됩니다. ignoreip 목록에 있는 IP 주소는 차단 대상에서 제외됩니다.

fail2ban은 IP 주소를 일정 시간 동안 감옥에 가두는 방식으로 작동합니다. 각 감옥은 특정 연결 유형에 적용되는 설정을 나타내며, 이를 통해 다양한 연결 유형에 대해 서로 다른 설정을 적용할 수 있습니다. 또한, 특정 연결 유형만 모니터링하도록 설정할 수도 있습니다.

[DEFAULT] 섹션에서 설정한 값들은 기본값이지만, 각 감옥별로 설정을 변경할 수 있습니다. 이제 SSH 감옥에 대한 설정을 살펴보겠습니다.

감옥 설정

감옥 설정을 통해 fail2ban이 특정 연결 유형을 모니터링할지 여부를 결정할 수 있습니다. 기본 설정이 특정 감옥에 적합하지 않다면 bantime, findtime, maxretry 값을 개별적으로 설정할 수 있습니다.

파일을 아래로 스크롤하여 280번째 줄 근처에서 [sshd] 섹션을 찾습니다.

여기에서 SSH 연결 감옥에 대한 값을 설정할 수 있습니다. 해당 감옥을 활성화하려면 다음 줄을 추가해야 합니다.

enabled = true

또한, 다음과 같이 maxretry 값을 설정합니다.

maxretry = 3

기본값은 5이지만, SSH 연결에 더 주의하기 위해 값을 3으로 줄였습니다. 이제 파일을 저장하고 닫습니다.

이렇게 하면 해당 감옥이 fail2ban 모니터링에 추가되고, 기본 설정 중 일부가 재정의됩니다. 각 감옥은 기본 설정과 감옥 자체 설정을 결합하여 사용됩니다.

fail2ban 활성화

fail2ban을 설치하고 설정했으므로, 이제 서비스로 실행되도록 활성화해야 합니다. 또한, 설정이 제대로 작동하는지 확인하는 테스트도 수행해야 합니다.

fail2ban을 서비스로 활성화하려면 다음 systemctl 명령어를 사용합니다.

sudo systemctl enable fail2ban

서비스를 시작하려면:

sudo systemctl start fail2ban

서비스 상태는 다음 명령어로 확인할 수 있습니다.

sudo systemctl status fail2ban.service

녹색 표시로 모든 것이 정상임을 알 수 있습니다.

fail2ban 자체 상태도 다음 명령어로 확인할 수 있습니다.

sudo fail2ban-client status

이 결과는 우리가 설정한 내용을 반영합니다. [sshd] 감옥이 활성화되어 있음을 보여줍니다. 특정 감옥의 상태를 자세히 보려면 다음 명령어를 사용합니다.

sudo fail2ban-client status sshd

현재까지 실패 횟수와 차단된 IP 주소는 0입니다.

감옥 테스트

이제 다른 컴퓨터에서 테스트 시스템으로 SSH 연결을 시도하고 의도적으로 암호를 잘못 입력하여 fail2ban이 작동하는지 테스트해 보겠습니다. 세 번의 연결 시도 동안 각 연결 시도에서 세 번씩 암호를 잘못 입력합니다. maxretry 값은 세 번의 암호 시도 실패가 아니라 세 번의 연결 시도 실패 후에 트리거됩니다.

세 번째 연결 시도에서 첫 번째 잘못된 암호를 입력하는 순간, 원격 시스템으로부터 응답을 받을 수 없게 됩니다. 즉, 차단된 것입니다.

명령 프롬프트로 돌아가려면 Ctrl+C를 눌러야 합니다. 다시 연결을 시도하면 이번에는 다음과 같은 오류 메시지를 받게 됩니다.

ssh [email protected]

이전에는 “Permission denied” 오류가 나타났지만, 이번에는 연결 자체가 거부되었습니다. 이는 해당 IP 주소가 차단되었음을 의미합니다.

[sshd] 감옥 상태를 다시 확인해 보겠습니다.

sudo fail2ban-client status sshd

세 번의 실패가 있었고, IP 주소(192.168.4.25)가 차단되었음을 알 수 있습니다.

fail2ban은 방화벽에 규칙을 추가하여 차단을 시행합니다. 현재 방화벽 규칙 상태를 다시 확인해 보겠습니다.

sudo iptables -L

INPUT 정책에 f2b-sshd 체인으로 SSH 트래픽을 전달하는 규칙이 추가되었음을 확인할 수 있습니다. f2b-sshd 체인에는 IP 주소(192.168.4.25)의 SSH 연결을 거부하는 규칙이 포함되어 있습니다. 설정된 bantime에 따라 10분 후에는 해당 IP 주소가 차단 해제되어 다시 연결을 시도할 수 있게 됩니다.

차단 기간을 더 길게 설정한 경우, IP 주소를 더 빨리 차단 해제하고 싶다면 다음 명령어를 사용합니다.

sudo fail2ban-client set sshd unbanip 192.168.5.25

이제 다시 원격 컴퓨터에서 SSH 연결을 시도하고 올바른 암호를 입력하면 연결이 성공적으로 이루어집니다.

ssh [email protected]

간단하고 효과적인 보안

fail2ban은 복잡한 문제를 해결하는 간단하면서도 효과적인 솔루션입니다. 구성이 간단하고 시스템에 미치는 부담도 적어 사용하기 편리합니다.