Hola a todos En este artículo me gustaría compartir mi experiencia en la configuración y el uso de un administrador de contraseña y contraseña para Linux, y no solo eso es notable por su simplicidad, usando las herramientas ya presentes en el sistema y la capacidad de trabajar exclusivamente desde la consola. Más específicamente, los problemas relacionados con la generación y el almacenamiento de la clave secreta gpg, así como la configuración de colaboración entre pass, gpg, git, github y el navegador, se verán afectados. Todo está bajo Linux, Windows y Android.
Qué es y cómo funciona
Técnicamente, pasar es un enlace muy simple sobre GnuPG y git escrito en bash. Cada contraseña (e información relacionada, como el inicio de sesión) se almacena en un archivo cifrado. La búsqueda de la contraseña deseada se realiza mediante el nombre del archivo, el cifrado, usando GnuPG, la sincronización entre dispositivos, usando git.
Además del pase original, hay dos proyectos más populares compatibles con él, que se ejecutan en Windows:
- QtPass . Una aplicación GUI escrita, como se puede adivinar, en Qt.
- Gopass Una aplicación de línea de comandos escrita en go. En Windows, lo uso. Sin embargo, en mi opinión, los desarrolladores comenzaron a agregar demasiadas funciones adicionales allí, mientras abandonaban su intuición.
El desarrollador del pase es Jason Donenfeld, quien también es el autor de WireGuard (implementaciones de VPN basadas en estándares modernos de criptografía, "obra de arte en comparación con OpenVPN e IPSec" según Linus Torvalds, que probablemente aparecerá en el kernel de Linux 5.6).
Creación de clave secreta
GnuPG: un sistema de cifrado y firmas electrónicas. A pesar de las fallas (por ejemplo, un artículo que critica el gpg), ha sido el estándar de facto por más de 20 años. Incluso el artículo en el enlace tiene dificultades para nombrar una herramienta alternativa para cifrar archivos.
El proceso de creación de una clave secreta en la consola se describe, por ejemplo, en habr , pero ¿por qué no hacerlo en la GUI? En el proyecto KDE, hicieron una interfaz para GPG llamada Kleopatra . Los usuarios de Linux lo encontrarán en los repositorios, y en gpg4win Kleopatra está listo para usar.
En el menú, seleccione File
- New Key Pair
- Create a personal OpenPGP key pair
.
Ingrese el nombre y el correo electrónico. No hay que preocuparse de que los cambie en el futuro. GPG le permite agregar libremente nuevos uid a la clave y eliminar los existentes. Si desea firmar sus confirmaciones de git con la clave creada y ver las casillas de verificación "Verificadas" frente a ellas, debe especificar un correo electrónico real que tenga el estado de "confirmado" en su cuenta de github.
A continuación, haga clic en Advanced Settings
para configurar las configuraciones clave.
En la sección Key Material
, seleccione ECDSA/EdDSA
+ ECDH
. Prefiero no usar el algoritmo RSA clásico, sino basado en las curvas elípticas ed25519 / cv25519. Su principal ventaja sobre RSA desde el punto de vista del usuario final es el tamaño de clave más pequeño con la misma fuerza criptográfica. Se argumenta que la clave ed25519 de 256 bits es casi tan fuerte como la clave RSA de 3072 bits. La única ventaja de este último es su alta prevalencia, especialmente en sistemas de hardware.
También puede seleccionar las familias de curvas Brainpool y NIST desde el menú. Sin embargo, se sospecha que estos últimos tienen una puerta trasera de la NSA, y los primeros también tienen quejas menores. Por lo tanto, ed25519 y cv25519 propuestos por el famoso criptógrafo Daniel Bernstein son la mejor opción.
Un hecho interesante: en el estándar de autenticación promovido activamente FIDO U2F (que Google participó activamente en el desarrollo), se utilizan las curvas NIST. Además, por ejemplo, Android Keystore tiene su soporte, pero no hay soporte para ed25519. ¿Por qué sucedió esto?
Como resultado, se crearán 2 subclaves en curvas elípticas. Uno para las firmas, el otro para el cifrado, que es lo que necesitamos. GPG no permite que se use una subclave para ambos, a pesar del hecho de que es algorítmicamente posible (hay funciones correspondientes, por ejemplo, en la biblioteca libsodium
).
Si planea utilizar esta clave para trabajar con git, en la sección Certificate Usage
del Certificate Usage
, verifique los elementos de Signing
y Authentication
.
En el siguiente paso, se propone crear una contraseña con la que se protegerá la clave. Dado que la clave se utilizará para cifrar todos los datos en el almacenamiento, esta contraseña es una contraseña maestra. Vale la pena acercarse a su elección con pedantería particular.
Generación de contraseña maestra
Por supuesto, siempre puede generar una cadena aleatoria a partir de un número suficiente (por ejemplo, 20) de caracteres. Sin embargo, es casi imposible de recordar y difícil de ingresar sin errores, especialmente en un teléfono inteligente. Por lo tanto, el EFF recomienda usar frases de contraseña en su guía .
El método funciona así: tome un diccionario lo suficientemente grande (EFF ofrece varios diccionarios, por ejemplo este ) y seleccione al menos 6 palabras al azar. Puedes elegir lo que quieras, incluso sin una computadora usando un dado o una moneda. Este método se llama dadosware . Todavía no he llegado a los dados y las monedas, así que solo shuf
utilidad shuf
incluida con 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
Guardamos esta frase de contraseña en un lugar seguro fuera de la computadora.
Como resultado, se creará una clave secreta. Al trabajar en la consola, a menudo debe indicar su huella digital, vale la pena anotar este número.
Ahora puede configurar la integración de gpg y git.
Integración de gpg, git y github
Estrictamente hablando, este artículo es opcional. El pase de almacenamiento de contraseña es solo un directorio con archivos cifrados, lo que significa que se puede sincronizar a su gusto. Google Drive, Yandex.Disk, etc. etc. Si no desea usar git, le aconsejo que preste atención a Syncthing . Este es un programa de código abierto que requiere un mínimo de configuraciones y transfiere archivos directamente entre dispositivos sin almacenarlos en servidores de terceros.
Como git hosting, nadie se molesta en crear su propio servidor poniendo Gitea , por ejemplo, sin embargo, esto significa el costo de su soporte y no necesariamente garantiza una gran seguridad y confiabilidad. Por lo tanto, yo, sin despreciar el uso de productos de Microsoft, simplemente creé un repositorio privado en github.
El mecanismo de autenticación estándar en git es a través de SSH. Por lo general, se entiende que esto requiere una clave ssh especial. Sin embargo, es posible, sin generar entidades innecesarias, utilizar la clave gpg creada en el paso anterior. Para que ssh use la clave gpg (más precisamente, la subclave), se deben cumplir dos condiciones:
- debe tener el conjunto de banderas
A
- Autenticar; - su keygrip debe estar escrito en el
~/.gnupg/sshcontrol
.
El primer elemento ya se ha completado y puede obtener keygrip con el comando
gpg --list-secret-keys --with-keygrip 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7
En la salida de gpg, estamos interesados en el keygrip de la subclave 05B6641E23D720E87EE6A26020BAB214B842F2B7
( 05B6641E23D720E87EE6A26020BAB214B842F2B7
).
Ahora puedes subir la clave pública a github. Vaya a la sección de SSH and GPG keys
en el perfil y seleccione New SSH key
. En la consola tecleamos
$ gpg --export-ssh-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPfj81nennAoujvw1fLzGx9iED34zk5oDMYKuUcBq5wv openpgp:0x54068AC7
y copie la clave ssh pública resultante.
Git puede firmar confirmaciones usando gpg, y github lo admite. Creo que esta es una característica útil para la seguridad. Exportar el comando public key gpg
$ 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-----
y copie lo que sucedió con el New GPG key
formulario de New GPG key
.
Otras acciones son específicas de su sistema operativo.
Integración de gpg y git (linux)
El cliente OpenSSH utilizado por git puede recibir claves de dos maneras: desde el ~/.ssh
y a través del socket creado por el demonio ssh-agent
. Este último puede ser gpg-agent
, que usaremos. En el archivo ~/.gnupg/gpg-agent.conf
necesita escribir la línea enable-ssh-support
.
Reinicie gpg-agent con el comando
gpg-connect-agent reloadagent /bye
Después de eso, creará un socket en
${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh
Esta ruta (puede depender de la distribución) debe escribirse en la variable de entorno $SSH_AUTH_SOCK
, y ssh la recogerá. Escribimos el comando en la consola
ssh -T git@github.com
y si todo salió bien, luego de ingresar la contraseña maestra, aparecerá un mensaje sobre la autenticación exitosa.
Integración de gpg y git (Windows)
Más recientemente, Microsoft agregó OpenSSH a la cantidad de componentes de Windows disponibles para la instalación, y también implementó soporte para sockets como AF_UNIX
, como el mismo SSH_AUTH_SOCK
. Sin embargo, Win32-OpenSSH no puede interactuar con gpg4win, ya que todavía usa solo canalizaciones con nombre.
Por lo tanto, debe instalar la masilla de hoja perenne. Escribimos en el archivo
~/AppData/Roaming/gnupg/gpg-agent.conf
enable-putty-support
y reinicie gpg-agent. Después de eso, comenzará a fingir ser un concurso: el demonio de las llaves. El archivo sshcontrol
debe estar ubicado en la misma carpeta.
Para que el cliente git comience a usar masilla, debe crear la GIT_SSH
entorno GIT_SSH
con la ruta a plink.exe
. Por ejemplo, tengo esto
C:\ProgramData\chocolatey\bin\PLINK.EXE
Por cierto sobre git. El git for windows
generalmente instalado git for windows
cliente de git for windows
contiene muchos elementos innecesarios (al menos innecesarios para que gopass funcione), por ejemplo, su propia implementación de OpenSSH. Sin embargo, sus desarrolladores están haciendo versiones más livianas que se pueden descargar en github . Por ejemplo, hay MinGit 2 veces más pequeño, y las personas riesgosas pueden probar MinGit-busybox. La versión de busybox surgió debido al deseo de los desarrolladores de crear un cliente git usando la API Win32 sin capas como MSYS2. Sin embargo, según sus propias reseñas, mingit-busybox todavía contiene muchos errores. Puede leer más sobre estos esfuerzos en el boleto .
Asegúrese de que gpg-agent se esté ejecutando ( gpg-connect-agent /bye
) y verifique la conexión a github:
plink git@github.com
Configuración de Git
Nada inusual aquí. Creo que los comandos se pueden dar sin comentarios:
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
El elemento gpg.program
necesario si gpg no está en la PATH
.
Copia de seguridad de clave secreta
La clave secreta debe almacenarse de forma tan segura como la frase de contraseña, es decir, fuera de la computadora. Simplemente puede imprimir una secuencia larga de números, pero reconocerla o ingresar desde el teclado; esto no es para los débiles de corazón. Por lo tanto, prefiero generar un código QR que sea fácil de escanear con cualquier teléfono inteligente. Hay un programa especial qrencode
para qrencode
. Una imagen de código QR se genera de la siguiente manera:
gpg --export-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 | qrencode --8bit --output secret-key.qr.png
Por supuesto, cuanto menos información innecesaria en la copia de seguridad, mejor. Aquí, un tamaño de clave muy pequeño es ed25519. Gracias a Daniel Bernstein!
Hay una utilidad especial de paperkey que le permite reducir la cantidad de datos al límite. El precio de la reducción es que la clave secreta de dicha copia de seguridad solo se puede restaurar si hay una pública. El ecosistema GPG tiene servidores especiales para almacenar claves públicas; puede leer sobre ellos y no solo en el artículo https://eax.me/gpg/ .
Se crea una copia de seguridad de paperkey de la siguiente manera:
gpg --export-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 > pubkey.asc gpg --export-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 | paperkey --output-type raw | qrencode --8bit --output secret-key.qr.png
La segunda regla de la copia de seguridad: la copia de seguridad no existe hasta que se confirme la capacidad de restaurar datos. Por lo tanto, realizamos una prueba de esfuerzo. Eliminar la clave secreta con el comando
gpg --delete-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7
Luego escaneamos el código QR e importamos la clave nuevamente en el GPG. Como escáner de código QR para Android, me gusta BinaryEye , un programa gratuito con una interfaz fácil de usar. En la imagen a continuación: copia de seguridad de la clave secreta de este artículo.
paperkey --pubring pubkey.asc --secrets from_qr.asc > secretkey.asc gpg --import ./secretkey.asc
Espero que no uses esta clave en ningún lado. Se crea solo con fines ilustrativos.
Si todo funciona, entonces puedes seguir adelante.
Usando el pase (go)
Ahora que tenemos una clave privada segura y almacenada, así como una integración funcional con git, podemos comenzar a usar el pase en sí. Prefiero gopass, ya que este enlace alternativo funciona en Windows.
Inicialice el almacenamiento de contraseña con el comando
gopass init
y seleccione la clave secreta deseada de la lista.
Trabajar con git ocurre de la misma manera que en el caso de un repositorio regular, solo la línea de comando necesita agregar (go)pass
. Inicializamos el repositorio y agregamos el origen deseado allí:
gopass git init gopass git remote add origin git@github.com:xxx/taisho-secrets.git
La dirección se puede encontrar en la página del repositorio en github haciendo clic en el botón Clone or download
.
Gopass tiene un comando específico
gopass sync
realizando tanto git pull
como git push
, es decir, sincronización completa.
El almacenamiento predeterminado se crea en la carpeta ~/.password-store
, pero también puede especificar su propia ruta.
Para trabajar con contraseñas, la consola admite los comandos ls, cp, mv, search, create, etc. Puede obtener la lista completa escribiendo gopass --help
, pero personalmente no uso la consola, sino el complemento del navegador el 95% del tiempo.
Integración de navegador
El complemento del navegador se llama puente gopass , se puede encontrar en la tienda de Chrome y Firefox (ver enlace).
Para conectar el complemento con el propio gopass, necesitará un script auxiliar y un manifiesto para la mensajería nativa. Son creados por el equipo.
gopass jsonapi configure
que nos ofrecerá elegir un navegador y la ubicación del script.
Mira cómo funciona todo. Crea una nueva contraseña:
gopass new habr
Respondemos todas las preguntas y ahorramos. GPG le pedirá que ingrese una contraseña maestra para trabajar con la clave privada.
Ahora abrimos el menú del complemento con una característica gopher azul, y si todo salió bien, podemos encontrar nuestra contraseña allí.
Teclas TOTP
Personalmente, uso FreeOTP , sin embargo, puedes trabajar con estas teclas usando pass. Los usuarios del pase original deben instalar la extensión pass-otp , y en gopass y APS (ver más abajo) las funciones necesarias están listas para usar.
Para agregar una clave TOTP al almacén de contraseñas usando pass-otp, obtenemos la URL (comenzando con otpauth://
) e ingresamos el comando
pass otp insert totp-secret
Si la autenticación resultante se puede llamar de dos factores es un punto discutible. Los desarrolladores de KeePassXC recomiendan almacenar claves TOTP en una base de datos separada protegida por una contraseña diferente. De paso, esto también se puede hacer.
Integración de Android
La implementación de GnuPG para Android se llama OpenKeychain . Para configurarlo, simplemente vaya al menú "gestión de claves" e importe la clave secreta creada anteriormente. El único inconveniente de OpenKeychain para mí personalmente es que no hay desbloqueo de huellas digitales.
La implementación del pase para Android se llama android-password-store , o simplemente APS.
Instalar y ejecutar APS. Antes de sincronizar el almacenamiento de la contraseña, vaya al menú "Configuración". Allí necesitaremos los siguientes elementos:
git
. La URL resultante debe ser la misma que la especificada en la página del repositorio en github. Tipo de autorización: OpenKeychain
.Git utils
. En esta sección, especifique el nombre de usuario y el correo electrónico desde la clave gpg.OpenPGP
. Seleccione OpenKeychain
.
Esta característica que apareció más recientemente incluye completar contraseñas en aplicaciones en Android 8.0+.
Nota para los usuarios de teléfonos inteligentes Huawei, y para todos los demás: OpenKeychain, APS, BinaryEye, FreeOTP, así como Syncthing, Telegram, Tachiyomi, KDE Connect y mucho más están disponibles en F-Droid . Los usuarios de Google Play deberían apreciar esto: un catálogo de software que no tiene anuncios, rootkits o simplemente software basura del famoso artículo tonsky .
Antes de autocompletar en APS, usé keepass2android . No está en F-Droid por la razón original: está escrito en Xamarin, pero los mantenedores de F-Droid no han podido instalar este marco en su servidor de compilación durante 9 meses . Alguien hace algo.
Ahora puedes clonar. En la pantalla principal, seleccione "clonar del servidor", especifique la ubicación deseada del repositorio, verifique la configuración de git.
Si un intento de trabajar con git conduce a un error (esto probablemente fue en versiones anteriores de APS debido al uso de una versión obsoleta de la biblioteca jgit
del proyecto Eclipse), entonces todavía hay Syncthing.
Conclusión
Por supuesto, pasar no es tan fácil de configurar. Sin embargo, por este precio, puede confiar en que las herramientas utilizadas por nosotros (así como personas como Linus Torvalds o Edward Snowden) no serán desaprobadas en un momento dado, no cambiarán el formato de datos y no estarán sin soporte. Y si lo hacen, la arquitectura modular simple de pass fomenta la creación de cualquier cliente alternativo y extensiones.
Si decide no usar el pase, espero que algunos de los programas mencionados en el artículo le sean útiles por sí solos.