Manual por pasos de cómo realizar una conexión SSH
Definición
SSH- Secure Shell- es un intérprete de órdenes seguro, y hace referencia al protocolo y al
programa que sirve para acceder remotamente a una máquina a través de la red.
Nota: Puedes obtener el software de OpenSSH de [Link]
Conexión SSH
1. El servidor arranca con el script de inicio
/etc/init.d/ssh.
2. El cliente inicia la conexión:
ssh usuario@servidor
Podemos utilizar la IP o el nombre del servidor. Si no especificamos el usuario,
utilizará el usuario que está realizando la conexión. Por ejemplo, si el usuario
practicasIniciales desde la máquina usac quiere conectarse a usac2 como
practicasIniciales2, ejecutará:
practicasIniciales@usac:~$ ssh practicasIniciales2@usac2
3. El servidor comprueba si el host del cliente tiene permiso para conectar, tras lo cual
cliente y servidor intercambian en texto plano sus identificadores de versión, para
comprobar si los protocolos soportados coinciden y la comunicación es posible.
4. El servidor envía al cliente su clave pública DSA (algoritmo asimétrico) en texto sin
cifrar, que el cliente usará para cifrar los mensajes hacia el servidor, haciéndolos sólo
legibles para el propio servidor.
5. Si no es la primera vez que se conecta a ese servidor, el cliente compara la clave
pública recibida del servidor con la que tiene almacenada para verificar su
autenticidad. Si es la primera vez que se conecta a ese servidor y no la tiene
almacenada, el cliente no sabe si la clave pública recibida es realmente la del servidor
o la de un impostor que ha interceptado la conexión, lo que se conoce con el nombre
de ataque “man in the middle”, por lo que pide confirmación al usuario para aceptarla
como válida:
The authenticity of host usac2 ([Link]) can't be established.
DSA key fingerprint is [Link]
Are you sure you want to continue connecting (yes/no)?
Para confirmarlo el usuario debería obtener el “fingerprint” por otro medio
alternativo y seguro: correo electrónico cifrado, por teléfono, correo postal, en
persona, etc. Confirmar la clave sin verificarla adecuadamente implica asumir el
riesgo de una posible suplantación. Si confiamos en la clave, le decimos al cliente
que continúe con la conexión:
yes
Warning: Permanently added usac2 (DSA) to the list of known hosts.
Como hemos confiado en la clave pública recibida, el cliente nos informa de que
ésta se ha añadido al archivo ~/.ssh/known_hosts, donde se almacenan los hosts
conocidos. En adelante cada vez que el cliente se conecte a ese servidor
comparará la clave pública recibida al iniciar sesión con la almacenada:
Si son iguales, continuará con el proceso de conexión.
Si son diferentes, nos avisará y pedirá confirmación para el nuevo fingerprint:
key_read failed
The authenticity of host usac2([Link]) can't be established.
DSA key fingerprint is [Link]
Are you sure you want to continue connecting (yes/no)?
6. El cliente genera una clave de sesión (válida sólo para la sesión en curso), selecciona
un algoritmo de cifrado simétrico y envía un mensaje conteniendo la clave de sesión y
el algoritmo simétrico seleccionado, cifrado con la clave pública DSA del servidor. A
partir de este momento todo el tráfico entre cliente y servidor viaja cifrado utilizando el
algoritmo de cifrado simétrico seleccionado y la clave de sesión.
7. Ahora el cliente se debe identificar ante el servidor, cosa que haremos mediante
contraseña (también puede hacerse mediante claves DSA, sin necesidad de
password). El servidor solicita al usuario la contraseña correspondiente a usuario:
practicasIniciales@usac2's password:
Si el login es válido y no hay restricciones adicionales obtendremos un shell en el
servidor SSH, de modo que podremos usar el sistema como si estuviéramos
sentados allí, con los privilegios que tenga ese usuario:
practicasIntermedias2@usac2:~$
Identificación del cliente mediante clave pública
El cliente puede identificarse mediante clave pública, sin password. Para ello:
1. Creamos en el cliente una clave RSA:
francis@asterix:~$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
2. Activamos ssh-agent en el cliente para que no nos pida la pass-phrase:
practicasIniciales@usac:~$ eval `ssh-agent -s`
Agent pid 12297
practicasIniciales@usac:~$ ssh-add
Enter passphrase for /home/practicasIniciales/.ssh/id_rsa:
Identity added: /home/practicasIniciales/.ssh/id_rsa
(/home/practicasIniciales/.ssh/id_rsa)
3. Copiamos en el servidor la clave pública (~/.ssh/id_rsa.pub):
practicasIniciales@usac:~$ scp ~/.ssh/id_rsa.pub
practicasIniciales2@usac2:~/.ssh/id_rsa.pub
4. La añadimos en el servidor al final del fichero ~/.ssh/authorized_keys:
practicasIniciales2@usac:~$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
5. Comprobamos que podemos iniciar una sesión SSH sin password ni pass-phrase:
practicasIniciales@usac:~$ ssh practicasIniciales2@usac2
practicasIniciales2@usac2:~$
8. Para salir de la sesión SSH teclearemos exit, retornando al shell de la máquina cliente:
practicasIniciales@usac2:~$ exit
logout
Connection to usac2 closed
practicasIniciales@usac:~$
Ejecutar un comando remoto con SSH
En vez de obtener un shell en la máquina remota, podemos simplemente ejecutar un
comando en ella. Para ello, usaremos el cliente SSH con la siguiente sintaxis:
$ ssh usuario@servidor "comando"
Usaremos comillas dobles para evitar que el cliente interprete el comando. Una vez
introducido el password se ejecutará el comando, retornando directamente al shell de la
máquina cliente. Por ejemplo:
practicasIniciales@usac:~$ ssh practicasIniciales2@usac2 "cat /etc/hostname"
practicasIniciales2@usac2's password:
usac2
practicasIniciales@usac:~$
Copiar un archivo con scp
El comando scp (secure copy) nos permite intercambiar ficheros o directorios (tanto enviar
como recibir) entre el cliente y el servidor utilizando SSH. Para copiar recursivamente un
directorio usaremos la opción -r. La sintaxis es:
$ scp origen destino
Para subir archivos o directorios del cliente al servidor la sintaxis sería:
$ scp archivo_local usuario@servidor:directorio_remoto
Por ejemplo:
practicasIniciales@usac:~$ scp file1
practicasIniciales2@usac2:/home/practicasIniciales2/
Para bajar archivos o directorios desde el servidor al cliente la sintaxis sería:
$ scp usuario@servidor:archivo_remoto directorio_local
Por ejemplo:
practicasIniciales@usac:~$ scp practicasIniciales2@usac2:/home/practicasIniciales2/file2 ./
En ambos casos nos pedirá el password. Introducimos la contraseña y se copiará el
archivo, retornando directamente al shell de la máquina cliente:
Password:
file1 100% 2837 KB 702.7 KB/s 00:06
practicasIniciales2@usac2:~$
Black Empires
Manual modificado de: [Link]