반응형

참고 사이트 : 
1. 설정값 들 정보
   https://www.lesstif.com/pages/viewpage.action?pageId=43843899
2. Centos 7 설치 관련
   https://idchowto.com/?p=43787

불러오는 중입니다...

 

Centos 7에 아무생각없이... (난 보안 담당자는 아님....)

 

서비스를 오픈하고 나니

 

불특정 다수에게 서비스를 제공해야 하는 상황이 발생하였습니다...

 

우리만 접근하면 참 좋은데

 

너무 많은 불법 접근 및 접속 요청이 있는 것을 알았고

 

이것을 능동적으로 대응하기 위해

 

fail2ban 패키지가 있다는 사실을 알게되어 글을 씁니다.

 

ssh, mariadb, http 불법 접근시 자동으로 ip ban이 되도록 하였습니다.

 



1. fail2ban 설치

 

다음 명령어를 통해 저장소를 설치할 수 있습니다.

 

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 

# yum install -y fail2ban fail2ban-systemd 


redhat 계열에서 접근로그파일은 /var/log/secure 입니다.  

centos 7 이전에는 secure 로그파일에 의존하여 동작했으나 centos 7 부터는 systemd에서 통합적으로 관리합니다.

※ 이 설정과 관련하여 별도의 파일로 설정할 때는 2가지 옵션을 추가해야 합니다.

 ( backend = polling
   banaction = iptables-multiport )

로그파일이 없으면 fail2ban동작불가하기 때문에 fail2ban-systemd를 같이 설치진행합니다

 

centos 시작시 fail2ban이 자동으로 시작하도록 설정

# systemctl enable fail2ban  

fail2ban 서비스 시작

# systemctl start fail2ban 




2. 설정

fail2ban 의 기본 설정은 /etc/fail2ban/jail.conf 에 있지만 설정을 수정할 필요가 있을 경우 

기본 설정 파일은 놔두고 개인화 설정 파일인 /etc/fail2ban/jail.local 을 사용하는 것이 좋습니다.

설정 파일은 Windows 의 ini 파일처럼 [항목명] 밑에 key=value 형식으로 기술하면 되며 

# 은 주석이며 주요 설정은 [DEFAULT] 항목 밑에 기술하며 여러 기능중에 주요 설정 항목을 알아 봅시다.

 

2019.04.30일 기준으로 기본 설치하면 /etc/fail2ban/jail.conf 파일만 존재하며 jail.local은 보이지 않습니다.

                  복사하여 사용하는 방식으로 보이나 아래 설정들은 그냥 사용하였습니다. (jail.conf은 백업 받아둠)

                  



2.1 ignoreip

ignoreip 에 설정된 IP 는 로그인을 실패해도 차단하지 않으며 기본 설정은 localhost 입니다. 

IP를 추가할 경우 jail.local 파일 의 [DEFAULT] 항목에 기술해 주면 되며 여러개를 기술할 경우 

공백이나 , 로 구분해 주면 되며 아래는 로컬호스트와 192.168.10.x 대역은 차단하지 않는 설정입니다.

ignoreip = 127.0.0.1/8 192.168.10.0/24 



2.2 bantime 

bantime 은 지정된 조건(아래에서 설명할 findtime, maxretry)에 따라 인증에 실패한 클라이언트를 차단할 

시간을 초 단위로 지정하며 기본 설정은 600초(10분)입니다.


2.3 findtime, maxretry

findtime 과 maxretry 는 클라이언트를 차단하기 위한 조건을 지정하며 findtime 에 

지정한 시간(초 단위)내에 maxretry 에 설정한 횟수만큼 인증을 실패하면 차단하게 됩니다.

즉 위 설정은 600초(10분) 내에 5번을 인증 실패할 경우 bantime 만큼 차단합니다.

특정 IP에서 차단후에도 지속적으로 인증을 시도할 경우 bantime 을 점점 길게 해서 

시도 횟수를 줄이는 게 필요하지만 이 기능은 개발 버전(0.10.x)에만 반영되어 있고 0.9 버전에는 구현되어 있지 않습니다.

실제 운영 환경에서는 bantime 을 몇 시간 정도로 길게 주는 것이 보안상 유리합니다.



2.4 mail 알림

 

# 1 
destemail = sysadmin@example.com 
  
  
# 2 
sender = fail2ban@my-server.com 
  
# 3 
mta = sendmail 
  
# 4 
action = %(action_mw)s 


fail2ban 으로 차단한 정보를 메일로 전송할 경우 destemail 에 수신자 이메일 주소를  설정하고 sender 에는  "보낸 사람"의 정보를 설정합니다.

보낸 사람 이름은 전자 메일의 "보낸 사람"필드의 값을 설정하며 mta 매개 변수는 메일을 보내는 데 사용할 메일 서비스를 설정하며 기본은 sendmail 입니다.

중요한 부분은 action 항목으로 차단했을 때 실행할 액션을 의미하며 기본 설정은 아무 일도 안 하는 설정인 "action = %(action_)s" 입니다.

기본 설정으로는 차단 내용을 메일로 전송하지 않으므로 action_ 을 action_mw 나 action_mwl 로 지정해야 메일을 전송하며 차이는 아래와 같습니다.

action_mw : 메일을 전송하고 whois 로 IP 정보를 조회한 결과를 첨부
action_mwl : 메일을 전송하고 whois 로 IP 정보를 조회한 결과와 관련된 로그를 첨부


권장 설정은 다음과 같이 메일을 전송하고 whois 와 log 를 첨부하는 설정입니다.

action = %(action_mwl)s 

※ 위 설정으로 하는 경우 메일 송신시 해당 IP의 정보를 검색한 결과도 같이 송부됩니다.

 

   따라서 whois 명령을 통해 정보가 조회될 수 있어야 합니다.


whois 가 설치되지 않은 경우 

 

$ sudo yum install whois 를 실행합니다.


2.5 개별 jail 설정

기본적으로 fail2ban 은 차단하지 않으므로 차단할 서비스를 [sshd] 처럼 항목명에 서비스를 등록하고 enabled = true 를 추가해 주면 차단됩니다.

2.6 포트 번호 변경

ssh 를 다른 포트로 사용할 경우 port 항목에 해당 포트를 기술해 주면 됩니다. 만약 ssh 가 여러 포트를 사용한다면 

, 를 구분자로 해서 포트를 모두 기술하며 아래는 ssh 기본 포트와 10022 를 사용할 경우 설정입니다.

 

[sshd] 
enabled = true 
port = ssh,10022 
sshd jail 설정 


3. 최종 설정값

 이제 ssh 를 위한 최종 /etc/fail2ban/jail.local 파일을 완성해 보면 아래와 같습니다.

[DEFAULT] 
  
## 차단하지 않을 IP 
ignoreip = 127.0.0.1/8 192.168.10.0/24 
  
# 1시간 차단 (-1로 설정할 경우 영구 차단) 
bantime  = 3600 
  
# 아래 시간동안 maxretry 만큼 실패시 차단 
findtime  = 300 
  
# 최대 허용 횟수 
maxretry = 5 
  
# 메일 수신자, 다중 수신자는 지원 안 함 
destemail = sysadmin@example.com 
  
# 메일 보낸 사람 
sender = fail2ban@my-server.com 
  
# 메일 전송 프로그램 
mta = sendmail 
  
  
# 차단시 whois 정보와 관련 로그를 첨부하여 메일 전송 
action = %(action_mwl)s 
  
# sshd 서비스 차단 
[sshd] 
enabled = true 
port     = ssh, 10022 



4. 서비스 적용

설정을 마쳤으면 서비스를 재시작하여 변경 사항을 반영합니다. 

$ sudo systemctl restart fail2ban 


fail2ban 동작 로그는 /var/log/fail2ban.log 에 기록되므로 tail -f /var/log/fail2ban.log 명령어로 확인해 볼 수 있습니다.


5. firewall-cmd 커널 방화벽 설정 규칙 확인

이제 firewall-cmd 로 커널 방화벽 설정 규칙을 확인해 보겠습니다.

$ sudo firewall-cmd --direct --get-all-rules
ipv4 filter INPUT 0 -p tcp -m multiport --dports ssh -m set --match-set fail2ban-sshd src -j REJECT --reject-with icmp-port-unreachable
fail2ban이 추가한 firewall 설정 규칙
결과에 보이는 "--match-set fail2ban-sshd src" 는 ipset 그룹명이 fail2ban-sshd 인 source 에서 ssh 서비스로 전송한 패킷은 REJECT 하라는 의미입니다.


6. 차단 설정된 정보 조회

설정된 ipset 의 정보는 --list 옵션으로 확인할 수 있습니다.

 

$ sudo ipset --list    

  
Name: fail2ban-sshd 
Type: hash:ip 
Revision: 1 
Header: family inet hashsize 1024 maxelem 65536 timeout 10800 
Size in memory: 16592 
References: 1 
Members: 
192.168.58.1 timeout 89 

ipset 정책 목록
이제 fail2ban-sshd 규칙의 Header 항목에 있는 "timeout 3600"  에 따라 인증에 실패한 IP 는 1시간 동안 차단됩니다.


7. 전체 차단 정보 조회

이제 fail2ban-sshd 규칙의 Header 항목에 있는 "timeout 10800"  에 따라 인증에 실패한 IP 는 3시간 동안 차단됩니다.

전체 차단 정보는 fail2ban 의 클라이언트 유틸리티인 fail2ban-client 명령어를 통해서 확인해 볼 수 있습니다.

$ sudo fail2ban-client status sshd 

Status for the jail: sshd 
|- Filter 
|  |- Currently failed: 1 
|  |- Total failed:     8 
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd 
`- Actions 
   |- Currently banned: 2 
   |- Total banned:     2 
   `- Banned IP list: 103.114.106.xxx 58.242.83.xxx 

 

8. mariadb 10 로그 파일 설정

8.1 로그 경로 생성

 

# mkdir /var/log/mariadb 

# chown mysql:mysql /var/log/mariadb 


8.2  로그 출력 경로 추가

/etc/my.cnf 파일에 다음 내역 추가

[mysqld] 항목 아래에

[mysqld]
log-error=/var/log/mariadb/mariadb.log 


8.3. mariadb 재시작

 

# systemctl restart mariadb 


9. fail2ban 에서 mariadb 설정

위의 8번 항목에 mairadb 설정 로그 출력까지 정상적으로 확인되면

다음 작업을 수행합니다.

/etc/fail2ban/jail.conf 파일

[mysqld-auth] 
# 설정 활성화 
enabled = true 

# 3306 포트 
port     = 3306 

# 로그 경로 
logpath  = /var/log/mariadb/mariadb.log 

# 최대 5회 실패시 적용 
maxretry = 5 

# 사용 필터 
filter   = mysqld-auth 
  
# 폴링 방식 적용 
backend = polling 

# ban 적용 
banaction = iptables-multiport 



9.1 재시작

위의 세팅 정보를 모두 설정하고

아래 명령을 통해 재시작 합니다.

 

# systemctl restart fail2ban 


10. apache tomcat 404 error 설정 추가 하기

10.1 tomcat 필터 파일 생성


404 에 대한 block 처리 방식입니다.

다만, 사전에 소스에 404 Not Found가 발생하는지 여부를 정확하게 확인이 필요합니다.
(아니면 모두 block 처리됨)

아래의 위치에 적용할 필터 명에 파일을 생성합니다.

- 위치 : /etc/fail2ban/filter.d
- 파일명 : tomcat.conf

[INCLUDES] 
before = common.conf 

[Definition] 
failregex =  ^.*\/.*\/.*404 
ignoreregex = 



10.2. jail.conf 정보 추가.

/etc/fail2ban/jail.conf 파일

[tomcat] 
# 설정 활성화 
enabled  = true 

# 적용 서비스 및 포트 
port     = http,https,80,443 

# block 설정 하지 않을 IP  대역대 
ignoreip = 127.0.0.1/8 192.168.10.0/24 

# ban (초) 시간 
bantime  = 3600 

# 최근 10분 동안 
findtime = 600 

# 설정 filter tomcat 
filter   = tomcat 

# 톰켓 로그 폴더 
logpath  = /var/log/tomcat8/localhost_access_log.*.txt 

# 재시도 회수 
maxretry = 5 

# 폴링 방식 적용 
backend = polling 

# ban 적용 
banaction = iptables-multiport 


10.3 재시작

위의 세팅 정보를 모두 설정하고

아래 명령을 통해 재시작 합니다.

# systemctl restart fail2ban 


11. php 파일 관련 설정 추가

11.1 필터 파일 생성

구축 사이트는 PHP 파일이 존재하지 않으므로

모든 php 파일의 404 not found의 경우에는 block 처리 함.


- 위치 : /etc/fail2ban/filter.d
- 파일명 : tomcat-php-404.conf

 

[INCLUDES] 
before = common.conf 

[Definition] 

failregex = ^ - - \[.*\] ".*\.php HTTP/1.1" 404 \d+$ 
            ^ - - \[.*\] ".*\.PHP HTTP/1.1" 404 \d+$ 

ignoreregex = 

 

11.2 필터 설정 적용

/etc/fail2ban/jail.conf 파일

[tomcat-php-404] 
# 설정 활성화 
enabled  = true 

# 적용 서비스 및 포트 
port     = http,https,80,443 

# block 설정 하지 않을 IP  대역대 
ignoreip = 127.0.0.1/8 192.168.10.0/24 

# ban (초) 시간 
bantime  = 3600 

# 최근 10분 동안 
findtime = 600 

# 설정 filter tomcat-php-404 
filter   = tomcat-php-404 

# 톰켓 로그 폴더 
logpath  = /var/log/tomcat8/localhost_access_log.*.txt 

# 재시도 회수 
maxretry = 5 

# 폴링 방식 적용 
backend = polling 

# ban 적용 
banaction = iptables-multiport 


11.3 재시작

위의 세팅 정보를 모두 설정하고

아래 명령을 통해 재시작 합니다.

 

# systemctl restart fail2ban 

============= 기타 ==========

1. jail.conf 설정 파일들에서 옵션들의 의미

ignoreip :이 매개 변수는 금지 시스템에서 무시해야하는 IP 주소를 식별합니다. 
          기본적으로 이것은 기계 자체에서 오는 트래픽을 무시하도록 설정되어 있습니다. 이는 꽤 좋은 설정입니다.
bantime :이 매개 변수는 금지의 길이를 초 단위로 설정합니다. 기본값은 600 초 또는 10 분입니다.
findtime :이 매개 변수는 fail2ban이 반복적으로 실패한 인증 시도를 찾을 때주의 할 창을 설정합니다. 
          기본값은 600 초 (다시 10 분)로 설정됩니다. 즉, 소프트웨어는 지난 10 분 동안 실패한 시도 횟수를 계산합니다.
maxretry : findtime금지가 설정되기 전에 창 에서 허용되는 실패한 시도 횟수를 설정합니다 .
backend :이 항목은 fail2ban이 로그 파일을 모니터하는 방법을 지정합니다. 
         이 설정은 autofail2ban이 시도한 pyinotify다음 gamin사용할 수있는 것을 
         기반으로 폴링 알고리즘을 시도한다는 것을 의미합니다 .
usedns : 역방향 DNS가 금지 구현을 돕는 데 사용되는지 여부를 정의합니다. 
         이것을 "no"로 설정하면 호스트 이름 대신 IP 자체가 금지됩니다. 
         "warn"설정은 역방향 DNS를 사용하여 호스트 이름을 검색하고 그런 식으로 금지하려고 시도하지만 검토를 위해 활동을 기록합니다.
destemail :이 주소는 메일 알리미로 작업을 구성한 경우 알림 메일로 전송됩니다.
           보낸 사람 이름 : 생성 된 알림 전자 메일의 보낸 사람 전자 메일 필드에 사용됩니다.
banaction : 임계 값에 도달 할 때 사용할 조치를 설정합니다. 실제로 /etc/fail2ban/action.d/호출 된 
            파일의 이름이 있습니다 iptables-multiport.conf. 
            이것은 iptablesIP 주소를 금지하기위한 실제 조작을 처리합니다 .          
mta : 알림 이메일을 보내는 데 사용할 메일 전송 에이전트입니다.
protocol : IP 금지가 구현 될 때 삭제 될 트래픽 유형입니다. 
           이것은 새로운 iptables 체인으로 전송되는 트래픽 유형이기도합니다.
chain : 이것은 fail2ban 깔때기로 트래픽을 보내기위한 점프 규칙으로 구성되는 체인입니다.


2. fail2ban 자주 사용하는 명령목록

fail2ban-client status : ban 목록확인
cat /var/log/fail2ban.log : fail2ban 로그확인
cat /var/log/fail2ban.log | grep Ban : Ban 내역만 뽑아서 보기
* ban된 ip 해제하기
fail2ban-client set sshd unbanip 192.111.1.101 (해제IP)

위에 명령어의 sshd 체인네임이며 ftp 등 ban 내역의 해제정보를 적으면된다.

3. filter 적용 테스트

모든 필터는 작성한 후 정상 동작하는지 필터 체크를 해야 합니다.

아래는 예제...

# fail2ban-regex   

예)

# fail2ban-regex /var/log/tomcat8/localhost_access_log.*.txt  /etc/fail2ban/filter.d/tomcat-php-404.conf

 
예2 ) 변수로 정의하는 방식

$ line='0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php'

$ ./fail2ban-regex "$line"  ' - - \[.*\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 1 matched, 0 missed


4. 설정된 fail2ban 상태 확인

# fail2ban-client status sshd

정상 상태이면 Journal matches 정보나 file 정보가 보이나

비정상 상태이면 안보임... ㅜㅜ


Status for the jail: mysqld-auth
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:
[root@localhost fail2ban]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     13
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 27
   |- Total banned:     27
   `- Banned IP list:   198.211

 

# fail2ban-client status mysqld-auth
Status for the jail: mysqld-auth
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     1
|  `- File list:        /var/log/mariadb/mariadb.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

 

 


 

윈도우즈 용도 존재함 (시간나면 정리를 할 예정)

Wail2Ban

관련 : http://cloudjoon.blogspot.com/2017/08/rdp-security-wail2ban.html

 

Beyond Cloud "IBM Cloud"

RDP( 원격데스크탑 ) 무차별 대입공격 관련 보안스크립트 적용 가이드 1. Wail2ban 소개 - Wail2ban 은 Windows 운영체제 대상으로 RDP( 원격데스크탑 ) 에 대하여 Brute-forc...

cloudjoon.blogspot.com

https://developer.ibm.com/kr/cloud/softlayer-bluemix-infra/security/2017/08/31/rdp-security-script/

 

RDP(원격데스크탑) 무차별 대입공격 관련 보안스크립트 적용 가이드 - IBM Developer

1. Wail2ban 소개 – Wail2ban 은 Windows 운영체제 대상으로 RDP(원격데스크탑)에 대하여 Brute-force Attack(패스워드 무차별 대입공격) 에 대한 방어를 위한 자동 보안설정 스크립트입니다. – 해당 스크립트는 파워쉘(PowerShell)로 작성되었으며, 원작자는 “Katie McLaughlin” 로써 해당 코드에 대한 재배포시에는 반드시 하기URL 의 “Copy Right Notice” 를 명시해야 됩니다.    htt

developer.ibm.com

 

https://github.com/glasnt/wail2ban

 

glasnt/wail2ban

fail2ban, for windows. . Contribute to glasnt/wail2ban development by creating an account on GitHub.

github.com

 

 

반응형

+ Recent posts