[Linux-Pira] Re: [Dicas-L] Como melhorar a segurança do ssh
Geison Tel
geison em rnp.br
Quinta Janeiro 13 09:20:28 BRST 2005
>
>
>
> Como melhorar a segurança do ssh
> ================================
>
>
> Colaboração: Ederson L. Corrêa
>
> Sabemos que o ssh é uma forma de acesso remoto razoalvelmente
> segura, bem mais segura que nosso velho conhecido telnet.
>
> Entretanto, na net encontram-se disponiveis diversos scripts de
> "brute force" para tentar se obter acesso pelo ssh, e como não
> faltam idiotas metidos a crackers para tentarem essas coisas,
> sempre é bom se cercar de todo o cuidado.
>
> Aqui listarei algumas sugestões coletadas de várias fontes
> (agradecimentos especiais ao Alejandro Flores, que me deu boas
> idéias), que ajudam a aumentarmos nossa segurança.
>
> 1. Use senhas fortes: Não use senhas fáceis, muito menos
> pequenas, de preferência assimétricas e sem padrão (nada de
> "letra numero letra numero ..." ou "numero letra numero letra
> ...") e faça bom uso dos caracteres como @,#,$,&, ...;
>
> 2. Mude a porta do ssh: Só com isso minimizamos problemas com um
> ataque automatizado, ou ataques de script kiddies que não sabem
> mudar a porta do ssh no exploit que baixaram da internet. Isso
> pode ser feito através da opção 'Port' do /etc/ssh/sshd_config.
>
> 3. Bloqueie o acesso como usuário root: Assim, evita-se
> problemas de alguém conseguir quebrar a senha do root e já
> acessar com plenos poderes. Com isso, o 'atacante' teria que
> descobrir o login e password de um usuário e depois a senha
> do root. Isso pode ser feito adicionando 'PermitRootLogin no'
> no /etc/ssh/sshd_config.
>
> 4. Certifique-se de o sshd estar rodando com separação
> de privilegios: Dessa forma, o sshd cria um processo não
> privilegiado para tratar as conexões iniciais. Após sucesso na
> autenticação, cria um outro processo que tem os provilegios
> necessários. Isso é default no ssh, mas devemos garantir
> que NÃO exista uma linha com 'UsePrivilegeSeparation no'
> no /etc/ssh/sshd_config.
>
> 5. Permita acesso a apenas um usuário: Isso
> é possivel através da opção 'AllowUsers' do
> /etc/ssh/sshd_config. Bastaria acrescentar uma linha com
> 'AllowUsers nome_do_usuario_autorizado_a_logar_via_ssh'.
>
> 6. Crie um usário com o máximo de restrições possiveis e que
> você só use para o shh: Exemplos de restrições:
>
> - Não o inclua em nenhum outro grupo além do users;
> - Edite o /etc/ftpusers e acrescente o nome desse usuário. Assim
> bloqueamos o acesso dele ao ftp.
> - Evite que ele possa se tornar root (adicione uma linha com
> 'root:nome_usuario_do_ssh:DENY' no /etc/suauth). Assim, vc
> deverá se tornar outro usuário e ai sim se tornar root. Exemplo,
> suponhamos que 'teste' seja o usuario criado para o acesso
> por ssh, e que 'elcorrea' seja um outro usuário cadastrado na
> máquina, assim para se tornar root estando logado com teste
> teriamos que fazer:
>
> $ (aqui somos teste)
> $ su - elcorrea (aqui nos logamos como usuario elcorrea)
> Password: (password do elcorrea)
> $ (agora somos elcorrea)
> $ su - (aqui nos tornamos root)
> Password: (password do root)
> # (agora somos root)
>
>
>
> Assim, vemos que alguém teria que descobrir dois nomes de
> usuário e três senhas para conseguir se tornar root.
>
> - Utilize algum programa pós-login para efetuar um 'challenge'
> para certificar de que você é você mesmo. Essa foi uma grande
> idéia do Alejandro. O que ele quis dizer é para criarmos um
> programa ou script que faz uma pergunta, a qual pode ser um
> gerador de caracteres baseado na hora ou uma simples pergunta
> de carater pessoal, que só você saberia responder. E caso
> o usuário erre ou tente fechar o programa/script (ctrl+c)
> a sessão é fechada. Um exmeplo bem simplista seria:
>
> - Crie (ou edite acrescentando no inicio) um .bash_profile
> para o usuário do ssh com o seguinte conteudo:
>
> trap '' SIGINT SIGTERM
> ./eu.sh
> if [ -e sou_eu.txt ]; then
> echo "Acesso Autorizado"
> rm -f sou_eu.txt
> else
> echo "Acesso Negado"
> logout
> fi
> trap SIGINT SIGTERM
>
>
>
> - Crie um arquivo chamado eu.sh no home do usuário do ssh, com:
>
> #!/bin/bash
> echo "Qual a senha do seu cartao?"
> read resp
> if [ "$resp" == "123456" ]; then
> touch sou_eu.txt
> fi
>
>
> E não se esqueça de torna-lo executavel: chmod +x eu.sh
>
> 7. Se possivel, limite os endereços IPs que podem acessar a
> maquina por ssh: Caso você sempre acesse a máquina através de
> um número limitado de maquinas, ou então somente internamente
> a rede, você pode limitar o acesso ao ssh a somente essas
> maquinas.
>
> Isso pode ser feito de diversas formas, com regras no iptables,
> através da dupla /etc/hosts.allow e /etc/hosts.deny, e, o que eu
> acho mais fácil, através da opção AllowUsers na forma user em host.
>
> Assim, suponhamos que eu sempre acesso a maquina remoatamente
> através de uma máquina de IP 10.0.0.5 e que eu criei o usuário
> 'teste' para acesso por ssh, assim eu acrescentaria uma linha
> com 'AllowUsers teste em 10.0.0.5' no /etc/ssh/sshd_config,
> e limitaria o acesso a apenas esse usuário e de apenas essa
> maquina.
>
> Se você não pode limitar os endereços, por qualquer
> razão, é bom utilizar um script que detecte uma
> tentaiva de acesso por brute force e que bloqueie o IP
> do atacante. Veja também um script desse tipo (http://www.vivaolinux.com.br/scripts/verFonte.php?codigo=656&arquivo=dtct), criado pelo Mastah
> listado abaixo:
>
>
> #!/bin/bash
> # Shellscript criado para bloquear os corriqueiros bruteforce probes
> # feitos para a porta do ssh. Pega as ultimas 20 tentativas ilegais na porta do ssh.
> # Verifica se voce já bloqueou o mané e se voce quer adicionar na regra do iptables.
> # Caso queira usar no crontab, é so mudar o valor da var $MODE pra "AUTO"...
> # Abracos, Mastah
>
> MODE="AUTO"
> #MODE="MANUAL"
>
> if [ -f /var/log/messages ] ; then
> ips=$(cat -n /var/log/messages | tail -n 20 | grep -i Illegal | grep -i sshd | awk -F" " {'print $11'})
> attempts=1
> for ip in $ips ; do
> lastip=$ip
> if [ "$lastip" == "$ip" ] ; then
> attempts=$(expr $attempts + 1)
> if [ $attempts -ge 5 ] ; then
> echo "Brute force SSHD attack detected from $ip"
> attempts=1
> lastip=""
> blocked=$(iptables -L INPUT | grep -i $ip | grep -i DROP)
> if [ "$blocked" ] ; then
> echo "> Ip Already Blocked. Continuing with scan"
> echo " "
> else
> if [ $MODE == "MANUAL" ] ; then
> echo "> Do You Want to add this IP to INPUT DROP in IPTABLES rules? (y/n)"
> read resp
> if [ "$resp" == "y" ] ; then
> iptables -A INPUT -s $ip -j DROP
> echo "> IP $ip ADDED TO IPTABLES INPUT DROP ruleset"
> echo " "
> fi
> else
> iptables -A INPUT -s $ip -j DROP
> echo "> IP $ip ADDED TO IPTABLES INPUT DROP ruleset"
> echo " "
> fi
> fi
> fi
> fi
> done
> fi
>
>
> Assim, utilizando apenas algumas dessas dicas já aumentamos
> enormemente a nossa segurança.
>
> Caso não tenha ficado claro, todas as alterações mencionados
> aqui devem ser feitas na maquina que será acessada remotamente.
>
>
> Referências
> ===========
>
>
> - Configurações para o SU - by Piter Punk (http://www.openslack.org/~piterpk/artigos/suauth.html)
> - Segurança da rede e Controle de acesso - by Guia Foca Gnu/Linux (http://focalinux.cipsga.org.br/guia/avancado/ch-rede.htm#s-rede-seg-tcpd)
> - man sshd_config
> - man sshd
> - man hosts_access
>
> --------------------------------------------------------------------
> Colabore com a Dicas-L. Publique seu comentário sobre esta mensagem
> em http://www.Dicas-L.unicamp.br/dicas-l/20050113.php
> --------------------------------------------------------------------
> As mensagens da lista Dicas-L são veiculadas diariamente
> para 26338 assinantes.
>
> Todas as mensagens da Dicas-L ficam armazenadas em
> http://www.Dicas-L.unicamp.br/dicas-l/
>
> A redistribuição desta e outras mensagens da lista Dicas-L pode
> ser feita livremente segundo a licença Creative Commons
> http://creativecommons.org/licenses/by-nc-sa/2.0/br/deed.pt
> --------------------------------------------------------------------
>
--
_ Geison Tel
°v° RNP - Rede Nacional de Ensino e Pesquisa
/(_)\ Brasil - Campinas - SP
^ ^ http://www.rnp.br
Mais detalhes sobre a lista de discussão Linux-Pira