Estudiando para rendir la rhcsa creo este post con algunos apunte, mucha cosa básica pero todo sirve
Para empezar vamos a hablar de las claves publico/privado. Estas llaves tienen un funcionamiento muy especial que se usa en varios protocolos (ademas de ssh y que no hablare en el post) y es que existen 2 llaves una publica que puede conocer todo el mundo y con la cual se cifran los mensajes que se desean enviar a un determinado destino y una privada que es conocida solo por el destino y sirve tanto para cifrar como para descifrar el contenido cifrado con la llave publica.
Para generar este par de llaves se utiliza ssh-keygen si lo lanzamos sin argumentos generara un par de llaves usando el algoritmo RSA con una longitud de 2048 bits y se guardara por defecto en el directorio ~/.ssh/id_rsa para la llave privada y ~/.ssh/id_rsa.pub para la llave publica
siempre recuerden la llave pública es publica por lo que todos deberían conocerla, la llave privada es privada y nadie excepto el dueño debería conocerla
la oración anterior también se aplica para los permisos, si colocamos mal los permisos el sistema reclamara y potencialmente no nos permitirá conectarnos al equipo remoto
los permisos correctos son:
rw——- que es lo mismo que 600 para la clave privada (solo el usuario debe poder acceder a el)
rw-r–r– que es lo mismo que 644 para la clave publica (solo el usuario puede editar el archivo y todos los demás solo leerlo)
Ahora veremos como funciona la comunicación entre un servidor y un cliente desde ambas perspectivas
el cliente tendrá la IP: 192.168.50.186
el servidor tendrá la IP: 192.168.50.234
Desde el cliente
Lo primero que veremos al intentar conectarnos al servidor, será un mensaje donde nos consulta si queremos almacenar la clave publica del servidor, esto como comente antes es necesario para que el cliente sepa como cifrar la comunicación de tal forma que el servidor sepa descifrarlo y que nadie mas pueda.
lo ideal (y que en lo personal nunca he visto que se haya hecho en la práctica) es que validemos de alguna otra forma, quizás presencial, correo, mensaje, etc. cual es la firma de la llave publica del servidor y validar que coincida con la firma que nos muestra en el mensaje.
Para hacer este paso se puede usar ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key en el lado servidor para obtener la huella (o fingerprint) del certificado.
Ojo cuando utilicemos este comando ya que el archivo de llave puede ser distinto al que yo use y esto lo podemos ver en el archivo de configuración del servidor y da lo mismo si usamos la llave privada o la publica ya que el fingerprint es el mismo
una vez aceptada la firma que nos muestra el servidor tendremos una linea de advertencia y nos solicita autenticarnos, acá tenemos 3 opciones:
Mas adelante veremos como configurar cada una de estas opciones en el lado servidor.
Autenticación por contraseña
Esta es la autenticación mas común y simple que encontramos, con ella se ingresa un usuario y una password y si coinciden se permite la conexión
Un punto importante es que, si no especificamos un usuario se usara el mismo usuario que invoca el comando de ssh (en este caso student) para elegir otro usuario puede ser con la opcion -u o usando el formato <user>@<servidor>
Autenticación por clave publica
En esta autenticación en vez de utilizar un usuario y password, utilizamos el mismo usuario pero con una llave publica en vez de la password para comprobar que somos quienes realmente decimos ser, para esto previamente hay que configurar el servidor para que acepte las conexiones del usuario (también, lo veremos en la parte del servidor) y luego entregarle nuestra clave pública usando el comando ssh-copy-id <user>@<servidor>
Como se pueden dar cuenta, solo basta con iniciar sesión con los mismos datos que usamos cuando exportamos la llave publica, en este caso el directorio de la llave publica es por defecto por lo que no hay problemas, pero si guardamos la llave en otro sitio, o tenemos llaves distintas para servidor o usuario debemos especificar donde esta la llave que usaremos con la opcion -i
Autenticación mixta
Cuando el servidor acepte ambos tipos de autenticación (por defecto openssh viene con esta opción)
Una vez superado este paso tenemos 2 opciones dependiendo de los argumentos que hayamos usados en el comando de ssh podemos acceder a una shell u obtener el output de un comando
Acceder a shell
Esta es la opción mas común y nos permitirá interactuar con la maquina remota, siempre y cuando tengamos acceso a una shell, existen casos donde ciertos usuarios tienen prohibido el acceso a shell definiendo en su usuario la shell /bin/nologin o /bin/false.
Para comprobar a cual shell tiene acceso el usuario X bastará con mirar el contenido del archivo /etc/passwd en la linea del usuario X
Obtener Output
cuando desde el cliente agregamos como argumento un comando ssh lo que hará es que en vez de entregarnos una shell interactiva, ejecutara el comando y nos mostrara el output de dicho comando para luego finalizar la conexión
Desde el servidor
En el lado servidor solo hay que preocuparse de mantener todo correctamente configurado para aceptar las conexiones ssh, todo esto se realiza en el archivo de configuración sshd_config ubicado en /etc/ssh/ sin embargo veremos algunas configuraciones para securizar el servicio
Cambiar el modo de autentificación
Como comente en la parte de cliente tenemos 3 formas de autentificarnos en ssh, cada una tiene una configuración especifica en el archivo sshd_config y por defecto se puede usar el método mixto
Por contraseña
Esta es la opción por defecto cuando instalamos openssh-server, por lo que no habrá que editar nada especial, pero de igual forma dejo documentada la linea que debemos editar y como dejarla
PasswordAuthentication yes
Por clave publica
En este método vamos a permitir solamente la autenticación usado llaves público privado por lo que vamos a negar la autentificación por contraseña y permitir el uso de llave publica para la autentificación.
PasswordAuthentication no PubkeyAuthentication yes
Autenticación mixta
Acá simplemente dejamos el archivo tal cual viene pre instalado, pero en caso de problemas las opciones a configurar son:
PasswordAuthentication yes PubkeyAuthentication yes
Cambiar el puerto
Esta es una de las cosas básicas que hago luego de instalar openssh y es bastante sencillo solo buscamos la siguiente linea en el archivo de configuración de sshd (/etc/ssh/sshd_config)
Port 22
donde definimos el valor de puerto que necesitemos, por lo general uso un valor alto y trato que siempre sea entre el rango de 4096 y 64534
Una consideración especial en esta parte es que el puerto que configuremos hay que indicarlo también en SElinux y el firewall que usemos para permitir el tráfico de entrada
Negar el acceso a root
Esta es otra medida que se debe tomar apenas instalamos openssh, ya que por lo general cuando existen intentos de ataques por fuerza bruta utilizan el usuario root (que existe en todas las maquinas Linux).
Sin contar con que al tener acceso con root automáticamente tienen el poder total sobre la maquina.
Tenemos una linea especial para controlar el comportamiento ante un intento de autentificación usando el usuario root desde la cual tenemos las siguientes opciones
PermitRootLogin <yes|prohibit-password|forced-commands-only>
yes
Simplemente permite la conexión usando el usuario root
prohibit-password
permite la autentificación de root pero solo utilizando llave publica
forced-commands-only
Permite la autentificación del usuario root usando llave pública pero no permite tener acceso a una shell sino que solamente a la ejecución de comandos
y con eso termino este «pequeño» post sobre openssh