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

40

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 dos quais é portátil
  • Os membros da equipe têm acesso a 10 a 50 servidores, geralmente com sudo

Acho que isso é bastante típico para a maioria das startups e grupos de TI corporativos de pequeno a 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 um de seus computadores laptop ou desktop?

    
por Evan Prodromou 23.01.2013 / 16:07

8 respostas

31

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

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

Também temos um host bastion que é usado para acessar hosts na rede de produção, permitindo que tenhamos regras de firewall muito restritivas em torno dessa rede. A maioria dos engenheiros tem alguma configuração SSH especial 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 nessa 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 deixam de remover uma chave antiga quando ela não é mais necessária e não temos nenhuma maneira real de rastrear isso, exceto para limpar quando um funcionário deixa a empresa. Ele também cria algum atrito adicional ao embarcar em um novo engenheiro, já que eles precisam gerar uma nova chave e enviá-la a todos os hosts antes que eles 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 dá a cada usuário uma identidade que aparece nos registros de auditoria, o que pode ser muito útil ao tentar para rastrear um problema de produção de volta para uma ação sysadmin.

É incomodativo, sob essa configuração, ter sistemas automatizados que executem ações contra hosts de produção, já que suas chaves SSH "conhecidas" podem servir como um caminho de acesso alternativo. Até agora, fizemos as contas de usuário para esses sistemas automatizados terem apenas o mínimo de acesso necessário para realizar seus trabalhos e aceitaram que um usuário mal-intencionado (que já deve ser engenheiro com acesso de produção) também poderia fazer essas mesmas ações. anonimamente usando a chave do aplicativo.

    
por 23.01.2013 / 17:24
6
Pessoalmente, eu gosto da idéia de cada membro da equipe ter uma chave em uma máquina de reduto ssh dedicada, na qual eles têm uma conta de usuário básica. Essa conta de usuário tem 1 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 somente o acesso ssh da máquina de bastiões esteja ativado)

Em seguida, em suas máquinas de trabalho diárias, 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 facilmente monitorar o acesso ssh através da rede (como todas as rotas através da máquina de bastiões) e se os desenvolvedores quiserem múltiplos chaves ou apenas um que eles compartilham entre suas máquinas não é problema real, pois você só tem uma máquina para atualizar. (a menos que as chaves ssh dos bastiões sejam comprometidas, ut tbh que é muito mais improvável do que uma das chaves de usuários)

    
por 23.01.2013 / 16:55
5

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

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

    
por 23.01.2013 / 17:22
2

Eu, pessoalmente, ficaria com o usuário e, em seguida, você teria responsabilidade instantaneamente e definiria as restrições com muito mais facilidade - não sei o que as outras pessoas pensam?

    
por 23.01.2013 / 16:28
2

Uma abordagem que eu já ouvi falar, mas não usei, é para cada usuário ter um pacote (por exemplo, .deb, .rpm) que contém sua configuração de chave pública ssh, bem como qualquer dotfiles que eles gostem 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 de usuário, ou pode complementar outra coisa criando a conta (cfengine / puppet etc) ou um sistema de autenticação central como o LDAP.

Estes pacotes são então instalados nos hosts através de qualquer mecanismo que você preferir (cfengine / puppet etc, cron job). Uma abordagem é ter um meta-pacote que tenha uma dependência dos pacotes por usuário.

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

Se você tem sistemas heterogêneos e precisa manter ambos os arquivos .rpm e .deb, então eu posso ver isso sendo um pouco chato, embora ferramentas como o alien possam tornar isso um pouco mais fácil.

Como eu digo, 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, na medida em que permite que um usuário atualize facilmente seu pacote para incluir seu arquivo .vimrc, por exemplo, sem ter que ter esse arquivo gerenciado por ferramentas como fantoches, às quais um usuário pode não ter acesso.

    
por 23.01.2013 / 20:35
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ê tiver chaves compartilhadas entre usuários, mesmo que seja uma pequena equipe, revogar uma chave é uma inconveniência para todos os outros.

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

    
por 25.01.2013 / 02:35
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 em algo e, talvez, trazer de volta à vida?

O repo está disponível no github: link

    
por 30.01.2013 / 04:47
-4

Uma abordagem poderia estar configurando o servidor NIS com o compartilhamento / home sobre o NFS. Isso combinado com o sudo nos servidores e permitindo somente 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.

Atenciosamente,

Rafael

    
por 23.01.2013 / 17:06