Psad + Iptables + Debian Squeeze

PSAD é a abreviatura de Port Scan Attack Detector e como o nome sugere, é um aplicativo capaz de analisar e interagir com determinados eventos, como possíveis ataques de port scan , ataques de negação de serviço (DoS) entre outros, pois ele utiliza as assinaturas do Snort, caso você já conheça o Snort o Psad é fichinha de ser configurado pois o seu arquivo de configuração é bem parecido e as variáveis de configuração também, deixei as referências do projeto e as documentações para que possam ser consultadas para tunar o seu psad.

Aqui eu vou mostrar a configuração do psad a configuração de um script de de firewall e a configuração do rsyslog pois os mesmos trabalham em conjunto.

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Agora vamos fazer um update dos repositórios

aptitude update

Agora vamos instalar o psad

aptitude install psad -y

Agora vamos configurar o rsyslogd para controlar os logs que vamos gerar pelo iptables

vim /etc/rsyslog.conf
[...]
#linha 83 vamos trocar 
*.=info;*.=notice;*.=warn;\
       auth,authpriv.none;\
       cron,daemon.none;\
       mail,news.none          -/var/log/messages
       
#Por este bloco, aqui estamos tirando o tipo info dos logs que vamos utilizar para o iptables
*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none          -/var/log/messages

#Adicione a seguinte linha
kern.info                       -/var/log/iptables
[...]

Agora vamos reiniciar o rsyslog

/etc/init.d/rsyslog restart

Agora vamos pegar um script de firewall de borda como exemplo

vim /etc/init.d/rc.firewall
#!/bin/sh
#Autor: Douglas Q. dos Santos
### BEGIN INIT INFO
# Provides:             rc.firewall
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         
# Short-Description:    Firewall 
### END INIT INFO

### CORES UTILIZADAS NO SCRIPT ###
GREY="\033[01;30m"
RED="\033[01;31m"
GREEN="\033[01;32m"
YELLOW="\033[01;33m"
BLUE="\033[01;34m"
PURPLE="\033[01;35m"
CYAN="\033[01;36m"
WHITE="\033[01;37m"
CLOSE="\033[m"

###  CAMINHO DAS VARIAVEIS DO IPV4 NO KERNEL ###
PSNI=/proc/sys/net/ipv4

### REDES ###
REDE_DMZ='172.20.0.0/24'

### INTERFACES DE REDE ###
IF_REDE_DMZ='eth1'
IF_REDE_EXT='eth2'

### SERVIDORES DA REDE DMZ ###
DMZ_DNS1='172.20.0.200'
DMZ_DNS2='172.20.0.201'
DMZ_EMAIL='172.20.0.202'
DMZ_WWW='172.20.0.203'

### IPS EXTERNOS PARA OS SERVIDORES DA DMZ###
EXT_DNS1='200.200.200.200'
EXT_DNS2='200.200.200.201'
EXT_EMAIL='200.200.200.202'
EXT_WWW='200.200.200.203'

### PORTAS ###
SSH_PORT="22222"
DNS_PORT="53" 
HTTP_PORT="80"
AUTH_PORT="113"
MAIL_PORTS="25,110,143,465,993,995"
NTP_PORT="123"

### COMANDOS ###
IPTABLES=$(which iptables)
MODPROBE=$(which modprobe)
COM="-m comment --comment"
TCP="-p tcp -m tcp" 
UDP="-p udp -m udp"
ICMP="-p icmp --icmp-type"
LIMIT="-m limit --limit" 
PRE_EXT="${IPTABLES} -A PREROUTING -t nat -i ${IF_REDE_EXT} "

### OPCOES DO KERNEL ###
### HABILITA REPASSE DE PACOTES ###
echo 1 > $PSNI/ip_forward
# HABILITAR PROTECAO CONTRA SYNFLOOD
echo 1 > $PSNI/tcp_syncookies
# HABILITAR VERIFICACAO DE ROTA DE ORIGEM (PROTECAO P/ IP SPOOFING)
for RP in $PSNI/conf/*/rp_filter ; do echo 1 > $RP ; done
# CONTROLE DE ICMP
echo 0 > $PSNI/icmp_echo_ignore_all
echo 1 > $PSNI/icmp_echo_ignore_broadcasts

### CARREGANDO MÓDULOS ##
${MODPROBE} ip_conntrack
${MODPROBE} ip_conntrack_ftp
${MODPROBE} ip_nat_ftp


case $1 in 
  start)
    echo "${GREEN}[         Iniciando Firewall         ]${CLOSE}"

    ### LIMPANDO REGRAS E CADEIAS ANTERIORES ###
    ${IPTABLES} -t filter -F
    ${IPTABLES} -t nat -F
    ${IPTABLES} -t mangle -F
    ${IPTABLES} -t filter -X
    ${IPTABLES} -t nat -X
    ${IPTABLES} -t mangle -X

    ### LIMPANDO AS POLITICAS DEFAULT ###
    ${IPTABLES} -P INPUT ACCEPT
    ${IPTABLES} -P FORWARD ACCEPT
    ${IPTABLES} -P OUTPUT ACCEPT

    ### DEFININDO POLITICA PADRAO DROP ###
    ${IPTABLES} -P INPUT DROP
    ${IPTABLES} -P FORWARD DROP
    ${IPTABLES} -P OUTPUT ACCEPT

    ### LIBERAR LOOPBACK ###
    ${IPTABLES} -A INPUT -s 127.0.0.1/32 -j ACCEPT ${COM} "LIBERA A LOOPBACK"

    ### CONTRA ATAQUES 
    ${IPTABLES} -A INPUT -m state --state INVALID -j LOG --log-prefix " FIREWALL: PKGS INVALIDOS " --log-level info 
    ${IPTABLES} -A INPUT -m state --state INVALID -j DROP ${COM} "PACOTES COM ESTADO INVALIDO OU MAL FORMADOS"

    ${IPTABLES} -A INPUT -f -j LOG --log-prefix " FIREWALL: FRAGMENTADOS " --log-level info
    ${IPTABLES} -A INPUT -f -j DROP ${COM} "PACOTES FRAGMENTADOS"

    ###  LIBERAR SSH ###
    ${IPTABLES} -A INPUT -s ${REDE_DMZ} ${TCP} --dport ${SSH_PORT} -j ACCEPT ${COM} "LIBERA ${REDE_DMZ} ACESSAR O SSH"

    ### LIBERAR RETORNO DE CONEXOES ###
    ${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    ${IPTABLES} -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

    ### LIBERAR EMAIL ###
    ${IPTABLES} -A FORWARD ${TCP} -m multiport --dports ${EMAIL_PORTS} -d ${DMZ_EMAIL} -j LOG --log-prefix " FIREWALL: ACESSO EMAIL " --log-level info
    ${IPTABLES} -A FORWARD ${TCP} -m multiport --dports ${EMAIL_PORTS} -d ${DMZ_EMAIL} -j ACCEPT ${COM} "Liberado repasse de EMAIL "

    ### LIBERAR DNS ###
    ${IPTABLES} -A FORWARD ${TCP} --dport ${DNS_PORT} -d ${DMZ_DNS1} -j LOG --log-prefix " FIREWALL: ACESSO DNS1 TCP " --log-level info
    ${IPTABLES} -A FORWARD ${TCP} --dport ${DNS_PORT} -d ${DMZ_DNS2} -j LOG --log-prefix " FIREWALL: ACESSO DNS2 TCP " --log-level info
    ${IPTABLES} -A FORWARD ${TCP} --dport ${DNS_PORT} -d ${DMZ_DNS1} -j ACCEPT ${COM} "LIBERA REPASSE PARA DNS1"
    ${IPTABLES} -A FORWARD ${TCP} --dport ${DNS_PORT} -d ${DMZ_DNS1} -j ACCEPT ${COM} "LIBERA REPASSE PARA DNS2"
    ${IPTABLES} -A FORWARD ${UDP} --dport ${DNS_PORT} -d ${DMZ_DNS1} -j LOG --log-prefix " FIREWALL: ACESSO DNS1 UDP " --log-level info
    ${IPTABLES} -A FORWARD ${UDP} --dport ${DNS_PORT} -d ${DMZ_DNS2} -j LOG --log-prefix " FIREWALL: ACESSO DNS2 UDP " --log-level info
    ${IPTABLES} -A FORWARD ${UDP} --dport ${DNS_PORT} -d ${DMZ_DNS1} -j ACCEPT ${COM} "LIBERA REPASSE PARA DNS1"
    ${IPTABLES} -A FORWARD ${UDP} --dport ${DNS_PORT} -d ${DMZ_DNS1} -j ACCEPT ${COM} "LIBERA REPASSE PARA DNS2"

    ### LIBERAR HTTP ###
    ${IPTABLES} -A FORWARD ${TCP} --dport ${HTTP_PORT} -d ${DMZ_WWW} -j LOG --log-prefix " FIREWALL: ACESSO WEB " --log-level info
    ${IPTABLES} -A FORWARD ${TCP} --dport ${HTTP_PORT} -d ${DMZ_WWW} -j ACCEPT ${COM} "LIBERA REPASSE PARA HTTP"

    ### LIBERAR NTP ###
    ${IPTABLES} -A INPUT ${UDP} --sport ${NTP_PORT} -j LOG --log-prefix " FIREWALL: ACESSO NTP " --log-level info
    ${IPTABLES} -A INPUT ${UDP} --sport ${NTP_PORT} -j ACCEPT ${COM} "Libera entrada de NTP"
    ${IPTABLES} -A FORWARD ${UDP} --sport ${NTP_PORT} -d ${REDE_DMZ} -j LOG --log-prefix " FIREWALL: ACESSO NTP " --log-level info
    ${IPTABLES} -A FORWARD ${UDP} --sport ${NTP_PORT} -d ${REDE_DMZ} -j ACCEPT ${COM} "Libera repasse do NTP"

    ### REGRAS DE PREROUTING ###

    ### DMZ_WWW ### 
    ${PRE_EXT} -d ${EXT_WWW} ${TCP} --dport ${HTTP_PORT} -j DNAT --to ${DMZ_WWW} ${COM} " SERVIDOR WWWW "

    ### DMZ_DNS ###
    ${PRE_EXT} -d ${EXT_DNS1} ${TCP} --dport ${DNS_PORT} -j DNAT --to ${DMZ_DNS1} ${COM} "SERVIDOR DE DNS PRIMARIO"
    ${PRE_EXT} -d ${EXT_DNS1} ${UDP} --dport ${DNS_PORT} -j DNAT --to ${DMZ_DNS1} ${COM} "SERVIDOR DE DNS PRIMARIO" 
    ${PRE_EXT} -d ${EXT_DNS2} ${TCP} --dport ${DNS_PORT} -j DNAT --to ${DMZ_DNS2} ${COM} "SERVIDOR DE DNS SLAVE"
    ${PRE_EXT} -d ${EXT_DNS2} ${UDP} --dport ${DNS_PORT} -j DNAT --to ${DMZ_DNS2} ${COM} "SERVIDOR DE DNS SLAVE"

    ### SERVIDOR DE MAIL ###
    ${PRE_EXT} -d ${EXT_MAIL} -p tcp -m multiport --dports ${EMAIL_PORTS} -j DNAT --to ${DMZ_MAIL} ${COM} "Servidor de Email"
    ${IPTABLES} -t nat -A POSTROUTING -s ${DMZ_MAIL} -p tcp -m multiport --dport ${EMAIL_PORTS} -j SNAT --to ${EXT_MAIL} ${COM} "Saida do email"

    ### CONTROLE DE ICMP (PING) ###
    ${IPTABLES} -A INPUT ${ICMP} 0 ${LIMIT} 1/s -j LOG --log-prefix " FIREWALL: ICMP REPLY " --log-level info
    ${IPTABLES} -A INPUT ${ICMP} 0 ${LIMIT} 1/s -j ACCEPT ${COM} "CONTROLE DE ICMP"
    ${IPTABLES} -A INPUT ${ICMP} 8 ${LIMIT} 1/s -j LOG --log-prefix " FIREWALL: ICMP REQUEST " --log-level info
    ${IPTABLES} -A INPUT ${ICMP} 8 ${LIMIT} 1/s -j ACCEPT ${COM} "CONTROLE DE PING"
    ${IPTABLES} -A FORWARD ${ICMP} 0 ${LIMIT} 1/s -j LOG --log-prefix " FIREWALL: ICMP REPLY " --log-level info
    ${IPTABLES} -A FORWARD ${ICMP} 0 ${LIMIT} 1/s -j ACCEPT ${COM} "CONTROLE DE PING"
    ${IPTABLES} -A FORWARD ${ICMP} 8 ${LIMIT} 1/s -j LOG --log-prefix " FIREWALL: ICMP REQUEST " --log-level info
    ${IPTABLES} -A FORWARD ${ICMP} 8 ${LIMIT} 1/s -j ACCEPT ${COM} "CONTROLE DE PING"
 
    ### Port SCANNER
    ${IPTABLES} -A INPUT ${TCP} --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix " FIREWALL: PS E SF " --log-level info
    ${IPTABLES} -A INPUT ${TCP} --tcp-flags ALL FIN,URG,PSH -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A INPUT ${TCP} --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix " FIREWALL: PS E SF " --log-level info
    ${IPTABLES} -A INPUT ${TCP} --tcp-flags SYN,RST SYN,RST -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A INPUT ${TCP} --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix " FIREWALL: PS E SF " --log-level info
    ${IPTABLES} -A INPUT ${TCP} --tcp-flags SYN,FIN SYN,FIN -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A INPUT ${TCP} --tcp-flags ALL NONE        -j LOG --log-prefix " FIREWALL: PS E SF " --log-level info
    ${IPTABLES} -A INPUT ${TCP} --tcp-flags ALL NONE        -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A INPUT ${TCP} --sport 0 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix " FIREWALL: PS E SF "
    ${IPTABLES} -A INPUT ${TCP} --sport 0 --tcp-flags FIN,SYN,RST,ACK SYN -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A FORWARD -p tcp --syn ${LIMIT} 2/s -j LOG --log-prefix " FIREWALL: PS E SF "
    ${IPTABLES} -A FORWARD -p tcp --syn ${LIMIT} 2/s -j ACCEPT ${COM} "PS e SF"
    ${IPTABLES} -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST ${LIMIT} 1/s -j LOG --log-prefix " FIREWALL: PS E SF "
    ${IPTABLES} -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST ${LIMIT} 1/s -j ACCEPT ${COM} "PS e SF"
    ${IPTABLES} -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST ${LIMIT} 1/s -j LOG --log-prefix " FIREWALL: PS  E SF "
    ${IPTABLES} -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST ${LIMIT} 1/s -j ACCEPT ${COM} "PS E SF"

    ### NEGAR IDENT ###
    ${IPTABLES} -A INPUT ${TCP} --dport ${AUTH_PORT} -j LOG --log-prefix " FIREWALL: NEGA IDENT " --log-level info
    ${IPTABLES} -A INPUT ${TCP} --dport ${AUTH_PORT} -j REJECT --reject-with tcp-reset ${COM} "Nega identificacao"

    ### RESET EM CONEXOES PARA PORTAS DESCONHECIDAS ###
    ${IPTABLES} -A INPUT -p tcp -j LOG --log-prefix " FIREWALL: RESET PORT DESC " --log-level info
    ${IPTABLES} -A INPUT -p tcp -j REJECT --reject-with tcp-reset ${COM} "Reseta conexoes em portas desconhecidas"

    ### REGRAS DE MASQUERADE ###
    ${IPTABLES} -A POSTROUTING -t nat -s ${REDE_DMZ} -j MASQUERADE ${COM} "Masquerade da DMZ"

    ## GERA LOG OUTROS ACESSOS INDEVIDOS
    ${IPTABLES} -A INPUT -j LOG --log-prefix " FIREWALL: ACCESSO DESCON " --log-level info
    ${IPTABLES} -A FORWARD -j LOG --log-prefix " FIREWALL: ACCESSO DESCON " --log-level info

   echo "${GREEN}[         Firewall Iniciado          ]${CLOSE}"

  ;;
  stop)
   echo "${RED}[       Parando Firewall ...      ]${CLOSE}";
    ### LIMPANDO REGRAS E CADEIAS ANTERIORES ###
    ${IPTABLES} -t filter -F
    ${IPTABLES} -t nat -F
    ${IPTABLES} -t mangle -F
    ${IPTABLES} -t filter -X
    ${IPTABLES} -t nat -X
    ${IPTABLES} -t mangle -X

    ### LIMPANDO AS POLITICAS DEFAULT ###
    ${IPTABLES} -P INPUT ACCEPT
    ${IPTABLES} -P FORWARD ACCEPT
    ${IPTABLES} -P OUTPUT ACCEPT

    ### REGRAS DE MASQUERADE ###
    ${IPTABLES} -A POSTROUTING -t nat -s ${REDE_DMZ} -j MASQUERADE ${COM} "Masquerade da DMZ com o firewall em stop"

   echo  "${RED}[        Firewall Parado          ] ${CLOSE}";

  ;;
   status)
   echo  "${RED}########################################################################################";
   echo  "*******************************Table Filter*********************************************${CLOSE}";
   ${IPTABLES} -t filter -L -n
   echo  "${RED}########################################################################################";
   echo  "********************************Table Nat***********************************************${CLOSE}";
   ${IPTABLES} -t nat -L -n
   ;;

   restart)
     $0 stop
     $0 start
   ;;

  *)
   echo  "${RED}Opcoes Validas:(start|stop|restart|status)${CLOSE}"
  ;;
esac

Agora vamos dar permissão de execucação para ele

chmod +x /etc/init.d/rc.firewall

Agora vamos colocar ele na inicialização do sistema

insserv -f -v rc.firewall

Pronto já temos o nosso firewall e o nosso rsyslog configurados agora precisamos acertar a configuração do psad, os arquivos de configuração do psad se encontram em /etc/psad

ls /etc/psad/
archive  auto_dl  icmp_types  ip_options  pf.os  posf  psad.conf  signatures  snort_rule_dl  snort_rules

O arquivo auto_dl nos definimos quais redes vão ser excluídas da auditória ou que vão ter um nível pré-definido de perigo, vamos ver um exemplo do arquivo auto_dl

vim /etc/psad/auto_dl
#  <IP address>  <danger level>  <optional protocol>/<optional ports>;
#
# Examples:
#
#  10.111.21.23    5;          # Very bad IP.
#  127.0.0.1       0;          # Ignore this IP.
#  10.10.1.0/24    0;          # Ignore traffic from this entire class C.
#  192.168.10.4    3    tcp;   # Assign danger level 3 if protocol is tcp.
#  10.10.1.0/24    3    tcp/1-1024;  # Danger level 3 for tcp port range
172.20.0.0/24   0;

Como pode ser notado podemos definir o tipo de perigo que um host ou uma rede pode nos causar podemos definir também por tipo de protocolo e portas. Aqui eu vou deixar isenta de auditoria a minha DMZ então eu informo o meu range 172.20.0.0/24 e o nível de perigo 0.

  1. O arquivo icmp_types é aonde o psad vai se referenciar quando for tratar um pacote do protocolo ICMP.
  2. O arquivo ip_option define assinaturas de interfaces para o psad detectar suspeitos.
  3. O arquivo pf.os é para sistema que utilizam o packet filter como firewall.
  4. O arquivo posf é utilizado para determinar qual o tipo de sistema que esta originando o scan.
  5. O arquivo signatures contem as assinaturas de possíveis ataques ou tentativas de ataques.
  6. O arquivo snort_rule_dl podemos definir um nível padrão para um determinado SID “Snort rule ID”.
  7. O diretório snort_rules podemos armazenar as regras do snort para o psad ter referências de assinaturas.
  8. O arquivo psad.conf é o arquivo com o núcleo de opções utilizadas, ele é bem parecido com o snort.conf

Vamos agora trabalhar com o arquivo psad.conf, vamos dar uma olhada em sua estrutura e vamos mudar o que acharmos necessário, para ele trabalhar corretamente não precisamos efetuar muitos acertos.

vim /etc/psad/psad.conf
[...]
#Vamos definir o email de quem vai receber os emails de alerta do sistema
EMAIL_ADDRESSES             douglas@douglas.wiki.br;
[...]
#Aqui nos temos a variável HOME_NET mais não vamos modificá-la pois o psad já reconhece a nossa rede e nos liberamos ela tambem em auto_dl 
[...]
#Aqui definimos que o psad vai procurar em todas as entras de log do iptables e não em alguma flag pré-definida.
FW_SEARCH_ALL Y;
[...]
#Flag que ele vai se basear caso o FW_SEARCH_ALL estiver com a opção N
FW_MSG_SEARCH   DROP;
[...]
#Qual daemon de gerenciamento de log que vai ser utilizado
SYSLOG_DAEMON   syslogd;
[...]
#Qual a interface que esta configurada que vai ser utilizado ele vai descobrir com o ifconfig
IFCFGTYPE       ifconfig;
[...]
#Aqui estamos definindo o níveis de perigo pela quantidade de pacotes com alguma assinatura
DANGER_LEVEL1               5;    ### Number of packets.
DANGER_LEVEL2               15;
DANGER_LEVEL3               150;
DANGER_LEVEL4               1500;
DANGER_LEVEL5               10000;
[...]
#Intervalo que vai esperar até checar novamente os logs do iptables
CHECK_INTERVAL   5;
[...]
#Aqui vamos definir que vamos definir opções de log do iptables não esqueça de acertar a variável IPT_SYSLOG_FILE  como foi definida em /etc/rsyslog.conf
ENABLE_SYSLOG_FILE          Y;
IPT_WRITE_FWDATA            Y;
IPT_SYSLOG_FILE             /var/log/iptables;
[...]
#Aqui definimos o nível mínimo para que seja enviado um e-mail nos notificando sobre algum alerta
#Para testes deixe como 1 mais depois acredito que você vai mudar isso de acordo com a necessidade.
MIN_DANGER_LEVEL            1;
[...]
# Aqui definimos que sera enviado um email de alerta se o nivel de perigo for maior ou igual ao definido
EMAIL_ALERT_DANGER_LEVEL    1;
[...]
#Habilitar o psad para trabalhar como IDS
ENABLE_AUTO_IDS             Y;
[...]
#Aqui estamos definindo o nível de perigo analisado pelo psad que já sera bloqueado por iptables automaticamente.
#Aqui vai ter que ser acompanhado os logs do psad para verificar o que vai ser melhor para a sua rede
AUTO_IDS_DANGER_LEVEL       1;
[...]
#Tempo que o atacante sera bloqueado por padrão é uma hora.
AUTO_BLOCK_TIMEOUT          3600;
[...]
#Quando um atacante for bloqueado vamos ser informado por e-mail.
ENABLE_AUTO_IDS_EMAILS      Y;
[...]
#Bloquear automaticamente com iptables somente funciona se a opção ENABLE_AUTO_IDS estiver ativa.
IPTABLES_BLOCK_METHOD       Y;
#Mais abaixo temos mais um monte de opções de personalização mais eu acho essas bem importantes para um bom funcionamento.
[...]

Não esqueça de configurar um servidor de e-mail ou fazer algum relay para algum servidor.

Agora vamos reiniciar o psad

/etc/init.d/psad restart

Podemos listar as estatísticas do psad com o seguinte comando

psad -S
[+] psadwatchd (pid: 23600)  %CPU: 0.0  %MEM: 0.0
    Running since: Fri Jan  6 12:37:05 2012

[+] psad (pid: 23593)  %CPU: 3.0  %MEM: 2.7
    Running since: Fri Jan  6 12:37:05 2012
    Command line arguments: [none specified]
    Alert email address(es): douglas@douglas.wiki.br

[+] Version: psad v2.1.7

[+] Top 50 signature matches:
        [NONE]

[+] Top 25 attackers:
        [NONE]

[+] Top 20 scanned ports:
        [NONE]

[+] iptables log prefix counters:
        [NONE]

    iptables auto-blocked IPs:
        [NONE]

    Total packet counters: tcp: 0, udp: 0, icmp: 0

[+] IP Status Detail:
        [NONE]

    Total scan sources: 0
    Total scan destinations: 0

[+] These results are available in: /var/log/psad/status.out

Um exemplo de email enviado pelo psad de um possível ataque

=-=-=-=-=-=-=-=-=-=-=-= Fri Jan  6 11:51:00 2012 =-=-=-=-=-=-=-=-=-=-=-=


         Danger level: [3] (out of 5)

    Scanned TCP ports: [443: 1 packets]
            TCP flags: [SYN: 1 packets, Nmap: -sT or -sS]
       iptables chain: FORWARD (prefix "FIREWALL: PS E SF"), 1 packets

               Source: 201.80.165.98
                  DNS: c950a562.virtua.com.br
             OS guess: Linux (2.4.x kernel)

          Destination: 172.20.0.201
                  DNS: [No reverse dns info available]

   Overall scan start: Fri Jan  6 11:44:28 2012
   Total email alerts: 36
   Complete TCP range: [80-443]
      Syslog hostname: fw-teste

         Global stats: chain:   interface:   TCP:   UDP:   ICMP:  
                       FORWARD  eth2         150    0      0      

[+] Whois Information (source IP):

% Joint Whois - whois.lacnic.net
%  This server accepts single ASN, IPv4 or IPv6 queries
 
% Brazilian resource: whois.registro.br


% Copyright (c) Nic.br
%  The use of the data below is only permitted as described in
%  full by the terms of use (http://registro.br/termo/en.html),
%  being prohibited its distribution, comercialization or
%  reproduction, in particular, to use it for advertising or
%  any similar purpose.
%  2012-01-06 11:45:09 (BRST -02:00)

inetnum:     201.80/14
aut-num:     AS28573
abuse-c:     GRSVI
owner:       NET Serviços de Comunicação S.A.
ownerid:     000.108.786/0001-65
responsible: Grupo de Segurança da Informação Vírtua
country:     BR
owner-c:     GRSVI
tech-c:      GRSVI
inetrev:     201.80/16
nserver:     ns7.virtua.com.br 
nsstat:      20120106 AA
nslastaa:    20120106
nserver:     ns8.virtua.com.br 
nsstat:      20120106 AA
nslastaa:    20120106
created:     20060427
changed:     20120105

nic-hdl-br:  GRSVI
person:      Grupo de Segurança Vírtua
e-mail:      virtua@virtua.com.br
created:     20080512
changed:     20090518

% Security and mail abuse issues should also be addressed to
% cert.br, http://www.cert.br/, respectivelly to cert@cert.br
% and mail-abuse@cert.br
%
% whois.registro.br accepts only direct match queries. Types
% of queries are: domain (.br), ticket, provider, ID, CIDR
% block, IP and ASN.


=-=-=-=-=-=-=-=-=-=-=-= Fri Jan  6 11:51:00 2012 =-=-=-=-=-=-=-=-=-=-=-=

Podemos acompanhar agora os logs do iptables em /var/log/iptables

tail -f /var/log/iptables
Jan  6 11:58:49 fw kernel: [5609066.829080]  FIREWALL: ACESSO DNS UDP IN=eth1 OUT=eth2 SRC=172.20.0.201 DST=204.x.x.x LEN=81 TOS=0x00 PREC=0x00 TTL=63 ID=33404 PROTO=UDP SPT=25291 DPT=53 LEN=61 
Jan  6 11:58:49 fw kernel: [5609066.829736]  FIREWALL: ACESSO DNS UDP IN=eth1 OUT=eth2 SRC=172.20.0.201 DST=208.x.x.x LEN=85 TOS=0x00 PREC=0x00 TTL=63 ID=21775 PROTO=UDP SPT=5424 DPT=53 LEN=65 
Jan  6 11:58:49 fw kernel: [5609066.927918]  FIREWALL: ACESSO DNS UDP IN=eth2 OUT=eth1 SRC=200.x.x.x DST=172.20.0.201 LEN=72 TOS=0x00 PREC=0x00 TTL=56 ID=0 DF PROTO=UDP SPT=32768 DPT=53 LEN=52 
Jan  6 11:58:49 fw kernel: [5609066.977318]  FIREWALL: ACESSO DNS UDP IN=eth1 OUT=eth2 SRC=172.20.0.201 DST=193.x.x.x LEN=99 TOS=0x00 PREC=0x00 TTL=63 ID=57820 PROTO=UDP SPT=47284 DPT=53 LEN=79 
Jan  6 11:58:49 fw kernel: [5609066.984478]  FIREWALL: ACESSO WEB IN=eth2 OUT=eth1 SRC=200.x.x.x DST=172.20.0.201 LEN=60 TOS=0x00 PREC=0x00 TTL=120 ID=2134 DF PROTO=TCP SPT=50623 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 
Jan  6 11:58:49 fw kernel: [5609066.985718]  FIREWALL: ACESSO DNS UDP IN=eth1 OUT=eth2 SRC=172.20.0.201 DST=193.x.x.x LEN=75 TOS=0x00 PREC=0x00 TTL=63 ID=15736 PROTO=UDP SPT=40897 DPT=53 LEN=55 
Jan  6 11:58:49 fw kernel: [5609067.002125]  FIREWALL: ACESSO WEB IN=eth2 OUT=eth1 SRC=200.x.x.x DST=172.20.0.201 LEN=60 TOS=0x00 PREC=0x00 TTL=120 ID=2135 DF PROTO=TCP SPT=50624 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 

Agora vamos consultar novamente as estatísticas do psad

psad -S
[+] psadwatchd (pid: 23600)  %CPU: 0.0  %MEM: 0.0
    Running since: Fri Jan  6 12:37:05 2012

[+] psad (pid: 23593)  %CPU: 1.8  %MEM: 2.8
    Running since: Fri Jan  6 12:37:05 2012
    Command line arguments: [none specified]
    Alert email address(es): douglas@scitechinfo.com.br

[+] Version: psad v2.1.7

[+] Top 50 signature matches:
        [NONE]

[+] Top 25 attackers:
        [NONE]

[+] Top 20 scanned ports:
      tcp 80    379 packets
      tcp 443   10 packets
      tcp 25    5 packets
      tcp 143   2 packets

      udp 694   312 packets
      udp 53    218 packets
      udp 138   7 packets

[+] iptables log prefix counters:
      "FIREWALL: RESET PORT DESC": 8
      "FIREWALL: PKGS INVALIDOS": 43
      "FIREWALL: ACESSO DNS UDP": 218
      "FIREWALL: ACCESSO DESCON": 319
      "FIREWALL: ACESSO SMTP": 4
      "FIREWALL: PS E SF": 11
      "FIREWALL: ACESSO WEB": 371
      "FIREWALL: ACESSO IMAP": 2

    iptables auto-blocked IPs:
        [NONE]

    Total packet counters: tcp: 396, udp: 537, icmp: 0

[+] IP Status Detail:
        [NONE]

    Total scan sources: 0
    Total scan destinations: 0

[+] These results are available in: /var/log/psad/status.out

Caso tenhamos algum ip em iptables auto-blocked podemos remove com psad -F, podemos obter mais opções com psad -h.