HowTo :: Acesso SSH usando chave GPG para autenticação

Prefácio

Muitos de nós já conhecemos o Secure Shell (SSH), que permite conectar a outros sistemas usando uma chave em vez de senha. Este guia explica como eliminar chaves SSH e usar uma subchave do GNU Privacy Guard (GPG) no lugar. Usar GPG não torna suas conexões SSH mais seguras. SSH é um protocolo seguro, e chaves SSH são seguras. Em vez disso, isso torna mais fácil certos aspectos de distribuição de chaves e gestão de backups. Também não muda seu workflow de uso do SSH. Todos os comandos continuarão funcionando como você espera, exceto que você não terá mais chaves privadas SSH, você vai desbloquear sua chave GPG.

Ao autenticar o SSH com sua chave GPG, você reduz o número de arquivos de chave que precisa proteger e fazer backup. Isso significa que sua higiene de gerenciamento de chaves precisa continuar boa, o que implica escolher boas passphrases e usar estratégias apropriadas de preservação de chaves. Lembre-se: você não deve fazer backup da sua chave privada na nuvem!

Além disso, hoje chaves SSH são distribuídas manualmente e muitas vezes diretamente. Se você quiser me dar acesso a uma máquina, precisa me pedir minha chave SSH. Você até pode encontrar uma publicada no meu site. Porém, ainda precisa decidir se confia no meu site. Se eu usar uma chave GPG para SSH, você pode selecionar uma chave conhecida e confiável para mim usando a web of trust do GPG a partir de um keyserver público. É nisso que o The Monkeysphere Project está trabalhando. Caso contrário, nada do que você fizer aqui afeta a web of trust usada para criptografia e assinatura com GPG.

O que é uma subchave GPG?

Uma chave GPG é, na verdade, um conjunto de chaves. Há uma chave primária, normalmente usada apenas para assinatura e certificação. A prática sugerida no uso do GPG é criar uma subchave para criptografia. Essa subchave é separada e, para todos os fins práticos, é assinada pela chave primária e transmitida ao mesmo tempo. Essa prática permite revogar a subchave de criptografia isoladamente, por exemplo se ela for comprometida, mantendo a chave primária válida. O importante é perceber que uma chave GPG contém múltiplas chaves. Para backup e armazenamento, você pode tratá-las como uma única chave, mas na hora de usar você pode utilizá-las de forma independente.

Este exercício vai usar uma subchave criada para autenticação para completar conexões SSH. Essa subchave de autenticação vai substituir completamente o par de chaves que você talvez tenha gerado no passado com ssh key-gen. Você pode criar quantas quiser caso precise de múltiplas chaves SSH.

Crie uma subchave de autenticação

Você já deve ter uma chave GPG. Se não tiver, leia algum dos muitos bons tutoriais disponíveis sobre o tema. Você vai criar a subchave editando sua chave existente. É preciso editar a chave no modo expert para acessar as opções corretas. O workflow adiciona uma nova chave onde você escolhe as capacidades, especificamente, você vai ativar apenas autenticação. O SSH normalmente usa uma chave RSA de 2048 bits que não expira (tipo 8 nas opções abaixo). Abaixo está uma versão editada do workflow. Todos os comandos foram testados no Fedora 29.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
gpg2 --expert --edit-key <KEY ID>

gpg> addkey

Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
Your selection? 8

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? s
Your selection? e
Your selection? a

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? q

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits

Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y
 

sec rsa4096/5B6C9AA9718B1298
created: 2019-03-21 expires: 2021-03-20 usage: SC
trust: ultimate validity: ultimate

ssb rsa4096/4CDB1F634D2FD7C
created: 2019-03-21 expires: 2021-03-20 usage: E

ssb rsa4096/136F0B4E3D42CF31
created: 2019-03-21 expires: never usage: A

[ultimate] (1). Marcos Azevedo (psylinux)

gpg> quit
Save changes? (y/N) y

Habilite a subchave GPG

Quando você usa SSH, um programa chamado ssh-agent gerencia as chaves. Para usar uma chave GPG, você vai usar um programa similar, o gpg-agent, que gerencia chaves GPG. Para fazer o gpg-agent atender requisições do SSH, você precisa habilitar suporte adicionando a linha enable-ssh-support no arquivo ~/.gnupg/gpg-agent.conf.

1
2
cat .gnupg/gpg-agent.conf
enable-ssh-support

Opcionalmente, você pode pré-definir quais chaves serão usadas no SSH para não precisar usar ssh-add para carregar as chaves. Para isso, especifique as chaves no arquivo ~/.gnupg/sshcontrol. As entradas nesse arquivo são keygrips, identificadores internos que o gpg-agent usa para referenciar chaves. Diferente de um hash de chave, um keygrip se refere tanto à chave pública quanto à privada. Para encontrar o keygrip, use gpg2 -K -with-keygrip, como mostrado abaixo. Depois adicione essa linha ao arquivo sshcontrol.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
gpg2 -K --with-keygrip
/home/psylinux/.gnupg/pubring.kbx
------------------------------
sec rsa2048 2019-03-21 [SC] [expires: 2021-03-20]
26C33AA7D4E4F7651C75AC218725AD32291EB131

Keygrip = 131E27EAC300658183D3E6B94B6D9AB1778A0291
uid [ultimate] Marcos Azevedo (psylinux)

ssb rsa2048 2019-03-21 [E] [expires: 2021-03-20]
Keygrip = 59A032B3BE1574BA0960DEDFB28FC26489383171

ssb rsa2048 2019-03-21 [A]
Keygrip = 2BE91C3C443AA29C3703D004587AD6DA9D7E40FC

Depois escreva o keygrip correspondente no arquivo sshcontrol

1
echo 2BE91C3C443AA29C3703D004587AD6DA9D7E40FC >> ~/.gnupg/sshcontrol

Por fim, você precisa dizer ao SSH como acessar o gpg-agent. Isso é feito alterando o valor da variável de ambiente SSH_AUTH_SOCK. As duas linhas abaixo, quando adicionadas ao seu ~/.bashrc, garantem que a variável seja configurada corretamente e que o agent seja iniciado e pronto para uso.

1
2
3
4
cat ~/.bashrc

export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent

Para continuar, execute esses comandos na sua sessão atual.

Compartilhe sua chave SSH

Para usar SSH, você precisa compartilhar sua chave pública com o host remoto. Você tem duas opções. Primeiro, pode rodar ssh-add -L para listar suas chaves públicas e copiá-las manualmente para o host remoto. Você também pode usar ssh-copy-id. Do ponto de vista do SSH, nada mudou.

Parabéns!

Você agora habilitou o acesso SSH usando uma chave GPG para autenticação! O SSH continuará funcionando como esperado, e as máquinas às quais você se conecta não precisarão de mudanças de configuração. Você reduziu o número de arquivos de chave que precisa gerenciar e fazer backup com segurança, ao mesmo tempo em que habilitou a oportunidade de participar de diferentes formas de distribuição de chaves. Fique seguro e mantenha uma boa higiene de chaves!