Utilice OpenSSH para proporcionar un entorno seguro para ejecutar terminales remotos. El uso básico de OpenSSH y la terminal es muy simple, pero este artículo también cubrirá otros elementos que permiten el inicio de sesión automático en hosts remotos, formas de ejecutar aplicaciones remotas y cómo copiar archivos de forma segura entre hosts.
Acerca de esta serie
El administrador típico de UNIX® tiene un conjunto de utilidades, conocimientos y sistemas clave que se utilizan con frecuencia para ayudar en el proceso administrativo. Existen varias utilidades clave, cadenas de línea de comandos y scripts para optimizar diferentes procesos. Algunas de estas herramientas provienen del sistema operativo, pero la mayor parte del conocimiento proviene de una larga experiencia y de la necesidad de reducir el estrés en el trabajo del administrador del sistema. Esta serie de artículos se centra en aprovechar al máximo las herramientas disponibles en varios entornos UNIX, incluidas formas de simplificar las tareas administrativas en entornos heterogéneos.
¿Por qué utilizar OpenSSH?
Los servicios de red estándar que utiliza todos los días, como FTP, Telnet, RCP, Remote Shell (rsh), etc., funcionan bien en un entorno cerrado, pero la información transmitida a través de la red utilizando estos servicios no está cifrada. Cualquiera que utilice un rastreador de paquetes en su red o una computadora remota puede ver la información intercambiada y, a veces, incluso la información de la contraseña.
Además, con todos estos servicios, las opciones para automatizar el proceso de inicio de sesión son limitadas y a menudo dependen de incrustar una contraseña de texto sin formato en la línea de comando para ejecutar declaraciones, lo que hace que el proceso de inicio de sesión sea aún más inseguro.
El protocolo Secure Shell (SSH) se desarrolló para sortear estas limitaciones. SSH proporciona cifrado para todo el canal de comunicación, incluido el intercambio de credenciales de inicio de sesión y contraseña, y funciona con claves públicas y privadas para proporcionar autenticación automatizada para los inicios de sesión. También puede utilizar SSH como protocolo de transporte subyacente. Usar SSH de esta manera significa que después de abrir una conexión segura, se puede intercambiar todo tipo de información a través del canal cifrado, e incluso HTTP y SMTP pueden usar este método para proteger el mecanismo de comunicación.
OpenSSH es una implementación gratuita de los protocolos SSH 1 y SSH 2. Fue desarrollado originalmente como parte del sistema operativo OpenBSD (Berkeley Software Distribution) y ahora se lanza como una solución general para UNIX o Linux® y sistemas operativos similares.
Instalar OpenSSH
OpenSSH es un software gratuito y se puede descargar desde el sitio web principal de OpenSSH (ver Recursos). Los sistemas OpenSSH se pueden crear a partir del código fuente en una variedad de sistemas, incluidos Linux, HP-UX, AIX®, Solaris, Mac OS X y más. Generalmente es posible encontrar binarios precompilados para la plataforma y versión elegidas. Algunos proveedores incluso proporcionan kits de herramientas OpenSSH como parte del sistema operativo.
Para construir OpenSSH necesitas lo siguiente:
Si necesita utilizar los ajustes de configuración predeterminados, utilice la secuencia de compilación normal, como se muestra en el Listado 1 a continuación.
$ ./configurar $ hacer $ hacer instalación |
Esto instala binarios, bibliotecas y archivos de configuración en el directorio /usr/local, por ejemplo, binarios en /usr/local/bin y archivos de configuración en /usr/local/etc. Si desea integrar varias herramientas en el entorno principal, es posible que deba especificar la opción --prefix para configurar el directorio base y la opción --sysconfdir para configurar la ubicación del archivo de configuración:
$ ./configure --prefix=/usr --sysconfidir=/etc/ssh |
Algunas otras opciones generales que podría especificar incluyen:
Después de completar la configuración, use make para compilar de la forma habitual.
Una vez completado el proceso de compilación e instalación, debe configurar el sistema creando primero una clave SSH que identifique de forma única el sistema y luego habilitando la comunicación segura entre el cliente y el host. Puedes ejecutar:
$ crear clave de host |
Alternativamente, puede realizar los pasos individuales manualmente en la línea de comando. Debe crear tres claves (una para cada uno de los principales algoritmos de cifrado: rsa1, rsa y dsa). Por ejemplo, el Listado 2 muestra cómo crear la clave rsa1.
$ ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key Generando par de claves rsa1 pública/privada. Ingrese la frase de contraseña (vacía si no hay frase de contraseña): Ingrese la misma contraseña nuevamente: Su identificación se ha guardado en /etc/ssh//ssh_host_key. Su clave pública se ha guardado en /etc/ssh//ssh_host_key.pub. La huella digital clave es: 43:aa:58:3c:d8:30:de:43:af:66:2a:b2:8d:02:08:86 root@remotehost |
Se le solicitará su contraseña. Para la clave de host, probablemente no necesite la contraseña de la clave, por lo que puede presionar Retorno para usar una contraseña vacía. Alternativamente, puede usar la opción -N en la línea de comando para acelerar el proceso (ver Listado 3).
$ ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N "" Generando par de claves rsa1 pública/privada. Su identificación se ha guardado en /etc/ssh/ssh_host_key. Su clave pública se ha guardado en /etc/ssh/ssh_host_key.pub. La huella digital clave es: a3:e3:21:4f:b5:9f:ff:05:46:66:bc:36:a1:47:a0:64 raíz@hostremoto |
Ahora repita el proceso para crear las claves rsa y dsa (consulte el Listado 4).
$ ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" $ ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" |
Esto creará dos archivos para cada tipo de clave: la clave pública (en un archivo que termina en .pub) y la clave privada. Debe asegurarse de que la clave privada solo sea leída por los procesos raíz y SSH; esto debe configurarse automáticamente. Es posible que desee copiar la clave pública en una ubicación central en un recurso compartido del Sistema de archivos de red (NFS) para que las personas puedan agregarla a la lista de claves de host conocidas.
Finalmente, debe iniciar el proceso sshd y configurarlo para que se ejecute al inicio. Para hosts Linux, puede encontrar el script de inicio apropiado en contrib/redhat/sshd.init que se puede agregar a /etc/init.d.
Uso de SSH para acceso básico al terminal
La función principal de OpenSSH es la de herramienta SSH, una alternativa segura al protocolo Telnet para un inicio de sesión remoto seguro en hosts UNIX o Linux.
Para conectarse a un host remoto usando el shell estándar, simplemente escriba el nombre del host:
$ ssh host remoto |
De forma predeterminada, el sistema intenta utilizar el nombre de usuario actual como nombre de inicio de sesión. Para utilizar un nombre de inicio de sesión diferente, preceda el nombre del host con el nombre de inicio de sesión, separado por el símbolo @. Por ejemplo:
$ ssh mc@remotehost |
Se le solicitará su contraseña de usuario; esto es similar a Telnet.
La primera vez que se conecte a un host, se le preguntará si desea guardar una copia de la clave pública del host remoto en un archivo de "hosts conocidos" (consulte el Listado 5).
$ ssh raíz@hostremoto No se puede establecer la autenticidad del host 'remotehost (10.211.55.3)'. La huella digital de la clave RSA es cc:c8:8b:75:3d:b6:00:2f:a9:9c:53:4c:03:0f:3d:1b. ¿Estás seguro de que quieres continuar conectándote (sí/no)? Advertencia: Se agregó permanentemente 'remotehost' (RSA) a la lista de hosts conocidos. |
En el futuro, no recibirá esta advertencia, pero se emitirá cuando el sistema detecte que la clave pública devuelta por el host remoto no coincide con la clave pública en el archivo del host, lo que indica un posible ataque de piratas informáticos. También podría significar que el administrador solo regeneró la clave del host.
Básicamente, no hay diferencia entre las sesiones SSH y Telnet, excepto que las sesiones SSH están cifradas, lo que hace casi imposible que alguien espíe su sesión o conozca su contraseña o los comandos y operaciones que está ejecutando.
También puede usar SSH para ejecutar comandos directamente en el host remoto sin usar un shell. Por ejemplo, para ejecutar el comando who en el host remoto, consulte el Listado 6.
Listado 6. Ejecutando el comando who en el host remoto$ ssh mc@remotehost quien consola de administración 23 de noviembre 14:04 mc ttyp1 2 de diciembre 10:53 (sulaco.mcslp.pri) mc ttyp2 10 de diciembre 06:50 (sulaco.mcslp.pri) administrador ttyp3 12 de diciembre 13:33 mc ttyp4 15 de diciembre 12:38 (nautilus.mcslp.p) |
La ejecución remota también emula la entrada, salida y error estándar del host del cliente. Esto significa que puede redirigir la salida a un comando remoto. Por ejemplo, puede agregar información directamente a un archivo remoto canalizando la salida del comando a SSH en el host remoto (consulte el Listado 7).
Listado 7. Agregar información directamente a un archivo remoto$ echo "Hola mundo" |ssh mc@remotehost 'gato >> holamundos.txt' |
Puede utilizar este método para aumentar su productividad al utilizar SSH para simplificar el proceso de inicio de sesión.
Intercambiar archivos usando SFTP
El comando sft es una alternativa al FTP que utiliza el canal de comunicación seguro proporcionado por el protocolo SSH.
Para abrir una conexión SFTP, especifique el nombre de host en la línea de comando:
$ sftp host remoto |
Tenga en cuenta que el comando anterior supone que desea utilizar el mismo método de inicio de sesión que su host actual. Para utilizar un método de inicio de sesión diferente, anteponga el nombre de host al nombre de usuario:
$ sftp mc@remotehost |
Aunque SFTP funciona de manera similar a FTP, existen algunas limitaciones y diferencias. Por ejemplo, dir en FTP proporciona una larga lista de archivos (consulte el Listado 8).
ftp>directorio 502 'EPSV': comando no entendido. 227 Entrando en modo pasivo (192,168,0,110,150,159) 150 Apertura de conexión de datos en modo ASCII para listado de directorios. total 1472 drwx------ 3 mc staff 102 4 de noviembre 11:17 Escritorio drwx------ 3 mc staff 102 4 de noviembre 11:17 Documentos drwx------ 18 mc personal 612 5 de noviembre 18:01 Biblioteca drwx------ 3 mc staff 102 4 de noviembre 11:17 Películas drwx------ 3 mc staff 102 4 de noviembre 11:17 Música drwx------ 4 mc staff 136 4 de noviembre 11:17 Imágenes drwxr-xr-x 4 mc personal 136 4 de noviembre 11:17 Público drwxr-xr-x 6 mc personal 204 4 de noviembre 11:17 Sitios drwxrwxrwx 3 personal raíz 102 24 de diciembre 07:30 tmp drwxr-xr-x 7 personal raíz 238 11 de diciembre 08:39 prueba 226 Transferencia completa. |
En SFTP, dir actúa como un alias para el comando de listado del directorio del host, que es ls en UNIX o Linux. De forma predeterminada, dir proporciona sólo una lista corta (consulte el Listado 9).
sftp> directorio Escritorio Documentos Biblioteca Películas Música Imágenes Público Sitios de prueba tmp |
Para obtener una lista larga, utilice las mismas opciones que ls (consulte el Listado 10).
sftp> directorio -l drwx------ 3 mc staff 102 4 de noviembre 11:17 Escritorio drwx------ 3 mc staff 102 4 de noviembre 11:17 Documentos drwx------ 18 mc personal 612 5 de noviembre 18:01 Biblioteca drwx------ 3 mc staff 102 4 de noviembre 11:17 Películas drwx------ 3 mc staff 102 4 de noviembre 11:17 Música drwx------ 4 mc staff 136 4 de noviembre 11:17 Imágenes drwxr-xr-x 4 mc personal 136 4 de noviembre 11:17 Público drwxr-xr-x 6 mc personal 204 4 de noviembre 11:17 Sitios drwxrwxrwx 3 personal raíz 102 24 de diciembre 07:30 tmp drwxr-xr-x 7 personal raíz 238 11 de diciembre 08:39 prueba |
Otros comandos, como cambiar directorios (cd, lcd localmente), crear directorios (mkdir) y enviar (poner) y recibir (obtener) archivos, permanecen sin cambios. Los dos últimos comandos, put y get, aceptan comodines (similares a mput y mget en FTP), pero tenga cuidado al transferir varios archivos sin comodines en SFTP. Por ejemplo, se reconoce que sftp> mget archivo1 archivo2 archivo3 intenta obtener el archivo1 y el archivo2 y los coloca en el directorio local archivo3, pero es posible que ese directorio no exista.
Copie archivos entre hosts usando scp
El comando scp funciona de manera similar al comando rc, excepto que utiliza el protocolo SSH para transferir archivos. Al transferir archivos relacionados con contenido o intercambiar archivos automáticamente en Internet, scp es mucho mejor.
Su formato es similar a rcp; usted especifica la ruta del archivo que se copiará y el nombre del host debe fusionarse en ella si es necesario. Por ejemplo, para copiar un archivo .bashrc desde un host remoto a su máquina local, use:
$ scp host remoto:/users/mc/.bashrc ~/.bashrc |
Como antes, para especificar un nombre de usuario a utilizar, anteponga el host al nombre de usuario, separado por el símbolo @:
$ scp mc@remotehost:/users/mc/.bashrc ~/.bashrc |
Suponiendo que el usuario con el que se está conectando tiene permisos de lectura, también necesitará usar el metacarácter ~ para acceder a la información en su directorio de inicio.
$ scp mc@remotehost:~mc/.bashrc ~/.bashrc |
Para copiar desde el directorio de inicio del usuario que ha iniciado sesión, utilice:
$ scp mc@remotehost:.bashrc ~/.bashrc |
El comando scp también admite reglas de expansión estándar. Entonces, para copiar todos los archivos .bash*, puedes usar:
$ scp mc@remotehost:.bash* ~ |
Incluso puede seleccionar archivos individuales de forma más específica utilizando llaves desplegables ({}):
$ scp mc@remotehost:".bash{rc,_path,_aliases,_vars}" ~ |
Tenga en cuenta que las llaves de expansión en la ruta del archivo (no la expresión de ruta remota completa) están entre comillas dobles.
En todos los ejemplos anteriores, se le solicitará la contraseña del host remoto. Esto se puede evitar proporcionando al anfitrión la parte pública de su clave personal.
Habilitar el inicio de sesión automático usando clave pública
Cuando inicia sesión en un sistema remoto mediante ssh, sftp o scp, aún necesita una contraseña para completar el proceso de inicio de sesión. Al crear una clave pública o privada, agregar la parte pública de la clave al archivo ~/.ssh/authorized_keys e intercambiar una clave válida con el sitio remoto, puede eliminar el requisito de proporcionar una contraseña y permitir el inicio de sesión automático.
Para crear una clave pública o privada, debe utilizar ssh-keygen para especificar el tipo de cifrado de clave. En la demostración se utiliza el tipo de clave rsa, pero también son válidos otros tipos de clave. Para crear la clave, consulte el Listado 11.
$ssh-keygen-trsa Generando par de claves rsa pública/privada. Ingrese el archivo en el que guardar la clave (/root/.ssh/id_rsa): |
Debe ingresar la ubicación del archivo que contiene las claves (componentes públicos y privados). Usar el valor predeterminado (en el directorio .ssh de su directorio de inicio) suele estar bien (consulte el Listado 12).
Directorio creado '/root/.ssh'. Ingrese la frase de contraseña (vacía si no hay frase de contraseña): |
Si ingresa una contraseña en esta etapa, se crea un archivo de clave de seguridad, pero también debe ingresar la contraseña cada vez que use la clave. Al presionar Retorno no se requiere contraseña (consulte el Listado 13).
Listado 13. Omitir el requisito de contraseña presionando RetornoIngrese la misma contraseña nuevamente: Su identificación se ha guardado en /root/.ssh/id_rsa. Su clave pública se ha guardado en /root/.ssh/id_rsa.pub. La huella digital clave es: 98:da:8d:48:a8:09:44:b1:b3:62:51:2d:a9:6b:61:ba raíz@hostremoto |
Ya se han creado la clave pública (id_rsa.pub) y la clave privada correspondiente (id_rsa).
Para habilitar el inicio de sesión automático, debe copiar el contenido de la clave pública al archivo autorizado_keys en el directorio ~/.ssh en el host remoto. Puede automatizar esto usando SSH (consulte el Listado 14).
$ gato ./.ssh/id_rsa.pub | ssh mc@remotehost 'gato >> .ssh/authorized_keys'; |
Además, si hace esto con frecuencia en varios hosts, puede utilizar un pequeño script o función de shell para realizar todos los pasos necesarios, como se muestra en el Listado 15.
OLDDIR='contraseña'; si [ -z "$1" ]; echo Necesita información de usuario@host; salida; fi; cd $INICIO; si [ -e "./.ssh/id_rsa.pub" ]; gato ./.ssh/id_rsa.pub | ssh $1 'gato >> .ssh/claves_autorizadas'; demás ssh-keygen -trsa; gato ./.ssh/id_rsa.pub | ssh $1 'gato >> .ssh/claves_autorizadas'; fi; CD $OLDDIR |
Puede utilizar el script setremotekey para copiar una clave existente o, si la clave no existe, crear una antes de copiarla:
$ setremotekey mc@remotehost |
Ahora, siempre que necesite iniciar sesión en un host remoto usando una clave pública, puede usar un script de clave personal en combinación con una lista de claves aceptadas por ese usuario en el host remoto.
Resumir
OpenSSH es una herramienta importante que protege las comunicaciones y las transferencias de información entre computadoras. No sólo es una alternativa segura a herramientas convencionales como Telnet, FTP y RCP, sino que también puede servir como protocolo de transporte para otros servicios como Subversion, X Windows System y rsync. Este artículo le muestra los pasos básicos necesarios para poner en funcionamiento OpenSSH, cómo utilizar mejor las herramientas principales proporcionadas por OpenSSH y cómo utilizar herramientas de intercambio de claves para simplificar los problemas de inicio de sesión y conectividad.