Quais são as práticas recomendadas para gerenciar chaves SSH em uma equipe?

42

Trabalho com pequenas equipes (<10) de desenvolvedores e administradores com as seguintes características:

  • A maioria dos membros da equipe possui> 1 computador pessoal, a maioria portátil
  • Os membros da equipe têm acesso a 10 a 50 servidores, geralmente com o sudo

Acho que isso é bastante típico para a maioria das startups e grupos de TI corporativos de pequeno e médio porte.

Quais são as melhores práticas para gerenciar chaves SSH em uma equipe como essa?

Você deve compartilhar uma única chave para toda a equipe?

Cada pessoa deve ter sua própria chave em uma conta compartilhada ("ubuntu" em todos os servidores)?

Contas separadas?

Cada membro da equipe deve manter uma chave separada para cada laptop ou desktop?

Evan Prodromou
fonte

Respostas:

33

Na minha empresa, usamos o LDAP para ter um conjunto consistente de contas em todas as máquinas e, em seguida, usamos uma ferramenta de gerenciamento de configuração (no nosso caso atualmente cfengine) para distribuir authorized_keysarquivos para cada usuário em todos os servidores. Os próprios arquivos de chave são mantidos (junto com outras informações de configuração do sistema) em um repositório git, para que possamos ver quando as chaves vão e vêm. O cfengine também distribui um sudoersarquivo que controla quem tem acesso para executar o que como raiz em cada host, usando os usuários e grupos do diretório LDAP.

A autenticação de senha é completamente desativada em nossos servidores de produção, portanto, a autenticação de chave SSH é obrigatória. A política incentiva o uso de uma chave separada para cada laptop / desktop / o que for e o uso de uma senha em todas as chaves para reduzir o impacto de um laptop perdido / roubado.

Também temos um host bastião usado para acessar hosts na rede de produção, o que nos permite ter regras de firewall muito restritivas em torno dessa rede. A maioria dos engenheiros possui algumas configurações especiais de SSH para tornar isso transparente:

Host prod-*.example.com
     User jsmith
     ForwardAgent yes
     ProxyCommand ssh -q bastion.example.com "nc %h %p"

Adicionar uma nova chave ou remover uma antiga exige um pouco de cerimônia nesta configuração. Eu diria que, para adicionar uma nova chave, é desejável que seja uma operação que deixe uma trilha de auditoria e seja visível para todos. No entanto, devido à sobrecarga envolvida, acho que as pessoas às vezes esquecem de remover uma chave antiga quando ela não é mais necessária e não temos uma maneira real de rastrear isso, exceto para limpar quando um funcionário deixa a empresa. Ele também cria um atrito adicional ao integrar um novo engenheiro, já que eles precisam gerar uma nova chave e enviá-la a todos os hosts antes que possam ser completamente produtivos.

No entanto, o maior benefício é ter um nome de usuário separado para cada usuário, o que facilita o controle de acesso mais granular quando necessário e fornece a cada usuário uma identidade que aparece nos logs de auditoria, o que pode ser realmente útil ao tentar rastrear um usuário. problema de produção de volta a uma ação sysadmin.

É incômodo, nessa configuração, ter sistemas automatizados que executam ações contra hosts de produção, pois suas chaves SSH "conhecidas" podem servir como um caminho de acesso alternativo. Até agora, acabamos de fazer com que as contas de usuário desses sistemas automatizados tenham apenas o acesso mínimo necessário para realizar suas tarefas e aceitamos que um usuário mal-intencionado (que já deve ser um engenheiro com acesso à produção) também possa executar essas mesmas ações semi- anonimamente usando a chave do aplicativo.

Martin Atkins
fonte
Esta é uma resposta muito boa! Pergunta de acompanhamento: você usa o cfengine para distribuir .authorized_keys. Você procurou alguma das maneiras de armazenar chaves públicas SSH diretamente no servidor LDAP? Eles exigem principalmente o patch sshd, que é frágil.
Evan Prodromou 23/01
Eu fiz algo semelhante com o Chef.
precisa saber é o seguinte
1
@EvanProdromou Configurei as chaves públicas SSH no LDAP, mas era muito mais complicado do que valia, já que eu tinha que manter os pacotes SSH atualizados por conta própria e já era tempo de algumas vulnerabilidades do SSH
Daniel Lawson
1
Regras do Sudo e chaves SSH também podem ser colocadas no LDAP, o SSSD pode ser usado para configurar isso. Links: sudo.ws/sudoers.ldap.man.html e access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/…
fuero
Eu gosto da sua parte ProxyCommand ssh -qlá! Nunca vi isso. Eu hesito em instalar um servidor bastião, mas se ele puder ser transparente para os usuários finais, talvez eu seja a favor. Obrigado Martin!
the0ther
6

Pessoalmente, gosto da ideia de cada membro da equipe ter uma chave em uma máquina ssh bastion dedicada na qual eles têm uma conta de usuário básica. Essa conta de usuário possui uma chave ssh que concede acesso a todos os servidores que eles precisam usar. (esses outros servidores também devem ser protegidos por firewall, para que apenas o acesso ssh da máquina bastion seja ativado)

Em suas máquinas de trabalho cotidianas, laptops, tablets etc., eles podem escolher entre ter uma chave entre eles ou várias chaves.

Como administrador de sistemas nessa rede, você tem um número mínimo de chaves para cuidar (uma por dev), pode monitorar facilmente o acesso ssh através da rede (como todas as rotas passam pela máquina bastião) e se os desenvolvedores desejam várias chaves ou apenas um que eles compartilham entre suas máquinas, não é um problema real, pois você só tem uma máquina para atualizar. (a menos que as chaves ssh do bastião estejam comprometidas, isso é muito mais improvável do que uma das chaves dos usuários)

peteches
fonte
5

Eu tive a situação em que precisei fornecer acesso à chave SSH para uma equipe de 40 desenvolvedores para ~ 120 servidores remotos de clientes.

Eu controlei o acesso forçando os desenvolvedores a se conectarem através de um único "host de salto". A partir desse host, gerei chaves públicas / privadas e as enviei aos servidores do cliente. Se os desenvolvedores precisassem acessar de um laptop, eles poderiam usar o mesmo par de chaves em seu sistema local.

ewwhite
fonte
2

Pessoalmente, eu aceitaria por usuário e você teria responsabilidade instantânea e definiria restrições com muito mais facilidade - não sei o que as outras pessoas pensam?

Rhys Evans
fonte
2

Uma abordagem que eu ouvi falar, mas não me usei, é que cada usuário tenha um pacote (por exemplo, .deb, .rpm) que contém sua configuração de chave pública ssh, bem como quaisquer arquivos de ponto que eles gostam de personalizar (.bashrc , .profile, .vimrc etc). Isso é assinado e armazenado em um repositório da empresa. Este pacote também pode ser responsável por criar a conta do usuário ou pode complementar outra coisa criando a conta (cfengine / puppet etc) ou um sistema de autenticação central como LDAP.

Esses pacotes são instalados nos hosts através do mecanismo que você preferir (cfengine / puppet etc, cron job). Uma abordagem é ter um metapacote que depende dos pacotes por usuário.

Se você deseja remover uma chave pública, mas não o usuário, o pacote por usuário é atualizado. Se você deseja remover um usuário, remova o pacote.

Se você tem sistemas heterogêneos e precisa manter os arquivos .rpm e .deb, posso ver isso um pouco irritante, embora ferramentas como o alienígena possam facilitar um pouco.

Como eu disse, eu não fiz isso sozinho. O benefício dessa abordagem para mim é que ela complementa um sistema LDAP central e o gerenciamento central de contas de usuário, pois permite que um usuário atualize facilmente seu pacote para incluir seu arquivo .vimrc, por exemplo, sem ter que gerenciar esse arquivo por ferramentas como fantoches, às quais um usuário pode não ter acesso.

Daniel Lawson
fonte
1

Você deve seguir a rota mais segura e forçar cada usuário a ter chaves separadas e, provavelmente, para cada dispositivo.

Se você possui chaves compartilhadas entre os usuários - mesmo que você seja uma equipe pequena -, revogar uma chave é um inconveniente para todos os outros.

Se você permitir que sua equipe tenha uma chave para todos os dispositivos, eles poderão escolher em quais servidores eles podem se conectar a esse dispositivo. Por exemplo, um laptop móvel pode ser restrito a um ou dois servidores, mas a área de trabalho do escritório pode ter acesso a todos os servidores.

Dolan Antenucci
fonte
1

Alguns anos atrás, a Envy Labs escreveu uma ferramenta chamada Keymaster (em parceria com o cliente Gatekeeper) para lidar com algo assim para as equipes de desenvolvimento.

O projeto não teve muito amor nos últimos dois anos, mas é provável que você possa mexer e talvez trazer de volta à vida?

O repo está disponível no github: https://github.com/envylabs/keymaster

Matthew Savage
fonte
-4

Uma abordagem pode ser a configuração do servidor NIS com o compartilhamento / home sobre o NFS. Isso combinou com o sudo nos servidores e permite apenas os usuários que você deseja para cada servidor via configuração ssh.

Dessa forma, todos os membros da equipe usam apenas um usuário e sua chave para acessar todos os servidores. Sudo e uma senha para as tarefas administrativas.

Saudações,

Rafael

Rafael Bonifaz
fonte
1
1) A ativação do NIS é uma falha de segurança. 2) Ter uma senha e conta é contrária à rastreabilidade e responsabilidade.
Deer Hunter