Quão ruim é ter vários dispositivos com as mesmas chaves de servidor SSH?

21

Estou trabalhando em um dispositivo incorporado que roda o FreeBSD e o SSH.

Como você sabe, o sshd gosta de gerar aleatoriamente um conjunto de chaves do servidor quando é inicializado. O problema é que enviaremos o produto com um sistema de arquivos de cartão SD somente leitura (não negociável).

Minhas duas opções como eu as vejo são:

  • Envie as mesmas chaves de servidor sshd em todos os dispositivos
  • Monte um sistema de arquivos de memória e gere as chaves do servidor em cada inicialização (lento ...)

É um grande problema de segurança enviar as mesmas chaves do servidor em todos os dispositivos? Esses itens não estarão diretamente na internet. Ocasionalmente, haverá vários dispositivos pertencentes à mesma pessoa e na mesma rede.

Na maioria das vezes, o dispositivo não será conectado à Internet.

O login com SSH não faz parte da operação normal. É principalmente para a conveniência dos programadores e técnicos. Os clientes não farão login no dispositivo com SSH.

Quais são as ramificações do uso das mesmas chaves de servidor em vários dispositivos de hardware?

PS alguém poderia, por favor, criar uma etiqueta de Internet das Coisas?

EDIT : Estou falando sobre a instalação das mesmas chaves privadas de host em todos os servidores (dispositivos). No que diz respeito às chaves públicas / privadas do usuário, atualmente não há planos de usar o login baseado em chave - seria o login com senha. Novamente, a mesma senha em todos os servidores (dispositivos).

Eu sei que isso provavelmente é uma má ideia. Eu gostaria de saber por que exatamente é uma má ideia, para que eu possa entender as vantagens e desvantagens.

NXT
fonte
Se você quer dizer as chaves do host, os usuários com mais de um dispositivo podem receber avisos, dependendo da configuração do cliente ssh. as maiores preocupações seriam as chaves de autenticação ssh reais. Espero que você não esteja instalando nenhuma chave privada e espero que suas chaves públicas sejam restritas a redes de origem específicas e esperamos que suas chaves privadas de propriedade de seus técnicos tenham uma senha forte e que essas chaves nunca sejam verificadas em um repositório por engano. As IoT estão recebendo um nome muito ruim por causa dessas coisas. Não estou dizendo que sim, apenas dizendo que é um grande problema.
Aaron
Estou falando sobre a instalação da mesma chave privada de host em todos os servidores, se é isso que você quer dizer.
NXT
2
Usar o mesmo nome de usuário / senha em todos os dispositivos é uma péssima idéia. É muito mais fácil usar força bruta do que a chave privada usada para autenticação de chave pública. Mesmo que esses dispositivos não estejam conectados diretamente à Internet, alguém fará isso de qualquer maneira. E se "não conectado diretamente" significa NAT, eles estão conectados o suficiente ...
Tero Kilkanen 4/16
7
Compartilhar a chave SSH significa que alguém que pode acessar a chave privada em um dispositivo pode se passar por todos esses dispositivos.
user253751
3
Embora essa seja uma pergunta interessante, não vejo nada relacionado à administração do sistema e, portanto, é fora de tópico para a falha do servidor. Você está perguntando sobre o design de uma interface de depuração / diagnóstico para um dispositivo incorporado que você está enviando e não uma interface que seria relevante para os administradores de sistemas. Esta pergunta pode ser migrada para o Information Security .
200_success

Respostas:

27

Em vez de armazenar dados específicos de host, como chaves de host ssh no cartão SD ou outra mídia somente leitura, você pode armazená-lo na NVRAM, que é para isso em um sistema incorporado. Você precisará criar scripts personalizados para armazenar e recuperar as chaves no momento da inicialização, mas os scripts serão exatamente iguais para todos os dispositivos.

Michael Hampton
fonte
12

O impacto do envio do mesmo par de chaves com todos os seus dispositivos está diretamente relacionado à segurança dos clientes que se conectam a eles, pois significa que não há como (de um cliente SSH) identificar exclusivamente o dispositivo ao qual ele está se conectando. Se seu par de chaves vazar, ele poderá ser usado para ataques MITM.

Por outro lado, a regeneração das chaves em cada inicialização também acionará um alerta nos clientes.

Para referência, de man ssh(1):

sshmantém e verifica automaticamente um banco de dados contendo a identificação de todos os hosts com os quais já foi usado. As chaves do host são armazenadas no ~/.ssh/known_hostsdiretório inicial do usuário. Além disso, o arquivo /etc/ssh/ssh_known_hostsé verificado automaticamente para hosts conhecidos. Quaisquer novos hosts são adicionados automaticamente ao arquivo do usuário. Se a identificação de um host mudar, sshavisa sobre isso e desativa a autenticação de senha para impedir a falsificação do servidor ou ataques de intermediários, que poderiam ser usados ​​para contornar a criptografia. A StrictHostKeyCheckingopção pode ser usada para controlar logins em máquinas cuja chave do host não é conhecida ou foi alterada.

dawud
fonte
2
Não entendo por que eles não podem gerar apenas uma vez (em cada dispositivo, na primeira inicialização) e nunca gerar novamente (a menos que sejam removidos)?
djsmiley2k - Cow
Perfeitamente factível. Mas o OP afirma que ele / ela deseja: 'Montar um sistema de arquivos de memória e gerar as chaves do servidor em cada inicialização'. Então, minha resposta assume isso.
dawud 5/12/16
ah, perdi isso quando li pela primeira vez.
Djsmiley2k - CoW
5

Parece que, na primeira opção, as teclas SSH estariam disponíveis no cartão SD. Assim, qualquer usuário pode pegar o cartão e lê-lo. Então, basicamente, suas chaves privadas se tornaram (principalmente) públicas.

Isso permitirá ataques man-in-the-middle, como o seguinte:

  1. Um usuário configura um servidor SSH com as chaves privadas obtidas do seu dispositivo e fornece esse endereço IP ao seu técnico.
  2. Seu técnico insere a senha de root na conexão SSH.
  3. O usuário agora conhece a senha raiz que é válida para todos os seus dispositivos.

No entanto, você não deve usar senhas raiz, em primeiro lugar, use chaves ssh para autenticação. Em seguida, o impacto das chaves do servidor compartilhado será bem pequeno se você fizer logon apenas a partir de uma LAN.

O SSH também fornece sigilo de encaminhamento, portanto, um invasor deve ser capaz de configurar um servidor falso para se beneficiar das chaves; farejar passivamente o tráfego não permitirá descriptografá-lo.

jpa
fonte
É engraçado como nossos preconceitos podem nos cegar (eu). O cartão SD está dentro da unidade, atrás de um painel e embaixo de uma placa de circuito, de modo que nunca me ocorreu que alguém o retiraria. No entanto, você está correto, é absolutamente acessível a qualquer pessoa com uma chave de fenda. Agradecemos o lembrete de considerar a segurança física do sistema.
NXT
WRT # 2, a senha root não deve ser enviada pela conexão SSH. Ele deve ser inserido no cliente do terminal e usado na metade local de um protocolo de autenticação que comprova a posse do segredo sem transmiti-lo ("prova de conhecimento"). Até sistemas com décadas de idade sabiam enviar um hash da senha e não a própria senha. Inclua um nonce no protocolo de desafio / resposta, e o invasor não conhece a senha original nem nenhum token que possa ser usado em seu lugar.
Ben Voigt
1
@BenVoigt Acho que a maioria dos sistemas unix transmite a senha ao servidor. O arquivo de sombra armazena apenas um hash, mas você não deseja confiar em um hash gerado pelo cliente - porque, de outra forma, alguém seria capaz de efetuar login com um hash roubado, sem revertê-lo. Portanto, o servidor precisa saber a senha real para executar bcrypt ou similar nela.
jpa
2

Eu li isso horrorizado! Eu que fiz várias máquinas no mesmo cluster com a mesma chave de host ssh nunca ousaria fazer isso. Em nenhuma circunstância, permita que máquinas com diferentes conjuntos de administradores compartilhem chaves de host ssh. Dessa forma, há loucura e horror gritante quando você é postado por sua falta de segurança.

Eis que digo a verdade: quem compromete um dispositivo compromete todos eles. Uma vez obtido, espere que as pessoas más pulem de um para o outro à vontade e a segurança retroceda como se fosse papel fino.

Joshudson
fonte
1
Você poderia explicar como um invasor usaria uma chave privada de servidor roubada para comprometer outros dispositivos?
jpa
@jpa: Para chaves de host, interceptando e roubando senhas, etc. Além disso, essa configuração parece propor fazer o mesmo com as chaves de usuário.
Joshudson
1

Como você menciona que o acesso SSH não é usado pelo usuário / cliente final, convém desativar o acesso SSH por padrão e ativá-lo apenas temporariamente quando o dispositivo for colocado no modo "depuração".

Você pode enviar todos os dispositivos com a mesma chave, supondo que você tenha protegido o modo "depuração" para que não possa ser acionado remotamente por alguém tentando hackear o dispositivo.

Ou você tem uma nova chave gerada quando o dispositivo entra no modo "depuração" - para que você não precise perder o tempo de inicialização gerando as chaves cada vez que o dispositivo é ligado.

Edders
fonte
Eu gosto desta ideia.
NXT
1

Aqui está um exemplo de cenário de ataque com base nas restrições que você possui:

Se os seus dispositivos estiverem, diga um Raspberry Pi, por exemplo. Se eu subir e arrancar o cartão SD de um, eu posso colocar o cartão SD no meu próprio computador, encontrar a chave sshd e copiá-la para onde quiser. Talvez eu pegue meu próprio raspberry pi e uma placa ethernet USB. Agora posso colocar isso entre um dispositivo de destino e onde quer que eles estejam e monitorar conexões ssh. Quando vejo que o dispositivo de destino está tentando fazer uma conexão ssh, faço o seguinte:

(target) <---> (my evil sshd <--> decrypted traffic <--> ssh) <---> (real server)
                                       |
                                       V
                                    log file

Oh, o que é isso? Sua senha é "Eu gosto de gatos"? Rapaz, este é um e-mail interessante que você enviou para sua esposa. Aposto que seria ainda mais interessante se ela lesse esse e-mail que você enviou para a esposa do vizinho.

As possibilidades são infinitas . E o alvo nunca saberia, porque a chave sshd é idêntica à encontrada no servidor real. Dependendo da segurança física das instalações que estão recebendo seu dispositivo, isso pode ser incrivelmente trivial. Não faça isso.

Em vez disso, faça o que você já propõe, mas corrija-o . Antes de escrever sua imagem, execute algo como isto:

ssh-keygen -f some-new-server
cp some-new-server /path/to/the/mounted/image/sshd/key
cp some-new-server.pub /path/to/the/mounted/image/sshd/key.pub

E agora todo servidor tem uma nova chave. Porque você realmente, realmente não quer distribuir cópias de uma chave. Sinceramente, é pelo menos tão ruim quanto tirar uma foto das chaves da sua casa e enviá-las para a Internet com o seu endereço residencial.

Wayne Werner
fonte
1
Se alguém tiver acesso físico ao seu hardware e você não conseguir criptografar os dados em repouso, todas as apostas serão desativadas.
user9517 suporta GoFundMonica