I-ssh: (0.11) (potato) Usar ssh (OpenSSH) en lugar de telnet/rlogin/rsh/rcp CAMBIOS: 0.07 1/10/00 +cambio de llave del servidor, +uso del agente 0.08 24.10.00 +cambios menores 0.09 13.1.01 + ssh-agent bash 0.10 14.1.01 + descrip correcta ssh-askpass-* 0.11 25.2.01 + URL de "Stupid Protocols", +comando a cinco hosts ATENCIÓN: El uso que le vamos a dar a SSH es para acceder de forma segura a nuestro servidor Linux desde otro PC en una red local sin usar telnet, y sin emplear redirección de X, ni creación de canales seguros IMPORTANTE: Si el uso que le das a ssh es crítico, hay que estar siempre pendiente de posibles exploits (fallos de seguridad) que puedan aparecer. Seguro que este es el paquete más estudiado en busca de fallos... 1) Instalar paquetes ssh Cliente y servidor ssh (alternativa) ssh-socks Igual con soporte de socks4 (NO) ssh-askpass-* Programa X que pide la "frase de paso" y la entrega a ssh-add, cuando se lanza ssh-add sin terminal (lanzador, ¿script?) Configuración: ¿Instalar el cliente ssh como SUID root? NO ¿Lanzar el servidor sshd? YES Para modificar la configuración posteriormente dpkg-reconfigure ssh En la instalación se genera una clave (privada/pública) del servidor sshd. Si se desea cambiarla: ssh-keygen -f /etc/ssh/ssh_host_key -Sustituir la llave actual /etc/ssh/ssh_host_key already exists. Overwrite (y/n)? [y] -La llave del servidor NO DEBE tener passphrase Enter passphrase (empty for no passphrase): [ENTER] -Al final se nos da el "fingerprint" de esta llave RESTRICCIÓN DE INTERFACES: Editar /etc/ssh/sshd_config y cambiar "ListenAddress 0.0.0.0" a: ---8<--- ListenAddress 192.168.0.1 --->8--- PARA USAR COMPRESIÓN POR DEFECTO CON UN SISTEMA La compresión aumenta la velocidad en lineas con módem y la disminuye en redes rápidas... Editar /etc/ssh/sshd_config y añadir "Compression yes" a los hosts deseados por ejemplo: ---8<--- Hosts nombre_de_host Compression yes ... --->8--- PARA ENTRAR COMO ROOT: (Permission denied, please try again.) *NO RECOMENDADO* Sin hacer esto, se puede acceder a root con "su" (o sudo) y se puede saber que usuario utilizó el root por los log... Editar /etc/ssh/sshd_config y cambiar "PermitRootLogin no" a: ---8<--- PermitRootLogin yes --->8--- ACTIVAR LOS CAMBIOS /etc/init.d/ssh reload 2) Generar las claves de usuario que debe usar ssh (una privada y una pública) Entrar como usuario: ssh-keygen #Generador de llaves y fingerprint -Confirmar archivo como $HOME/.ssh/identity -Entrar la "passphrase" (contraseña para la llave) ó pulsar ENTER para no usar ninguna [1] -Al final se nos da el "fingerprint" de nuestra llave [1] No dar passphrase a la llave es un RIESGO DE SEGURIDAD Si no se da una passphrase al conectar entramos directamente (sin login ni nada parecido). Si alguien nos consigue robar la llave pues lo mismo... Si se le da a la llave una passphrase esta nos es solicitada para conectar Enter passphrase for RSA key 'manel@nombre_host': 3) Añadir nuestra clave pública, como autorizada, a los sistemas en los que queremos conectar a) ssh-copy-id -i manel@192.168.0.1 #Conecta mediante ssh #Instala nuestra identidad.pub en una maquina remota #(nos pide la contraseña de esa cuenta) # -i = no utilizar el agente sino $HOME/.ssh/identity.pub b) "En plan manual" LOCAL: $HOME/.ssh/identity.pub Añadir esta linea al authorized REMOTO: $HOME/.ssh/authorized_keys en donde queramos conectarnos NOTA: Una vez hecho esto ya no se nos pide la contraseña de la cuenta para entrar en la máquina remota (estilo telnet), sino la passphrase de la llave RSA Para no tener que escribir la passphrase a menudo usa el agente ;-) 4) Añadir la clave pública del servidor a nuestro "known_hosts" a) De todos nuestros servidores usando "make-ssh-known-hosts" make-ssh-known-hosts dominio # Para ver resultado SIN crear archivo make-ssh-known-hosts dominio > /etc/ssh/ssh_known_hosts # Esto requiere que nuestros hosts estén en el DNS # y genera un "known_hosts" global en /etc/ssh/ssh_known_hosts # a partir del servidor DNS pidiendo claves publicas a # todos los hosts b) "En plan manual" Se hace automáticamente en la primera conexión a ese servidor y genera un archivo solamente para este usuario en ~/.ssh/known_hosts ssh -l manel 192.168.0.1 The authenticity of host '192.168.0.1' can't be established. Key fingerprint is 1024 4a:1d:4f:e8:05:63:f1:77:d1:b2:5b:17:2e:10:35:6d. Are you sure you want to continue connecting (yes/no)? Para averiguar el fingerprint de un host sshd, hacer en él: ssh-keygen -l -f /etc/ssh/ssh_host_key.pub 1024 4a:1d:4f:e8:05:63:f1:77:d1:b2:5b:17:2e:10:35:6d root@hostname USO: SSH: ssh -l como_usuario 192.168.0.1 #Para conectar con sistema remoto exit #Fin de sesión ssh -C -l como_usuario 192.168.0.1 #Conectar usando compresión # -C = usar compresión NOTA: slogin es lo mismo que ssh (es un symlink) SCP: scp -Cprv archivo_origen archivo_destino #Copia segura scp -Cprv archivo_origen1 archivo_origen2 directorio_destino scp -Cprv usuario@host_origen:archivo ~ scp -Cprv archi* usuario@host_destino: # -C = usar compresión # -p = preservar fechas # -r = recursivamente # -v = modo verboso (información paso a paso de lo que se hace) AGENTE: ssh-agent Lanza el agente (ver "un poco de teoría" más abajo) hay dos formas de usarlo (ejemplos más abajo) ssh-add Añade identidades al agente de autenticación, se nos pide la frase de paso, las identidades las mantiene el agente, cuando el agente finaliza desaparecen ssh-add -l Ver las identidades representadas por el agente EJEMPLO USANDO AGENTE COMO ANTEPASADO ssh-agent bash #Lanzamos un bash con ssh-agent como padre, # seguimos trabajando en el bash nuevo... #El agente finalizará cuando cerremos el # bash (exit) ssh-add #Añadimos identidad (nos pide frase de paso) ssh sistema #Entramos sin frase de paso... EJEMPLO LANZANDO UN COMANDO EN CINCO SISTEMAS ssh-agent bash ssh-add for sistema in host1 host2 host3 host4 host5; do > ssh root@$sistema "comando-a-lanzar-en-todos-los-sistemas" > done EJEMPLO USANDO VARIABLES DE ENTORNO touch ~/agent #Creamos un archivo para mantener las variables chmod 600 ~/agent ssh-agent > ~/agent #Lanzamos el agente y guardamos las variables . agent #Creamos las variables de entorno ssh-add #Añadimos nuestra identidad al agente ssh/startx/... #Lanzamos lo que sea, ya no hace falta la frase # todos los procesos hijos de este shell ya # heredan las variables de entorno necesarias POR DENTRO: El demonio ssh se llama sshd y no se lanza desde inetd sino como demonio independiente y escucha en el puerto TCP 22 Por defecto OpenSSH emplea el algoritmo de cifrado 3DES (triple DES) que es más seguro, aunque también puede emplear Blowfish (más rápido) La opción de compresión comprime con el mismo método que gzip UN POCO DE TEORÍA: La passphrase La passphrase debe tener un mínimo de caracteres y ser difícil de reventar Seguridad total Se ha diseñado de tal forma SSH que es inmune a ataques de spoof de IP, de enrutado y de DNS, impresionante :-) Parte de este esquema es que el cliente autentica al servidor y el servidor autentica al cliente, por eso hay que copiar las claves públicas del uno al otro... Agente de autenticación Se puede utilizar este servicio para mantener todas las claves privadas, y autenticar al usuario de forma centralizada por toda la red local. Esto significa que solo hay que eacribir la frase de paso una vez y ssh utilizará el agente cada vez que la necesite para entrar en otro sistema en el que estemos autorizados Bueno esto es un poco más complicado, ssh, scp, ssh-add deben saber como contactar con el agente... Esto puede hacerse de dos formas: 1) Por medio de las variables de entorno que ssh-agent envía por stdout al ejecutarlo 2) Si ssh-agent es "antepasado" de los procesos que necesitan contactar con él (ssh-add, ssh, scp) Redirección de X Con SSH se puede establecer un canal seguro para utilizar las X de forma remota Redirección de puertos Con SSH se puede redirigir el tráfico de un puerto a un canal seguro ARCHIVOS: /etc/ssh/sshd_config Configuración del servidor sshd /etc/ssh/ssh_config Configuración global de clientes ssh (para todos los usuarios) especificable host a host ~/.ssh/config Configuración del usuario para clientes ssh /etc/ssh/ssh_known_hosts Servidores ssh conocidos (global) [1] ~/.ssh/known_hosts Servidores ssh conocidos (usuario) [1] ~/.ssh/authorized_keys Clientes ssh autorizados [1] /etc/ssh/ssh_host_key Llave privada del servidor /etc/ssh/ssh_host_key.pub Llave pública del servidor ~/.ssh/identity Llave privada del cliente ~/.ssh/identity.pub Llave pública del cliente [1] En estos archivos se guardan claves públicas de los otros hosts *POR CONFIRMAR* Parte importante de la config está comentada en /etc/ssh/ssh_config (Seguramente está configurado al compilar por defecto por Debian) POR HACER: Limitación por IP/dominio ¿Es posible? Investigar redirección X11, y de puertos (canales seguros), forwarding, uso para red privada virtual (VPN). Se merecen chuletas por si solos... MAS INFO: man ssh Incluye explicación de las opciones de /etc/ssh/ssh_config man scp man sshd man ssh-agent Incluye explicación del uso del agente /usr/doc/ssh/* (English) Leer en especial: README.Ylonen.gz Descripción de SSH, y porque hay que usarlo README.Debian Notas de configuración de Openssh en Debian SSH Techniques http://www.linuxmonth.com/issue3/articles/security/security.html Stupid, Stupid Protocols: Telnet, FTP, rsh/rcp/rlogin http://securityportal.com/cover/coverstory20000814.html