como a segurança é um ponto muito importante hoje e sempre, resolvi postar algumas técnicas de Hardening para servidores Linux, ou Linux Hardening como queiram. Tenho notado que muitos administradores não tem-se preocupado com esses detalhes essenciais baseando-se apenas em fazer funcionar os serviços e esquecendo da segurança, isso é um problema sério. Bom vejamos abaixo um breve resumo:
Hardening é um processo de mapeamento das ameaças, mitigação dos riscos e execução das atividades corretivas - com foco na infra-estrutura e objetivo principal de torná-la preparada para enfrentar tentativas de ataque.
Normalmente, o processo inclui remover ou desabilitar nomes ou logins de usuários que não estejam mais em uso, além de serviços desnecessários.
Outras providências que um processo de hardening pode incluir: limitar o software instalado àquele que se destina à função desejada do sistema; aplicar e manter os patches atualizados, tanto de sistema operacional quanto de aplicações; revisar e modificar as permissões dos sistemas de arquivos, em especial no que diz respeito a escrita e execução; reforçar a segurança do login, impondo uma política de senhas fortes.
Agora que sabemos o que significa o hardening, podemos dizer que isso na realidade são "As boas práticas de segurança" que começam lá na sua instalação.
Seguem abaixo algumas boas práticas para hardening de seu servidor linux:
1 - Remover pacotes desnecessários.
Usando os comandos:
Via debian: dpkg -l > pacotes.txt
Via RedHat: rpm -ql > pacotes.txt
Através do arquivo de texto gerado, analise qual a real necessidade dos pacotes.
2 - Segurança do Sistema de Arquivos
Além do particionamento do disco, o comando “mount” possui opções bem interessantes para elevar a segurança das tabelas de partições, tais como:
nosuid - Faz com que binários com permissão “suid bit” não possam utilizar esta propriedade na partição em que está definido.
noexec - Impossibilita a execução de binários ou arquivos executáveis dentro da partição na qual essa opção está ativada.
noatime - Diz para não atualizar o tempo de acesso dos inodes (melhorando a performance em partições onde há MUITO acesso a disco).
Estas opções devem ser utilizadas no arquivo “/etc/fstab”, exemplo:
/dev/hda4 /home ext3 defaults,nosuid noexec 1 2
/dev/hda5 /var/log ext3 defaults,nosuid,nodev,noexec 1 2
Vale salientar que existem outras opções do comando “mount”, consulte o “man” do comando para ver todas as opções possíveis.
3 - Limitando os Recursos do Kernel
Adicione as linhas abaixo no final do arquivo “/etc/sysctl.conf” :
# Ativa proteção contra ataques de IP Spoofing
net.ipv4.conf.all.rp_filter=1
# Desabilita pacotes roteados “na fonte”
net.ipv4.conf.all.accept_source_route=0
# Ignora mensagens ICMP de broadcast
net.ipv4.icmp_echo_ignore_broadcasts=1
# Registra todos os pacotes de origem suspeita (como pacotes forjados)
net.ipv4.conf.all.log_martians = 1
4 - Gerenciando os Serviços do Sistema
Muitos administradores, iniciantes ou até mesmo experientes, deixam de utilizar as vantagens de ferramentas clássicas do sistema para checar se o serviço está funcionando corretamente, se está sendo executado na porta certa, se está recebendo requisições inválidas ou até mesmo verificar se um invasor deixou um “backdoor” no sistema. Lembre-se que todas essas ferramentas estão ali para facilitar sua vida. Aproveite-as! Como exemplo, façamos uma varredura nos serviços em execução do sistema. No arquivo /etc/services encontra-se uma lista de portas padrão dos serviços mais conhecidos (alguns nem tanto :).
O comando “netstat” nos mostra informações sobre os serviços de redes no nosso sistema, exemplo:
$ netstat -tupan
O comando “fuser”, que faz parte do pacote psmisc, verifica cada processo(serviço) que está rodando em cada porta. Exemplo:
$ fuser -v 22/tcp
USER PID ACCESS COMMAND
22/tcp: root 5479 F.... sshd
Já o comando “lsof” nos mostra diversas informações do sistema, como usuários, arquivos, processos e conexões. Exemplo :
$ lsof -p
Serviços desnecessários
Os seguintes serviços devem ser desinstalados
* rshd
* rlogind
* rwhod
* telnetd - substitua pelo ssh
* ftpd - substitua pelo scp
* identd
Estes serviços podem ser desinstalados usando o gerenciador de pacotes do sistema operacional, ou através do comando chkconfig, desativando todos os níveis (exemplo: 'chkconfig –level 123456 sendmail off'). Além disso, pode-se remover as entradas específicas dos programas no boot do sistema operacional (/etc/inetd.conf e/etc/xinetd). Versões mais novas do chconfig editam as entradas do xinetd automaticamente.
5 - Desativação de Contas desnecessárias
Após a instalação do sistema e em atividades periódicas é interessante analisarmos todos os usuários do sistema. Alguns utilitários que instalamos adicionam usuários “padrão” no sistema, como ftp, mysql, nobody. Certifique-se de que estes usuários possuam no parâmetro “shell” caminhos para arquivos inexistentes. Na maior parte das vezes estes serviços não precisam de um interpretador shell válido, mas por serem contas válidas no sistema, podem ser utilizadas em determinados casos.
O comando “passwd -l” trava a conta de um usuário. Exemplo:
$ passwd -l # (Trava a conta do usuário)
$ passwd -u # (Destrava a conta do usuário)
6 - Gerenciamento das Políticas de Senhas
O login.defs é um arquivo de configuração lido pelos programas login, não é parte da configuração do PAM. Porém pode auxiliar no gerenciamento do usuários e na definição de uma política de senha.
Você também pode implementar o controle de senhas pelo PAM (Módulo de autenticação plugável) com a biblioteca pam-cracklib.
Outro módulo do PAM bastante interessante é o pam-dotfile, que permite que você defina senhas diferentes, para um mesmo usuário, no serviços específicos como IMAP, SSH, FTP, entre outros.
7 - Gerenciamento dos Privilégios
A configuração abaixo trata a autenticação do usuário com o módulo pam_wheel.so, utilizando o grupo administradores. Com ele somente os usuários do grupo administradores poderão utilizar o comando /bin/su.
Edite o arquivo “/etc/pam.d/su e adicione a linha:
auth required pam_whell.so group=administradores
Os módulos “pam_limits.so” e “pam_time.so” também são muito úteis para gerenciar os recursos de uso e o controle de acesso ao servidor.
Obs: Tome muito cuidado ao editar esse arquivo. Erros podem impedi-lo de efetuar login no sistema! Mantenha sempre um terminal autenticado pronto para desfazer quaisquer modificações.
8 - Ajustes nas Configurações do OpenSSH
O OpenSSH é uma suíte de ferramentas que provê criptografia em sessões de comunicações em uma rede de computadores usando o protocolo SSH. Ele é muito visado em ataques de “BruteForce”, portanto alguns ajustes são necessários. O SSHTest é um utilitário criado pela empresa Clavis Segurança da Informação em parceria com o GRIS (Grupo de Resposta a Incidentes de Segurança) do Departamento de Ciência da Computação da UFRJ para analisar arquivos de configuração do daemon OpenSSH, presente na maioria dos sistemas *NIX (incluindo Linux e *BSD), em busca não apenas de buracos na segurança de seu servidor como também por maneiras de melhorar a segurança do mesmo, pró-ativamente. Basta descompatar e executá-lo, e uma série de perguntas interativas serão feitas enquanto ele modifica o arquivo de configuração do servidor OpenSSH.
SSH
Modifique as configurações do SSH para permitir acesso usando o protocolo SSHv2 somente.
Editar o arquivo /etc/ssh/sshd_config e trocar a linha:
#PROTOCOL 1,2
para:
PROTOCOL 2
Vamos criar o grupo “sshlogin” para usuários que podem acessar o servidor remoto, e desabilitar o login do root no SSH:
vi /etc/ssh/sshd_config
Adicione as seguintes linhas:
#AllowUsers root
or
PermitRootLogin no
AllowGroups sshlogin
É possível restringir os hosts/IPs que acessam o servidor remotamente. Edite o arquivo /etc/hosts.allow (Substitua x.x.x.x pelos IPs dos usuários)
sshd : 127.0.0.1 : allow
sshd : 192.168. : allow
sshd : 10. : allow
sshd : x.x.x.x : allow
sshd : x.x.x.x : allow
sshd : ALL :deny
A última linha vai restringir o acesso ao SSH, liberando apenas os IPS listados acima.
9 - Gerenciamento de um IDS
É uma boa prática implantar softwares de verificação de integridade e detecção de intrusão no sistema antes do ambiente entrar em produção online. Um sistema de detecção de intrusão baseado em redes (NIDS) é um sistema de detecção de intrusão que tenta detectar atividades maliciosas como ataques de negação de serviço e port scans monitorando o tráfego de rede. Um execelente NIDS é o Snort, uma das 5 melhores ferramentas de segurança Open-Source. Já o sistema de detecção de intrusão baseado em Hosts (HIDS) faz analise de logs, checagem de integridade de arquivos e detecção de rootkits. Um excelente HIDS é o OSSEC, com muitas características interessantes e fácil de usar.
10 - Gerenciamento do Firewall
Utilização do iptables, firewall statefull nativo de várias distribuições linux, realiza filtragem de pacotes, origem/destino, portas, protocolos, tem a possibilidade de adição de módulos adicionais, o que dá maior flexibilidade e poder para a ferramenta.
11 - Atualização de Patches
Todo sistema operacional deve ser atualizado com frequência, assim como seus componentes e pacotes instalados. De tempos em tempos, grupos de segurança lançam Security Advisories, alertando para possíveis falhas em softwares específicos. Algumas distruibuições possuem um sistema automático para verificar se os pacotes estão desatualizados e passíveis de falhas, corrigindo e/ou emitindo um alerta ao administrador local.
12 - Apache
Esconder a versão dos softwares utilizados dificulta, em parte, a ação do invasor. No Apache, para esconder esta informação, basta alterar a seguinte linha do httpd.conf:
ServerTokens ProductOnly
ServerSignature Off
A diretriz ServerTokens controla a resposta do Servidor para os clientes sobre a versão do apache e do sistema operacional, além de informações sobre os módulos pré-compilados.
ServerTokens Banner do Servidor
ProductOnly Server: Apache
Major Server: Apache/2
Minor Server: Apache/2.0
Minimal Server: Apache/2.0.55
OS Server: Apache/2.0.55 (Debian)
Full (or not specified) default Server: Apache/2.0.55 PHP/5.1.2-1+b1 mod_ssl/2.0.55 OpenSSL/0.9.8b
Se você quiser restringir o acesso à uma página para um determinado IP ou blocos de IPs, é possível configurar o Apache da seguinte maneira (editando o httpd.conf):
Order Deny,Allow
Deny from all
Allow from 200.0.0.0/16
Outra dica é nunca deixar que os diretórios listem o conteúdo, caso não haja o arquivo index.html
Options +Indexes MultiViews
O Apache, na sua instalação padrão, acompanha vários módulos. A documentação do Apache descreve as funcionalidades de cada módulo. Em muitos casos, os módulos são desnecessários e podem ser desativados. Para isto, basta comentar as linhas precedidas por “LoadModule” no httpd.conf. Alguns módulos que podem ser desabilitados para casos específicos: mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex.
13 - MySQL
O MySQL, no seu modo padrão, deixa o usuário root sem senha. Usuários podem fazer login como root (sem especificar uma senha) e acessar as bases de dados com privilégios administrativos. Para testar se o servidor está sem senha de root, digite:
mysqladmin -u root status
ou
mysql -u root
Para configurar uma senha para a conta root do MySQL (trocar 'NOVA SENHA' pela senha desejada):
mysql -u root
mysql> UPDATE mysql.user SET password=PASSWORD('NOVA SENHA') WHERE user='root';
mysql> FLUSH PRIVILEGES;
14 - Sniffer
Todo tráfego não criptografado que entra e sai na rede pode ser interceptado por programas que capturam pacotes. Para que uma placa possa capturar tráfego, ela deve estar ativa no modo promíscuo. Para verificar se a sua rede está sujeita a sniffer:
sudo infconfig eth0
Localize e compare as seguintes linhas:
#Sem Sniffer
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
#Promíscuo - Sujeito a Sniffer
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
Para desativar o modo promíscuo para uma interface de rede determinada, basta executar o seguinte comando:
ifconfig eth0 -promisc
15 - Portas Abertas
A verificação esporádica de portas abertas na rede é uma boa prática de segurança. Usando o NMAP, pode-se identificar portas abertas, programas responsáveis e versões de sistemas operacionais. O seguinte comando vai listar todas as portas abertas da máquina:
$ nmap -A -p 1-65535 localhost
PORT STATE SERVICE VERSION
514/tcp open shell?
Em seguida, para identificar o PID responsável pela porta:
$ sudo fuser 514/tcp
514/tcp: 6231
Finalmente, para desobrir o aplicativo responsável:
$ sudo ps 6231
PID TTY STAT TIME COMMAND
6231 ? Ss 0:52 /usr/sbin/syslog-ng
16 - Desconectando usuários inativos
Rotineiramente, administradores esquecem de fazer logout após terminar seus trabalhos, deixando a conta “root” aberta na máquina. Uma pessoa com acesso físico pode facilmente comprometer a máquina, instalando scripts maliciosos e adicionando usuários indevidos.
A solução para resolver este problema é fazer com que o shell faça o logout automaticamente após um certo período de inatividade. Para fazer isto, você deve configurar a variável especial do Linux chamada “TMOUT” com o tempo de inatividade em segundos antes do logout.
Edite o seu arquivo profile (/etc/profile) e adicione a seguinte linha em algum lugar após a linha onde se lê “HISTFILESIZE=” nesse arquivo:
TMOUT=3600
O valor que entramos para a variável está em segundos e representa 1 hora (60 * 60 = 3600 segundos). É importante observar que se você decidir colocar a linha acima em seu arquivo ”/etc/profile”, então o logout automático após uma hora de inatividade entrará em vigor para todos os usuários do sistema.
Se ao invés disso você quiser controlar quais usuários receberão o logout automático e quais não o receberão, você pode configurar esta variável no arquivo .bashrc (shell bash) ou .login (shell csh) , que ficam situados no diretório pessoal de cada um.
Para quem quer ir mais a fundo, leia o Livro On-line do Google Books (Hardening Linux)
Links relacionados:
Hackbusters
RNP
Nenhum comentário:
Postar um comentário