Alta disponibilidade e segurança com Nginx e Naxsi

Além de servir como um servidor web leve e versátil o Nginx é muito poderoso como proxy-reverso. Também podemos utilizá-lo como um sistema de balanceamento de carga de excelente performance.

Neste post mostrarei como criar um ambiente não só de balanceamento de carga com failover, como também irei incrementá-lo com uma camada de segurança usando o WAF Naxsi.

nginxha

Instalação

aptitude install nginx-naxsi

Habilitar o balanceamento de carga é muito simples bastando para isso incluir a diretiva upstream no vhost do site. Ele possibilita diversos tipos de configurações:

Esse é caso mais simples onde os backends serão tratados como um único host.

upstream acme {
        server 192.168.0.2;
        server 192.168.0.3;
        server 192.168.0.4; 
        }

A entidade acme agora será tratada como upstream servindo de referência para o parâmetro proxy_pass como mostra o exemplo abaixo:

server {
  listen acme:80;
  access_log /var/log/nginx/nginx.log;
  
  location / {
    proxy_pass http://acme;
  }
}

Para o cliente sempre manter a conexão no mesmo backend utiliza-se o parâmetro hash_ip.

upstream acme {
        hash_ip;
        server 192.168.0.2;
        server 192.168.0.3;
        server 192.168.0.4; 
        }

Prioridade e Failover

Para definir a prioridade de cada backend utiliza-se o parâmetro weight o valor padrão é 1. No exemplo abaixo as 3 primeiras requisições serão enviadas para o servidor 192.168.0.2, a 4a e 5a para o 192.168.0.3 e a 6a. para o 192.168.0.4.

upstream acme {
        hash_ip;
        server 192.168.0.2 weight=3;
        server 192.168.0.3 weight=2;
        server 192.168.0.4; 
        }

O failover é habilitando usando os parâmetros max_fails define o total de falhas na requisição e fail_timeout define o intervalo de tempo entre as falhas a partir dai a requisição é enviada para o próximo backend.

upstream acme {
        hash_ip;
        server 192.168.0.2 max_fails=3  fail_timeout=30s;
        server 192.168.0.3;
        server 192.168.0.4; 
        server 192.168.0.5 down;
        }

O parâmetro down é utilizado quando um backend está inacessível.

Naxsi

O Naxsi é um Web Application Firewall para o Nginx criado pelo Thibault Koechlin. Uma das grandes vantagens é que ele segue o modelo positivo de segurança aprendendo como a aplicação funciona e criando regras baseadas no comportamento (whitelist-based), ele não utiliza assinatura dos ataques (blacklist-based) como um AV por exemplo.

Habilitar esse WAF é muito simples bastando apenas adicionar a seguinte linha no arquivo nginx.conf:


include /etc/nginx/naxsi_core.rules;

E no arquivo do vhost

 location / {
     include    /etc/nginx/naxsi.rules;
     proxy_pass  http://acme/;
     ...
     }

#Naxsi Learning Mode 

  location /RequestDenied {
   proxy_pass http://127.0.0.1:4242;
   }

A opção Learning Mode permite ao Naxsi aprender o funcionamento da aplicação criando novas regras de whitelist.

Outra ferramenta bastante útil é o nx_util, ele é um parser que lê o arquivo de erro dos sites, atualiza uma base de dados sqlite, gera novas regras de whitelist e exporta os dados para a tela ou para um arquivo html muito bacana.

wget https://naxsi.googlecode.com/files/nx_util-0.3.tgz
tail /var/log/nginx/acme.error.log | nx_util.py -d naxsi_ui -l -i -o -H /var/www/acme.html

naxsi_ui

Visualizando os dados na console

tail /var/log/nginx/naxsi.error.log | nx_util.py -d naxsi_ui -l -i -o
Using stdin.
Committing to db ...
########### Optimized Rules Suggestion ##################
# total_count:1 (50.0%), peer_count:1 (100.0%) | simple quote
BasicRule wl:1306 "mz:$URL:/vulnerabilities/sqli/|$ARGS_VAR:id";
# total_count:1 (50.0%), peer_count:1 (100.0%) | simple quote
BasicRule wl:1013 "mz:$URL:/vulnerabilities/sqli/|$ARGS_VAR:id";

OBS1: Para acessar o html utilizei o lighttpd configurando-o na porta 8080.

OBS2: Para evitar problemas com o WordPress existem regras específicas que podem ser encontradas neste blog

Abaixo seguem os arquivos de configuração completos:

Nginx

/etc/nginx/nginx.conf
user  nginx;
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    tcp_nodelay on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

# Protecao contra DoS
    client_body_buffer_size 1K;
    client_header_buffer_size 1k;
    client_max_body_size 2M;
    large_client_header_buffers 2 1k;
    client_body_timeout 10;
    client_header_timeout 10;
    keepalive_timeout 5 5;
    send_timeout 10;

    server_tokens off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

    proxy_max_temp_file_size 0;

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;

    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
    proxy_cache_methods GET HEAD POST;

# Naxsi WAF

    include /etc/nginx/naxsi_core.rules;

}

Vhost

/etc/nginx/sites-available/acme
upstream acme {
        hash_ip;
        server 192.168.0.2 weight=5;
        server 192.168.0.3 max_fails=3  fail_timeout=30s;
        server 192.168.0.4; 
        }

server {
    listen       80;
    server_name  acme;

    access_log  /var/log/nginx/acme.access.log  main;
    error_log  /var/log/nginx/acme.error.log;

    location / {
     include    /etc/nginx/naxsi.rules;
     proxy_pass  http://acme/;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;	
}

#Naxsi Learning Mode 

  location /RequestDenied {
   proxy_pass http://127.0.0.1:4242;
   }
}

Posted in Uncategorized | Tagged , , , , , , , , , , , , , | Comments Off

Criando regras para ips dinâmicos no iptables

Uma boa prática de segurança é limitar o acesso a consoles administrativas ou conteúdo privado para origens específicas, mas como fazer isso no iptables quando seu ip é dinâmico?

Existe um patch que amplia o suporte do iptables até a camada de aplicação, só é que necessário recompilar o kernel o que dá um certo trabalho.

Passei pelo mesmo problema e encontrei uma solução que vem funcionando muito bem.

Usando os scripts abaixo as regras do iptables serão atualizadas sempre que houver mudança no ip de origem.

RedHat e derivados

Crie o arquivo /usr/bin/dynamic_iptables.py com o conteúdo abaixo. Ele será responsável por verificar se o ip foi modificado e irá reiniciar o iptables.

Altere o valor da variável home_dyndns com o nome do host criado no seu serviço de DNS dinâmico ( e.g. no-ip ou dyndns )

#!/usr/bin/python

import os

def gettextoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
    pipe = os.popen(cmd + ' 2>&1', 'r')
    text = pipe.read()
    if text[-1:] == '\n': text = text[:-1]
    return text

home_dyndns = "acme.no-ip.org"
log_dyndns = "/tmp/iptables_noip_update.log"
last_dyndns = gettextoutput("cat " + log_dyndns)
cur_dyndns = gettextoutput("host " + home_dyndns)

print "Log: "+ last_dyndns
print "Cur: "+ cur_dyndns

if last_dyndns == cur_dyndns:
    print "IPs match, no restart necessary"
else:

    print "Updating last IP with current"
    os.system("echo '" + cur_dyndns + "' > " + log_dyndns)
    print "Restarting iptables to update"
    os.system("/etc/init.d/iptables restart")

Crie o arquivo /usr/bin/update_rules.sh que será responsável pela atualização das regras do iptables com o novo endereço de origem.

Altere o valor da variável HOSTNAME com o nome do host criado no seu serviço de DNS dinâmico ( e.g. no-ip ou dyndns )

#!/bin/bash

HOSTNAME=acme.no-ip.org
LOGFILE=/tmp/iptables_noip_update.log

Current_IP=$(host $HOSTNAME | cut -f4 -d' ')

if [ $LOGFILE = "" ] ; then
iptables -I INPUT -i eth0 -s $Current_IP -j ACCEPT
echo $Current_IP > $LOGFILE
else

Old_IP=$(cat $LOGFILE)

if [ "$Current_IP" = "$Old_IP" ] ; then
echo "IP address has not changed"
else
iptables -D INPUT -i eth0 -s $Old_IP -j ACCEPT
iptables -I INPUT -i eth0 -s $Current_IP -j ACCEPT
echo $Current_IP > $LOGFILE
echo "iptables have been updated"
fi

No Redhat as regras do iptables são armazenadas no arquivo /etc/sysconfig/iptables criado usando o comando iptables-save. Quando o serviço for reiniciado as regras contidas neste arquivo serão reaplicadas.

Debian e derivados

Para rodar no Debian foi preciso fazer pequenas adaptações nos scripts.

Crie o arquivo /usr/bin/dynamic_iptables.py com o conteúdo abaixo.

Altere o valor da variável home_dyndns com o nome do host criado no seu serviço de DNS dinâmico ( e.g. no-ip ou dyndns )

#!/usr/bin/python
import os

def gettextoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
    pipe = os.popen(cmd + ' 2>&1', 'r')
    text = pipe.read()
    if text[-1:] == '\n': text = text[:-1]
    return text

home_dyndns = "acme.no-ip.org"
log_dyndns = "/tmp/iptables_noip_update.log"
last_dyndns = gettextoutput("cat " + log_dyndns)
cur_dyndns = gettextoutput("host " + home_dyndns)

print "Log: "+ last_dyndns
print "Cur: "+ cur_dyndns

if last_dyndns == cur_dyndns:
    print "IPs match, no restart necessary"
else:
    print "Updating last IP with current"
    os.system("echo '" + cur_dyndns + "' > " + log_dyndns)

Crie o arquivo /usr/bin/update_rules.sh.

Altere o valor da variável HOSTNAME com o nome do host criado no seu serviço de DNS dinâmico ( e.g. no-ip ou dyndns )

#!/bin/bash

HOSTNAME=acme.no-ip.org
LOGFILE=iptables_noip_update.log

Current_IP=$(host $HOSTNAME | cut -f4 -d' ')

if [ $LOGFILE = "" ] ; then
iptables -I INPUT -i eth0 -s $Current_IP -j ACCEPT
echo $Current_IP > $LOGFILE
else

Old_IP=$(cat $LOGFILE)

iptables -D INPUT -i eth0 -s $Old_IP -j ACCEPT
iptables -I INPUT -i eth0 -s $Current_IP -j ACCEPT
echo $Current_IP > $LOGFILE
echo "iptables have been updated"
fi

Agendamento

Para automatizar o processo de atualização crie agendamentos no /etc/crontab ou no crontab do usuário root usando o comando sudo crontab -e

* 8 * * * /usr/bin/dynamic_iptables.py > /tmp/dynamic_iptables.log
* * * * * /usr/bin/update_rules.sh > /tmp/dynamic_rules.log

Referências

Using IPTables with Dynamic IP hostnames like dyndns.org

L7-filter Kernel Version HOWTO

Posted in Uncategorized | Tagged , , , , , , , , , | Comments Off

Otimizando a detecção de ataques de SQLi com evasão do Ossec HIDS

SQL injection é uma das vulnerabilidades mais difundidas e exploradas em aplicações Web, não é muito difícil encontrar esta falha em diversos CMSs, plugins e códigos de sites espalhados pela internet.

 

Ferramentas de proteção como WAFs e IDS/IPS possuem regras que alertam ou bloqueiam este tipo de ataque, porém existem diversas técnicas evasivas que permitem o concretização do ataque como:

 

  • White Space Manipulation;
  • URL encoding;
  • Unicode/UTF-8;
  • Hex Encoding;
  • char() function;
  • Comment Exploitation;
  • Concatenation, etc.

O SQLmap, uma das melhores ferramentas para este tipo de ataque, possui um pool de scripts de evasão ( tamper ) bastante interessante.

 

Aproveitei o laboratório da apresentação que farei no Flisol para melhorar a detecção destes ataques e acabei criando algumas regras que otimizaram o tempo de identificação e o bloqueio. As regras atuais conseguem identificar o ataque, porém o delay entre a identificação e o bloqueio é um pouco alto, usando mais de um tamper e outras opções como o aumento do intervalo das requisições por exemplo piora ainda mais detecção.

 

Estas novas regras foram aprovadas pelo upstream do Ossec HIDS estando disponíveis no repositório do projeto e serão publicadas no novo release que está na versão alfa.

 

Quem estiver interessado em utilizar ou testar apenas adicione as linhas abaixo no arquivo /var/ossec/rules/local_rules.xml.

 

<group name=”attack,sqlinjection,”>

   <rule id=”160001″ level=”6″>

     <if_sid>31100</if_sid>

<url>=%27|select%2B|insert%2B|%2Bfrom%2B|%2Bwhere%2B|%2Bunion%2B</url>

     <description>SQL injection attempt.</description>

   </rule>

   <rule id=”160002″ level=”6″>

     <if_sid>31100</if_sid>

<url>%EF%BC%87|%EF%BC%87|%EF%BC%87|%2531|%u0053%u0045</url>

    <description>SQL injection attempt.</description>

   </rule>

</group>

Sugestões e melhorias serão sempre bem vindas! =P

Posted in Uncategorized | Tagged , , , , , , , , , , , , | 1 Comment

Linode Pwned!

Hoje o Linode anunciou que seu ambiente de administração de servidores foi invadido. O cracker “ryan” que se diz do grupo HTP ( Hack the Planet ) assumiu a autoria do ataque com o objetivo obter informações de cartões de crédito e senhas de acesso.

Segundo o anúncio os dados dos cartões são mantidos criptografados usando chave pública e privada dentro do banco de dados e as chaves públicas são auto-encriptadas com senhas complexas. Além destas informações o cracker obteve acesso nos servidores web e “parte” do código-fonte das aplicações do Linode.

A falha explorada do Adobe ColdFusion ( CVE-2013-1387, CVE-2013-1388) foi recentemente divulgada e corrigida, ela permite o ‘bypass’ da autenticação na console administrativa.

Para os usuários deste datacenter é recomendando acompanhar as informações do cartão de crédito cadastrado, trocar a senha de acesso da dashboad usando senhas complexas, monitorar o consumo de recursos do servidor e rezar.

Para os usuários do ColdFusion é de extrema importância a atualização do ambiente, já que após explorado o servidor poderá ser utilizado para práticas criminosas ( Spam, botnet, etc ).

Não fico surpreso com esta notícia, já que a gestão de vulnerabilidades é quase que totalmente negligenciada por todos, seja ele um grande ou pequeno provedor.

Referências:

CVE-2013-1387

CVE-2013-1388

Hackers Claim to Have Gained Access to Linode Customer Passwords, Credit Cards

Blog Linode – Security Incident Update

Adobe Security Bulletin

Posted in Uncategorized | Tagged , , , , , , | Comments Off

Implementando uma cloud privada usando o Owncloud

O conceito de computação em nuvem ( cloud computing ) vêm se expandido e permitindo que diversos serviços sejam ofertados na internet de forma gratuita ou por um baixo custo.

Mesmo existindo todo um conceito de segurança baseado nas melhores práticas, que nem sempre são seguidas diga-se de passagem, não é muito recomendado manter dados confidencias ou estratégicos dentro de nuvens públicas.

A grande questão é:

Porque não manter seus dados dentro de sua própria nuvem, garantindo assim a segurança dos dados?

O Owncloud é um sistema opensource multiplataforma que permite a criação de nuvens privadas de forma muito simples através dos diversos recursos disponíveis.

Instalação

sudo aptitude install apache2 php5 php-pear php-xml-parser php5-sqlite php5-json sqlite php5-mysql mp3info curl libcurl3 libcurl3-dev php5-curl zip php5-gd

ANTES DE CONTINUAR NÂO ESQUEÇA DE FAZER O HARDENING!!!

wget -c http://owncloud.org/releases/owncloud-latest.tar.bz2

sudo tar xvf owncloud-latest.tar.bz2 -C /var/www/

cd /var/www/ && sudo chown -R www-data. owncloud && sudo chmod -R 755 owncloud

sudo apache2ctl restart

Acesse o endereço http://IP_SERVIDOR/owncloud e crie um usuário e senha administrativa.

Agora o Owncloud está pronto para uso!

Posted in Uncategorized | Tagged , , , , | 1 Comment

Testando a ferramenta de proteção multi-tarefa Artillery

Lançado em outubro de 2011 por Dave Rel1k ,também criador do Social-Engineer Toolkit (SET) ,o Artillery foi desenvolvido com o objetivo de funcionar como ferramenta de monitoramento, honeypot e proteção.

A versão 0.6.1 disponibiliza os seguintes módulos:

* File System Monitoring
* Hardening
* Honeypot
* Anti-DoS
* Anti SSH Brute Force

Ele também é responsável por alimentar um feed com informações dos ataques para a empresa do Rel1k a Trustedsec.

Estes módulos podem ser utilizados em conjunto ou individualmente, para entender melhor suas funcionalidades eles foram testados separadamente.

Instalação

A instalação do Artillery é muito simples bastando somente clonar o repositório svn e executar o arquivo setup.py

svn co http://svn.trustedsec.com/artillery artillery/

cd artillery

./setup.py

Welcome to the Artillery installer. Artillery is a honeypot, file monitoring, and overall security
tool used to protect your nix systems.

Written by: Dave Kennedy (ReL1K)

Do you want to install Artillery and have it automatically run when you restart [y/n]: y

Do you want to keep Artillery updated? (requires internet) [y/n]: y

[*] Finished. If you want to update Artillery go to /var/artillery and type ‘svn update’

Would you like to start Artillery now? [y/n]: n

Configuração

Todas as funcionalidades são habilitadas por padrão, para os testes editei o arquivo de configuração deixando somente um módulo habilitado.

No exemplo abaixo habilitei somente o módulo File System Monitor, adicionei o diretório /tmp no monitoramento desabilitando os outros módulos.

DICA: Mesmo informando o NO ou OFF recomendo comentar as linhas referentes as portas, o sistema não é muito obediente e abre as portas mesmo com o honeypot desabilitado.

OBS: Não foi necessário utilizar o envio de alertas por email, todas as informações necessárias foram gravadas no arquivo de log alerts.log.

MONITOR=YES

MONITOR_FOLDERS=”/var/www”,”/etc/”,”/tmp”

MONITOR_FREQUENCY=60

HONEYPOT=NO

HONEYPOT_BAN=NO

WHITELIST_IP=127.0.0.1,localhost

#PORTS=”135,445,22,1433,3389,8080,21,5900,25,53,110,1723,1337,10000,5800,44443″

EMAIL_ALERTS=OFF

SSH_BRUTE_MONITOR=OFF

SSH_BRUTE_ATTEMPTS=4

AUTO_UPDATE=ON

ANTI_DOS=OFF

ANTI_DOS_PORTS=80,443

ANTI_DOS_THROTTLE_CONNECTIONS=50

ANTI_DOS_LIMIT_BURST=200

ACCESS_LOG=/var/log/apache2/access.log

ERROR_LOG=/var/log/apache2/error.log

BIND_INTERFACE=”"

THREAT_INTELLIGENCE_FEED=ON

THREAT_FEED=”https://www.trustedsec.com/banlist.txt”

THREAT_SERVER=”OFF”

THREAT_LOCATION=”/var/www/”

Após a configuração, é só executar o arquivo artillery.py.

./artillery.py &

Para parar o serviço recomendo usar o kill porque o script de inicialização é muito fraco, ele só foi criado para inciar o serviço.

pgrep artillery

25556

kill -9 2556

Hardening

Responsável por varrer o sistema criando alertas no arquivo /var/artillery/logs/alerts.log com dicas de hardening do sistema.

cat /var/artillery/logs/alerts.log

[!] Insecure configuration detect on filesystem: Issue identified: /etc/ssh/sshd_config allows RootLogin. An attacker can gain root access to the system if password is guessed. Recommendation: Change RootLogin yes to RootLogin no

Issue identified: /etc/ssh/sshd_config. SSH is running on the default port 22. An attacker commonly scans for these type of ports. Recommendation: Change the port to something high that doesn’t get picked up by typical port scanners.

Issue identified: /var/www/site/includes/configure.php permissions are not set to root. If an attacker compromises the system and is running under the Apache user account, could view these files. Recommendation: Change the permission of /var/www/site/includes/configure.php to root:root. Command: chown root:root /var/www/site/includes/configure.php

File System Monitor

Este módulo é responsável por monitorar os diretórios informados no arquivo de configuração (/var/www, /etc/ e /tmp ), emitindo alertas se algum arquivo for modificado. Uma base de dados é criada em /var/artillery/database/integrity.database com o checksum de todos os arquivos.

cat /var/artillery/database/integrity.database

/etc/group:c598ff5224a5380a49546b7e1f4b045d72795c73a2bf72a23f041881ce9682b057a25df880cb2e5807a6fc407c6beab09273e423b2f188950d4e0eca7e4aac5b

/etc/profile.d/bash_completion.sh:1d93a773191eea24d2df194239e0e9f16adc6210ecada55f6e499705be0cc98a61665f2f2646b2e4af6413fe97424c980f1961820eab7534383938f4458f1c62

Honeypot

Este módulo pode ser configurado para bloquear ou não a tentativa de exploração do pseudo-serviço.

# DO YOU WANT TO TURN ON THE HONEYPOT
HONEYPOT=ON
#
# DO YOU WANT TO AUTOMATICALLY BAN ON THE HONEYPOT
HONEYPOT_BAN=OFF
#
# WHITELIST IP ADDRESSES, SPECIFY BY COMMAS ON WHAT IP ADDRESSES YOU WANT TO WHITELIST
WHITELIST_IP=127.0.0.1,localhost
#
# PORTS TO SPAWN HONEYPOT FOR
PORTS=”135,445,22,1433,3389,8080,21,5900,25,53,110,1723,1337,10000,5800,44443″

netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:5800 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:37864 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:36074 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1337 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1433 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:44443 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:46044 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:135 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN

Testando

nc 192.168.0.6 5800

O sistema informa que a tentativa de conexão foi bloqueada, porém como a resposta automática foi desabilitada somente um alerta é criado no arquivo de log.

cat /var/artillery/logs/alerts.log

2012-09-20 23:21:55.623614 [!] Artillery has blocked (and blacklisted the IP Address: 192.168.0.2 for connecting to a honeypot restricted port

Após habilitar a resposta automática e tentar conectar o pseudo-serviço novamente, o sistema grava o ip de origem em /var/artillery/banlist.txt e cria uma regra no iptables.

SSH Brute Force Monitor

Módulo responsável por monitorar e bloquear ataques de SSH Brute Force.

Testando

Ataque

hydra -l root -P passlist.txt 192.168.0.6 ssh

Hydra (http://www.thc.org/thc-hydra) starting at 2012-09-21 19:59:34
[DATA] 16 tasks, 1 server, 3157 login tries (l:1/p:3157), ~197 tries per task
[DATA] attacking service ssh on port 22
[22][ssh] host: 192.168.0.6 login: root password: password
[STATUS] attack finished for 192.168.0.6 (waiting for children to finish)
1 of 1 target successfuly completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2012-09-21 19:59:48

Proteção

Artillery has blocked (blacklisted) the following IP for SSH brute forcing violations: 192.168.0.2

Anti-DOS

Módulo responsável por monitorar e “proteger” contra ataques de DoS nas portas 80 e 443. Este módulo simplesmente cria a seguinte regra do iptables:

iptables -A ARTILLERY -p tcp –dport %s -m limit –limit %s/minute –limit-burst %s -j ACCEPT

As váriveis são preechidas de acordo com as seguintes linhas do arquivo de configuração:

ANTI_DOS_PORTS=80,443

ANTI_DOS_THROTTLE_CONNECTIONS=50

ANTI_DOS_LIMIT_BURST=200

Durante os testes as ferramenta controlou alguns testes com o Pyloris e HULK, isso não significa que ele resistirá a um ataque massivo de DoS.

Conclusões

Durante os testes conclui facilmente que o Artillery precisa melhorar muito comparado a outras ferramentas mais maduras como o Honeyd, Ossec, Samhain, AIDA, Fail2ban, Modsecurity entre outras.

No meu ponto de vista ele ainda não está preparado para ser utilizado em ambientes de produção ou de alta criticidade por possui falhas na implementação, destaco abaixo algumas delas:

O script de inicialização simplesmente não para nem incia o serviço durante o boot.

cat /etc/init.d/artillery

#!/bin/sh
cd /var/artillery
sudo python artillery.py &
echo “Starting Artillery, it may take a few moments for it to come online…”

Automaticamente a ferramenta cria regras de bloqueio no iptables usando os 10416 ips existentes no arquivo /var/artillery/banlist.txt. O grande problema é que ele mantém as regras na memória e após alguns bloqueios, sucessivos erros ocorrem e novas regras não são criadas.

Não existe um tempo limite para a remoção da regra, então todas elas precisam ser removidas manualmente. O script remove_ban.py responsável por esta tarefa falha em alguns momentos.

O envio de email falha mesmo configurando os dados corretamente no arquivo de configuração.

Como informei anteriormente as portas do honeypot são habilitadas mesmo com o módulo desativado.

O tempo de resposta da detecção ao bloqueio durante os testes de brute force foi muito grande.

Enfim recomendo o uso do Artillery como ferramenta de aprendizado da linguagem Python, pois os códigos dos módulos são bastante simples e intuitivos.

Referências

https://www.trustedsec.com/downloads/artillery/

http://thehackernews.com/2012/02/confusing-attackers-with-artillery-by.html

Posted in Uncategorized | Tagged , , , , , , , , , , , | Comments Off

Software Freedom Day (SFD) 2012 – Salvador

O Software Freedom Day (SFD) é uma celebração mundial do Software Livre e do Código Aberto (Free and Open Source Software – FOSS).

O SFD têm como objetivo educar o público em todo o mundo
sobre os benefícios do uso de software livre de alta qualidade na
educação, no governo, em casa, e nos negócios.

Em Salvador este evento ocorrerá dia 15/09 ( sábado ) na Faculdade FTC Paralela.

Maiores informações:
Software Freedom Day Salvador

Posted in Uncategorized | Tagged , , , , , , , | Comments Off

Debian Day 2012 em Salvador

Fonte: http://deb.li/ddssa2012

Debian

Contamos com sua presença! =)

Sobre o evento

O Debian Day é a celebração anual do aniversário do Projeto Debian, que em 2012 completa 19 anos. O evento acontece simultaneamente em diversas cidades do mundo, e tem o objetivo de discutir assuntos relacionados ao Debian, e principalmente, atrair novos colaboradores.

O Debian Day em Salvador:

Data: 18/08/2012, das 10:00h às 16:00h
Local: Auditório da Faculdade Regional da Bahia (UNIRB). Av. Tamburugy, 474 – Patamares – Salvador/BA. Veja no mapa
URL para divulgação: http://deb.li/ddssa2012

Programação

10:00» Debian & Ubuntu — Alexandro Silva
11:00» Produção gráfica e Debian? Está tudo lá! — Aurélio Heckert.
12:00-14:00» intervalo para almoço
14:00» Debian: 19 anos e contando — Antonio Terceiro
15:00» Perguntas e Repostas sobre o Debian — discussão
Resumos das palestras

Debian & Ubuntu

Palestrante: Alexando Silva.

Resumo: em breve

Produção gráfica e Debian? Está tudo lá

Palestrante: Aurélio Heckert. Desenvolvedor, grafista digital e divulgador do software livre. Participa do time de desenvolvimento do Noosfero e Inkscape, além de colaborar com vários outros projetos e grupos de usuários. É co-fundador e colaborador do PSL-BA, TWikiBrasil, Inkscape Brasil e da COLIVRE – Cooperativa de Tecnologias livres.

Resumo: Muitos já falam sobre produção gráfica com SL e frequentemente citam Distros mais populares ou distros focadas em multi-media. Por que não usar Debian? O slogan “The Universal Operating System” não foi dado a-toa.

Debian: 19 anos e contando

Palestrante: Antonio Terceiro. Desenvolvedor Debian. Sócio da Colivre, onde Desenvolve software livre profissionalmente. Doutor em Engenharia de Software pela UFBA.

Resumo: uma visão geral do projeto Debian, seus valores e seu papel no ecossistema do software livre.

Perguntas e respostas sobre o Debian

Esta atividade será um debate livre. A idéia é tirar dúvidas, responder perguntas e trocar idéias sobre o Debian e como colaborar. Vale tirar dúvidas técnicas também.

Certificados de participação

Participantes que necessitam de um certificado de participação devem adotar o seguinte procedimento:

Fazer o download do modelo de certificado
Imprimir, preencher o seu nome e trazer o certificado impresso
Solicitar assinatura ao final do evento

Sobre o projeto Debian

O Projeto Debian foi fundado em 1993 por Ian Murdock para ser um projeto comunitário verdadeiramente livre. Desde então, o projeto cresceu e se tornou um dos maiores e mais influentes projetos de software livre. Milhares de voluntários de várias partes do mundo trabalham juntos para criar e manter software no Debian. Traduzido em 70 idiomas, e oferecendo suporte a uma grande variedade de tipos de computadores, o Debian se denomina o “sistema operacional universal”.

Posted in Uncategorized | Tagged , , , , , , , | Comments Off

O mito do “apagão de talentos”

Fonte: Blog Jump!

Converse com um analista de RH, com um empresário ou com um proeminente executivo de grande empresa por mais de 20 minutos e você ouvirá a expressão do título desta postagem. A pessoa discorrerá sobre como há uma carência de profissionais preparados no Brasil, sobre como é difícil encontrar gente competente para posições que exigem algum preparo, enfim. Ela comentará que há um “apagão de talentos”, uma falta de pessoas preparadas para crescer e ocupar posições de responsabilidade e destaque.

Falarei futuramente sobre a visão de negócio dos empresários brasileiros, que é curta. Sobre a insipidez geral dos profissionais de RH, reduzidos a contratadores e demitidores em série e calculadores de benefícios legais de departamento pessoal. Sobre a falta de adaptação da alta-gerência à uma nova realidade empresarial que nasceu nos EUA na década de 1990 e agora chega aqui. Sobre a direção das empresas, crente que os profissionais do mercado não evoluíram nada nos últimos anos.

Mas neste momento quero focar em como o meio empresarial se apropria de modismos de revista para moldar uma situação alternativa à realidade do mercado. O mais forte dos modismos atuais é culpar o Apagão de Talentos pela inabilidade das empresas em angariar e reter bons profissionais em seus quadros.

A culpa é do mercado
A maioria das empresas, especialmente as grandes, gosta de culpar o mercado ou os concorrentes por seus próprios problemas. Não conseguir suprir suas áreas com trabalhadores de qualidade, em ritmo igual ao de demissões, é algo cuja culpa rapidamente se atribui a terceiros. O próprio ritmo das demissões deveria ser um indicativo de que a “política para retenção de talentos” da empresa tem algum problema. Se somos tão bons em reter talentos porque tantas pessoas vão embora? É uma pergunta que não é feita com a frequência necessária nos departamentos de RH.

“Nós não pagamos pouco, não oferecemos poucos benefícios, não temos um nome ruim no mercado profissional, não somos vistos como uma empresa que exige demais com metas nem sempre justas. Não! Nada disso! Nós não conseguirmos contratar novos profissionais com qualidade porque eles não estão lá fora!”

 

É cômodo e fácil colocar a culpa em terceiros. E, assim que a primeira revista “especializada” deu a deixa, todo mundo o fez.

Bons profissionais são como qualquer bom ativo
Eles estão lá fora. Mas você precisa procurar por eles. A maioria das empresas coloca um anúncio em sites de emprego ou empresas especializadas em Head Hunting que é mais ou menos assim:

Gerente de Projetos de Automação.
O profissional será responsável por gerenciar projetos de automação de dispositivos respondendo ao Diretor Industrial pelo andamento, orçamento, e entrega dos projetos afim de manter os equipamentos em funcionamento. Ocasionalmente vai ter de trabalhar até tarde, incluindo em fins de semana, para terminar a implementação de projetos junto à equipe de técnicos industriais. Disponibilidade para viagens é mandatória.

Perfil
Formado em Engenharia. Pós graduação em Gestão de Projetos ou MBA serão considerados diferencial. Experiência de 3 anos é fundamental. Inglês fluente é mandatório.

Benefícios compatíveis com o mercado e remuneração à combinar.

 

Ora, esse tipo de anúncio de emprego dá muitos indícios sobre a “política de retenção de talentos da empresa”. A empresa quer alguém ultra responsável que irá se reportar diretamente a alguém que facilmente ganha 3 vezes mais que ela. Com alguma chance de, em muito tempo de trabalho, ascender à essa mesma posição. Essa pessoa será responsável por uma função muito importante para o ciclo produtivo que facilmente gera receita de dezenas de vezes sua remuneração total anual. É uma posição bastante importante para o ciclo produtivo do contratante.

Ainda assim, note que a empresa pede alguém com 3 anos de experiência na posição, ou seja, enquanto inglês fluente é mandatório o desejo de evoluir profissionalmente é totalmente opcional. Trabalhar mais de 8 horas por dia é lugar comum e concordar em abrir mão do convívio familiar está implícito. E, por fim, a remuneração à combinar é prova clara de que a pessoa que reúna todas essas condições ainda será paga com o menor salário que seja possível considerando seu rendimento atual e sua vontade de mudar de emprego. Se na entrevista o funcionário mostrar grande descontentamento com seu empregador atual isso provavelmente reduzirá o valor que a empresa está disposta a pagar ao candidato.

Com tudo isso o responsável pela vaga vai ressaltar que é muito difícil achar profissionais que atendam ao nível de responsabilidade, experiência e requisitos da posição pelo salário que a empresa está disposta a pagar. Está criado o Apagão de Talentos artificial do qual estou falando. Se a vaga citada possuir um salário atraente, em nível daqueles pagos em outros países, garanto que não faltarão profissionais enviando currículos para a empresa.

O problema é que as empresas, ao comprarem seus ativos, normalmente olham para a qualidade e quando vão contratar pessoas olham para o preço. Reclamam que não encontram os profissionais que precisam mas nunca se dispõe a rever a forma como avaliam os processos de contratação.

Muitas empresas vêem os funcionários como máquinas impressoras, com as quais se deve gastar o menos possível, como com toner remanufaturado. Que quando derem problemas serão facilmente substituídos. Deveriam ver o patrimônio humano como se fosse o predial. Que tem potencial de servir por anos desde que receba a “manutenção” adequada.

Entretanto a maioria das empresas se porta como uma solteirona de 50 anos que não queria nada mais do que um homem bonito, educado, elegante, cheiroso, cavalheiro, com um bom dinheiro e que fosse fiel. Ao não encontrar o que deseja, pois suas exigências estão altas demais, brada que está “faltando homem no mercado”. Agora sim a semelhança se fez notar, não é mesmo?

Prova dos Nove
Eu já pensava muito sobre isso simplesmente observando o mercado de trabalho em Florianópolis, cidade onde vivo. Como já trabalhei em São Paulo e em Curitiba tenho uma perspectiva privilegiada. Já pude observar processos de contratação de grandes multinacionais que usam como referência os salários que pagam à seus funcionários em outros países. Toleram pagar um pouco mais à seus empregados no Brasil. Como Florianópolis tem um número de grandes empresas estrangeiras (GEEs) menor do que outras capitais do Sul e Sudeste tem também a menor média salarial destas duas regiões.

Diferente de empresas locais, que muitas vezes se preocupam em pagar o menor salário possível aos contratados, as empresas multinacionais normalmente possuem tabelas de valores-base para posições importantes na cadeia de negócios. Isso faz com que um mercado local pequeno, como o de Florianópolis, jogue luzes nesse tipo de diferença. Vou ilustrar com um exemplo. Em Florianópolis é fácil encontrar gerentes de contas PJ de grandes bancos que ganham, com 5 anos de experiência na função, US$2,5mil/mês ou US$32.500 por ano para administrar carteiras que giram 10 ou 20 milhões de dólares/mês. É uma remuneração baixa para o nível de responsabilidade da função e não por acaso os bancos encontram dificuldades em recrutar profissionais para estas posições na região.

Sei de vagas que estão abertas há quase 8 meses e ainda sem previsão de contratação. Em contra-partida, já vi anúncios de gerentes de controladoria de empresas em São Paulo que pagam US$55.000 por ano exigindo o mesmo nível de experiência que a posição de gerente de banco. E eu entendo que as responsabilidades envolvidas na controladoria são menores simplesmente porque você tem apenas um patrão a quem prestar contas, enquanto na gerência de contas você é cobrado por duas partes que possuem interesses quase sempre contrapostos.

Este é apenas um indício de que os baixos salários em relação às exigências das vagas faz os profissionais escassearem. Entretanto há outra evidência. O Google Brasil reporta receber mais de 1.200 currículos todos os meses de pessoas interessadas em trabalhar em um de seus escritórios. Pode, com todas as letras e cores, escolher quem contratar. O contraste em relação ao banco que tem a vaga aberta por 8 meses é a materialização da cultura corporativa e a forma como a empresa olha para os funcionários. Voltarei nisso em um instante.

O Google faz coisas de forma diferente, até na área de recursos humanos. Um funcionário recebe um prêmio de até R$5mil quando uma indicação sua termina em contratação. No Natal de 2009 cada funcionário da empresa recebeu de presente o smartphone que o Google vendia, o NexusOne. Pense sobre a última coisa que você ganhou do seu empregador. Entendeu porque o Google consegue ter uma fila de pessoas se candidatando todos os dias?

Como ver o funcionário
Empresas criativas vêem o funcionário como um agente de novas idéias. Fala-se muito no discurso corporativo sobre o valor que as idéias tem (lembre do slogan do Santander: O Valor das idéias) e sua importância para os negócios. E se a empresa precisa de idéias para usar como combustível da inovação os funcionários ganham valor. Não há muitas empresas assim no Brasil pois elas estão em um novo pedaço da economia capitalista que ainda não floresceu por aqui.

As empresas da economia tradicional muitas vezes olham para as pessoas apenas como partes de suas estruturas, complementos dos processos. E como tal, podem entender que muitas vezes eles atrapalham o funcionamento dos processos e precisam ser substituídos por pessoas que se adaptem melhor ao jeito como as coisas são feitas. Ao contratar procuram pessoas que irão se encaixar à esse perfil e traduzem isso em demandas exageradas por habilidades e experiência.

Por exemplo, uma empresa que exija grande tempo de experiência em uma função relativamente simples sinaliza, antes mesmo da contratação, que não vai dar treinamento para os funcionários. Que não vai se preocupar em patrocinar cursos, pós graduações ou outras formas de evolução profissional. Digo de antemão que qualquer empresa que demande experiência maior do que 6 meses para qualquer posição de analista não está comprometida com a evolução profissional do funcionário.

A disposição para ensinar é a característica mais importante de um professor. Uma empresa que deseja gente pronta, que entre no jogo jogando, não está comprometida com a evolução profissional. Portanto não vai saber valorizar (com dinheiro e não com cartões de natal decorados) profissionais com perfil mais completo. Se você é um profissional mais experiente e completo deve buscar empresas que dão valor à educação corporativa e à evolução dentro da empresa, para conseguir o maior valor pelo que você oferece.

Ausência de métricas
O mais interessante é que o mundo corporativo adora números, siglas e métricas, mas nunca ninguém criou nada para parametrizar a forma como os funcionários são remunerados por suas atividades. Mesmo tendo uma sigla e um índice para cada linha dos seus balancetes corporativos as empresas não dispõe de uma métrica para que seus funcionários possam avaliar se estão sendo bem pagos, proporcionalmente à seus pares ou colegas de outras empresas. Como saber então se você está sendo pago justamente pelo trabalho que está desempenhando?

Estranhamente os salários são tratados de forma super confidencial, ainda que o balanço e ou caixa das empresas sejam até publicados em jornais para que todos possam ver. O segredo aqui é mantido por razão simples, para que a empresa pague a cada um o mínimo possível para que ele desempenhe sua função. Se você descobre que alguém que faz a mesma coisa que você ganha 30% a mais a primeira providência é pedir um aumento. Ocultar a informação salarial é essencial para que as empresas possam continuar funcionando e pagando aos seus proprietários valores cada vez mais altos.

Nada contra isso e contra o capitalismo, muito pelo contrário. Mas a falta de transparência na questão salarial contrasta com todo o blá-blá-blá corporativo sobre meritocracia e reconhecimento de valor das pessoas. Em um ambiente realmente meritocrático não haveria problema se todos os funcionários soubessem o salário do chefe. Seria até um incentivo para trabalhar mais e mais em vista de uma promoção.

Se você ainda não aceitou esse argumento pense na seguinte perspectiva. Na escola exibimos à todos as notas mais altas dos melhores alunos. Não há pudor em se exibir uma nota 10. Isso é incentivado. Na etapa seguinte, na vida corporativa, a nota 10, isto é o melhor salário, deve ser escondida a sete chaves. Faz sentido?

Mostrar meritocraticamente o salário do chefe para a equipe só não funciona bem em dois casos específicos:
1- O salário do chefe não é tão bom frente à responsabilidade que ele tem, e ter conhecimento disso traria um revés aos ânimos da equipe. Essa situação costuma ocorrer no chão de fábrica das indústrias;
2- O salário do chefe é muito alto em relação ao salário da equipe e desproporcional em relação à carga de cobranças e responsabilidades individuais, e isso causa insatisfação à equipe que entende que alguém que não trabalha tanto ganha muito mais. Essa situação costuma ocorrer nas empresas de serviços a partir da média gerência.

Pela falta de um parâmetro mais geral o profissional precisa se basear em sua própria carreira para definir se o seu salário é justo. O modelo que eu adoto é medir o quanto ganho para cada ano que estudei. Em tese eu devo conseguir aumentar o valor por ano de estudo a medida que minha carreira progride. Assim, ao me formar na faculdade eu tinha estudado por 18 anos (da primeira série até o quinto ano de faculdade com mais 3 de secundário) e ganhava US$94,28/mês para cada ano de estudo. Hoje estou com 19,5 anos de estudo e ganho US$133,64/mês para cada ano de estudo. Se eu decidir fazer um MBA de 18 meses preciso de um aumento real de salário de 7,6% apenas para que o investimento no MBA valha a pena.

Essa métrica é interessante pois vai permitir que você compare sua remuneração com seus colegas de função, caso você saiba o salário e tempo de estudo deles. Mas não vai funcionar para comparar sua função com outras posições. E nesse aspecto você precisa desenvolver sua própria percepção de salário/responsabilidade para cada posição de sua empresa.

Voltando ao Apagão
Sobre o apagão fictício de talentos que estamos vivendo eu defendo que as empresas têm pecado e oferecido remunerações muito tímidas para vagas que exigem pessoas muito qualificadas e dispostas a enfrentar grandes responsabilidades. Conheço dezenas de profissionais muito qualificados que não se sentem atraídos pela maioria das vagas que aparecem em seus e-mails porque não estão confortáveis com a idéia de trocar de emprego para ganhar 300 ou 400 reais a mais por mês.

Grande parte dessa questão está ligada à quantidade de informação que as pessoas recebem sobre empresas da chamada nova economia, como o Google, citado anteriormente. Claro que nem todas as empresas podem pagar remunerações como o Google e portanto terão que se contentar com profissionais de nível mais baixo, por assim dizer. E aí surge outro problema. No momento de definir os critérios para as vagas as empresas escolhem padrões exageradamente altos, acima da realidade para os salários que estão dispostos a pagar. Vagas com experiência de 4 anos e inglês fluente, mas com salários de R$2.500,00 são comuns e, sinceramente, fora da realidade. O que dizer de anúncios buscando vendedores com carro próprio e que oferecem R$1.800,00 mais Vale alimentação?

Completa esse quadro a globalização. Ela própria que equalizou os preços de commodities no mundo todo e virou clichê para explicar tantas coisas. As empresas não perceberam que, em um mundo globalizado, a mão de obra, mesmo a especializada, é uma commodity como a soja, o minério de ferro e o petróleo. Os salários da alta-gerência e diretoria das empresas brasileiras já são equivalentes aos pagos nos EUA e Europa, mesmo de empresas médias e pequenas. Porque esses profissionais dispõe da possibilidade de ser empregados por empresas para trabalhar offshore. Profissionais de média gerência e segundo escalão estão experimentando o dessabor de desempenharem, em empresas nacionais, funções equivalentes ao de colegas de outros países e receberem uma fração apenas do que aqueles ganham.

Ao avaliar que o Itaú Unibanco é o banco com maior lucro líquido absoluto do continente no 1S2011, incluíndo seus competidores dos EUA, não se pode esquecer que um gerente do Itaú ganha cerca de 1/4 do que um gerente do Bank of America nos EUA. Inclua na análise que durante a fusão entre Itaú e Unibanco os funcionários ficaram por 2 anos com suas remunerações congeladas (sem que nenhuma promoção ou ação de mérito pudesse ser efetuada) e fica fácil entender de onde vem a lucratividade tão alta do banco. É fácil ser a empresa mais lucrativa do seu segmento no hemisfério se seus funcionários são sub-pagos e você fica 24 meses sem dar um único aumento.

Entretanto, como isto afeta a satisfação dos funcionários, e o blá-blá-blá corporativo sobre ser feliz no trabalho? Não muito, desde que seus concorrentes também se esforcem para pagar o menor valor possível para cargos que exigem conhecimento profundo sobre finanças, certificação das autoridades competentes e uma grande dose de responsabilidade.

Entretanto quanto seus melhores funcionários começam a receber propostas de outros segmentos da economia você precisa justificar o fato de não conseguir repor profissionais tão competentes quanto aqueles que saíram. Há uma resposta certa e uma resposta fácil. E o Apagão de Talentos é novamente citado.

Posted in Uncategorized | Tagged , , , , , | 6 Comments