Olá pessoal. Neste artigo, gostaria de compartilhar minha experiência na configuração e no uso de um gerenciador de senhas para Linux, e não apenas isso é notável por sua simplicidade, pelas ferramentas já presentes no sistema e pela capacidade de trabalhar exclusivamente a partir do console. Mais especificamente, os problemas relacionados à geração e armazenamento da chave secreta gpg, bem como a configuração da colaboração entre pass, gpg, git, github e navegador, serão afetados. Tudo está no Linux, Windows e Android.
O que é e como funciona
Tecnicamente, pass é uma ligação muito simples sobre o GnuPG e o git escritos no bash. Cada senha (e informações relacionadas, como login) são armazenadas em um arquivo criptografado. A busca pela senha desejada é realizada pelo nome do arquivo, criptografia - usando GnuPG, sincronização entre dispositivos - usando git.
Além do passe original, existem mais dois projetos populares compatíveis com ele, em execução no Windows:
- QtPass . Um aplicativo GUI escrito, como você pode imaginar, no Qt.
- Gopass . Um aplicativo de linha de comando escrito em go. No Windows, eu o uso. No entanto, na minha opinião, os desenvolvedores começaram a adicionar muitos recursos extras lá, enquanto abandonavam sua intuitividade.
O desenvolvedor do passe é Jason Donenfeld, que também é o autor do WireGuard (implementações de VPN baseadas nos modernos padrões de criptografia, "obra de arte comparada ao OpenVPN e IPSec", segundo Linus Torvalds, que provavelmente aparecerá no kernel do Linux 5.6).
Criação de chave secreta
GnuPG - um sistema para criptografia e assinaturas eletrônicas. Apesar das falhas (por exemplo, um artigo que critica o gpg), esse é o padrão de fato há mais de 20 anos. Mesmo um artigo de referência não consegue nomear uma ferramenta alternativa para criptografia de arquivos.
O processo de criação de uma chave secreta no console é descrito, por exemplo, no habr , mas por que não fazê-lo na GUI? No projeto KDE, eles fizeram uma interface para o GPG chamado Kleopatra . Os usuários do Linux o encontrarão nos repositórios, e no gpg4win Kleopatra está pronto para uso.
No menu, selecione File
- New Key Pair
- Create a personal OpenPGP key pair
.
Digite o nome e o email. Não precisa se preocupar em alterá-los no futuro. O GPG permite adicionar livremente um novo uid à chave e excluir os existentes. Se você deseja assinar seu git confirma com a chave criada e ver as caixas de seleção "Verificadas" ao lado delas, é necessário especificar um email real com o status "confirmado" na sua conta do github.
Em seguida, clique Advanced Settings
para definir as principais configurações.
Na seção Key Material
, selecione ECDSA/EdDSA
+ ECDH
. Prefiro usar não o algoritmo RSA clássico, mas com base nas curvas elípticas ed25519 / cv25519. Sua principal vantagem sobre o RSA, do ponto de vista do usuário final, é o menor tamanho da chave com a mesma força criptográfica. Argumenta-se que a chave ed25519 de 256 bits é tão forte quanto a chave RSA de 3072 bits. A única vantagem deste último é sua alta prevalência, especialmente em sistemas de hardware.
Você também pode selecionar as famílias de curvas Brainpool e NIST no menu. No entanto, os últimos são suspeitos de ter um backdoor da NSA, e os primeiros também têm pequenas queixas. Portanto, ed25519 e cv25519 propostos pelo famoso criptógrafo Daniel Bernstein são a melhor escolha.
Um fato interessante: no padrão de autenticação FIDO U2F promovido ativamente (do qual o Google participou ativamente do desenvolvimento), são utilizadas as curvas NIST. Além disso, por exemplo, o Android Keystore tem suporte, mas não há suporte para ed25519. Por que isso aconteceu?
Como resultado, serão criadas 2 subchaves nas curvas elípticas. Um para assinaturas e outro para criptografia, que é o que precisamos. O GPG não permite que uma subchave seja usada para ambos, apesar de ser possível por algoritmos (existem funções correspondentes, por exemplo, na biblioteca libsodium
).
Se você planeja usar essa chave para trabalhar com o git, na seção Certificate Usage
, verifique os itens de Signing
e Authentication
.
Na próxima etapa, propõe-se criar uma senha com a qual a chave será protegida. Como a chave será usada para criptografar todos os dados no armazenamento, essa senha é uma senha mestre. Vale a pena abordar sua escolha com uma pediatria específica.
Geração de senha mestra
Obviamente, você sempre pode gerar uma sequência aleatória a partir de um número suficiente (por exemplo, 20) de caracteres. No entanto, é quase impossível lembrar e difícil entrar sem erros, especialmente em um smartphone. Portanto, o EFF recomenda o uso de frases secretas no seu guia .
O método funciona assim: pegue um dicionário suficientemente grande (o EFF oferece vários dicionários, por exemplo, este ) e selecione pelo menos 6 palavras aleatórias. Você pode escolher como quiser, mesmo sem um computador, usando dados ou moedas. Esse método é chamado de diceware . Ainda não cheguei a dados e moedas, então usarei o utilitário shuf
incluído no GNU coreutils:
$ shuf --random-source=/dev/random -n 6 ./eff_large_wordlist.txt 51345 rendering 24564 edging 65652 vivacious 31343 footprint 55261 snore 24436 earache
Salvamos essa senha em um local seguro fora do computador.
Como resultado, uma chave secreta será criada. Ao trabalhar no console, muitas vezes é necessário indicar sua impressão digital, vale a pena anotar esse número.
Agora você pode configurar a integração de gpg e git.
Integração com Gpg, Git e Github
Estritamente falando, este item é opcional. O passe de armazenamento de senha é apenas um diretório com arquivos criptografados, o que significa que pode ser sincronizado como você desejar. Google Drive, Yandex.Disk, etc. etc. Se você não quiser usar o git, aconselho a prestar atenção ao Syncthing . Este é um programa de código aberto que requer um mínimo de configurações e transfere arquivos diretamente entre dispositivos sem armazená-los em servidores de terceiros.
Como hospedagem git, ninguém se preocupa em criar seu próprio servidor colocando o Gitea , por exemplo, no entanto, isso significa o custo de seu suporte e não garante necessariamente grande segurança e confiabilidade. Portanto, não desprezando o uso de produtos da Microsoft, simplesmente criei um repositório privado no github.
O mecanismo de autenticação padrão no git é através do SSH. Geralmente, entende-se que isso requer uma chave ssh especial. No entanto, é possível, sem gerar entidades desnecessárias, usar a chave gpg criada na etapa anterior. Para que a chave gpg (mais precisamente, a subchave) seja usada pelo ssh, duas condições devem ser atendidas:
- ele deve ter o sinalizador
A
- Authenticate definido; - seu keygrip deve ser gravado no
~/.gnupg/sshcontrol
.
O primeiro item já foi concluído e você pode obter o pressionamento de tecla com o comando
gpg --list-secret-keys --with-keygrip 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7
Na saída do gpg, estamos interessados no aperto de tecla do sub25 ed25519 ( 05B6641E23D720E87EE6A26020BAB214B842F2B7
).
Agora você pode carregar a chave pública no github. Vá para a seção SSH and GPG keys
no perfil e selecione New SSH key
. No console, digitamos
$ gpg --export-ssh-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPfj81nennAoujvw1fLzGx9iED34zk5oDMYKuUcBq5wv openpgp:0x54068AC7
e copie a chave ssh pública resultante.
O Git pode assinar confirmações usando gpg, e o github suporta isso. Eu acho que esse é um recurso útil para segurança. Exporte o comando gpg da chave pública
$ gpg --export --armor 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 -----BEGIN PGP PUBLIC KEY BLOCK----- mDMEXcrHrBYJKwYBBAHaRw8BAQdA9+PzWd6ecCi6O/DV8vMbH2IQPfjOTmgMxgq5 RwGrnC+0G0hlbGxvIEhhYnIgPGZha2VAZW1haWwuY29tPoiQBBMWCAA4BQsJCAcC BhUKCQgLAgQWAgMBAh4BAheAFiEEBgnJ3+8aorON7brcwFRLVVQGiscFAl3WO2wC GyMACgkQwFRLVVQGiscg5AEAkh0a6OQS2CPiXq9bWB+wULHUGT6NYZhwZ3eUQCfH Zq0A/iFBJQkAZIFdqH84ksFbvv6K/LQy72NRJzK0tho6qFwHuDgEXcrHrBIKKwYB BAGXVQEFAQEHQEs6UVOtj5yMGxvRcMU577miH/Bh5kZWMJKHxsDBcXV4AwEIB4h4 BBgWCAAgFiEEBgnJ3+8aorON7brcwFRLVVQGiscFAl3Kx6wCGwwACgkQwFRLVVQG isea8wD/X5JSJW0PMu/KucytUZZo8obHa86/TUwH/8+xQ3+djuEBALugbQRmCIr5 /JYO7x5PNA0QYqhh7LIZ9nKYp0mhqpcO =dc89 -----END PGP PUBLIC KEY BLOCK-----
e copie o que aconteceu com o New GPG key
formulário de New GPG key
.
Ações adicionais são específicas para o seu sistema operacional.
Integração de gpg e git (linux)
O cliente OpenSSH usado pelo git pode receber chaves de duas maneiras: do ~/.ssh
e através do soquete criado pelo daemon ssh-agent
. O último pode ser gpg-agent
, que usaremos. No arquivo ~/.gnupg/gpg-agent.conf
você precisa escrever a linha enable-ssh-support
.
Reinicie o gpg-agent com o comando
gpg-connect-agent reloadagent /bye
Depois disso, ele criará um soquete em
${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh
Esse caminho (pode depender da distribuição) deve ser gravado na variável de ambiente $SSH_AUTH_SOCK
, e o ssh o buscará. Digitamos o comando no console
ssh -T git@github.com
e se tudo correu bem, depois de inserir a senha mestre, uma mensagem sobre autenticação bem-sucedida será exibida.
Integração de gpg e git (Windows)
Mais recentemente, a Microsoft adicionou o OpenSSH ao número de componentes do Windows disponíveis para instalação e também implementou suporte para soquetes como o AF_UNIX
, como o mesmo SSH_AUTH_SOCK
. No entanto, o Win32-OpenSSH não pode interagir com o gpg4win, pois ainda usa apenas pipes nomeados.
Portanto, você deve instalar o Putty sempre-verde. Nós escrevemos no arquivo
~/AppData/Roaming/gnupg/gpg-agent.conf
enable-putty-support
e reinicie o gpg-agent. Depois disso, ele começará a fingir ser Pageant - o demônio das chaves. O arquivo sshcontrol
deve estar localizado na mesma pasta.
Para que o cliente git comece a usar massa de vidraceiro, é necessário criar a GIT_SSH
ambiente GIT_SSH
com o caminho para plink.exe
. Por exemplo, eu tenho esse
C:\ProgramData\chocolatey\bin\PLINK.EXE
A propósito, sobre o git. O cliente git for windows
geralmente instalado contém muitos itens desnecessários (pelo menos desnecessários para o gopass funcionar), por exemplo, sua própria implementação do OpenSSH. No entanto, seus desenvolvedores estão criando versões mais leves que podem ser baixadas no github . Por exemplo, o MinGit é duas vezes menor e pessoas arriscadas podem experimentar o MinGit-busybox. A versão do busybox surgiu devido ao desejo dos desenvolvedores de criar um cliente git usando a API do Win32 sem camadas como o MSYS2. No entanto, de acordo com suas próprias análises, o mingit-busybox ainda contém muitos bugs. Você pode ler mais sobre esses esforços no ticket .
Verifique se o gpg-agent está em execução ( gpg-connect-agent /bye
) e verifique a conexão com o github:
plink git@github.com
Configuração do Git
Nada incomum aqui. Eu acho que os comandos podem ser dados sem comentar:
git config --global user.name "Hello Habr" git config --global user.email fake@email.com git config --global user.signingKey 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 git config --global gpg.program /usr/bin/gpg git config --global commit.gpgSign true
O item gpg.program
necessário se o gpg não estiver no PATH
.
Backup de chave secreta
A chave secreta deve ser armazenada com tanta segurança quanto a frase secreta, ou seja, fora do computador. Você pode simplesmente imprimir uma longa sequência de números, mas reconhecê-la ou inserir no teclado - isso não é para os fracos de coração. Portanto, prefiro gerar um código QR fácil de digitalizar com qualquer smartphone. Existe um programa qrencode
especial para qrencode
. Uma imagem de código QR é gerada da seguinte maneira:
gpg --export-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 | qrencode --8bit --output secret-key.qr.png
Obviamente, quanto menos informações desnecessárias no backup, melhor. Aqui, um tamanho de chave muito pequeno é ed25519. Obrigado a Daniel Bernstein!
Existe um utilitário especial paperkey que permite reduzir a quantidade de dados ao limite. O preço da redução é que a chave secreta de tal backup pode ser restaurada apenas se houver uma pública. O ecossistema GPG possui servidores especiais para armazenar chaves públicas; você pode ler sobre elas e não apenas no artigo https://eax.me/gpg/ .
Um backup da chave de papel é criado da seguinte maneira:
gpg --export-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 > pubkey.asc gpg --export-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 | paperkey --output-type raw | qrencode --8bit --output secret-key.qr.png
A segunda regra do backup: o backup não existe até que a capacidade de restaurar dados a partir dele seja confirmada. Portanto, realizamos um teste de estresse. Exclua a chave secreta com o comando
gpg --delete-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7
Em seguida, digitalizamos o código QR e importamos a chave de volta para o GPG. Como um scanner de código QR para Android, eu gosto do BinaryEye , um programa gratuito com uma interface amigável. Na figura abaixo - backup da chave secreta deste artigo.
paperkey --pubring pubkey.asc --secrets from_qr.asc > secretkey.asc gpg --import ./secretkey.asc
Espero que você não use essa chave em nenhum lugar. É criado apenas para fins ilustrativos.
Se tudo funcionar, você pode seguir em frente.
Usando (ir) passe
Agora que temos uma chave privada segura e armazenada com segurança, além de trabalhar com a integração com o git, podemos começar a usar o próprio passe. Eu prefiro o gopass, pois essa ligação alternativa funciona no Windows.
Inicialize o armazenamento de senha com o comando
gopass init
e selecione a chave secreta desejada na lista.
Trabalhar com o git acontece da mesma maneira que no caso de um repositório regular, apenas a linha de comando precisa adicionar (go)pass
. Inicializamos o repositório e adicionamos a origem desejada:
gopass git init gopass git remote add origin git@github.com:xxx/taisho-secrets.git
O endereço pode ser encontrado na página do repositório no github, clicando no botão Clone or download
.
Gopass tem um comando específico
gopass sync
executando tanto git pull
quanto git push
, ou seja, sincronização completa.
O armazenamento padrão é criado na pasta ~/.password-store
, mas você também pode especificar seu próprio caminho.
Para trabalhar com senhas, o console suporta os comandos ls, cp, mv, search, create, etc. Você pode obter a lista completa digitando gopass --help
, mas eu pessoalmente não uso o console, mas o plug-in do navegador 95% do tempo.
Integração de Navegador
O plug-in do navegador é chamado de ponte gopass , pode ser encontrado na loja Chrome e Firefox (veja o link).
Para conectar o plug-in ao próprio gopass, você precisará de um script auxiliar e de um manifesto para mensagens nativas. Eles são criados pela equipe.
gopass jsonapi configure
que nos oferecerá a escolha de um navegador e a localização do script.
Veja como tudo funciona. Crie uma nova senha:
gopass new habr
Respondemos a todas as perguntas e salvamos. O GPG solicitará que você digite uma senha mestra para trabalhar com a chave privada.
Agora abrimos o menu do plug-in com um característico esquilo azul e, se tudo correu bem, podemos encontrar nossa senha lá.
Chaves TOTP
Pessoalmente, eu uso o FreeOTP , no entanto, você pode trabalhar com essas chaves usando pass. Os usuários do passe original precisam instalar a extensão pass-otp e, no gopass e no APS (veja abaixo), as funções necessárias estão prontas para uso.
Para adicionar uma chave TOTP ao armazenamento de senhas usando pass-otp, obtemos a URL (começando com otpauth://
) e otpauth://
o comando
pass otp insert totp-secret
Se a autenticação resultante pode ser chamada de dois fatores é um ponto discutível. Os desenvolvedores do KeePassXC recomendam o armazenamento de chaves TOTP em um banco de dados separado, protegido por uma senha diferente. Em contrapartida, isso também pode ser feito.
Integração com Android
A implementação do GnuPG para Android é chamada OpenKeychain . Para configurá-lo, basta ir ao menu "gerenciamento de chaves" e importar a chave secreta criada anteriormente. A única desvantagem do OpenKeychain para mim é que não há desbloqueio de impressão digital.
A implementação do passe para o Android é chamada de android-password-store , ou simplesmente APS.
Instale e execute o APS. Antes de sincronizar o armazenamento da senha, vá para o menu "Configurações". Lá precisaremos dos seguintes itens:
git
. O URL resultante deve ser o mesmo especificado na página do repositório no github. Tipo de autorização - OpenKeychain
.Git utils
. Nesta seção, especifique o nome de usuário e o email na chave gpg.OpenPGP
. Selecione OpenKeychain
.
Esse recurso apareceu mais recentemente inclui o preenchimento de senhas em aplicativos no Android 8.0+.
Observe para os usuários de smartphones Huawei e todos os demais: OpenKeychain, APS, BinaryEye, FreeOTP, além de Syncthing, Telegram, Tachiyomi, KDE Connect e muito mais estão disponíveis no F-Droid . Os usuários do Google Play devem apreciar: um catálogo de software que não possui anúncios, rootkits ou simplesmente software indesejado do famoso artigo tonsky .
Antes do preenchimento automático no APS, usei keepass2android . Ele não está no F-Droid pelo motivo original: está escrito no Xamarin, mas os mantenedores do F-Droid não conseguem instalar essa estrutura em seu servidor de compilação há 9 meses . Alguém faz alguma coisa.
Agora você pode clonar. Na tela principal, selecione "clonar do servidor", especifique o local desejado do repositório, verifique as configurações do git.
Se uma tentativa de trabalhar com o git levar a um erro (provavelmente ocorreu em releases anteriores do APS devido ao uso da versão desatualizada da biblioteca jgit
do projeto Eclipse), ainda haverá Syncthing.
Conclusão
Obviamente, o passe não é tão fácil de configurar. No entanto, por esse preço, você pode ter certeza de que as ferramentas usadas por nós (assim como pessoas como Linus Torvalds ou Edward Snowden) não serão descontinuadas em um momento, não mudarão o formato dos dados e não ficarão sem suporte. E, se o fizerem, a arquitetura modular simples do passe incentiva a criação de quaisquer clientes e extensões alternativos.
Se você decidir não usar o passe, espero que alguns dos programas mencionados no artigo sejam úteis para você.