OpenSSH com chaves públicas do banco de dados

14

É possível buscar as chaves públicas de um banco de dados em vez do arquivo allowed_keys?

Gostaria de usar essa configuração para gerenciar o acesso ssh a itens como repositórios git para vários usuários, sem a necessidade de recriar o arquivo allowed_keys sempre que uma chave pública for alterada ou adicionada.

Fionn
fonte
1
Estou usando fantoche para este
Matt Simmons
O Userify pode gerenciar essas contas com administração centralizada, mas com autenticação local. Dessa forma, se o banco de dados centralizado ficar inativo, você ainda poderá entrar, mas todos os benefícios do gerenciamento centralizado.
Jamieson Becker

Respostas:

16

Eu encontrei essa pergunta ao tentar responder a mim mesma. Após algumas pesquisas e experimentações, encontrei algumas outras opções para isso. Vou pular a parte sobre a distribuição de chaves como uma alternativa, já que Matt Simmons cobriu isso. Além disso, eu sei que há momentos em que isso não é bom o suficiente. Por exemplo, se você é o GitHub e precisa armazenar milhões de chaves públicas em um único usuário, a atualização contínua dos arquivos allowed_keys do SSH e a manutenção deles sincronizados em potencialmente dezenas a centenas de caixas de borda não é viável ou desejável.

Então,

  1. Primeiro, o RedHat (e variantes) têm um patch suportado para o OpenSSH que adiciona as opções AuthorizedKeysCommande AuthorizedKeysCommandRunAs. O patch foi mesclado a montante no openssh 6.2. Para citar a partir da página de manual :

    AuthorizedKeysCommand

    Especifica um programa a ser usado para procurar as chaves públicas do usuário. O programa será chamado com seu primeiro argumento, o nome do usuário que está sendo autorizado, e deve produzir nas linhas AuthorizedKeys de saída padrão (consulte AUTHORIZED_KEYS no sshd (8)). Por padrão (ou quando definido como a sequência vazia), não há execução de AuthorizedKeysCommand. Se o AuthorizedKeysCommand não autorizar o usuário com êxito, a autorização recairá no AuthorizedKeysFile. Observe que essa opção tem efeito apenas com o PubkeyAuthentication ativado.

    AuthorizedKeysCommandRunAs

    Especifica o usuário em cuja conta o AuthorizedKeysCommand é executado. String vazia (o valor padrão) significa que o usuário que está sendo autorizado é usado.

    Em meus experimentos hoje à noite, descobri que, fora da caixa, isso não funciona devido às políticas padrão do SELinux. Você pode contornar isso desativando a aplicação do SELinux com setenforce 0. Como a desativação do SELinux provavelmente é uma idéia, você pode gerar a política correta. No meu caso, isso foi tão simples quanto tentar fazer login com a AuthorizedKeysCommandopção configurada /etc/ssh/sshd_confige depois usá-la audit2allow -a -M local && semodule -i local.pp. Basicamente, ele examina os logs de auditoria e encontra coisas que foram impedidas e gera exceções para eles. Se é provável que você tenha outras coisas que possam ser incluídas na lista de permissões, você provavelmente deve aprender mais sobre audit2allowcomo obter as novas políticas corretamente.

  2. Existem outros patches (provavelmente menos testados e confiáveis) disponíveis para adicionar funcionalidades semelhantes. Por exemplo, existe o openssh-script-auth . Você também pode encontrar o patch usado pelo RedHat e aplicá-lo diretamente. Um rápido acesso ao Google revela https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patch e https://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patch, que são com base nas versões RH, mas que foram atualizadas para versões mais recentes do OpenSSH.

  3. Faça o patch do OpenSSH para realizar pesquisas de chave diretamente de alguma loja (por exemplo, como GitHub e CodeBaseHQ e outras já foram realizadas). O GitHub não forneceu este patch de código aberto, tanto quanto sei, mas sei que no passado encontrei versões para a pesquisa de chaves do MySQL e PostgreSQL. Tentei encontrá-los novamente agora, mas não tive muita sorte.

  4. Existem também algumas opções baseadas em FUSE. Por exemplo, existe o LPKFuse, que permite servir chaves públicas do LDAP, alterando o AuthorizedKeysFilelocal para um no sistema de arquivos LPKFuse. O LPKFuse FS cria arquivos virtuais cujo conteúdo é respaldado por campos de um servidor de diretório.


Em suma, acho que a opção 1 é de longe a melhor, pois é oficialmente suportada pelo RedHat. Além disso, ele permite que você coloque qualquer lógica que desejar nesse script (inclusive conversando com um banco de dados) em qualquer idioma que desejar.

Bo Jeanes
fonte
Re: # 1 boa descoberta !! Espero que isso aconteça, seria útil no ESXi.
26412 Jason Tan
@JasonTan: O AuthorizedKeysCommand foi lançado no openssh 6.2. Também atualizei a resposta para refletir isso.
Bluewind
Ótima resposta, a opção 1 era exatamente o que eu estava procurando.
Shane Kilkelly
3

O OpenSSH não tem esse recurso, pelo que sei. Sua melhor aposta pode ser que um script gere novamente o arquivo automaticamente todas as noites (ou com a frequência necessária).

Além disso, você pode querer ver esta pergunta: Um sistema para distribuir chaves públicas SSH

Matt Simmons
fonte
1

Acredito que em versões mais recentes do openssh, você pode armazenar chaves em uma entrada LDAP do usuário. Se você já estiver usando LDAP ou AD para gerenciamento de contas, poderá utilizá-lo também para gerenciamento de chaves.

mtinberg
fonte