Enjualar usuario SFTP en un directorio en modo lectura en centos.

Escribo esta entrada que me surge por la necesidad de tener un usuario SFTP enjaulado en un directorio y que solo pueda acceder a los ficheros en modo lectura.

He encotrado muchos tutoriales en internet de como enjaular usuarios SFTP y como gestionar directorios en modo lectura, pero ninguno que fusioanara ambas opciones, con lo que paso a explicarlo en esta entrada.

Para realizar el tutorial es necesario tener instalado el openssh-server, que viene en casi todas las distribuciones linux, de no estar instalado se puede instalar con este comando.

yum –y install openssh-server
  1. Creamos el grupo SFTP que gestionara los accesos
groupadd sftp

2. Creamos el directorio SFTP y el directorio del usuario y los permisos adecuados.

##directorio sftp
mkdir /var/sftp
chgrp sftp /var/sftp
chmod 750 /var/sftp/

##directorio usuario sftp
mkdir /var/sftp/prueba
chmod 770 /var/sftp/prueba
chgrp sftp /var/sftp/prueba

3. Creamos el usuario prueba, añadiendolo al grupo sftp, sin accesos shell y con el home del directorio creado.

useradd -g sftp -s /bin/false -d /var/sftp/prueba prueba ; echo "Password" | passwd --stdin prueba 

4. Editamos la configuracion del ssh ( /etc/ssh/sshd_config ), donde cambiamos el modo SFTP sftp-server por internal-sftp ( Subsystem sftp internal-sftp ), añadimos el grupo sftp ( Subsystem sftp internal-sftp ), asignamos el directorio del SFTP ( ChrootDirectory /var/sftp ) y configuramos el SFTP en modo solo lectura ( ForceCommand internal-sftp -R ).

vim /etc/ssh/sshd_config

# Comentamos original
### Subsystem       sftp    /usr/libexec/openssh/sftp-server

# Add sftp group. directory. only read
    Subsystem sftp internal-sftp
    Match group sftp
    ChrootDirectory /var/sftp
    ForceCommand internal-sftp -R

5. Reiniciamos el servicio ssh.

service sshd restart

6. Comprobamos a conectarnos con cualquier sofware SFTP (como winscp) y vemos como funciona correctamente.

Acceso SFTP solo lenctura

Como solucionar el error: unable to negotiate wit port 22: no matching key exchange method found

Ya estamos con los errores atipicos, si te ha parecido alguna vez el error unable to negotiate wit port 22: no matching key exchange method found, voy a explicarte de manera sencilla como solucionarlo.

Esto es debido a que el origen y destino tienen diferentes librerias ssl y no puden realizar correctamente la negociación para la conexión ssh, saltano un error de este tipo.

[root@pruebas~]# ssh pruebas@192.168.1.2
unable to negotiate wit port 22: no matching key exchange method found. Their offer : diffie-hellman-group-exchange-sha1,diffie-hellman-group14-exchange-sha1, diffie-hellman-group1-exchange-sha1

La solucion es bastante sencilla y solo ahce falta añadir el cifrado del algoritmo a utilizar, como muestro en el ejemplo a continuación.

[root@pruebas~]# ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 pruebas@192.168.1.2

Solucionar error: cannot set groups operation not permitted

Si te ha aparecido este error cannot set groups operation not permitted en un centos 7, red hat 7 o parecido y no puedes loguear como root manten la calma que tiene solución.

Esto es debido a un “cambio accidental” en los permisos del fichero /bin/su, una de las tipicas burradas que permite hacer en linux y te puede meter en un buen lio.

La solución es tan facil como asignar los siguientes permisos especiales al fichero /bin/su:

chmod 4755 /bin/su 

Una vez cambiados los permisos quedaran de la forma siguiente pudiendo loguear sin problemas.