11 de mai de 2010

Segurança no Linux

1- Tcpwrappers

É fortemente recomendável a utilização do tcpwrappers com o objetivo de diminuir a probabilidade de ataques a serviços privilegiados. Serviços privilegiado devem ser oferecidos somente para maquinas (redes) clientes. 

As regras de acesso são definidas nos arquivos
/etc/hosts.allow 
e
/etc/hosts.deny 
para os serviços que rodam através do superdaemon inetd. Pelo conceito do privilégio mínimo. Serviços que não necessitam estar rodando no sistema devem ser desabilitados, inclusive este daemon. Lembrando que é sempre recomendável que os serviços rodem com privilégios mínimos ou com usuário com poucos privilégios, a exemplo, o nobody.
/etc/hosts.allow e
/etc/hosts.deny: a ordem de leitura durante uma conexão a estes serviços é pelo hosts.allow. Se existir alguma regra neste arquivo para a conexão, o segundo arquivo não é checado. Se não existir regras, então o segundo arquivo é checado e caso encontre alguma regra, a conexão é negada, caso contrário, o acesso é liberado.

Uma boa idéia é colocar sempre em
/etc/hosts.deny ALL:ALL 
para que somente as conexões permitidas explicitamente em
/etc/hosts.allow  
sejam permitidas.
Exemplo de configuração do
/etc/hosts.allow 
:

#
in.ftpd: ALL
ALL: localhost
in.ftpd: .silva.eti.br
ipod3d: ALL EXCEPT silva.eti.br


wait/nowait : esta informação no inetd.conf indica ao super-server a forma de "ouvir" as conexões. Por exemplo, em um servidor cujo serviço telnet tenha muitas conexões simultãneas, uma boa idéia é colocar o parametro como nowait e assim ter multi-thread's atendendo as requisições. Configurado como wait, teremos um máximo de conexões por minuto setado para o default e o servidor poderá não aceitar conexões novas em uma faixa de tempo.

Alguns serviços, como o Samba, tem opção de ser configurados para rodar através de daemons ao invés de 
usar o super-server inetd. Neste caso é fortemente recomendável usar a primeira opção. No Debian é facilmente reconfigurado através do comando dpkg-reconfigure samba. Confira seus serviços /etc/inetd.conf com o comando  $ grep -v "^#" /etc/inetd.conf .

A estrutura do arquivo inetd.conf é simples, tendo uma unica entrada para cada para serviço, conforme este exemplo:
  • service-name: o nome de um serviço válido e listado em /etc/services;
  • socket type: deve ser escolhido um dos permitidos entre "stream", "dgram", "raw", "rdm" ou "seqpacket" dependendo se o socket será stream, datagram, raw, reliabli delivered message ou sequenced packet.;
  • proto: protocolo a ser utilizado, exemplo TCP;
  • flags: wait ou nowait.[numero] de instâncias no servidor;
  • user: usuário que irá rodar o serviço (lembre-se do privilégio mínimo);
  • server-path: caminho do serviço a ser executado como em /usr/sbin/tcpd;
  • args: argumento para o serviço como em /usr/sbin/smbd, considerando o samba como exemplo.
Para checar se suas configurações do tcpwrapper estão  isentas de erros, pode se utiliar o aplicativo tcpdchk.
2- O arquivo /etc/securetty
Como o nome sugere, securetty é o terminal ou console onde o root tem acesso ao sistema. Por segurança, minha sugestão é que root não se logue em nenhum terminal. Caso você precise ter algum privilégio de root, poderá ainda usar su ou sudo para atividades administrativas. Basta comentar todas as entradas em /etc/securetty caso queira ter este tipo de segurança à conta root. 
Leia este artigo e veja uma explicação humorada do que representa o root para o sistema operacional (e para você mesmo). 
3. Grub
Uma boa idéia como medida de segurança é pensar no boot do sistema. No GRUB é possível (e recomendável) desativar a interatividade no caso de alguma pessoa conseguir acesso físico ao servidor, exigindo assim uma senha em caso de tentativa de boot em single mode. Basta para isso descomentar a linha correspondente em /boot/grub/menu.lst como exemplo:

# menu.lst
default     0   
## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout     5   
# Pretty colours
color cyan/blue white/blue

## password ['--md5'] passwd
# If used in the first section of a menu file, disable all interactive editing
# control (menu entry editor and command-line)  and entries protected by the
# command 'lock'
# e.g. password topsecret
#      password --md5 $1$Tf9aZ/$AtnPE4K0P/Xn5DnpMsuoL0
 password senha

Perceba também que é recomendável que a senha esteja criptografada pelo md5. Isso pode ser feita através do utilitário grub e chamando o aplicativo md5crypt. Basta então copiar e colar o hash dentro da linha correspondente no menu.lst do grub. ATENÇÃO, faça isso por sua conta e risco. O grub é o bot loader default no Debian.
4. Senhas
Existem muitas maneiras de se inferir a senha de uma pessoa ou administrador do sistema. Ferramentas como engenharia social, nomes de times e outras afinidades das pessoas podem indicar um caminho para descoberta destas informações, incluindo nisso o próprio lixo gerado por uma organização e palavras comuns baseadas em dicionário. É papel de um sysadmin identicar este tipo de fragilidade e fazer sua correção. Você pode por exemplo suspender uma conta de acesso através do passwd -l ou liberar através do passwd -u .
Dois notáveis programas muito conhecidos são utilizados tanto para "testar" a fraqueza de senhas quanto para descobrir com força bruta senhas de usuários. Mais em http://www.openwall.com/john/ . Para sistemas Windows(TM) é possível também fazer os testes e recovery através do programa encontrado aqui.   
5. /etc/security
Se desejar "blindar" ainda mais seu servidor e torná-lo ainda mais seguro, observe este diretório. Nele temos por exemplo uma forma para controlar que pode ser acesso através de várias combinações: o acess.conf e group.conf oferecem uma tabela de controle para login extremamente eficiente com muitos tipos de permissões. Dentro de limits.conf, é possível fazer controle por usuário dos recursos do sistema, como número máximo de logins por usuário e o total no sistema inclusive tempo de processador e prioridade nos processos.
6. Reboot
Quando falamos em segurança, devemos prestar atenção em todos os detalhes. Na hipótese de um sistema estar comprometido, um reboot pode ser ainda mais desastroso, tornando os problemas piores para o syadmin e ainda podendo ter as evidências apagadas sem pensar em outros fatores. Em Linux, devemos dificultar o reboot proposital do sistema e até mesmo acidental. 
Dentro de /etc/inittab basta comentar a linha (considerado Debian como exemplo):


# What to do when CTRL-ALT-DEL is pressed.

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
7. Proteção ao SSH

Alguns sysadmins acreditam que mudando a porta do ssh (22) para uma outra qualquer pode melhorar a segurança do serviço ssh. A isto chamamos de segurança por obscuridade e não acredite que alguém mal intencionado possa se satisfazer com pouco. O ideal é fazer pelo menos alguns ajustes no sshd como exemplificado abaixo:
  • permita somente Protocol 2;
  • não permita password em branco;
  • não permita acesso como root;
  • não permita X11 forward;
  • ative timeout;
  • ative AllowUsers;
Exemplo de /etc/ssh/sshd_config


   Host *
   ForwardAgent no
   ForwardX11 no
   RhostsRSAAuthentication no
   RSAAuthentication yes
   PasswordAuthentication yes
   HostbasedAuthentication no
   BatchMode no
   CheckHostIP yes
   AddressFamily any
   ConnectTimeout 0
   StrictHostKeyChecking ask
   IdentityFile ~/.ssh/identity
   IdentityFile ~/.ssh/id_rsa
   IdentityFile ~/.ssh/id_dsa
   Port 22
   Protocol 2
   Cipher 3des
   Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
   Compression yes
   EscapeChar ~
   ForwardX11Trusted no
   ServerAliveInterval 160
   ServerAliveCountMax 3

   AllowUsers admin1 admin2 ...
   denyUsers ALL
   MaxStartups 5:90:10   (Após 5 conexões não autenticadas, 90% das conexões do ip serão recusadas e após 10 tentativas, o ip será bloqueado).
8. Tripwire

O tripwire é um monitor da integridade de sistemas Linux/Unix com diversas rotinas que certamente produz maior garantia de que seu servidor esteja mais seguro, informando inclusive alterações em permissões, links e diretórios. É recomendado sua instalação assim que o servidor esteja pronto e configurado, mantendo a partir deste ponto, toda a checagem das alterações ocorridas. O que você esta lendo aqui é uma pequena contribuição, não é um documento final e tem sómente as funções mais usuais. Se precisar saber mais, observe a man page.
Instalação simples através do aptitude install tripwire
Database Initialization Mode:
sudo tripwire --init   
Ao inicializar o twipwire no modo inicialização, será criado um database de situação atual do servidor.  Durante uma checagem posterior, este database será usado como referência para comparação.
Integrity Checking Mode
sudo tripwire --check 
Depois que você tem um database do servidor, poderá então usar o tripwire para checar a integridade do sistema. Este relatório é enviado para sua tela e salvo no diretório especificado na configuração REPORTFILE, normalmente em
 /var/lib/tripwire/reports. 
Database Update Mode



sudo tripwire --update 
Importante quando o próprio administrador do sistema fez mudanças, instalações novas etc. Permite atualizar o database com a nova situação do servidor. Veja mais man tripwire e perceba que devido sua importância, você será solicitado a confirmar cada item que teve sua alteração desde a criação do database tripwire.
Policy Update Mode



sudo tripwire --update-policy /etc/tripwire/twpol.txt 
Permite redefinir e sincronizar seu database com seu novo arquivo de policy com as informações de segurança atualizadas.
Test Mode

sudo tripwire --test --email root@localhost 



Um teste simples a fim de checar se as notificações do tripwire estão chegando ao administrador.
Enviando report do tripwire por e-mail
Use crontab para agendar os envios dos relatórios. O comando é simples e pode-se utilizar várias combinações. Um exemplo simples:


 sudo twprint --print-report  --twrfile /var/lib/tripwire/report/klecker-20100514-130744.twr | mail usuariodestino  


9. logwatch


10. Criptografia

ecryptfs-utils

11. last, lastdb,


Referências: 
1.http://www.faqs.org/docs/securing/chap5sec37.html
2.http://www.faqs.org/docs/securing/chap5sec41.html
4.http://www.tldp.org/HOWTO/Security-HOWTO/password-security.html
5.http://www.l0phtcrack.com/
6. man inittab
7. http://www.cert.br/docs/whitepapers/defesa-forca-bruta-ssh/