[CentOS 7] SSH 무작위 로그인 시도 막기 ( Fail2Ban ) > 기술자료 | 해피정닷컴

[CentOS 7] SSH 무작위 로그인 시도 막기 ( Fail2Ban ) > 기술자료

본문 바로가기

사이트 내 전체검색

[CentOS 7] SSH 무작위 로그인 시도 막기 ( Fail2Ban ) > 기술자료

Linux [CentOS 7] SSH 무작위 로그인 시도 막기 ( Fail2Ban )

페이지 정보


본문

Linux 서버를 공개망에서 사용하면서 방화벽을 사용하지 않는 경우 ssh 로그인을 지속적으로 시도하는 로그를 볼 수 있습니다.
대부분 외국 IP 대역에서 지속적으로 ssh 로그인을 시도하는데 무작위 비밀번호를 대입하는 것입니다.
당연히 방화벽을 설정하는 것이 당연하나 특수한 목적으로 인해 접속 IP 대역을 제한할 수 없는 경우도 있을 수 있습니다.
이런 경우에 보안을 조금이나마 강화하기 위해 사용할 수 있는 것이 fail2ban 입니다.


1-1. SSH 로그인 시도 IP를 확인
[root@localhost ~]# ls /var/log/secure | xargs grep -E "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" -o | sort | uniq
공개망에 연결된 서버라면 생각보다 많은 IP가 나와 놀랄수도 있습니다.
IP들 중 자신이 아는 IP를 제외하면 대부분이 위에 언급한 공격일 확률이 높습니다.


1-2. 최근 로그인 실패 기록을 확인
[root@localhost ~]# last -f /var/log/btmp | more

20 Linux Log Files that are Located under /var/log Directory에 보면 /var/log/btmp에 대한 설명을 확인 할 수 있습니다.
fail2ban은 지정된 시간 내에 지정된 횟수 이상으로 ssh 로그인을 실패하면 해당 IP에서의 접근을 지정된 시간만큼 차단하는 역할을 합니다.


2. OS 버전 확인
https://www.happyjung.com/lecture/2216?


3.  epel-release 추가
[root@localhost ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
Retrieving https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
Preparing...                          ################################# [100%]
        package epel-release-7-10.noarch is already installed


4.  fail2ban 설치
[root@localhost ~]# yum install -y fail2ban
Loaded plugins: fastestmirror
base                                                                                                                           | 3.6 kB  00:00:00     
epel/x86_64/metalink                                                                                                           | 4.2 kB  00:00:00     
epel                                                                                                                           | 4.3 kB  00:00:00     
extras                                                                                                                         | 3.4 kB  00:00:00     
mariadb                                                                                                                        | 2.9 kB  00:00:00     
updates                                                                                                                        | 3.4 kB  00:00:00     
webtatic                                                                                                                       | 3.6 kB  00:00:00     
(1/2): epel/x86_64/updateinfo                                                                                                  | 810 kB  00:00:00     
epel/x86_64/primary_db         FAILED                                          
http://repos.fedoralinux.ir/pub/epel/7/x86_64/repodata/2d654b9fec87d6b6e15258552458b0e18b470ebad3bc11f4178bc4b6fa518c4b-primary.sqlite.xz: [Errno 14] HTTP Error 404 - Not Found
Trying other mirror.
To address this issue please refer to the below knowledge base article 

https://access.redhat.com/articles/1320623

If above article doesn't help to resolve this issue please create a bug on https://bugs.centos.org/

(2/2): epel/x86_64/primary_db                                                                                                  | 4.8 MB  00:00:00     
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: mirror.premi.st
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
 * webtatic: sp.repo.webtatic.com
Package fail2ban-0.9.6-3.el7.noarch already installed and latest version
Nothing to do


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


4-2. fail2ban 살펴보기
아래는 fail2ban를 설치하면 생성되는 fail2ban 디렉토리들입니다.

/etc/fail2ban/
  ├ action.d
  │     계정 접속에 실패할 경우 사용할 수 있는 action 파일들이 있습니다. 방화벽으로 ip차단을 할 수 있는 firewallcmd-new.conf 파일도 여기에 있습니다.
  │  
  │     기본 action 파일내용은 아래와 같습니다.
  │     [Definition]
  │     actionstart = fail2ban 시작시 실행할 명령
  │     actionstop = fail2ban 중단시 실행할 명령
  │     actioncheck = action 시작을 확인할 명령
  │     actionban = 차단행위 발생시 실행할 차단 명령
  │     actionunban = 차단시간 초과시 실행할 차단해제 명령
  │  
  ├  fail2ban.d
  │     사용자설정 디렉토리
  │
  ├  filter.d
  │     fail2ban는 접속 로그파일을 분석하여 비밀번호 실패기록을 근거로 ip 차단하는 원리입니다.
  │     접속 로그파일를 분석할때는 /etc/fail2ban/filter.d 에 있는 서비스 필터를 사용하게 됩니다.
  │     예를 들면 sshd.conf 파일은 sshd 서비스 로그필터 파일입니다.
  │
  ├ jail.d
  │    fail2ban 사용자 설정을 넣을 수 있는 디렉토리입니다.
  │    fail2ban 은 실행시 jail.d 디렉토리있는 모든파일들에 있는 설정들을 적용하도록 되어있습니다.
  │  │  
  │  ├  00-firewalld.conf  - fail2ban-firewalld 패키지를 설치할 경우
  │  └  00-systemd.conf  - fail2ban-systemd 패키지를 설치할 경우
  │          관련 패키지를 설치할 경우 그 셋팅파일이 생성됩니다.
  │  
  ├ jail.conf
  │   기본설정 파일이며, 사용자 설정파일이 jail.d 디렉토리에 존재할 경우 그 사용자 설정이 기본설정보다 우선 적용됩니다.
  │
  ├ fail2ban.conf
  │   fail2ban 로그파일에 대한 설정을 할 수 있습니다. (loglevel, logtarget )
  │  


5. 재부팅시 자동실행되도록 fail2ban 서비스를 활성화
[root@localhost ~]# systemctl enable fail2ban
Created symlink from /etc/systemd/system/multi-user.target.wants/fail2ban.service to /usr/lib/systemd/system/fail2ban.service.


6. fail2ban-systemd 설치 (CentOS 7)
fail2ban는 접속로그 기록을 분석해서 실패기록을 근거로 차단하는 원리로 동작합니다.

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

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

[root@localhost ~]# yum install fail2ban-system
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: mirror01.idc.hinet.net
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
 * webtatic: sp.repo.webtatic.com
No package fail2ban-system available.
Error: Nothing to do


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

[root@localhost ~]# vi /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" 값으로 변경하면 됩니다.


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

[root@localhost ~]# vi /etc/fail2ban/fail2ban.d/local.conf
[Definition]
loglevel = ERROR


9. fail2ban 서비스 시작
[root@localhost ~]# systemctl start fail2ban.service


10. fail2ban 상태 확인
[root@localhost ~]# fail2ban-client status sshd

Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed: 153
|  `- File list:    /var/log/secure
`- Actions
   |- Currently banned: 0
   |- Total banned: 2
   `- Banned IP list:


11. ipset에 설정(차단)된 내용 확인
[root@localhost ~]# ipset --list

Name: fail2ban-sshd
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536 timeout 3600
Size in memory: 16656
References: 1
Members:


12. fail2ban 로그 확인
[root@localhost ~]# cat /var/log/fail2ban.log | more
2017-08-12 00:48:50,511 fail2ban.server         [32725]: INFO    Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.6
2017-08-12 00:48:50,512 fail2ban.database       [32725]: INFO    Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2017-08-12 00:48:50,515 fail2ban.database       [32725]: WARNING New database created. Version '2'
2017-08-12 00:48:50,516 fail2ban.jail           [32725]: INFO    Creating new jail 'sshd'
2017-08-12 00:48:50,538 fail2ban.jail           [32725]: INFO    Jail 'sshd' uses systemd {}
2017-08-12 00:48:50,566 fail2ban.jail           [32725]: INFO    Initiated 'systemd' backend
2017-08-12 00:48:50,567 fail2ban.filter         [32725]: INFO    Set maxRetry = 3
2017-08-12 00:48:50,568 fail2ban.filter         [32725]: INFO    Set jail log file encoding to UTF-8
2017-08-12 00:48:50,569 fail2ban.actions        [32725]: INFO    Set banTime = 86400
2017-08-12 00:48:50,570 fail2ban.filter         [32725]: INFO    Set findtime = 86400
2017-08-12 00:48:50,570 fail2ban.filter         [32725]: INFO    Set maxlines = 10
2017-08-12 00:48:50,660 fail2ban.filtersystemd  [32725]: INFO    Added journal match for: '_SYSTEMD_UNIT=sshd.service + _COMM=sshd'
2017-08-12 00:48:50,677 fail2ban.filter         [32725]: INFO    [sshd] Found 59.63.166.83
2017-08-12 00:48:50,679 fail2ban.jail           [32725]: INFO    Jail 'sshd' started
2017-08-12 00:48:50,681 fail2ban.filter         [32725]: INFO    [sshd] Found 59.xx.166.83
...


14. 차단 IP 목록
설치하고 몇분동안 차단된 아이피가 벌써 5개나 ...
[root@localhost ~]# awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n
      1 116.xx.116.41
      1 2.xx.93.91
      1 39.xx.93.107
      1 59.xx.166.83
      1 61.xx.172.66

[root@localhost ~]# firewall-cmd --direct --get-rules ipv4 filter f2b-sshd
1000 -j RETURN
0 -s 61.xx.172.66 -j REJECT --reject-with icmp-port-unreachable
0 -s 59.xx.166.83 -j REJECT --reject-with icmp-port-unreachable
0 -s 116.xx.116.41 -j REJECT --reject-with icmp-port-unreachable
0 -s 2.xx.93.91 -j REJECT --reject-with icmp-port-unreachable
0 -s 39.xx.93.107 -j REJECT --reject-with icmp-port-unreachable


15. ip 차단해제
[root@localhost ~]# firewall-cmd --direct --remove-rule ipv4 filter f2b-sshd 0 -s [해제할 ip주소]  -j REJECT --reject-with icmp-port-unreachable


자료출처
https://blog.asamaru.net/2016/04/07/how-to-protect-ssh-with-fail2ban-on-centos-6-7/
https://www.conory.com/note_linux/42606 

댓글목록

등록된 댓글이 없습니다.


Total 2,641건 32 페이지
  • RSS
기술자료 목록
2021
HTML   11711  2017-07-27 11:39  
2020
일반   38206  2017-07-26 18:00 ~ 2017-07-28 00:00  
2019
영카트   15727  2017-07-25 03:34  
2018
그누보드   18179  2017-07-25 01:41 ~ 2017-07-28 00:00  
열람
Linux   37162  2017-07-19 00:08 ~ 2024-11-18 15:17  
2016
일반   19353  2017-07-18 21:58  
2015
그누보드   11929  2017-07-17 13:16  
2014
그누보드   12532  2017-07-13 12:50 ~ 2018-12-04 18:46  
2013
그누보드   13355  2017-07-12 19:25 ~ 2018-04-11 10:20  
2012
HTML   12324  2017-07-10 14:33  
2011
그누보드   10776  2017-07-02 20:32 ~ 2021-08-02 21:45  
2010
그누보드   17679  2017-07-02 01:41 ~ 2017-11-01 16:16  
2009
그누보드   15133  2017-06-30 02:56 ~ 2017-07-02 00:00  
2008
그누보드   10123  2017-06-29 18:46  
2007
테크노트   11353  2017-06-28 15:53  
2006
영카트   11171  2017-06-27 14:03  
2005
영카트   14475  2017-06-27 13:03  
2004
영카트   20006  2017-06-22 21:47 ~ 2017-07-03 00:00  
2003
영카트   10525  2017-06-22 17:17  
2002
Secure   10365  2017-06-15 14:32  

검색

해피정닷컴 정보

회사소개 회사연혁 협력사 오시는길 서비스 이용약관 개인정보 처리방침

회사명: 해피정닷컴   대표: 정창용   전화: 070-7600-3500   팩스: 042-670-8272
주소: (34368) 대전시 대덕구 대화로 160 대전산업용재유통단지 1동 222호
개인정보보호책임자: 정창용   사업자번호: 119-05-36414
통신판매업신고: 제2024-대전대덕-0405호 [사업자등록확인]  
Copyright 2001~2024 해피정닷컴. All Rights Reserved.