10  Configurar claves para SSH

Cuando interactuamos con un servidor Git remoto, como GitHub, debemos incluir credenciales en la solicitud. Esto demuestra que somos un usuario específico de GitHub, al que se le permite hacer cualquier cosa que le pidamos.

Git puede comunicarse con un servidor remoto utilizando uno de dos protocolos, HTTPS o SSH, y los diferentes protocolos utilizan diferentes credenciales.

Aquí describimos la configuración de credenciales para el protocolo SSH. Si no está seguro de utilizar HTTPS o SSH, lea HTTPS versus SSH. De ahora en adelante, asumimos que ha elegido intencionalmente configurar claves SSH.

10.1 Claves SSH

Las claves SSH proporcionan una forma más segura de iniciar sesión en un servidor que usar únicamente una contraseña. Si bien una contraseña puede eventualmente descifrarse con un ataque de fuerza bruta, las claves SSH son casi imposibles de descifrar solo con fuerza bruta. La generación de un par de claves le proporciona dos largas cadenas de caracteres: una clave pública y una privada. Puede colocar la clave pública en cualquier servidor (¡como GitHub!) y luego desbloquearla conectándose con un cliente que ya tenga la clave privada (¡su computadora!). Cuando los dos coinciden, el sistema se desbloquea sin necesidad de contraseña. Puede aumentar aún más la seguridad protegiendo la clave privada con una frase de contraseña.

Adaptado de las instrucciones proporcionadas por GitHub y Digital Ocean.

10.2 SSH esquema y consejo

Descripción general de alto nivel de lo que debe suceder:

  • Cree un par de claves SSH pública-privada. Literalmente, 2 archivos especiales, en un lugar especial. Opcionalmente, cifre la clave privada con una frase de contraseña (práctica recomendada).
  • Agregue la clave privada a su agente ssh. Si lo protegiste con una frase de contraseña, es posible que tengas una configuración adicional.
  • Agrega tu clave pública a tu perfil de GitHub.

Consejo:

  • Si es nuevo en la programación y el shell, probablemente le resulte más fácil HTTPS al principio (Capítulo 9). Siempre puedes cambiar a SSH más tarde. Puede utilizar un método desde la computadora A y el otro desde la computadora B.
  • Debes cambiar tus claves SSH periódicamente. Algo así como una vez al año.
  • Es una buena práctica proteger su clave privada con una frase de contraseña. Esto puede dificultar la configuración y el uso, por lo que si no estás preparado para ello (todavía), no uses una frase de contraseña o considera seriamente usar HTTPS en su lugar.
  • No hagas ejercicios extraños para tener un solo par de claves, reutilizadas en varias computadoras. Probablemente deberías tener una clave por computadora (yo hago esto). Algunas personas incluso tienen una clave por computadora, por servicio (yo no hago esto).
  • Es normal asociar varias claves públicas con tu cuenta de GitHub. Por ejemplo, una clave pública para cada computadora a la que se conecte.

10.3 ¿Ya tienes claves?

Puede comprobar esto desde RStudio o desde el shell.

Consejo global: si tiene claves existentes, pero no tiene idea de dónde provienen o por qué las creó, debería considerar seriamente la posibilidad de crear un nuevo par de claves SSH. Depende de usted decidir si eliminar las antiguas y cómo hacerlo. Pero no permita que eso le impida crear nuevas claves y seguir adelante.

10.3.1 Desde RStudio

Vaya a Tools > Global Options…> Git/SVN. Si ve algo como ~/.ssh/id_rsa en el cuadro Clave SSH RSA, definitivamente tiene claves existentes.

Advertencia: RStudio solo busca un par de claves llamado id_rsa e id_rsa.pub. Esto tiene sentido, porque históricamente ha sido lo más común.

Sin embargo, hoy en día tanto GitHub como GitLab alientan a los usuarios a generar claves SSH con el algoritmo Ed25519, lo que da como resultado un par de claves llamado id_ed25519 e id_ed25519.pub. En el momento de escribir este artículo, RStudio no mostrará dicho par de claves, lo que puede resultar confuso. Por lo tanto, probablemente sea una buena idea comprobar también las claves existentes en el shell.

10.3.2 Desde el shell

Vaya al shell (Apéndice A).

Liste las claves existentes:

ls -al ~/.ssh/

Si le dicen que ~/.ssh/ no existe, ¡no tiene claves SSH!

Si ve un par de archivos como id_rsa.pub e id_rsa o id_ed25519 y id_ed25519.pub, ya tiene un par de claves. El patrón típico es id_FOO.pub (la clave pública) e id_FOO (la clave privada), donde FOO refleja el tipo de clave. Si está satisfecho con seguir con sus claves existentes, salte a las secciones sobre cómo agregar una clave al ssh-agent y GitHub.

10.4 Crear un par de claves SSH

10.4.1 Opción 1: configurar desde RStudio

Vaya a Tools > Global Options…> Git/SVN > Create SSH Key….

RStudio le solicita una frase de contraseña. Es opcional, pero también una buena práctica. Configurar su sistema para un funcionamiento fluido con una clave protegida con contraseña introduce más partes móviles. Si es completamente nuevo en esto, omita la frase de contraseña (¡o use HTTPS!) e impleméntela la próxima vez, cuando se sienta más cómodo con la configuración del sistema. Al principio no usaba una frase de contraseña, pero ahora la uso y la registro en un administrador de contraseñas.

Haga clic en “Crear” y RStudio generará un par de claves SSH, almacenadas en los archivos ~/.ssh/id_rsa y ~/.ssh/id_rsa.pub.

Tenga en cuenta que actualmente RStudio solo genera claves RSA, mientras que la recomendación estándar de GitHub y GitLab es utilizar claves Ed25519. Si desea seguir ese consejo, genere sus claves en el shell por ahora.

10.4.2 Opción 2: configurar desde el shell

Cree el par de claves así, pero sustitúyalo por un comentario que signifique algo para usted, especialmente si tendrá varias claves SSH en su vida. Considere el correo electrónico asociado con su cuenta de GitHub o el nombre de su computadora o alguna combinación, p.e. your_email@example.com or macbook-pro or jane-2020-macbook-pro.

ssh-keygen -t ed25519 -C "DESCRIPTIVE-COMMENT"

Si parece que su sistema es demasiado antiguo para admitir el algoritmo Ed25519, haga lo siguiente:

ssh-keygen -t rsa -b 4096 -C "DESCRIPTIVE-COMMENT"

Acepte la propuesta de guardar la clave en la ubicación predeterminada. Simplemente presione Enter aquí:

Enter file in which to save the key (/Users/jenny/.ssh/id_ed25519):

Tiene la opción de proteger la clave con una frase de contraseña. Es opcional, pero también una buena práctica. Configurar su sistema para un funcionamiento fluido con una clave protegida con contraseña introduce más partes móviles. Si es completamente nuevo en esto, omita la frase de contraseña e impleméntela la próxima vez, cuando se sienta más cómodo con la configuración del sistema. Al principio no usaba una frase de contraseña, pero ahora la uso y la registro en un administrador de contraseñas.

Enter passphrase (empty for no passphrase):
Enter same passphrase again: 

El proceso debería completarse ahora y debería haberse visto así:

~ % ssh-keygen -t ed25519 -C "jenny-2020-mbp"        
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/jenny/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/jenny/.ssh/id_ed25519.
Your public key has been saved in /Users/jenny/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:XUEaY/elhcQJz3M9jx/SdC0zh10lCA7uNpqgkm5G/R0 jenny-2020-mbp
The key's randomart image is:
+--[ED25519 256]--+
|        . =o==oo*|
|       . + =.=+B+|
|        . o . @oB|
|       . . .  oO+|
|  . .   S .  ..o.|
| o o . E .    ...|
|+ . . + .       .|
|.+   . .         |
|o.               |
+----[SHA256]-----+

10.4.3 Agregar clave al agente ssh

Informe a su agente ssh sobre la clave y, especialmente, configúrelo para administrar la frase de contraseña, si decide establecer una.

Las cosas se vuelven un poco específicas del sistema operativo por aquí. En caso de duda, consulte las instrucciones de GitHub para SSH, que se mantiene actualizado para Mac, Windows y Linux. También explica situaciones más inusuales que las que puedo.

10.4.3.1 Mac OS

Asegúrese de que ssh-agent esté habilitado. Así es como se ve el éxito (el pid variará):

~ % eval "$(ssh-agent -s)"
Agent pid 15360

A veces esto falla así:

~ % eval "$(ssh-agent -s)"
mkdtemp: private socket dir: No such file or directory

Un error similar podría informarse como “Permiso denegado”. Deberías intentarlo de nuevo, pero como superusuario. ¡No olvide utilizar exit para volver a su cuenta de usuario normal cuando haya terminado!

~ % sudo su
Password:
sh-3.2# eval "$(ssh-agent -s)"
Agent pid 15385
sh-3.2# exit
exit

Agregue su clave al agente ssh. Si establece una frase de contraseña, se le cuestionará aquí. Darle. La opción -K almacena su frase de contraseña en el Keychain.

~ % ssh-add -K ~/.ssh/id_ed25519
Enter passphrase for /Users/jenny/.ssh/id_ed25519: 
Identity added: /Users/jenny/.ssh/id_ed25519 (jenny-2020-mbp)

Si tienes macOS Sierra 10.12.2 y superior, debes hacer una cosa más. Cree un archivo ~/.ssh/config con este contenido:

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519

Puedes omitir la línea sobre UseKeychain si no usaste una frase de contraseña. Pero si lo hizo, esto debería almacenar su contraseña persistentemente en el llavero. De lo contrario, tendrás que ingresarlo cada vez que inicies sesión. Hilo útil de StackOverflow: ¿Cómo puedo agregar permanentemente mi clave privada SSH a Keychain para que esté disponible automáticamente para ssh?.

10.4.3.2 Windows

En un shell de Git Bash, asegúrese de que ssh-agent se esté ejecutando:

$ eval $(ssh-agent -s)
Agent pid 59566

Agregue su clave, sustituyendo el nombre correcto por su clave.

$ ssh-add ~/.ssh/id_ed25519

10.4.3.3 Linux

En un shell, asegúrese de que ssh-agent se esté ejecutando:

$ eval "$(ssh-agent -s)"
Agent pid 59566

Agregue su clave, sustituyendo el nombre correcto por su clave.

ssh-add ~/.ssh/id_ed25519

10.5 Proporcionar clave pública a GitHub

Ahora almacenamos una copia de su clave pública en GitHub.

10.5.1 RStudio al portapapeles

Vaya a Tools > Global Options…> Git/SVN. Si su par de claves tiene el nombre id_rsa.pub e id_rsa, RStudio lo verá y le ofrecerá “Ver clave pública”. Haga eso y acepte la oferta de copiar a su portapapeles.

Si su par de claves tiene un nombre diferente, como id_ed25519.pub e id_ed25519, tendrá que copiar la clave pública de otra manera.

10.5.2 Shell al portapapeles

Copie la clave pública en su portapapeles. Por ejemplo, abra ~/.ssh/id_ed25519.pub en un editor y copie el contenido en su portapapeles. O realice una de las siguientes acciones en la línea de comando:

  • Mac OS: pbcopy < ~/.ssh/id_ed25519.pub
  • Windows: clip < ~/.ssh/id_ed25519.pub
  • Linux: xclip -sel clip < ~/.ssh/id_ed25519.pub

Linux: si es necesario, instale xclip mediante apt-get o yum. Por ejemplo, sudo apt-get install xclip.

10.5.3 En GitHub

Ahora registramos la clave pública con GitHub. Haga clic en su foto de perfil en la esquina superior derecha y vaya a Configuración > Claves SSH y GPG. Haga clic en “Nueva clave SSH”. Pegue su clave pública en el cuadro “Clave”. Asígnele un título informativo, probablemente repitiendo el comentario descriptivo que utilizó anteriormente durante la creación de la clave. Haga clic en “Agregar clave SSH”.

¡En teoría, hemos terminado! Puedes usar ssh -T git@github.com para probar su conexión a GitHub. Si no está seguro de qué hacer con el resultado, consulte el enlace para obtener más detalles. Por supuesto, la mejor prueba es analizar los ejemplos de uso realistas que aparecen en otras partes de esta guía.

10.6 Solución de problemas

10.6.1 URL HTTPS cuando pretendías usar SSH

Si cree que tiene SSH configurado correctamente y aún así se le solicitan credenciales, considere esto: para el repositorio en cuestión, ¿es posible que haya configurado GitHub, probablemente llamado origin, como un control remoto HTTPS, en lugar de SSH?

Cómo ver las URL remotas asociadas con el repositorio actual en el shell:

git remote -v

Un control remoto SSH se verá así:

git@github.com:USERNAME/REPOSITORY.git

mientras que un control remoto HTTPS se verá así:

https://github.com/USERNAME/REPOSITORY.git

Puedes solucionar este problema con git remoto set-url, que se demuestra en La URL determina el protocolo.

10.6.2 git2r, o alguna otra herramienta, no puede encontrar claves SSH en Windows

¿Has visto este mensaje de error?

Error in .local(object, ...) : 
  Error in 'git2r_push': error authenticating: failed connecting agent

Lo hemos visto cuando trabajamos con Git/GitHub desde R a través del paquete git2r.

La causa principal es la confusión sobre la ubicación de .ssh/ en Windows. La idea que tiene R de su directorio de inicio en Windows a menudo difiere de la ubicación predeterminada de los archivos de configuración para Git y ssh, como .ssh/. En sistemas *nix, generalmente coinciden y no hay problema.

Dos directorios importantes en Windows son el HOME del usuario y el USERPROFILE. R generalmente asocia ~ con HOME, pero Git y ssh a menudo consultan USERPROFILE para sus archivos de configuración. En mi máquina virtual con Windows 10, veo:

normalizePath("~")
#> [1] "C:\\Users\\JennyVM\\Documents"

as.list(Sys.getenv(
  c("HOME", "USERPROFILE")
))
#> $HOME
#> [1] "C:/Users/JennyVM/Documents"
#> 
#> $USERPROFILE
#> [1] "C:\\Users\\JennyVM"

list.files(
  Sys.getenv("USERPROFILE"),
  pattern = "ssh|git",
  include.dirs = TRUE,
  all.files = TRUE
)
#> [1] ".gitconfig" ".ssh"

Dos soluciones:

  • Dígale a git2r explícitamente dónde encontrar su clave pública y privada y pase el objeto cred resultante a sus llamadas de git2r.

    cred <- git2r::cred_ssh_key(
      publickey = "~/../.ssh/id_rsa.pub",
      privatekey = "~/../.ssh/id_rsa"
    )
  • Crear un enlace simbólico para que .ssh/ en el directorio de inicio de R apunte a su directorio real .ssh/. Ejemplo aportado por Ian Lyttle en Windows 7 usando el símbolo del sistema:

    MKLINK /D "C:\Users\username\Documents\.ssh" "C:\Users\username\.ssh"

Finalmente, si git2r parece incapaz de obtener su contraseña SSH de ssh-agent, instale el paquete getPass:

install.packages("getPass")

y git2r debería abrir una ventana emergente donde puede ingresar su frase de contraseña. Gracias a Ian Lyttle por este consejo.

Este enlace proporciona una excelente explicación de la incertidumbre sobre dónde se encuentran .ssh/ y .gitconfig del usuario en Windows: git en Windows - ubicación de los archivos de configuración. En pocas palabras: coloque su configuración y claves donde su herramienta principal espera que estén y cree enlaces simbólicos para ayudar a otras herramientas a encontrar estas cosas.

10.6.3 Otro

Otras cosas para verificar dos veces:

  • ¿Agregaste SSH a tu agente ssh?
  • ¿Configuraste Mac OS Sierra o High Sierra para almacenar persistentemente tu frase de contraseña en el llavero?
  • ¿Agregaste la clave pública a GitHub?