5 trucos y trucos SSH y más

imagen



En este artículo, hablaremos sobre trucos y comandos útiles al trabajar con SSH. A saber:



  • Cómo utilizar la autenticación de dos factores para conexiones SSH.
  • Uso seguro del "reenvío de agentes".
  • Finalizando una sesión colgada.
  • Dejamos el terminal abierto al salir o desconectar.
  • ( Zoom!).




Hay cinco formas de activarlo.



1. Actualizamos OpenSSH y usamos tokens de hardware. En febrero de este año, se agregó soporte para tokens FIDO U2F (Universal Second Factor) a OpenSSH. ¿Qué puedo decir? Eso es genial, pero hay una advertencia.



El punto es que la actualización agrega nuevos tipos de claves para admitir tokens. Sin embargo, esta función solo se puede utilizar al actualizar el cliente y el servidor a la versión 8.2 o posterior. Puede verificar la versión actual del cliente usando el comando ssh -V. En lo que respecta al servidor remoto, vale la pena usar nc [servername] 22.



Además, se han agregado dos nuevos tipos de claves: ecdsa-sk y ed25519-sk. También hay certificados para ellos. Para crear archivos clave, debe insertar un token y ejecutar el comando



$ ssh-keygen -t ecdsa-sk -f ~ / .ssh / id_ecdsa_sk.



¿Que hace ella? Crea claves públicas y privadas que están vinculadas al token U2F. La clave privada del token se utiliza para descifrar la clave privada que está almacenada en el disco.



Otra posibilidad es establecer una contraseña para los archivos clave como segundo factor. El hecho es que OpenSSH funciona con otra opción de generación: sk. Por lo tanto, los archivos de claves se almacenan en un token de hardware y siempre están contigo. Para crear una clave residente, debe usar el comando:



$ ssh-keygen -t ecdsa-sk -O resident -f ~/.ssh/id_ecdsa_sk.


Bueno, para transferir el archivo de clave a una nueva máquina, debe insertar el medio y ejecutar el comando $ ssh-add -K. Recuerde: el token debe activarse al conectarse.



2. Usamos PIV + PKCS11 y Yubikey. En el caso de que necesite conectarse a máquinas donde están instaladas versiones anteriores del servidor SSH, existe otra opción. Aquí hay una instrucción detallada para U2F + SSH con PIV / PKCS11 . Un poco complicado pero merece la pena.



3. La tercera forma es usar el agente yubikey. Aquí está el agente SSH para los propios Yubikeys , creado por Filipo Valsorda.



4. Toque ID y sekey. Otra forma es usar Sekey- un agente de código abierto. Almacena claves privadas en el sistema de enclave seguro para MacOS y le permite activar la función de firma con Touch ID.



5. Por último, utilice SSH de inicio de sesión único. Aquí están las instrucciones de configuración. La ventaja de Single Sign On SSH es que el usuario puede hacer cumplir la política de seguridad del proveedor de la cuenta, incluida la compatibilidad con la autenticación multifactor.



Reenvío seguro de claves (reenvío de agentes)



¿Para qué se utiliza el reenvío de claves? Para acceso de host remoto al agente de usuario SSH local. El hecho es que cuando el cliente SSH utiliza el reenvío de claves (ssh -A se activa con mayor frecuencia), durante la conexión hay 2 canales. La primera es una sesión de usuario interactiva, la segunda es un canal de reenvío clave.



El agente SSH local crea un socket IPC que se conecta a través de este canal al host remoto. Esto es bastante peligroso, ya que el usuario root en el host remoto tiene acceso al agente SSH local del usuario que se conecta. Por lo tanto, se puede utilizar para acceder a los recursos de la red en nombre de este usuario. Y si trabaja con un agente SSH estándar, no descubrirá el problema. Pero con una clave U2F o Sekey, este problema se puede eliminar.



En general, puede reenviar la clave, pero es recomendable no utilizar este método con frecuencia y para todas sus conexiones. Es aconsejable usarlo solo cuando el usuario confía en la situación.



Cierre de sesión de SSH colgado



Las sesiones SSH a menudo se congelan debido a problemas de red, pérdida de control de un programa en ejecución o una de las secuencias de escape del terminal que bloquea la entrada del teclado. Hay varias formas de salir de una sesión bloqueada:



1. Automáticamente cuando se desconecta la red. Para hacer esto, agregue al archivo de configuración SSH, .ssh / config:

ServerAliveInterval 5

ServerAliveCountMax 1




En este caso, ssh verificará la conexión enviando solicitudes de eco al host remoto a intervalos regulares. Se establecen mediante el parámetro ServerAliveInterval. Si hay más solicitudes sin respuesta que ServerAliveCountMax, SSH cierra la conexión.



2. Romper la sesión. ssh usa el carácter ~ como secuencia de escape predeterminada. El comando ~ cierra la conexión actual y regresa al terminal.



Además, el ~? Muestra la lista completa de comandos que se pueden usar en la sesión actual. Si tiene varios diseños instalados, tendrá que presionar el botón ~ dos veces para enviar un carácter.



Dejar abierta la terminal del host remoto



Hay dos opciones para guardar la sesión mientras se cambia entre redes.



1. Uso de Mosh o Eternal Terminal



Si necesita una conexión confiable y que no se cierre, incluso al cambiar entre redes, entonces hay una salida: debe usar Mosh - shell móvil. Mosh se refiere a un shell seguro que usa SSH para inicializar una sesión (protocolo de enlace). Después de eso, cambia a su propio canal cifrado, que es muy estable. Por ejemplo, puede manejar varias situaciones, incluidas desconexiones, cambios en la dirección IP del dispositivo, grandes retrasos en la transferencia de datos, etc. Todo esto es gracias a UDP y al protocolo de sincronización que usa Mosh.



Para trabajar con él, primero debe instalarlo tanto en el servidor como en el cliente, abriendo los puertos 60,000 a 61,000 para el tráfico UDP entrante en su host remoto. Después de eso, solo necesita escribir mosh user @ server para conectarse.



Mosh trabaja a nivel de pantallas de terminal y pulsaciones de teclas, lo que le da muchas ventajas sobre SSH, que transfiere un flujo de datos binarios de E / S normal entre los clientes y el servidor. Si necesita sincronizar solo la pantalla del terminal y las pulsaciones de teclas, la conexión interrumpida se restaura mucho más rápido. El mismo SSH debe almacenarse en un búfer y enviarse todo, pero Mosh solo necesita guardar las pulsaciones de teclas, sincronizando el último estado de la ventana del terminal con el cliente.



2. Usando tmux. Para conectarse y desconectarse según sea necesario, mientras se mantiene la misma sesión en el host remoto, vale la pena usar un multiplexor de terminal llamado tmux . En el caso de que la conexión SSH se interrumpa, debe volver a conectarse y escribir tmux attach. Luego, el usuario vuelve a la sesión tmux.



También ofrece varias funciones adicionales, que incluyen pestañas, paneles, lo mismo que en el terminal macOS, además de la posibilidad de trabajar con el terminal junto con otro usuario. Puede obtener aún más con Byobu, un paquete que agrega muchas funciones convenientes y atajos de teclado. Se envía con Ubuntu y se puede ejecutar en macOS con Homebrew.



Compartiendo una terminal remota



Hay situaciones en las que necesita compartir una sesión SSH, por ejemplo, mientras resuelve problemas complejos con servidores. La mejor forma de hacerlo es con tmux. Para resolver el problema, debe hacer lo siguiente:



  • Asegúrese de que tmux esté instalado en el servidor en la DMZ (o la ubicación a la que desea conectarse).
  • Ambos usuarios deben conectarse al servidor a través de SSH con la misma cuenta.
  • Uno de los usuarios debe ejecutar tmux para crear una sesión tmux.
  • El segundo usuario ejecuta el comando tmux attach.
  • ¡Todo está listo!


Si necesita ajustar las sesiones de varios usuarios, debe usar tmate . Esta es una bifurcación mejorada de tmux.



Asesoramiento experto



Decidimos complementar la traducción con nuestros propios consejos; esperamos que también sean útiles. Maxim Klochkov , consultor senior en el Network Solutions Center de Jet Infosystems y profesor del curso Cybersecurity Profession en Skillbox, compartió su útil experiencia .



Reenvío de puerto TCP



Ssh tiene dos opciones útiles: -L y -R.



El parámetro -L organiza un puerto TCP abierto en nuestra computadora local, al intentar establecer una conexión TCP a la cual esta conexión se reenvía de forma transparente al túnel ssh, y luego se establece una conexión desde la computadora remota.



El parámetro -L va seguido de un argumento con la siguiente forma:



ssh -L XXX:server1:YYY login@server2


Aquí, server2 es el servidor remoto al que accedemos a través de ssh, login es el nombre de usuario bajo el cual iniciamos sesión en el servidor remoto, XXX es el número de puerto que debe organizarse en la computadora local, server1 es el host al que debemos reenviar la conexión desde este puerto Y, finalmente, YYY es el puerto al que se debe reenviar esta conexión.



Veamos dos ejemplos.



Ejemplo 1.



  1. Estamos en el servidor spb.company1.ru y queremos probar una aplicación web que acceda a la base de datos en central-db.company1.ru
  2. Esta base de datos solo está disponible en el servidor moscow.company1.ru, en el puerto 9999
  3. Organizaremos el reenvío del puerto local 55555 a la base de datos a través del túnel ssh de la siguiente manera: ssh -L 55555: central-db.company1.ru: 9999 login@moscow.company1.ru
  4. Después de eso, implementamos una aplicación web en nuestro servidor local, y no especificamos central-db.company1.ru:9999 como base, sino localhost: 55555 - esta conexión se reenviará al servidor moscow.company1.ru, y este servidor hará la conexión con una base de datos en el host central-db.company1.ru, puerto 9999


Ejemplo 2.



  1. Estamos en el servidor spb.company1.ru y queremos mostrarle al cliente un sitio web de prueba en moscow.company1.ru, puerto 5000.
  2. No hay acceso a este sitio desde Internet, solo hay acceso interno desde el mismo host donde está implementado, es decir, desde moscow.company1.ru
  3. Organizamos el reenvío del puerto local 80 a través del túnel ssh de la siguiente manera ssh -L 80: localhost: 5000 login@moscow.company1.ru
  4. Si ahora el usuario ingresa al navegador usando el enlace spb.company1.ru , entonces la conexión se reenviará a través del túnel ssh al servidor moscow.company1.ru, y este servidor ya establecerá una conexión con la dirección localhost: 5000, es decir, a nuestra web de prueba -sitio.


El parámetro -R organiza un puerto TCP abierto en el servidor remoto, cuando intenta establecer una conexión TCP, esta conexión se reenvía de forma transparente al túnel ssh y luego se establece una conexión desde el servidor local.



El parámetro -R va seguido de un argumento con la siguiente forma:



ssh -R XXX:server1:YYY login@server2


Aquí, server2 es el servidor remoto al que accedemos a través de ssh, login es el nombre de usuario bajo el cual iniciamos sesión en el servidor remoto, XXX es el número de puerto que debe organizarse en el servidor remoto, server1 es el host al que necesitamos reenviar la conexión desde el servidor remoto Y, finalmente, YYY es el puerto al que se debe reenviar esta conexión.



Veamos dos ejemplos.



Ejemplo 1.



  • Estamos en el servidor moscow.company1.ru, y desde este servidor hay una base de datos disponible en el servidor central-db.company1.ru, en el puerto 9999.
  • Estamos implementando una aplicación web en el servidor spb.company1.ru y la base de datos no es accesible desde este servidor.
  • Organizamos el reenvío de puertos desde el servidor spb.company1.ru a la base de datos de la siguiente manera: ssh -R 55555: central-db.company1.ru: 9999 login@spb.company1.ru
  • Después de eso, implementamos nuestra aplicación web en el servidor spb.company1.ru, pero especificamos no central-db.company1.ru:9999 como base, ya que este servidor no está disponible para nosotros, sino localhost: 55555 - esta conexión se reenviará a nuestro local máquina a través de un túnel ssh, y luego la máquina local establecerá una conexión con el servidor central-db.company1.ru, puerto 9999.


Ejemplo 2.



  • Estamos en el servidor moscow.company1.ru y tenemos un sitio web de prueba implementado en nuestro servidor, en el puerto 5000.
  • Este sitio web de prueba solo está disponible localmente, no se permiten conexiones desde Internet, pero queremos mostrar este sitio web a un cliente que puede acceder al servidor spb.company1.ru con un navegador web.
  • Organizaremos el reenvío de puertos desde el servidor spb.company1.ru de la siguiente manera: ssh -R 80: localhost: 5000 login@spb.company1.ru
  • Si ahora el usuario ingresa al navegador usando el enlace spb.company1.ru , entonces la conexión se reenviará a través del túnel ssh a nuestro servidor local moscow.company1.ru, y se establecerá una conexión desde este a localhost: 5000 - es decir, a nuestra web de prueba sitio.


¿Qué trucos puedes compartir?



Sobre este tema:






All Articles