리눅스서버

[ssh접속 보안] 계정 비밀번호 무작위 대입 공격 방어법, fail2ban

https://conory.com/blog/11720


이전에 이미 fail2ban 설치에 대해서 작성한 문서가 있지만, 그동안 버전이 업데이트되면서 변경사항도 있었고, 또 소스 컴파일 설치방법으로 소개되었기때문에 이번에는 yum 설치방법으로 다시 소개하겠습니다.


ssh(원격 콘솔)을 사용하게 되면 보안에 취약할 수 밖에 없습니다. 왜냐면 외부에서 서버접속을 할 수 있기때문입니다. 비밀번호를 몰라도 끈질기게 알아낸다면 가능하겠지요. 무식하게 비밀번호를 하나하나 대입해서 말입니다. 그러다보면 언젠가는 비밀번호를 알아낼 겁니다. 이것을 전문용어로 무작위 대입 공격 (brute force attack) 이라고 한답니다.


이 무작위 공격을 방어할 수 있는 단 하나의 해결책은 주어진 횟수를 초과해서 비밀번호를 틀린다면 차단하는 겁니다. (소위말하는 비밀번호 3번 오류나면 5분간 차단하는 방법이죠.) 이 방법으로 방어하고, 비밀번호를 어럽게 변경하다면 무작위을 공격하더라도 비밀번호를 알아내는 것은 거의 불가능할 겁니다.


리눅스에는 이와 같이 무작위 공격을 방어할 수 있는 여러 프로그램들이 있습니다. 그중 하나가 바로 오늘 설치할 fail2ban 입니다. ssh를 사용한다면 거의 필수 프로그램이라고 할 수 있습니다.



1. fail2ban 살펴보기

아래는 fail2ban를 설치하면 존재할 fail2ban 디렉토리들입니다.


/etc/fail2ban/filter.d

fail2ban는 접속 로그파일을 분석하여 비밀번호 실패기록을 근거로 ip 차단하는 원리입니다. 접속 로그파일를 분석할때는 /etc/fail2ban/filter.d 에 있는 서비스 필터를 사용하게 됩니다. 예를 들면 sshd.conf 파일은 sshd 서비스 로그필터 파일입니다.


* /etc/fail2ban/action.d

계정 접속에 실패할 경우 사용할 수 있는 action 파일들이 있습니다. 방화벽으로 ip차단을 할 수 있는 firewallcmd-new.conf 파일도 여기에 있습니다.


기본 action 파일내용은 아래와 같습니다.

[Definition]

actionstart = fail2ban 시작시 실행할 명령

actionstop = fail2ban 중단시 실행할 명령

actioncheck = action 시작을 확인할 명령

actionban = 차단행위 발생시 실행할 차단 명령

actionunban = 차단시간 초과시 실행할 차단해제 명령


/etc/fail2ban/jail.d

fail2ban 사용자 설정을 넣을 수 있는 디렉토리입니다. fail2ban 은 실행시 jail.d 디렉토리있는 모든파일들에 있는 설정들을 적용하도록 되어있습니다.


/etc/fail2ban/jail.conf 파일은 기본설정 파일이며, 사용자 설정파일이 jail.d 디렉토리에 존재할 경우 그 사용자 설정이 기본설정보다 우선 적용됩니다.


그리고 관련 패키지를 설치할 경우 그 셋팅파일이 생성됩니다.


fail2ban-firewalld 패키지를 설치할 경우 - 00-firewalld.conf 파일 생성

fail2ban-systemd 패키지를 설치할 경우 - 00-systemd.conf 파일 생성


/etc/fail2ban/fail2ban.conf

fail2ban 로그파일에 대한 설정을 할 수 있습니다. (loglevel, logtarget )

사용자설정 디렉토리 : fail2ban.d



2. 설치

먼저 yum을 통한 fail2ban 설치는 epel 저장소가 설치되어있어야 할 수 있습니다. 저장소 추가편( https://conory.com/blog/42596 )을 참조하여 epel 저장소 설치부터 해주세요.


epel 저장소가 추가되었으면 아래 명령어로 fail2ban 설치하면 됩니다.


yum install fail2ban


@ CentOS 7에서 설치시 fail2ban-firewalld 패키지가 같이 필수로 설치됩니다. firewalld 말고, iptables을 계속 사용한다면 /etc/fail2ban/jail.d/00-firewalld.conf 파일을 제거해야 iptables를 통한 차단이 이루어집니다.


그리고 재부팅시 자동실행되도록 fail2ban 서비스를 활성화시키면 됩니다.


systemctl enable fail2ban



4. fail2ban-systemd 설치 (CentOS 7)

fail2ban는 접속로그 기록을 분석해서 실패기록을 근거로 차단하는 원리로 동작합니다.


레드헷 계열 (Red Hat/CentOS/Fedora)에서 접근 로그파일은 /var/log/secure 이였습니다. 그래서 이전에는 /var/log/secure 로그파일에 의존해서 동작했습니다. 하지만 CentOS 7부터는 시스템 로그들을 systemd에서 통합 관리하게 되었습니다. 때문에  /var/log/secure 로그파일은 더 이상사용하지않는 파일이 되었습니다. 그러나 로그파일이 없으면 fail2ban가 동작할 수 없습니다.


대체방안으로 간단하게 fail2ban-systemd를 설치해주면 해결됩니다.


# yum install fail2ban-systemd



4. 설정

fail2ban의 기본 설정파일은 /etc/fail2ban/jail.conf 입니다. 이 기본설정 파일을 직접 수정하지않고, 기본 설정파일을 참조하여 새로 생성한 사용자 설정파일에서 설정해주는 방법으로 하면 yum 업데이트가 되더라도 사용자가 설정한 파일을 덮어쓰지않게 됩니다.


# vi /etc/fail2ban/jail.d/local.conf


/etc/fail2ban/jail.d 디렉토리에서 local.conf 파일 생성하고, 아래 설정내용들을 넣어주면됩니다.

[DEFAULT]
# Common
ignoreip  = 127.0.0.1/8
bantime   = 86400
findtime  = 86400
maxretry  = 3
banaction = firewallcmd-new

# Mail
destemail = 알림 수신메일 주소
sender    = 알림 발신메일 주소

# Action
action_mw = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

action    = %(action_mw)s

[sshd]
enabled = true


ignoreip

관리자 ip를 입력하면 됩니다. 여기 입력한 ip는 절대 차단되지않습니다.


* bantime

인증 실패시 차단할 차단시간입니다. -1이면 영구차단입니다. (단위 : 초)

@ 영구차단을 하거나 차단시간을 많이 주면 재부팅시 fail2ban 다시 ip차단 리스트를 읽어오기때문에 그것이 많으면 느려집니다.


* findtime

입력한 시간안에 허용횟수를 초과하여 실패시 차단됩니다. (단위 : 초)


maxretry

차단되기전까지 인증시도를 위한 허용횟수입니다. 허용횟수를 초과하여 실패할 경우 차단됩니다.


* banaction

ip 차단 방법입니다. /etc/fail2ban/action.d 디렉토리에 있는 action을 입력할 수 있습니다. 

firewalld 을 사용한다면 "firewallcmd-new" 값 입력.

iptables 을 사용한다면 "iptables-multiport" 값 입력.


* action

action에 "%(action_mw)s" 값을 입력하면 ip차단시 알림메일이 전송됩니다. 알림메일을 받지않으려면 "%(action_)s" 값으로 변경하면 됩니다.


@ 로그레벨 조정

fail2ban 로그파일( /var/log/fail2ban.log )에 로그가 너무 많이 생성된다면 로그레벨(loglevel)을 ERROR으로 조정하면 됩니다. /etc/fail2ban/fail2ban.d 디렉토리에 사용자 설정파일( local.conf )을 생성하고, 로그레벨 설정을 넣으면 됩니다.


# vi /etc/fail2ban/fail2ban.d/local.conf


아래 내용을 넣으면 됩니다.

[Definition]
loglevel = ERROR


5. 서비스 시작

모든 설정을 마친후 fail2ban 서비스를 시작하면 fail2ban이 가동됩니다.


systemctl start fail2ban



6. 차단 ip 관리

아래 명령어들은 firewalld 사용자에게만 해당되는 내용입니다.


* 차단된 ip 목록

# firewall-cmd --direct --get-rules ipv4 filter f2b-sshd


* ip 차단해제

# firewall-cmd --direct --remove-rule ipv4 filter f2b-sshd 0 -s [해제할 ip주소]  -j REJECT --reject-with icmp-port-unreachable


?