Bloquear ssh a root pero permitir rsync u otros comandos

Una de las primeras medidas de seguridad que se toman tras instalar cualquier sistema operativo de tipo Unix es deshabilitar el acceso directo con el usuario root por ssh. Hay ocasiones (se pueden contar con los dedos de una mano) en las que no nos quedará más remedio que tomar algunas excepciones, para ello vamos a ver un par de opciones que nos ofrece la configuración de ssh a nivel de servidor (/etc/ssh/sshd_config). Las opciones de las que vamos a hablar son:

  • PermitRootLogin without password
  • PermitRootLogin forced-commands-only

La primera opción, PermitRootLogin without password significa que el acceso root con usuario/password quedará completeamente deshabilitado, pero sí que se permitirá acceder usando una pareja de claves RSA.

La segunda opción, PermitRootLogin forced-commands-only consiste en permitir el acceso root pero restringiendo los comandos a ejecutar. Esto se hace añadiendo parámetros en la línea de la llave pública correspondiente del archivo /root/.ssh/authorized_keys de root (servidor destino). Como parámetros podemos permitir el acceso únicamente a determinadas IPs, restringir la ejecución de comandos concretos y especificar diversos parámetros de la conexión SSH, como deshabilitar la redirección de puertos, la redirección de X11, etc.

El siguiente ejemplo conectarse como root por ssh únicamente a la IP 192.168.0.100 y para ejecutar el comando touch /var/tmp/test.txt. Después de los parámetros se encuentra la llave pública RSA correspondiente:

from="192.168.0.100",command="/bin/touch /var/tmp/test.txt",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding  ssh-rsa AAAAB3NzaC1yc70YLGCWjUQSeTHXQCo.............

El caso de rsync

En el caso de rsync, configurar el comando directamente en la línea del authorized_keys sería bastante pesado, sobre todo por la cantidad de parámetros y variables que habría que configurar para que funcionara bien permitiendo el acceso. Los propios desarrolladores de rsync solucionaron este problema creando un script en perl llamado rrsync. Este script suele estar en la carpeta «docs» de rsync en el propio SO o en /usr/local/bin/rrsync. Lo podéis descargar también aquí.

Al script únicamente hay que pasarle un directorio a partir del cual se permitirá hacer rsync. Hay también la opción de ponerlo en modo read-only -ro:

from="192.168.0.100",command="/usr/local/bin/rrsync /var/tmp",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding  ssh-rsa AAAAB3NzaC1yc70YLGCWjUQSeTHXQCo.............

Y ya está. Con esta configuración permites hacer rsync en cualquier directorio dentro de /var/tmp, como root y desde la IP 192.168.0.100. El resto de accesos root quedan todos bloqueados.