Monitoring fail2ban
Install
로그를 검사해 의심스런 IP 를 찾아 Firewall rule을 관리하기 어렵다 Fail2ban은 정규표현식을 사용해서 로그에서 의심스런 IP를 찾아 Firewall 등록할 수 있도록 해준다.
Fail2ban
로그를 검사해 의심스런 IP 를 찾아 Firewall rule에 등록해 관리하는 것은 어려운 과정이다. Fail2ban은 정규표현식을 사용해서 로그에서 의심스런 IP를 찾아 Firewall 등록 할 수 있도록 해준다.
설치
fail2ban
은 iptables
패키지와 함께 설치한다.
1 | $ sudo apt install iptables fail2ban |
그리고 systemctl
로 재대로 서비스가 시작되는지 확인해 본다.
1 | $ sudo systemctl restart fail2ban.service # 재시작 |
설정을 위해서 fail2ban
설정 파일인 fail2ban.conf, 그리고 jail 파일 jail.conf 파일을 .local
파일로 복사한 사용자 정의 파일에서 사용한다.
1 | $ cd /etc/fail2ban |
/etc/fail2ban 디렉토리
설치된 후 관련된 설정 파일은 /etc/fail2ban 디렉토리에 저장됩니다. 관련한 로그 기록은 /etc/logratate.d/fail2ban에 정의되어 /var/log/fail2ban.log 로 저장됩니다.
다음은 설정 디렉토리 구조
1 | $ tree -L 2 fail2ban/ |
- jail.conf:
jail
이라 불리는 모니터링할 대상에 대한 기본 옵션과 행위를 선언한다. - action.d/iptables-multiport.conf: fila2ban 이 jail에 맞게 거부(Ban)한 IP를 다루는 기본 액션이다.
- fail2ban.local :
fail2ban
주요 설정 파일 - jail.local: jail 설정 파일
- jaild.d/defaults-debian.conf: jail enable/disable
- paths-common.conf: 로그 파일 경로
- paths-debian.conf: 로그 파일 경로
설정
fail2ban은 jail 을 구성하고 jail의 filter 그리고 action으로 나뉘어 있다.
fail2ban.conf 구성
fail2ban.conf는 기본 구성 변수로 loggin, socket 그리고 PID 파일 등등이 설정된다. 별도의 파일로 Jail을 구성할 때 fail2ban.local 같은 이름을 사용하고 새로 설정되는 값은 기본 설정 값을 재정의 하게 된다.
단 같은 [default] 섹션이 존재하면 구성된 내용 적용이 잘 안된다.
다음 스크립을 사용하면 모둔 변수를 주석 처리하고 수정할 옵션만 복사해 준다.
1 | sed 's/\(^[[:alpha:]]\)/# \1/' fail2ban.conf | sudo tee fail2ban.local 1&> /dev/null |
fail2ban.local 파일은 다음과 같은 내용을 담을 것이다.
- loglevel: The level of detail that Fail2ban’s logs provide can be set to 1 (error), 2 (warn), 3 (info), or 4 (debug).
- logtarget: Logs actions into a specific file. The default value of /var/log/fail2ban.log puts all logging into the defined file. Alternately, you can change the value to STDOUT, which will output any data; STDERR, which will output any errors; SYSLOG, which is message-based logging; and FILE, which outputs to a file.
- socket: The location of the socket file.
- pidfile: The location of the PID file.
jail.conf
/etc/fail2ban/jail.conf 는 데몬, 서비스에 대한 jail을 구성한다. jail은 log를 읽어 불필요한 것을 찾아 낸다.
다음은 jail.conf에서 주석이 달린 jail.local을 생성해 준다.
1 | sed 's/\(^[[:alpha:]]\)/# \1/' jail.conf | sudo tee jail.local 1&> /dev/null |
If using CentOS or Fedora open jail.local and set the backend to systemd. This is not necessary on Debian 8, even though it is a SystemD system.
/etc/fail2ban/jail.local
1 | backend = systemd |
화이트리스트 IP
먼저 검출된 IP 중에 무시할 영역, 화이트리스트를 선언해 줍니다. 리스트는 ‘,’로 구분하고 서브넷 혹은 IP주소를 입력한다.
1 | [DEFAULT] |
차단 시간과 재시도 횟수
bantime
, findtime
, maxretry
은 차단 시간에 대한 구성이다.
1 | bantime = 2592000 |
- bantime: 검출된 IP가 접속 차단 시간을 초단위로 선언해 준다.
-1
이면 영속적으로 밴 된다. - findtime: ban이 설정 전에 로그인 간격 시간
- maxretry: 최대 횟수
https://arno0x0x.wordpress.com/2015/12/30/fail2ban-permanent-persistent-bans/
로컬 시스템의 이메일 주소를 sendmail -t user@email.com, replacing user@email.com with your email address.
이메일
fail2ban에 검출되는 jail이 있으면 이메일 설정에 따라 메일로 경고를 받을 수 있다.
- destemail: The email address where you would like to receive the emails.
- sendername: The name under which the email shows up.
- sender: The email address from which Fail2ban will send emails.
그리고 action 설정을 조절할 필요가 있다, 이것은 ban 상황이 기준점에 닿으면 발생한다. 기본 액션 %(action_)s
은 사용자만 ban 한다. action_mw 액션은 ban을 실행하고 WhoIS 리포트로 메일을 보내준다. action_mwl은 모든 로그까지 함께 보내준다.
You will also need to adjudst the action setting, which defines what actions occur when the threshold for ban is met. The default, %(action_)s, only bans the user. action_mw will ban and send an email with a WhoIs report; while action_mwl will ban and send an email with the WhoIs report and all relevant lines in the log file. This can also be changed on a jail-specific basis.
1 | action = %(action_)s |
1 | $ sudo service fail2ban restart |
각 서버스에 대한 Jail 설정
필터를 이용해 Jail을 만들어 의심스런 접근을 막아 보자. 앞서 복사한 jail.local 파일에는 주요 서비스가 모두 선언되어 있고 sshd 만 활성화 되어 있다.
Jail은 다음 같이 구성된다.
1 | [ssh] |
- enabled: Determines whether or not the filter is turned on.
- port: The port Fail2ban should be referencing in regards to the service. If using the default port, then the service name can be placed here. If using a non-traditional port, this should be the port number. For example, if you moved your SSH port to 3456, you would replace ssh with 3456.
- filter: The name of the file located in /etc/fail2ban/filter.d that contains the failregex information used to parse log files appropriately. The .conf suffix need not be included.
- logpath: Gives the location of the service’s logs.
- maxretry: Will override the global maxretry for the defined service. findtime and bantime can also be added.
action: This can be added as an additional setting, if the default action is not suitable for the jail. Additional actions can be found in the action.d folder.
각 서비스에 대한 jail은
jail.d
에 설정 파일을 구성해도 된다.
(1) sshd
Brute-force Attack과 같은 접근을 차단하는 필터로 로그에 아래와 유사한 패턴이 나오면 IP를 검출한다.
Jul 22 06:56:50 foo sshd[14984]: Failed password for invalid user a from xxx.xxx.xxx.xxx port 55452 ssh2
jail.config 혹은 jail.local 에서 기본으로 활성화 되어 있다.
(2) ssh-ddos
sshd-ddos Filter를 사용해 SSH Service를 Scanning하거나 telnet으로 접속할 떄 발생하는 Message를 검사하여 해당 IP의 접근을 차단할 수 있습니다.
이 Filter로 검출되는 /var/log/auth.log의 Message는 다음과 같습니다.
Jul 23 13:16:25 foo sshd[21989]: Did not receive identification string from xxx.xxx.xxx.xxx
Jail 설정을 위해서 다음과 같이 입력합니다.
1 | [sshd-ddos] |
혹은 $ sudo vi /etc/fail2ban/jail.d/sshd-ddos.conf
1 | $ sudo service fail2ban restart |
Failregrexs
다양한 필터를 사용할 수있다. 의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음
1 | $ sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf |
이 필터를 사용자가 작성할 수 있는데 파이썬의 정규식을 사용해서 사용자 지정 필터를 작성한다.
access.log 필터 작성해 보기
nginx 로그를 대상으로 200 에러를 검출해 보자
1 | 91.134.232.57 - - [28/Nov/2016:07:30:23 +0900] "GET / HTTP/1.1" 200 1125 "http://hundej |
123.143.201.75 - - [28/Nov/2016:17:29:18 +0900] “HEAD / HTTP/1.1” 200 0 “-“ “python-requests/2.10.0”
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-test.conf
Ban 관리
fail2ban-client set YOURJAILNAMEHERE unbanip IPADDRESSHERE
Use iptables -L -n to find the rule name…
…then use fail2ban-client status to get the actual jail names.
룰 이름이 표시된다 f2b- 으로 시작하는 룰을 찾는다
그리고 fail2ban-status 는
fail2ban-client set YOURJAILNAMEHERE unbanip IPADDRESSHERE
HOW to fail2ban
basic usages
1 | sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf |
1 | sudo iptables -L --line-numbers |
Nginx
기본으로 /etc/fail2ban/jail.conf 에 [nginx-http-auth]
jail이 하나 선언되어 있다.
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
nginx jail
nginx-noscript
웹 사이트에서 실행되고 침투할 수 있는 코드를 찾아 준다. php 등이 웹 사이트와 연동되지 않았다면 아래 제일을 추가해서 이런 임의의 실행코드 형식 실행을 방지할 수 있다
1 | [nginx-noscript] |
nginx-badbots
웹 요청에 악의적인 봇을 호출하는 것을 방지한다.
1 | [nginx-badbots] |
filter
추가한 jail 이 동작할 필터를 작업해 주어야 한다. 필터는 /etc/fail2ban/filter.d 디렉토리에 있다.
nginx-http-auth.conf
기본으로 제공하는 nginx-http-auth.conf 필터에 하나를 더 추가해 준다. 아래는 사용자가 아이디와 비밀번호를 입력하지 않는 경우에 대해 필터한다. 아래의 no user/password 패턴을 추가한다.
1 | [Definition] |
nginx-badbots.conf
1 | sudo cp apache-badbots.conf nginx-badbots.conf |
nginx-noscript
[nginx-noscript] jail 은 다음 내용을 입력한다:
1 | [Definition] |
nginx-nohome
1 | [Definition] |
nginx-noproxy
1 | [Definition] |
Jail 실행 확인
1 | $ sudo fail2ban-client status |
그리고 iptable의 서비스로 방화벽 규칙에 fail2ban 규칙이 동작중인지 확인한다.
1 | $ sudo iptables -S |
그리고 fail2ban 의 jail 실행 상태를 자세히 보고 싶므면 status 뒤에 jail 이름을 주면 된다.
1 | $ sudo fail2ban-client status nginx-badbots |
Testing
의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음
1 | $ sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf |
Ban 관리
nginx 인증 요구시 잘못된 인증을 시도하면 fail2ban 규칙에 따라 접근이 금지당한다. 그리고 jail 규칙이 잘 적용 됐는지 결과를 다음 같이 확인할 수 있다:
1 | $ sudo fail2ban-client status nginx-http-auth |
인증 규칙에 어긋나는 접근을 시도한 IP인 111.111.111.111
을 확인 할 수 잇다.
금지된 IP는 해당 jail을 이용해 다음 같이 해제할 수 있다.
1 | $ sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111 |
http://blog.ricardomacas.com/index.php?controller=post&action=view&id_post=3
fail2squared
https://supine.com/posts/2012/08/fail2ban-monitoring-itself-recursively/
TO COMPLETELY FLUSH THE FAIL2BAN LOG FILE AND CLEAR OUR BLACKLIST FILE
sudo service fail2ban stop
sudo truncate -s 0 /var/log/fail2ban.log
sudo truncate -s 0 /etc/fail2ban/ip.blacklist
sudo rm /var/lib/fail2ban/fail2ban.sqlite3
sudo service fail2ban restart
https://ubuntu101.co.za/security/fail2ban/fail2ban-persistent-bans-ubuntu/
sqlite3
fail2ban.conf file, I found the following:
1 | dbfile = /var/lib/fail2ban/fail2ban.sqlite3 |
So, I did a little research to try to find out how access the database.
To open or connect to the database:
1 | $ sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 |
To list all the tables in the database:
1 | sqlite> .tables |
To query a table:
1 | sqlite> SELECT * FROM logs; |
Another table:
sqlite> SELECT * FROM bans;
To disconnect from the database:
sqlite> .quit
참조
참조: https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-debian-7