sábado, 2 de abril de 2022

PinePhone - ssh en mobian y manjaro

SSH (Secure Shell)

¿que es SSH?

SSH es un protocolo de red que permite establecer una comunicación a través de un canal seguro entre un cliente local y un servidor remoto.

SSH se basa en la arquitectura cliente/servidor. El puerto por defecto por el que escucha peticiones de conexión es el TCP 22.

Con SSH por defecto accedemos a la interfaz de línea de comandos (CLI) de la máquina remota (servidor), y podemos ejecutar aplicaciones gráficas remotas, si se está ejecutando un servidor X en el equipo remoto y transferir archivos (subir o descargar) entre el cliente y el servidor, todo ello a través de un canal cifrado.

SFTP (SSH File Transfer Protocol o Protocolo de transferencia segura usando ssh) es un protocolo que permite la transferencia, descargas y manipulación de archivos a través de una conexión cifrada con SSH.

SCP (Secure Copy o Copia Segura) es un protocolo seguro para transferir archivos a través de SSH. SCP sólo implementa la transferencia de archivos, pues la autenticación requerida es realizada a través de SSH.


 OpenSSH 

OpenSSH (Open Secure Shell), es un protocolo de conexión segura (Secure Shell), y consta de un cliente SSH y del servidor SSH, para realizar comunicaciones cifradas de extremo a extremo.


OpenSSH consta de las siguientes herramientas
  • Las operaciones remotas se realizan mediante ssh , scp , y sftp
  • Gestión de llaves con ssh-add, ssh-keysign, ssh-keyscan, y ssh-keygen
  • El lado del servicio consiste en sshd, sftp-server, y ssh-agent

OpenSSH es desarrollado por unos pocos desarrolladores del Proyecto OpenBSD y puesto a disposición bajo una licencia tipo BSD.

El paquete servidor llamado: openssh-server proporciona el demonio sshd que permite a los clientes ssh, scp y sftp establecer conexiones seguras.

El paquete cliente llamado: openssh-client proporciona los clientes de ssh, scp y sftp, los programas: ssh-agent y ssh-add para hacer más cómoda la autenticación de clave pública, y las utilidades: ssh-keysing, ssh-keyscan, ssh-keygen.

OpenSSH incluye servicio y clientes para los protocolos SSH, SFTP y SCP.

     

Instalación del servidor y del cliente en Debian,  Mobian y derivados

OBSERVACIÓN: 

- Abrimos una consola de comandos y nos logeamos como usuario administrador usando el comando: su
-
O como usuario normal anteponiendo el comando: sudo, todo depende de como tengas configurado tu sistema operativo Debian GNU/Linux.




Antes de comenzar la instalación de cualquier paquete, recomendamos actualizar los repositorios, usando el siguiente comando:


$ sudo apt update

A continuación procedemos a la instalación de los paquetes correspondientes al servidor (openssh-server) y al cliente (openssh-client). Aunque realmente en el móvil solo he instalado el servidor (openssh-server)

$ sudo apt install openssh-server openssh-client

En Debian, Mobian y derivados, no es necesario realizar ninguna acción mas. Una vez instalado podemos conectarnos a nuestro servidor Mobian (PinePhone) con el usuario normal (no root) y con la contraseña del usuario normal (no root), por defecto el usuario root esta deshabilitado, y por defecto se usa el puerto TCP 22.

En Mobian, por defecto después de instalar, el servicio sshd esta en ejecución y está habilitado en el arranque.

Muestra del proceso de instalación en Mobian

 

 


 


 

 

Muestra del proceso de instalación en Manjaro Plasma Mobile

 

 



 

Comprobar que el servidor SSH está iniciado

Si la instalación fue exitosa, ahora tenemos el servicio sshd instalado en el servidor.
Para asegurarnos que el servidor esta en funcionamiento, ejecutamos el siguiente comando:

$ systemctl status sshd

 





Arrancar, Reiniciar y para el servidor

- Cuando instalamos el servidor ssh, en algunos sistemas como manjaro plasma mobile, el servidor ssh se encuentra parado, tenemos que arrancarlo para que funcione.

- Algunas veces tendremos que reiniciar el servidor, por ejemplo cuando realicemos cambios en la configuración de sshd.

- Alguna vez necesitaremos parar el servidor, para que nadie se conecte.

Para arrancar el servidor usamos el siguiente comando:

$ sudo systemctl start sshd

Para reiniciar el servidor usamos el siguiente comando:

$ sudo systemctl restart sshd

Para parar el servidor usamos el siguiente comando:

$ sudo systemctl stop sshd 

 

 


Habilitar el servicio sshd en el arranque

Para que funcione el servidor ssh, es necesario habilitar el servicio sshd, en mobian por defecto ya viene habilitado, pero en manjaro plasma mobile, no viene habilitado.
Entonces para habilitar el servicio sshd en el arranque, usamos el siguiente comando:

$ sudo systemctl enable sshd

A partir de este momento, cada vez que enciendas el teléfono con mobian, manjaro, etc.. ya tendremos habilitado el servidor ssh.

 


 

 

Como conectarnos al servidor desde un pc

Abrimos una consola de comados en el cliente, y usamos el siguiente estructura del comando ssh:


$ ssh usuario@conexión_al_servidor puerto_de_conexión
  • ssh = es el protocolo que usamos para realizar la conexión
  • usuario = es el usuario que hemos dado de alta. En la multiimagen de 15 sistemas operativos de prueba. En Mobian el usuario por defecto es: mobian.  Y en manjaro el usuario, es definido por el propio usuario.
  • @ = hacia donde se realiza la petición.
  • conexión_al_servidor = Se usa la IP, o el dominio, o subdominio, etc. del servidor.
  • puerto_de_conexión = por defecto es el 22 si se omite se usa el 22, si lo hemos cambiado se tiene que declarar con el parámetro -p y el numero del puerto de conexión que hemos definido en el fichero sshd_config

Como sabemos cual es la dirección IP que tenemos actualmente en el móvil.

Hay muchos métodos, pero nosotros vamos a usar el comando: nmcli

el nos va a mostrar de forma muy clara, cual es nuestra IP.


 

nmcli en Mobian

 


nmcli en Manjaro plasma mobile

 



Recordemos que el parámetro -p numero se usa para indicar el puerto de conexión, en caso contrario, si no se especifica el parámetro -p numero significa que esta haciendo uso del puerto por defecto: 22 


ejemplo usando el puerto por defecto:

$ ssh mobian@192.168.1.19

ejemplo un puerto personalizado:

$ ssh mobian@192.168.1.19 -p 123456

 

 =================================================

Conexión desde pc a Mobian






 =================================================


Conexión desde pc a Manjaro plasma mobile

 




 

Vamos a conectarnos a SSH usando el explorador de archivos

Podemos conectarnos de forma gráfica, usando un gestor de archivos, como en este blog usamos KDE Plasma, vamos a realizar este manual usando, el gestor de archivos Dolphin, aunque se puede utilizar cualquier gestor de archivos que soporte el protocolo SFTP.

Si estas usando windows 10, la consola de microsoft ya soporta de forma nativa el protocolo del cliente OpenSSH, y para conectarte de forma gráfica puedes usar el programa: Filezilla. En versiones anteriores a windows 10 no tiene soporte para usar OpenSSH, y tienes que usar un programa, como por ejemplo PuTTy, para poder conectarte al servidor SSH.



Conectarnos desde el explorador de archivos Dolphin

Abrimos Dolphin y en el lateral izquierdo pulsamos en Red


 
Ahora hacemos clic en Añadir carpeta de red
 


 
En el asistente que nos sale, hacemos clic en Shell segura (ssh)



 
Rellenamos los siguientes apartados:
  • Nombre: Nombre del dispositivo al que nos vamos a conectar, (puedes poner lo que quieras)
  • Usuario: el nombre de usuario que este dado de alta en el sistema, en este caso es: mobian
  • Servidor: indicamos la dirección IP, o el dominio, etc.
  • Puerto: por defecto es el 22, lo cambiamos al puerto que definamos en la configuración de sshd_config
  • Protocolo: usamos sftp
  • Carpeta: para el pinephone (actualmente en desarrollo) os aconsejo usar la raiz: / para poder reparar cualquier fallo o error. Cuando sea estable os aconsejo usar vuestro home: /home/mobian
  • Codificación: Dejamos por defecto- Unicode (UTF-8), para no tener problemas con el mapa caracteres del teclado en el servidor.

Por ultimo pulsamos en Guardar y conectar




Si todo es correcto nos pedirá la contraseña del usuario

 

 



Si la conexión ha sido exitosa, estaremos viendo las carpetas y ficheros de nuestro teléfono PinePhone.

 



Configuración del servidor

El servidor y el cliente ssh, tiene los siguiente archivos de configuración:


- /etc/ssh/sshd_config: Archivo de configuración del servidor SSH. 
- /etc/ssh/ssh_config: Archivo de configuración de los clientes SSH. 
- ~/.ssh/config: Archivo personal de cada usuario. Contiene la configuración utilizada por los clientes SSH. Permite al usuario local utilizar una configuración distinta a la definida en el archivo /etc/ssh/ssh_config. 
- ~/.ssh/known_hosts: Archivo personal de cada usuario. Contiene las firmas digitales de los servidores SSH a los que se conectan los clientes. Cuando éstas firmas cambian, se pueden actualizar ejecutando el comando ssh-keygen -R, pasando el nombre del anfitrión o la IP del anfitrión como argumento. Este comando elimina la entrada correspondiente en el archivo ~/.ssh/known_hosts y, permite añadir de nuevo al anfitrión con una nueva firma digital.

El comando para actualizar las nuevas firmas del servidor ssh:

$ ssh-keygen -R nombre_o_ip_del_servidor_SSH
 
- ~/.ssh/authorized_keys: Archivo personal para cada usuario. Contiene los certificados de los clientes SSH, para permitir autenticación hacia servidores SSH sin requerir contraseña.


     

Configuración de algunos parámetros del servidor (sshd_config)

Para ello, editaremos el fichero de configuración /etc/ssh/sshd_config.

MUY IMPORTANTE: 

1- Antes de realizar cualquier cambio se recomienda hacer una copia de seguridad del archivo /etc/ssh/sshd_config, usando el siguiente comando:

 

$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.copia

 

 2- Las líneas que comienzan por el simbolo # siginifica que no se usan, es como si no estuvieran en el archivo. Para hacer uso de dicha línea le borramos el simbolo #

3- Editaremos el archivo /etc/ssh/sshd_config con el editor de texto plano llamado: nano, presente en casi todas las distribuciones Linux:

$ sudo nano /etc/ssh/sshd_config

Editaremos y modificamos el fichero de configuración por defecto, según nuestras necesidades.

 

A continuación mostraremos algunos parámetros para saber configurar el servidor ssh, para mas información os aconsejo leer el manual oficial:

1- Port 

El servicio SSH escucha por el puerto 22. El parámetro por defecto es:

#Port 22

Es lo primero que tenemos que hacer, cambiar el puerto de conexión por defecto del TCP 22 a otro preferiblemente entre el 1024 y 65535. Ya que los atacantes buscán servidores que estén escuchando por el puerto 22. Cambiar de puerto disminuye considerablemente la posibilidad de una intrusión. En nuestro ejemplo, configuraremos el servidor para que escuche por el puerto 65432:

Port 65432

2- ListenAddress

El servicio SSH por defecto acepta peticiones a través de todas las direcciones IP correspondientes a todas las interfaces de red del sistema. El parámetro por defecto es:


#ListenAddress 0.0.0.0
#ListenAddress ::


En nuestro ejemplo, configuramos el servidor para que acepte peticiones de la red con IP 192.168.1.0, a la cual sólo se puede acceder desde la red local:

ListenAddress 192.168.1.19

3- HostKey

El parámetro HostKey indica la ubicación de las llaves públicas para el servidor sshd, para el protocolo SSHv2 de SSH. 

 

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key
 

4- Logging

El registro de eventos del servicio es importante así como la ruta donde guardarlos, un atacante experimentado intentará limpiar los logs para evitar ser atrapado.
En este parámetro se especifica el registro de eventos:

- SyslogFacility especifica el tipo de registros que genera, en este caso es AUTH, es decir, de las autenticaciones que se hacen contra el servidor. El parámetro AUTH es el predeterminado.


- LogLevel el parámetro por defecto es INFO.


#SyslogFacility AUTH
#LogLevel INFO
 

5- LoginGraceTime

En este parámetro establece el tiempo, en segundos, durante el cual la pantalla de login estará disponible para que el usuario introduzca su nombre de usuario y contraseña, si no lo hace durante ese período de tiempo el login se cerrará, evitando así dejar por tiempo indeterminado pantallas de login sin que nadie las use, o que alguien este intentando mediante un script adivinar un usuario y su contraseña. Si el valor es 0, no hay límite de tiempo para que un usuario se autentique, lo cual no es recomendable ya que de esta forma un atacante podría utilizar ataques de fuerza bruta o usando métodos de diccionario para adivinar la contraseña, por lo tanto no es recomendable dejar esta directriz a 0.

#LoginGraceTime 2m

6- PermitRootLogin

Este parámetro es el mas importante, y aconsejo dejarlo tal cual para asegurar nuestro servidor SSH. En los sistemas operativos Linux se crea por defecto el usuario root, lo que implica que ya conocemos la existencia de al menos un usuario, con privilegios de administrador. Muchos ataques de fuerza bruta se concentran en atacar al usuario root con la esperanza de que el usuario root este habilitado y tenga una contraseña débil.
Sabiendo una parte de la ecuación (root) solo será cuestión de tiempo para que alguien con paciencia vulnere el sistema. Por tanto este parámetro es recomendable dejarlo por defecto (sin acceso root).
Al denegar el acceso al usuario root, cada vez que necesitemos realizar tareas administrativas, accederemos como un usuario normal y una vez dentro, utilizando alguno de los comandos su o sudo podremos realizar dichas tareas administrativas. Por lo tanto, denegando el acceso al usuario root, el atacante tendrá que averiguar tanto el nombre de un usuario del sistema como su contraseña, algo que dificulta mucho mas una posible intrusión al sistema

#PermitRootLogin prohibit-password
 

7- StrictModes

En este parámetro se establece que sshd revisara los modos y permisos de los archivos de los usuarios y el directorio $home de el usuario antes de aceptar la sesión. Esto es normalmente deseable porque a veces algunos usuarios dejan sus directorios, accidentalmente, con permiso de escritura para cualquiera. El valor predeterminado es yes, por lo tanto, lo dejaremos con su valor predeterminado.

#StrictModes yes
 

8- MaxAuthTries

Este parámetro establece el número máximo de intentos de conexión permitidos, es decir, la cantidad de veces que podemos equivocarnos al ingresar el usuario y/o contraseña. Una vez que los intentos alcanzan la mitad de este valor, las conexiones fallidas siguientes serán registradas. Después del máximo número de intentos se cerrará la conexión. Es posible volver a intentarlo, pero el límite de intentos por vez evita ataques basados en la persistencia de la conexión.

#MaxAuthTries 6
 

9- PubkeyAuthentication

Este parámetro se usa para autenticación por medio de la llave pública. Por defecto esta desactivado.

#PubkeyAuthentication yes
 

10- AuthorizedKeysFile

Este parámetro se usa junto con la autenticación por llave pública, y especifica donde se guardaran las llaves en el servidor. El valor por defecto es ~/.ssh/authorized_keys 


#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2
 
 

11- IgnoreUserKnownHosts

Este parámetro especifica si se ignorara o no el uso de el archivo ~/.ssh/known_hosts en el cual se agregan las llaves de los servidores SSH a los cuales nos conectamos y confiamos. Por lo tanto debe de estar indicado en: no para no ignorar este archivo.

#IgnoreUserKnownHosts no
 
 

12- IgnoreRhosts

Este parámetro deniega el uso de relaciones de confianza establecidas en los ficheros ~/.rhosts y ~/.shosts de los usuarios:

#IgnoreRhosts yes
 

13- PasswordAuthentication

El parámetro PasswordAuthentication habilita o deshabilita la autenticación por contraseñas. Por defecto está permitida la autenticación con contraseña. Si establecemos el valor: no, sólo se permitirá el acceso a través de firmas digitales. Es muy importante no cambiar el valor de este parámetro, sin antes haber instalado nuestra firma digital.

#PasswordAuthentication yes

14- PermitEmptyPasswords

El parámetro PermitEmptyPasswords especifica si se permite el uso de contraseñas vacías, es decir, autenticarse sin contraseña (no recomendable por motivos de seguridad). Este parámetro se usa conjuntamente con PasswordAuthenticacion yes.

#PermitEmptyPasswords no
 

15- UsePAM

Este parámetro, es para conectarnos como un usuario normal no como root.

#UsePAM yes
 
 

16- AllowTcpForwarding

Este parámetro permite hacer redireccionamiento de protocolos basados en TCP. Permite crear túneles a conexiones de protocolos no seguros, enviando la información en texto plano por un túnel cifrado. Muy usada en conexiones POP3 o IMAP.

#AllowTcpForwarding yes
 
 

17- Aplicaciones gráficas

El parámetro X11Forwarding establece si se permitirá la ejecución remota de aplicaciones gráficas que utilicen el servidor X11. Es necesario que el valor esté establecido a yes para poder ejecutar aplicaciones gráficas.

#X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
 
 

18- PrintMotd

El parámetro PrintMod establece si se presentará o no el mensaje de bienvenida, de indicación, etc.. (MOTD). El motd es un archivo que contiene un mensaje que se muestra a todos los usuarios que se conectan a la máquina por línea de comandos (CLI). Normalmente se usa para informar a los usuarios sobre el estado del servidor o simplemente para dar la bienvenida a la máquina. La ruta al archivo es /etc/motd.

Se trata de un archivo de texto plano el cual podemos personalizar. Hay que tener en cuenta que si el motd ya está habilitado para los usuarios del sistema, si lo habilitamos en /etc/ssh/sshd_config, al iniciar sesión en el servidor SSH, este aparecerá duplicado. El motd se muestra justo al aceptar nuestra conexión en el servidor.

En este otro manual explico como personalizar el motd

PrintMotd no
 

19- PrintLastLog

Este parámetro especifica si se mostrara un mensaje mostrando la dirección IP de donde se conecto el usuario la ultima vez. Muy útil para saber si alguien más se está conectando con un usuario en especifico.

#PrintLastLog yes

20- TCPKeepAlive

Este parámetro se usa para enviar al servidor sshd mensajes de que no hay inactividad.

#TCPKeepAlive yes
 
 

21- ClientAliveInterval

Este parámetro indica el intervalo de tiempo en segundos en el cual después de que no se ha recibido ninguna petición/dato/comando desde el cliente, entonces sshd enviara un mensaje a través del canal cifrado, esperando una respuesta de el cliente, en caso de no responder se cierra la conexión con el cliente. El valor predeterminado es 0, el cual significa que no se envía tal mensaje. 

 

#ClientAliveInterval 0
 
 

22- ClientAliveCountMax

Este parámetro indica las veces que el servidor sshd enviará mensajes cuando el cliente está inactivo. Si el cliente no envía ninguna respuesta, entonces el servidor terminara la conexión y por lo tanto la sesión. Si tenemos conexiones intermitentes es recomendable subir el numero a este valor. Hay que tener en cuenta que esta opción es diferente a la opción TCPKeepAlive, estos mensajes son enviados a través de el canal cifrado.
 
#ClientAliveCountMax 3
 

23- UseDNS

Cuando un cliente SSH realiza una conexión hacia un servidor SSH, el servidor intentará resolver la dirección IP del cliente. Si el servidor DNS predeterminado del sistema carece de una zona de resolución inversa que resuelva un nombre para la dirección IP del cliente, la conexión se demorará algunos segundos más de lo normal. Podemos deshabilitar esta directriz para agilizar las conexiones SSH en redes donde, se carece de servidores DNS que tengan zonas de reenvío para resolver los nombres o zonas de resolución inversa para resolver las direcciones IP de los segmentos de red local. En nuestro ejemplo lo dejaremos desactivado.

#UseDNS no
 

24- PidFile

Este parámetro establece el nombre y ruta del archivo donde se guarda el identificador de proceso (pid) de sshd.

#PidFile /run/sshd.pid
 
 

25- MaxStartups

Este parámetro establece el máximo número de conexiones simultaneas de login que permitirá el servidor SSH por cada IP que intente conectarse. Hay ataques muy efectivos que dividen el ataque en una gran cantidad de conexiones de login. Es decir, el atacante divide en una gran cantidad de logins los intentos por ingresar, aumentando sus posibilidades de adivinar antes al usuario y su contraseña.

#MaxStartups 5

También podemos utilizar la siguiente sintáxis:

#MaxStartups 10:30:100

Donde:
10: Número de conexiones no autenticadas antes de comenzar a caer.
30: Porcentaje de probabilidad de caer una vez que llegamos a 10.
100: Número máximo de conexiones en las que comenzamos a caer.
 
 

26- Banner

Este paŕametro presenta un banner de acceso que nos permitirá mostrar un mensaje antes de la autenticación. Por ejemplo: Enseñar un cartel de advertencia exponiendo temas legales de un acceso no autorizado.
El banner de acceso no es más que el contenido de un fichero de texto plano ubicado en algun lugar del servidor (por ejemplo: /etc/ssh/ssh_pre-login) que podremos personalizar a nuestro gusto. El banner de acceso se presenta antes de autenticarnos en el servidor.

#Banner none
 
Banner /etc/ssh/ssh_pre-login
 


 
 
 
 
 
 
 
 
 

No hay comentarios: