Prefácio
A rede mundial de computadores tem mais de 10 botnets. Todas dominadas por crackers armados até os dentes. É só nego de nmap, nessus, tcpdump e por ai vai.
No resto do mundo são softwares de auditoria. Na internet, são as armas do crime.
Um 0-day attack atravessa um firewall como se fosse papel. É burrice pensar que numa rede assim os daemons, mesmo atualizados, não vão ser crackeados apenas para fazer valer a lei.
E Linux também tem bug amigo, Linux também tem falha de segurança.
É por isso que nessa rede todo administrador tem que escolher: Ou se corrompe, ou se omite, ou vai pra guerra.
Aviso
Se você é um profissional decente, não tenho dúvidas que vai decidir partir para guerra e nesse tutorial vamos ver os passos básicos para tornar seu servidor mais resistente a invasões.
Mas não se iluda. Nada é 100% seguro e seguir as boas práticas de segurança uma vez na vida não vai te ajudar muito. Mantenha-se atualizado, mantenha sua infra-estrutura atualizada (não apenas seus servidores) e seja humilde. Aprenda com seus erros e com os erros dos outros.
Outro ponto que vale ressaltar aqui: Esse tutorial é dirigido ao Ubuntu Server 8.04 (Hardy). Muita coisa pode ser aplicada para desktop e para outras distribuições, mas não é sobre isso que vou falar aqui.
Fique com o básico
Quanto menos pacotes instalados no seu Ubuntu, melhor. Mais pacotes significam mais potenciais pontos de falha, mais opções para um invasor tentar escalar privilégios e mais recursos para ele utilizar sua máquina como ponte para outros ataques em caso de uma invasão bem sucedida.
Durante a instalação do seu Ubuntu Server, quando apresentado às opções, não escolha nenhum pacote. Você pode manualmente instalar openssh, LAMP, DNS e etc mais tarde, num momento mais conveniente.
Num primeiro momento fique apenas com o sistema mais enxuto possível para facilitar as implementações de segurança antes de começar a abrir as portas.
Application Specific
Ter um servidor para cada serviço que você precisa não é mais exclusividade de grandes empresas, com um gordo orçamento. Utilize máquinas virtuais baseadas no seu hypervisor preferido e crie uma máquina virtual para cada tipo de serviço que for utilizar.
Utilize de bom-senso. Não coloque banco de dados da intranet na mesma partição virtual que está seu banco de dados da DMZ.
Algo como um servidor de banco de dados para todos os serviços da DMZ e um servidor HTTP para todos os bancos de dados da DMZ parece mais coerente.
Servidores em redes muito hostis (como um servidor do lado de fora dos firewalls da DMZ) ficam melhor se forem self-contained, ou seja, com todos os serviços rodando numa mesma partição virtual.
Tenha certeza de que tem uma placa de rede exclusiva para administração do seu hypervisor e proteja-a muito bem.
No Ubuntu o Xen é uma excelente opção.
Guardando seus logs
Numa situação ideal sua rede vai dispor de um servidor de syslog onde todos os hosts enviam seus eventos, mas se não for o caso, durante a instalação crie uma partição /var/log com filesystem ext3.
Isso vai permitir que você utilize o chattr para restrigir seus arquivo ao modo append only.
Caso esteja utilizando rotacionamento de log, lembre-se de editar as políticas para evitar erros.
Ter logs é essencial para previnir invasões, mas pode ser seu passe livre de problemas em caso de invasão concretizada ou investigação judicial.
Se possível utilize sempre um servidor de syslog numa máquina física à parte. Seja bem paranóico na configuração da segurança dessa máquina.
Utilize firewall local
Mesmo que sua rede disponha de firewall de borda, existe sempre a possibilidade de alguém conseguir acesso à sua rede local. Um visitante numa sala de reunião, um esperto num wireless rogue, etc.
No Hardy nem mesmo com sintaxe do iptables você precisa se preocupar. Basta utilizar o ufw.
Ele já vem com uma lista de regras pré-configuradas com um nível de segurança bem aceitável. Falando em bom iptablês, as policies são DROP e você aplica suas excessões.
Exemplificando um servidor LAMP na sua DMZ:
Onde:
192.168.5.0/24 é sua rede interna.
192.168.100.2 é o IP interno do seu LAMP server
Ou um servidor de DNS apenas com ip válido:
Onde:
200.200.200.201 é o IP nateado da sua rede
200.200.200.10 é o IP do seu servidor de DNS
200.1.1.200 é o seu DNS Slave
Colocando uma armadura
A Novell desenvolveu um excelente framework de segurança chamado AppArmor e disponibilizou como open source.
Consiste basicamente em um patch no kernel e uma série de ferramentas de gerenciamento.
O conceito é: Uma determinada aplicação, independentemente de estar sendo executada pelo zezinho ou pelo root deve conseguir acessar somente determinados diretórios e arquivos, executar somente determinados comandos e utilizar somente determinadas bibliotecas.
O grande trunfo do AppArmor é que ele proteje seus servidor mesmo contra 0-day attacks. Se você preparar o perfil da sua aplicação muito bem são grandes as chances de seu servidor sair ileso mesmo num ataque a um daemon bugado.
Para isso você gera um arquivo com o “perfil” da aplicação e fala pro AppArmor: Amigão, esse binário só pode fazer isso aqui ó…
O Hardy já vem com o kernel patcheado e com as ferramentas de gerenciamento instaladas. Basta baixar os profiles e sair usando.
Mas lembre-se do seguinte: Os profiles que você instalou levam em conta que você está utilizando os serviços conforme a configuração padrão do Ubuntu. Eu inclusive recomendo que você realmente faça isso sempre que possível, mas caso esteja utilizando alguma coisa diferente do padrão, um pouco de tweak pode ser necessário.
Pessoalmente senti falta de um profile para o Apache, mas depois de criar o meu eu entendi o motivo: Depende muito do que você vai rodar no seu webserver.
Talvez mais para frente eu escreva um artigo sobre o AppArmor, mas por enquanto, fique com este link da Wiki do Ubuntu.
UPDATE (29/08/2008 08:27): Meu amigo Mezzanotti, que é especialista em IT Security, mandou um link bem interessante que eu não conhecia: Center for Internet Security. Muitos tutoriais de hardening lá. Vale uma passada.