Bom dia a todos,
No inicio de janeiro de 2015, surgiu no /. um artigo muito interessante de como a NSA já consegue desencriptar em tempo real ligações de SSH.
Quem diz a NSA, diz qualquer grupo que tenha acesso a uma pool suficientemente grande de pc’s zombie, ie botnet.
A ideia em si é aterradora se tiverem que passar dados de negócio extremamente sensíveis pela internet. Os dados são nossos e queremos manter controle de quem os vê.
Descobri então este artigo no github onde nos é ensinado a efetuar military grade hardening ás conectividades de SSH.
Este post é portanto uma tradução e mini how-to do que é explicado nesse artigo e todos os créditos são deles.
Em termos de prefácio é importante lembrar que o OpenSSH suporta 8 tipos principais de troca de chave:
- curve25519-sha256: ECDH over Curve25519 with SHA2
- diffie-hellman-group1-sha1: 1024 bit DH with SHA1
- diffie-hellman-group14-sha1: 2048 bit DH with SHA1
- diffie-hellman-group-exchange-sha1: Custom DH with SHA1
- diffie-hellman-group-exchange-sha256: Custom DH with SHA2
- ecdh-sha2-nistp256: ECDH over NIST P-256 with SHA2
- ecdh-sha2-nistp384: ECDH over NIST P-384 with SHA2
- ecdh-sha2-nistp521: ECDH over NIST P-521 with SHA2
Destes 8, há que recordar 3 coisas importantes:
- ECDH curve choice: Isto elimina automaticamente das opções 6-8 porque as NIST curves falham redondamente.
São conhecidas por efetuar leaks de informação. Igualmente NIST é considerado como sendo prejudicial e não deverá ser confiado. - Tamanho de Bit do modulo de DH: Isto elimina a segunda hipótese pois a NSA consegue já quebrar estas comunicações em tempo real. Pondo de uma forma simples os 1024 bits já não nos fornecem margem de segurança suficiente.
- Segurança da função de hash. Isto automaticamente invalida as opções 2 a 4 pois o SHA1 está broken.
Isto deixa-nos com as opções 1 e 5. A opção 1 é perfeitamente boa mas para questões de interoperabilidade a versão 5 pode e deve ser incluída.
Assim sendo, ao nível da configuração do daemon de sshd (/etc/ssh/sshd_config) temos:
KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256
Do lado do cliente de ssh (/etc/ssh/ssh_config) temos:
# Github needs diffie-hellman-group-exchange-sha1 some of the time but not always.
#Host github.com
# KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1
Host *
KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256
Autenticação:
O OpenSSH oferece 4 tipos de algoritmos públicos de autenticação:
- DSA with SHA1
- ECDSA with SHA256, SHA384 or SHA512 depending on key size
- Ed25519 with SHA512
- RSA with SHA1
Assim sendo, efetuar ao nível do /etc/ssh/sshd_config:
Protocol 2
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
Nota: Com isto alem de dar hostkeys diferentes, é desabilitado a versão 1 do protocolo que está broken.
Vamos gerar as keys necessárias:
cd /etc/ssh
rm ssh_host_*key*
ssh-keygen -t ed25519 -f ssh_host_ed25519_key < /dev/null
ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key < /dev/null
Autenticação de cliente:
Uma das formas de autentica como sempre é a password embora seja um método falível.
Recomenda-se sempre a utilização de chaves partilhadas:
No ficheiro de configuração do daemon /etc/ssh/sshd_config:
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
Do lado da configuração do cliente /etc/ssh/ssh_config:
Host *
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
HostKeyAlgorithms [email protected],[email protected],ssh-rsa-cert [email protected],ssh-ed25519,ssh-rsa
Finalmente geramos as client keys necessárias:
ssh-keygen -t ed25519 -o -a 100
ssh-keygen -t rsa -b 4096 -o -a 100
Cifras simétricas:
As cifras simétricas é o que é utilizado para encriptar os dados e nos garantir segurança na comunicação assim que a troca de chaves inicial está completa.
Existem bastantes algoritmos:
- 3des-cbc
- aes128-cbc
- aes192-cbc
- aes256-cbc
- aes128-ctr
- aes192-ctr
- aes256-ctr
- [email protected]
- [email protected]
- arcfour
- arcfour128
- arcfour256
- blowfish-cbc
- cast128-cbc
- [email protected]
Assim sendo e tendo em conta os issues identificados com algumas das cifras temos:
No ficheiro de configuração do daemon /etc/ssh/sshd_config:
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
Do lado da configuração do cliente /etc/ssh/ssh_config:
Host *
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
Códigos de autenticação de mensagem.
A encriptação fornece a confidencialidade. Os códigos a integridade do que recebemos.
Existem os seguintes opções de escolha referente a MAC’s:
- hmac-md5
- hmac-md5-96
- hmac-ripemd160
- hmac-sha1
- hmac-sha1-96
- hmac-sha2-256
- hmac-sha2-512
- umac-64
- umac-128
- [email protected]
- [email protected]
- [email protected]
- [email protected]
- [email protected]
- [email protected]
- [email protected]
- [email protected]
- [email protected]
No ficheiro de configuração do daemon /etc/ssh/sshd_config:
MACs [email protected],[email protected],[email protected],umac [email protected],hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,[email protected]
No ficheiro de configuração do cliente /etc/ssh/ssh_config:
Host *
MACs [email protected],[email protected],[email protected],[email protected],hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,[email protected]
Nota: Todas as alterações efetuadas ao /etc/ssh/sshd_config vão obrigar a um reload ao daemon de ssh.
O artigo é extremamente extenso e extremamente bem construido. Recomendo vivamente que leiam o mesmo com muita atenção.
Caso tenham duvidas, o meu email está como sempre disponível.
Abraço,
Nuno
[fb_linkedin_resume_header]