Zamora Teran/SSH terminal remoto
Básicos de SSH
SSH es un sistema para tener acceso remoto a otra computadora. Da un terminal (shell) remoto.
Por ejemplo, podríamos correr servidores de ssh en todos los servidores de las escuelas, así que tenemos acceso remoto a las escuelas para hacer diagnósticos y arreglar unos problemas desde la oficina.
ssh también tiene funcionalidad avanzada, por ejemplo puede mandar archivos y reenviar paquetes de la red.
- El cliente es tu computadora, donde estás. Tiene el cliente de ssh, se llama ssh.
- El servidor es la computadora a que querés tener acceso. Corre el servidor de ssh, se llama sshd.
Para conectar, necesitas saber la dirección IP del servidor, y una cuenta en el servidor. El comando es:
# ssh usuario@IP
Por ejemplo, si el usuario es fzt y el IP del servidor es 1.2.3.4, el comando es:
# ssh fzt@1.2.3.4
Te preguntará la contraseña para la cuenta fzt en el servidor, y luego te dará un terminal.
SSH con llaves
En vez de contraseñas, podes usar llaves. Es otro ejemplo de criptografía asimétrica, un sistema que vimos cuando vimos el sistema de seguridad de la XO (por ejemplo: activaciones).
Generar las llaves
Una vez en tu vida, tenes que generar tus propias llaves:
- id_rsa: Una llave privada que nunca vas a compartir.
- id_rsa.pub: Una llave pública que vas a poner en todos los servidores a que querés tener acceso.
Deberías hacer un respaldo de tus llaves en un lugar seguro.
Para generar, usar el comando ssh-keygen
# ssh-keygen
Te preguntará una ruta donde querés guardarlas (usar el default). También tenes la opción de elegir una contraseña para la llave privada, así que tenes un poco más seguridad (si alguien roba el archivo que es la llave privada, todavía el ladrón no puede usarlo sin saber la contraseña también).
Poner la llave pública en el servidor
Por cada cuenta en cada servidor donde queres tener acceso, tenes que poner tu llave pública en un archivo se llama .ssh/authorized_keys debajo del directorio hogar. Eso significa que necesitas tener acceso una vez antes, para que podes poner el archivo en su lugar.
En el servidor, con la cuenta a que querés tener acceso desde otro lugar, el proceso será:
- Si ya no existe, crear el directorio .ssh con permiso restringido:
# mkdir .ssh # chmod 700 .ssh
- Entrar el directorio .ssh
# cd .ssh
- Si ya no existe, crear el archivo authorized_keys con permiso restringido:
# touch authorized_keys # chmod 600 authorized_keys
- Con un editor de texto, agregar tu llave pública al archivo authorized_keys.
El archivo authorized_keys es una lista de llaves públicas, una llave por línea. Entonces es posible que varias personas tienen acceso remoto a la cuenta, si todos tienen su llave pública en el archivo.
Si ya tenes acceso al servidor desde tu computadora con SSH, podes usar un programa ssh-copy-id (desde tu computadora) para hacer el proceso anteriormente. El programa hace todo (creando los directorios y archivos con permiso correcto si es necesario):
# ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@IP
Conectar
Ahora podes conectar como normal desde una computadora donde tenés tu llave privada:
# ssh usuario@IP
Si tu llave privada tiene una contraseña, te preguntará ahora. La mayoría de las distribuciones de Linux tiene un sistema que recuerda tu contraseña en memoria para la sesión, así no tenes que teclearla tantas veces.
Cuando ssh conecta, el servidor sshd desafia al cliente para probar que el cliente tiene la llave privada.
Configuración del servidor
La configuración de sshd queda en un archivo se llama /etc/ssh/sshd_config. Hay 2 opciones interesantes:
- PermitRootLogin: si yes, es posible conectar a la cuenta de root desde remoto por ssh (default: no)
- No es buen idea poder conectar como root desde afuera por razones de seguridad
- PasswordAuthentication: si no, no es posible conectar con una contraseña, sólo es posible conectar con una llave privada (de una llave pública que queda en authorized_keys).
- Es buena dehabilitar la posibilidad de conectar con contraseña, así hay mas seguridad.
Transferir archivos por SSH
Para mandar un archivo local a un directorio remoto en un servidor donde tenemos acceso por ssh:
# scp /ruta/de/archivo_local usuario@IP:/ruta/de/directorio_remoto
Para copiar un archivo remoto a un directorio local:
# scp usuario@IP:/ruta/de/archivo_remoto /ruta/de/directorio_local
rsync funciona por ssh también. Por ejemplo, para synchronizar un arbol de archivos y directorios desde local al servidor:
# rsync -av /ruta/de/directorio_local usuario@IP:/ruta/de/directorio_remoto
GNOME tiene la funcionalidad Conectar con el servidor con un tipo de conexion SFTP que podes usar para montar un directorio remoto (por ssh) como si fuera un directorio local.
Reenviando datos locales por el servidor
Con el comando siguiente, el cliente ssh hace un servidor proxy (SOCKS) localmente en el puerto 8092 que manda los datos por la conexion de ssh al servidor, que reenvia los datos desde allá:
# ssh -D 8092 usuario@IP
Ahora podés configurar Firefox para usar un servidor proxy 127.0.0.1 puerto 8092, y todo tus datos de internet serán mandado por el servidor.
Un ejemplo: cuando registramos con OpenDNS para filtrar los contenidos del internet, OpenDNS dice que tenemos que navegar a una página especial desde la escuela (para verificar que el IP de la escuela que programamos pertenece a nosotros). Podemos usar este sistema para hacer esta tarea desde la oficina, sin tener que ir a la escuela.