Part 1에 이어서 이번 Post에서는 Fail2ban을 이용하여 효과적으로 Server 보안을 수행하는 방법과 Rootkit 검사도구인 rkhunter에 대해서 알아 보도록 하겠습니다.

5. Fail2ban

Server 관리자가 늘 항상 Log를 검사하여 일일이 의심되는 IP를 찾아 Firewall에 Rule을 추가하는 일은 상당히 귀찮은 일이 될 수 있습니다.

Fail2ban은 주기적으로 정규 표현식을 사용하여 Log에서 의심스러운 IP를 검출해 내어, 해당 IP를 Firewall에 등록하여 접근을 자동으로 차단합니다.

관리자 입장에서는 의심스러운 행동을 검출할 수 있는 정규 표현식만 잘 만들어 놓으면, 자동으로 나머지 동작은 Fail2ban이 알아서 하기 때문에 좀 더 편리하게 Server의 보안을 유지할 수 있습니다.

역으로 생각하면, 정규 표현식이 잘못되었거나 Cracker의 접근 Pattern이 변경되어 Log가 이전과는 다르게 적혀있다면, Fail2ban을 사용해도 접근을 차단할 수 없다는 것을 알 수 있습니다. 때문에 Fail2ban을 사용한다 할 지라도, 관리자의 주기적인 Log 검사나, Filter Update가 필요하다는 것을 유의하기 바랍니다.

5.1 Install

Fail2ban을 설치하기 위해서 다음과 같이 Terminal에서 입력합니다.

$ sudo apt-get install fail2ban
$ sudo vi /etc/fail2ban/jail.conf
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.1/24
bantime = 2592000
maxretry = 3
$ sudo service fail2ban restart

위에서 jail.conf는 Fail2ban의 설정 File입니다. 이 File에서 Fail2ban의 기본 동작과 여러가지 Filter를 설정할 수 있습니다.

[DEFAULT]의 3개의 Option은 다음과 같은 의미를 가집니다.

  • ignoreip: 의심스러운 접근으로 검출되었다 할 지라도 무시해야 할 IP와 Network을 설정할 수 있습니다. 위의 설정은 Loopback과 Private Network을 무시합니다.
  • bantime: 검출된 IP를 Firewall에 등록하여 접속을 차단할 기간을 초 단위로 설정합니다. 위의 설정은 1달(30일)을 설정한 것입니다.
  • maxretry: 정규 표현식으로 검사했을 때, maxretry에 설정한 횟수만큼 Matching 되면 해당 IP를 검출합니다.

5.2 Test

Cracker의 의심스러운 동작을 검출하기 위한 정규 표현식을 저장해 놓은 것을 Fail2ban에서는 Filter라고 이야기합니다.

jail.conf에 이 Filter를 사용할 지에 대한 설정을 지정할 수 있고, 원한다면 관리자가 직접 Filter를 만들어서 사용할 수도 있습니다.

Filter를 새로 만들었거나 기존에 존재하는 Filter를 적용하기 전에, 관련된 Log를 검사하여 해당 Filter를 적용할 지 여부를 결정할 필요가 있습니다.

다음과 같이 입력하면 Filter를 사용했을 때, Matching되는 IP를 보여줍니다. (ssh 접근 Log가 기록되어 있는 auth.log를 sshd Filter로 검사하는 예)

  
$ sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

5.3 Filter

이제 Filter를 이용해 Jail을 만들고 활성화하여, Cracker의 의심스러운 접근을 방어해 봅시다. 여기서 Jail은 설정한 Filter를 동작하게 하는 단위를 의미합니다.

굳이 Log에서 의심스러운 내용이 검출되지 않더라도, Server에서 제공하는 Service와 관련된 Jail이 아래에 소개하는 것들 중에 있다면 가급적 활성화하는 것이 좋습니다.

5.3.1 sshd

sshd Filter는 SSH 설정에서 언급한 Brute-force Attack과 같은 접근을 차단하는 Filter입니다.

이 Filter를 사용하면 /var/log/auth.log에서 아래와 유사한 문장이 나오면 IP를 검출하여 접속을 차단합니다.

Jul 22 06:56:50 foo sshd[14984]: Failed password for invalid user a from xxx.xxx.xxx.xxx port 55452 ssh2

sshd Filter는 설치 시에 기본적으로 활성화되어 있습니다. 활성화된 설정은 /etc/fail2ban/jail.d/defaults-debian.conf에서 확인할 수 있습니다.

5.3.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 설정을 위해서 다음과 같이 입력합니다.

$ sudo vi /etc/fail2ban/jail.d/sshd-ddos.conf
[sshd-ddos]
enabled = true
$ sudo service fail2ban restart

5.3.3 apache-badbots

apache-badbots Filter를 사용해 Cracker가 자신이 만든 Program으로 HTTP, HTTPS Protocol을 통해 Server에 접근하려 했을 경우에 발생하는 Message를 검출하여 해당 IP를 차단할 수 있습니다.

검출되는 /var/log/apache2/access.log의 Message는 다음과 같습니다.

xxx.xxx.xxx.xxx - - [12/Jul/2013:01:21:37 +0900] "GET /manager/html HTTP/1.1" 302 520 "-" "Mozilla/3.0 (compatible; Indy Library)"

Jail 설정을 위해서 다음과 같이 입력합니다.

$ sudo vi /etc/fail2ban/jail.d/apache-badbots.conf
[apache-badbots]
enabled = true
$ sudo service fail2ban restart

5.3.4 apache-nohome

apache-nohome Filter는 Server의 Home Directory를 찾는 것을 실패한 접속자의 Log가 다수 발견되었을 때 해당 IP를 차단합니다.

Jail 설정을 위해서 다음과 같이 입력합니다.

$ sudo vi /etc/fail2ban/jail.d/apache-nohome.conf
[apache-nohome]
enabled = true
$ sudo service fail2ban restart

5.3.5 apache-overflows

apache-overflows Filter는 Server 접속 URL이 너무 길거나 의심스러운 경우를 검사하여 해당 IP를 차단합니다.

Jail 설정을 위해서 다음과 같이 입력합니다.

$ sudo vi /etc/fail2ban/jail.d/apache-overflows.conf
[apache-overflows]
enabled = true
$ sudo service fail2ban restart

5.3.6 php-url-fopen

php-url-fopen Filter는 PHP의 fopen() URL Injection을 이용하여 접근을 시도한 해당 IP를 차단합니다.

/var/log/apache2/access.log에서 검출되는 Message는 다음과 같습니다.

xxx.xxx.xxx.xxx - - [26/Mar/2009:08:44:20 -0500] "GET /index.php?n=http://eatmyfood.hostinginfive.com/pizza.htm? HTTP/1.1" 200 114 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"

Jail 설정을 위해서 다음과 같이 입력합니다.

$ sudo vi /etc/fail2ban/jail.d/php-url-fopen.conf
[php-url-fopen]
enabled = true
$ sudo service fail2ban restart

5.4 Log

Filter가 작동되면 /var/log/fail2ban.log에 관련된 내용이 저장됩니다. 아래는 fail2ban.log의 일부를 옮겨 놓은 것입니다.

2013-07-24 01:05:03,100 fail2ban.jail   : INFO   Jail 'ssh' started
2013-07-24 01:05:03,101 fail2ban.jail   : INFO   Jail 'ssh-ddos' started
2013-07-24 01:05:03,101 fail2ban.jail   : INFO   Jail 'apache-badbots' started
2013-07-24 01:05:03,102 fail2ban.jail   : INFO   Jail 'apache-proxy' started
2013-07-24 01:05:03,103 fail2ban.jail   : INFO   Jail 'apache-myadmin' started
2013-07-25 00:38:06,817 fail2ban.actions: WARNING [apache-proxy] Ban xxx.xxx.xxx.xxx
2013-07-25 12:57:27,497 fail2ban.actions: WARNING [ssh] Ban xxx.xxx.xxx.xxx
2013-07-25 23:21:05,672 fail2ban.actions: WARNING [apache-proxy] Ban xxx.xxx.xxx.xxx

위의 내용을 통해 Jail이 시작되었고, 해당 Jail을 통해서 검출된 IP가 접속이 차단된 것을 알 수 있습니다.

실제로 접속 차단이 동작하는 것을 확인하기 위해서는 다음과 같이 입력하면 됩니다. (sshd Jail의 예)

$ sudo iptables -L f2b-sshd
Chain f2b-sshd (1 references)
target     prot opt source               destination         
DROP       all  --  www.example.com      anywhere            
RETURN     all  --  anywhere             anywhere 

-L Option 뒤에 f2b-<Jail 이름>을 입력하면 해당 Jail의 동작으로 차단된 IP(또는 FQDN)을 확인할 수 있습니다.

6. Rkhunter (Rootkit checker)

보안에 대해서 신경을 쓴다 할 지라도 Cracking을 당할 가능성은 늘 존재합니다.

혹여 root 권한을 획득한 침입자가 Rootkit과 같은 Malware를 System에 설치할 경우, 관리자도 모르게 System을 맘대로 주무르거나 Server의 Data를 빼돌릴 수 있습니다.

Rkhunter는 이와 같은 Rootkit이 System에 설치되어 있는지 Check합니다. 다음과 같이 입력하여 System에 설치합니다.1

$ sudo apt-get install rkhunter

Postfix Configuration

설치 시에 MTA(Matil Transfer Agent)인 Postfix가 의존성으로 같이 설치됩니다. Postfix의 설정은 이 Post의 범위를 넘어가기 때문에 설명하지는 않고, 여기서는 설정 안함을 선택하고 진행합니다.

설치 후에는 설정을 위해 아래와 같이 입력합니다.

$ sudo vi /etc/default/rkhunter

CRON_DAILY_RUN="true"
CRON_DB_UPDATE="true"
APT_AUTOGEN="true" 

위의 /etc/default/rkhunter 설정은 다음과 같은 의미가 있습니다.

  • CRON_DAILY_RUN: 설정하면 매일마다 Rkhunter가 System을 Check해서 결과를 저장합니다.
  • CRON_DB_UPDATE: 설정하면 매 주마다 Rkhunter가 Check하는 Program에 대한 정보를 Update합니다.
  • APT_AUTOGEN: 설정하면 apt-get 명령으로 새로운 Package를 설치하거나 삭제할 때, 자동으로 Rkhunter의 DB를 Update합니다.

수동으로 Rkhunter를 사용해 검사하려면 다음과 같이 입력합니다.

$ sudo rkhunter --propupd
$ sudo rkhunter --checkall
System checks summary
=====================

File properties checks...
    Files checked: 135
    Suspect files: 0

Rootkit checks...
    Rootkits checked : 245
    Possible rootkits: 0

Applications checks...
    All checks skipped

실행해 보면 Application Check는 Ubuntu에서 Skip하게 되어 있는데, 그 이유는 Ubuntu의 Securiy Team이 Application에 대한 관리를 하기 때문이라고 합니다.

검사 중간에 Warning이 표시되거나 Summary에서 Suspect files나 Possible rootkits의 값이 0이 아니라면 System에 Rootkit이 설치되어 있는지 확인이 필요합니다.

자세한 Check한 결과가 저장된 /var/log/rkhunter.log의 내용을 토대로 Google에서 검색하거나 Rkhunter Users Mailing List를 이용하여 질문해 보기 바랍니다.

그리고 실제적으로 Server에 Rootkit이 설치되었다면 중요 Data만을 Backup하고, Network 연결 없이 새로 OS를 설치하는 것이 가장 좋은 해결책이라 생각됩니다.

6.1 무시해도 되는 문제들

6.1.1 /usr/bin/unhide.rb

System의 숨겨진 Process를 검사하는 Program인데 이것이 Ruby Script로 변경되었음을 통지하는 Warning이 발생할 수 있습니다.

Warning: The command '/usr/bin/unhide.rb' has been replaced by a script: /usr/bin/unhide.rb: Ruby script, ASCII text

unhide.rb는 원래부터 Ruby Script이기 때문에 해당 내용은 무시해도 됩니다. 다음과 같이 입력하여 Warning이 발생하지 않도록 설정합니다.

  
$ sudo vi /etc/rkhunter.conf

SCRIPTWHITELIST=/usr/bin/unhide.rb

6.1.2 /dev/.udev/rules.d/root.rules

“Checking /dev for suspicious file types” 항목에서 root.rules에 대한 Warning이 발생할 수 있습니다. 이 File은 Ubuntu에 기본적으로 설치되는 File이기 때문에, 다음과 같은 내용이 rkhunter.log에 적혀있다면 무시해도 됩니다.

Checking /dev for suspicious file types         [ Warning ]
Warning: Suspicious file types found in /dev:
         /dev/.udev/rules.d/root.rules: ASCII text

6.1.3 /dev/shm/pulse-shm-*

다음과 같이 pulse-shm에 대한 Warning이 발생할 수 있습니다.2

Checking /dev for suspicious file types         [ Warning ]
Warning: Suspicious file types found in /dev:
         /dev/shm/pulse-shm-2518430882: data

이 File은 Ubuntu의 PulseAudio에서 사용하는 것이기 때문에 다음과 같이 rkhunter.conf를 수정하여 이 문제를 무시하도록 설정합니다.

$ sudo vi /etc/rkhunter.conf

ALLOWDEVFILE=/dev/shm/pulse-shm-*

6.1.4 일부 숨겨진 File과 Directory

“Checking for hidden files and directories” 항목에서 Warning이 발생하고, 다음과 같은 내용이 /var/log/rkhunter.log에 적혀있다면 해당 문제는 무시해도 무방합니다.

Warning: Hidden directory found: /etc/.java
Warning: Hidden directory found: /dev/.udev
Warning: Hidden file found: /dev/.blkid.tab: ASCII text
Warning: Hidden file found: /dev/.blkid.tab.old: ASCII text
Warning: Hidden file found: /dev/.initramfs: symbolic link to `/run/initramfs'

해당 File과 Directory에 대한 Warning을 무시하려면 다음과 같이 입력하고 Rkhunter를 다시 실행하면 됩니다.

$ sudo vi /etc/rkhunter.conf

ALLOWHIDDENDIR="/etc/.java"
ALLOWHIDDENDIR="/dev/.udev"
ALLOWHIDDENDIR="/dev/.initramfs"
ALLOWHIDDENFILE="/dev/.blkid.tab"
ALLOWHIDDENFILE="/dev/.blkid.tab.old"

Tested Environments

  • Ubuntu 15.10: fail2ban 0.9.3, rkhunter 1.4.2

References