Seja bem vind@, se você é um debiano (um baiano que usa debian) faça parte de nossa comunidade!


Nginx – Implantação e hardening do nginx no Debian

6 de Março de 2012, por Desconhecido - 0sem comentários ainda

nginx
O Nginx ( pronuncia-se “engine-x”) é um webserver e proxy reverso para os protocolos http, smtp, pop3 e imap focado em alta performance. Sua utilização vêm crescendo bastante rapidamente, numa pesquisa realizada em janeiro deste ano pela Netcraft ele ocupa o 2o. lugar entre os servidores webs ativos na internet.

Neste post apresentarei como configurar o Nginx com suporte ao PHP e todos os ajustes de segurança necessários.

NOTA: Informações importantes encontram-se nos comentários dos arquivos de configuração.

Para obter as versões mais recente usaremos os pacotes disponíveis no repositório squeeze-backports

deb http://backports.debian.org/debian-backports squeeze-backports main

aptitude install -t squeeze-backports nginx spawn-fcgi php5-cgi

Configurando o vhost

vim /etc/nginx/sites-available/www.acme.com

#O dominio acme.com é um alias para www.acme.com

server {
server_name www.acme.com acme.com;
access_log /var/log/nginx/www.acme.com.access.log;
error_log /var/log/nginx/www.acme.com.error.log;
root /var/www/acme/;

location / {
index index.php;
}

#Restrigindo o acesso ao ambiente administrativo

location /admin {
root /var/www/acme/;
index index.php;
allow 200.222.222.222;
deny all;
}

#Negando o acesso a alguns arquivos

location =/*.txt {
deny all;
log_not_found off;
access_log off;
}

location =/xmlrpc.php{
deny all;
log_not_found off;
access_log off;
}

location =/readme.html {
deny all;
log_not_found off;
access_log off;
}

#Habilitando o suporte ao PHP

location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/acme$fastcgi_script_name;
}
}

Hardening do Nginx

user www-data;

#Total de threads. Configure de acordo com a quantidade de CPU existente, acima de 2 CPUs = 4.
worker_processes 4;
pid /var/run/nginx.pid;

events {
#Juntamente com o work_processes permite calcular o máx. de clientes ( max clients = worker_processes * worker_connections )
worker_connections 1024;

}

http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
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;

# Oculta banner
server_tokens off;
}

# Limita o maximo de conexoes concorrentes por IP
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;

Script de inicialização do PHP-Fastcgi

vim /etc/init.d/php-fastcgi

RETVAL=0
case “$1″ in
start)
$PHP_SCRIPT
RETVAL=$?
;;
stop)
killall php5-cgi
RETVAL=$?
;;
restart)
killall php5-cgi
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo “Usage: php-fastcgi {start|stop|restart}”
exit 1
;;
esac
exit $RETVAL

Adicionando nos Runlevels

update-rc.d php-fastcgi defaults

Habilitando o vhost e iniciando os serviços

cd /etc/nginx/sites-enabled

ln -s ../sites-available/www.acme.com

invoke-rc.d nginx start && invoke-rc.d php-fastcgi start

UPDATE 21/03/2012

Dicas adicionais do Jeronimo Zucco (@jczucco)

#Para evitar conexões DAV (PROPFIND TRACE PROPPATCH MKCOL COPY MOVE LOCK UNLOCK OPTIONS) se isso não for utilizado, é claro.

proxy_cache_methods GET HEAD POST;

#Para acompanhar a performance e utilização do nginx, afinal a disponibilidade também é importante. Pode ser feito gráfico do rrdtool usando essa ferramenta:http://blog.kovyrin.net/2006/04/29/monitoring-nginx-with-rrdtool/

HttpStubStatusModule

Configuração do limits.conf do parâmetro “nofile” para o usuário que está rodando o nginx. Por padrão o valor é 1024 arquivos abertos, se isso for insuficiente, o log irá apresentar: “failed (24: Too many open files)”, causando negação de serviço.

#Alguns bloqueios por extensão:

location ~ /\.ht {
deny all;
}
location ^/MSOffice {
deny all;
}

location ~ _vti_bin {
deny all;
}

location ~* \.(dll|cmd|src)$ {
deny all;
}

#Se o nginx for proxy reverso de HTTPS, habilitar somente criptografia forte para evitar o BEAST attack (CVE-2011-3389):

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

UPDATE 2 – 22/03/2012

Mais dicas do meu amigoJeronimo Zucco (@jczucco)

#Regra para evitar acidentes de “desenvolvedores” que esquecem arquivos em diretórios expostos para a internet, como dump de base de dados, código fonte backup, etc:

location ~* \.(ant|asa|asax|ascx|axd|backup|bak|bat|bkp|cdx|cer|cfg|cmd|com|config|conf|cs|csproj|csr|dat|db|dbf|dll|dos|htr|htw|ida|idc|idq|inc|ini|key|licx|lnk|log|mdb|old|pass|pdb|pol|printer|pwd|resources|resx|sql|src|sys|vb|vbs|vbproj|vsdisco|webinfo|xsd|xsx)$ {
deny all;
}

#Bloqueio por hostname do que está sendo feito proxy, para evitar que uma configuração mal feita acabe abrindo o proxy para o mundo externo:

if ($host !~ ^(dominio.com.br|www.dominio.com.br)$ ) {
return 403;
}

Considerações finais

As melhores práticas de segurança do PHP já foram abordadas nos posts anteriores [1] [2]

Como pudemos constatar sua implementação é aparentemente fácil, o site do projeto é bastante rico em documentação.

O Nginx é muito utilizado como proxy reverso tornando-se um frontend para balanceamento de carga suportando diversos protocolos, existe também um módulo de WAF chamado Naxsi, esta e outras soluções serão tratadas nos próximos posts.

Referências

Nginx and PHP-FastCGI on Debian 5

Top 20 Nginx WebServer Best Security Practices



Configurando os agentes do Ossec HIDS automaticamente no Linux

1 de Março de 2012, por Desconhecido - 0sem comentários ainda

O modo tradicional para configurar as chaves de autenticação dos agentes no Ossec server é sustentável até 5 servidores em média. Para facilitar esta tarefa Daniel Cid criou o daemon ossec-authd, responsável por gerenciar as chaves de autenticação dos agentes no servidor usando um certificado digital.

NO OSSEC SERVER

Execute os seguintes comandos para gerar o certificado:

#openssl genrsa -out /var/ossec/etc/sslmanager.key 2048

Generating RSA private key, 2048 bit long modulus
……………………………………………………………….+++
…………………………………………………………………………………………………………………..+++
e is 65537 (0×10001)

#openssl req -new -x509 -key /var/ossec/etc/sslmanager.key -out /var/ossec/etc/sslmanager.cert -days 365

—–
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Bahia
Locality Name (eg, city) []:Salvador
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Alexos Core Labs
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:debian
Email Address []:alexos@acme.com

Inicie o ossec-authd

#/var/ossec/bin/ossec-authd -p 1515 >/dev/null 2>&1 &

#netstat -at | grep 1515
tcp 0 0 *:1515 *:* LISTEN

NO OSSEC AGENT

OBS: Antes de compilar o agente instale o pacote libssl-dev ( Debian ) ou openssl-dev ( CentOS ) evitando assim a mensagem erro abaixo.

ERROR: Not compiled. Missing OpenSSL support.

Execute o seguinte comando para iniciar a autenticação:

#/var/ossec/bin/agent-auth -m 192.168.0.1 -p 1515
2012/03/01 20:28:12 ossec-authd: INFO: Started (pid: 10988).

INFO: Connected to 192.168.0.1:1515
INFO: Using agent name as: debian
INFO: Send request to manager. Waiting for reply.
INFO: Received response with agent key
INFO: Valid key created. Finished.
INFO: Connection closed.

Reinicie o servidor e o agente:

invoke-rc.d ossec restart ( Debian )

ou

service ossec restart ( CentOS )

Confirme a comunicação usando o agent_control no servidor

#/var/ossec/bin/agent_control -l

OSSEC HIDS agent_control. List of available agents:
ID: 000, Name: debian (server), IP: 127.0.0.1, Active/Local
ID: 1024, Name: debian, IP: any, Active

Referência



Thesis submitted

28 de Fevereiro de 2012, por Desconhecido - 0sem comentários ainda

Last Friday, after 5 long years, I have finally submitted my PhD thesis. It was quite a relief, more or less as if an elephant was taken off my back.

An English title for my thesis would be Structural Complexity Characterization in Software Systems. Here is an abstract:

This thesis proposes a theory to characterize structural complexity in software systems. This theory aims to identify (i) the contribution of several factors to the structural complexity variation and (ii) the effects of structural complexity in software projects. Possible factors in the structural complexity variation include: human factors, such as general experience of the developers and their familiarity with the different parts of the system; factors related to the changes performed on the system, such as size variation and change diffusion; and organizational factors, such as the maturity of the software development process and the communication structure of the project. Effects of structural complexity include higher effort, and consequently higher cost, in software comprehension and maintenance activities.

To test the validity of the proposed theory, four empirical studies were performed, mining data from free software project repositories. We analyzed historical data from changes performed in 13 systems from different application domains and written in different programming languages.

The results of these studies indicated that all the factors studied influenced the structural complexity variation significantly in at least one of the projects, but different projects were influenced by different sets of factors. The models obtained were capable of describing up to 93% of the structural complexity variation in the projects analyzed.

Keywords: Structural Complexity, Software Maintainance, Human factors in Software Engineering, Mining Software Repositories, Theories in Software Engineering, Empirical Software Engineering, Free/Open Source Software Projects.

Those who read Portuguese can check out the actual thesis text as a PDF file.

Most of the studies discussed in the thesis are presented in English in papers I have published during the last years.

My defense is going to be on March 23rd. If you happen to be at Salvador at that day, please feel cordially invited.



VaiVem – Sistema de empréstimos

15 de Fevereiro de 2012, por Desconhecido - 0sem comentários ainda

screenshot de uma das telas do vaivem

Já faz um tempo que comecei a desenvolver o VaiVem um pequeno sistema de controle de empréstimos pra uso na universidade em que trabalho. Esse sistema é voltado para equipamentos de audiovisual, porém pode ser facilmente adaptado para outros tipos de objetos.

O VaiVem é desenvolvido em Django, um framework web escrito com Python. Esse é o primeiro sistema que eu desenvolvi, então não é nada muito complexo.

Os recursos que o Vaivem possui:

- Geração de comprovantes de empréstimo;
- Busca de empréstimos por equipamento ou por usuário;
- Aplicação de penalidades em caso de atraso na devolução;
- Software Livre (Licença Affero GPLv3).

O código está disponível no gitorious: https://gitorious.org/vaivem

Instruções de instalação: https://gitorious.org/vaivem/pages/Home



OpenStreetMap na revista Tema

6 de Janeiro de 2012, por Desconhecido - 0sem comentários ainda

Matéria sobre OpenStreetMap na Revista Tema

Em outubro, após a palestra na Latinoware, eu e Djavan Fagundes fomos entrevistados pela jornalista Loyanne Salles, a qual se interessou em fazer uma matéria sobre o OpenStreetMap para a revista Tema.

A matéria foi publicada na edição de dezembro/2011 e ficou muito interessante. Veja a matéria ou acesse a edição completa da revista.

A revista Tema é uma publicação do Serpro, a empresa de TI do governo federal.