Hardening (em português, endurecimento) é um processo de mapear as ameaças, mitigar os riscos e executar atividades corretivas com foco na infra-estrutura, este tem como objetivo principal torná-la resistente a tentativas de ataques. Vale ressaltar que a técnica aqui chamada de Hardening é constituída por varias camadas ou níveis se assim preferir, ou seja, é um processo de defesa/proteção em cascata.
Explicando de outra forma: Hardening é o processo de endurecimento do sistema/serviços, tornando este resistente e fortemente preparado para enfrentar ataques diversos.
Algumas características:
- Fortalecimento do sistema;
- Ajustes finos;
- Procedimentos de segurança pré e pós-instalação.
Tipos de Hardening:
- De Sistema;
- De Serviço;
- De “Processo”.
Pontos a serem levados em conta num processo de Hardening:
- Remover ou desabilitar contas de usuários que não estão mais em uso;
- Remover serviços desnecessários;
- Limitar o acesso dos usuários;
- Manter os patches atualizados;
- Impor uma politica de segurança que obrigue seus usuários a escolherem senhas “fortes”.
Muita gente gosta de falar, quero meu servidor/aplicação o mais seguro possível. Mas vamos parar pra pensar, segurança implica em menos flexibilidade e vice versa!
Exemplo enxuto: Um usuário tem a flexibilidade e conforto de se logar no servidor da empresa de casa, então todo dia ele levanta, toma o café e nem sempre vai pra empresa pois realiza dos os procedimentos de casa. Mas esta pessoa contrata um “especialista” em segurança e pede a ele para implementar o máximo de segurança em todos os servidores da empresa, no dia seguinte quando tenta logar via ssh descobre que o profissional contratado desativou ssh. Sendo assim conforto e flexibilidade foram para o espaço!
Como falei este é um exemplo enxuto, pois mecanismos de segurança como autenticação baseada em chaves, limitar o login para IP(s) específicos, etc, poderiam ter sido implementados. Mas para simplificar e exemplificar a questão flexibilidade X segurança, apliquei este exemplo.
Abaixo irei comentar cada um dos pontos citados anteriormente.
Remover ou desabilitar contas de usuários que não estão mais em uso
Isso é algo muito sério, principalmente quando este ponto não é tratado dentro da empresa. Se um usuário não necessita ter acesso a um sistema este não deve possui meios para se logar neste sistema. Vamos a uma história real para exemplificar melhor este ponto.
João era funcionário de uma empresa de TI, em seu ambiente ele trabalhava com sistemas de missão crítica. Fora da empresa ele não possui conexões com os sistemas interno por nem um meio de conexão (ssh, telnet, vpn, etc), mas esta empresa possuía conexão wi-fi permitindo assim que seus funcionários se conectassem ao sistema por cabo ou por meio sem fio. Mas qual o problema? O sinal da wi-fi conseguia cobri todo o estacionamento e proximidades da empresa. Quando joão foi despedido ficou indignado, pegou seu carro, parou perto da empresa e seu usuário ainda estava ativo no sistema, como ex-funcionário furioso João efetuou login no sistema e começou a causar danos a estrutura computacional desta empresa!
Remover serviços desnecessários
Se um serviço não é realmente necessário para aquela aplicação ou tarefa não o mantenha ativo no sistema, recomendo ainda que remove todos os serviços/programas não essenciais para a continuidade do “negócio”. Quanto maior for a gama de serviços desnecessários ativos no seu sistema, mais vulnerável você irá se encontrar, isso se deve ao fato de que, com uma maior quantidade de serviços você poderá estar expostos a um grande número de falhas que podem ser utilizadas em beneficio de um invasor.
Exemplo enxuto: Zezinho possui um servidor web, ele possui dois tipos de conexões para com este servidor (ssh e telnet), ou seja, temos ai dois serviços de acesso remoto. O problema é que Zezinho nunca utiliza telnet e ainda sim possui o serviço instalado! Isso é realmente preocupante pois o Telnet é uma forma de conexão que não implementa nem um tipo de segurança e possui diversas falhas conhecidas.
Limitar o acesso dos usuários
Não der poder para todo mundo, não corra o risco de confiar de mais e depois receber um “punhal” nas costas. Limite o acesso de usuários a certos diretórios, serviços, etc. Vamos a alguns pontos correlacionados a esta questão:
- Não permita que qualquer usuário vire o todo poderoso (ROOT);
- Limite as atividades dos usuários, não deixe que eles acessem ou modifiquem qualquer arquivo;
- Dê poder somente para aqueles que realmente precisam dele;
- Limite a utilização de recursos por parte dos usuários, como consumo de disco, ram, etc.
Exemplo enxuto: Ao instalar um acesso ssh é uma boa pratica você impedir que o usuário realize o login diretamente como root, é extremamente recomendado obrigar este a se logar primeiramente como usuário comum e depois se tornar root caso tenha permissão para isso. “Em geral isso é feito para que um atacante fique no escuro, poi primeiro ele terá que descobri quais usuários existem no sistema, logo em seguida terá que tentar conseguir acesso à conta de cada um e verificar se este possui acesso root”!
Manter os patches atualizados
Atualizações devem sempre ser executadas! Correções de “bugs” são efetuadas por meio de atualizações, então deixe sempre todas as instancias do seu sistema atualizadas com as soluções mais recentes. Eu recomendo que primeiramente realizem estas atualizações em um ambiente de “teste” para somente depois implementar em um ambiente de produção.
Exemplo enxuto: A versão 1 do protocolo estava em larga utilização quando se descobriu ser insegura. Descobriu-se também que até a versão 2 era suscetível a ataques de temporização estatística, conforme Song (2001 apud Cheswick; Bellovin; Rubin, 2003, p.158). Esta técnica de temporização estatística está relacionada ao fato do SSH acomodar os tamanhos de blocos dos sistemas de criptografia, a versão 2 do protocolo arredonda cada pacote a um limite de oito bytes. Em resumo aqueles que utilizam as versões antigas citadas neste exemplo, encontram-se vulneráveis a um ataque. Sobre este assunto leia mais em: http://www.vivaolinux.com.br/artigo/SSH-Metodos-e-ferramentas-para-invasao
Impor uma politica de segurança que obrigue seus usuários a escolherem senhas “fortes”
Infelizmente muita gente costuma definir senhas fracas para qualquer sistema ou aplicação que queiram utilizar, isso facilita que indivíduos mal intencionados adivinhem a senha ou realizem ataques de dicionário. Pode parecer brincadeira mas muita gente costuma utilizar número de telefone, datas e outros derivados como uma solução de senha, algo que não deve ser levado adiante ou encorajado.
Tente definir senhas aleatórias com no minimo 8 caracteres, letras maiúsculas/minusculas, números e símbolos. Logo abaixo apresento três soluções, em PHP, Linux e Windows:
Gerador de senha aleatória em PHP:
<?php
while ($n < 8) {
$caracteres = ‘abcdxywzABCDZYWZ0123456789-=)(*&$#@’;
$senha = strlen($caracteres)-1;
$password = null;
for($i=0; $i < 8; $i++) {
$password .= $caracteres{mt_rand(0, $senha)};
}
echo $password . “<br />”;
$n++;
}
?>
Gerador de senha aleatória (pwgen) para ambiente GNU/Linux:
O primeiro passo é instalar o pwgen:
# aptitude install pwgen
Se você utilizar somente o comando abaixo irá gerar senhas de 8 caracteres:
$ pwgen -y
Para especificar o número de caracteres basta adicionar o parâmetro (-n quantidade_de_caracteres):
$ pwgen -y -n 16
Segue dois geradores de senha aleatória para ambiente Windows:
Password tools bundle (http://www.baixaki.com.br/download/password-tools-bundle.htm)
Password Inventor (http://www.baixaki.com.br/download/password-inventor.htm)
Segue link para dois geradores de senha aleatória online:
http://www.basfas.com.br/on-line/gerador-de-senhas
http://www.meuscript.com.br/gerador-de-senhas