Restrinja la copia de seguridad sin contraseña con SFTP

11

Necesito realizar una copia de seguridad de un servidor en mi computadora usando Duplicity:

duplicity /etc sftp://[email protected]//home/backup

Para poder hacer esto, necesito permitir el acceso sin contraseña haciendo lo siguiente:

$ ssh-keygen
$ ssh-copy-id [email protected]
$ ssh [email protected]

Mi pregunta es, ¿cómo puedo restringir el comando solo a esta transferencia SFTP en la clave pública que se genera?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

Y dado que estoy en una dirección IP dinámica, ¿cómo puedo superar el problema del "host desconocido perdido" cada vez que cambia mi IP?

Desbordamiento de preguntas
fuente
1
"problema de host conocido faltante": use StrictHostKeyChecking = sin opción para ssh
Marki
@ Marki, gracias, configurar eso en ssh_config funciona.
Desbordamiento de preguntas el

Respuestas:

15

Pregunta 1

Mi pregunta es, ¿cómo puedo restringir el comando solo a esta transferencia SFTP en la clave pública que se genera?

Hay 2 métodos para hacer esto.

1. - Restringir a través de sshd

Este método implica la creación de la función de SFTP dentro de su demonio SSH, sshd. Esto se controla a través del /etc/ssh/sshd_configarchivo de configuración. NOTA: Esto restringirá al usuario, backuppara que solo se le permita SFTP en el servidor.

# /etc/ssh/sshd_config

Subsystem       sftp    internal-sftp

## You want to put only certain users (i.e users who belongs to sftpusers 
## group) in the chroot jail environment. Add the following lines at the end 
## of /etc/ssh/sshd_config

Match User backup
  ForceCommand internal-sftp

2. - Restricción a través de claves_autorizadas

Este método no implica ningún cambio en el sshd_configarchivo. Puede limitar un usuario + una tecla SSH a un solo comando a través de la command=función que ya ha mencionado en su pregunta. El truco está en qué comando incluyes. Puede colocar el servidor SFTP en esta command=línea, lo que tiene el mismo efecto que configurar el servidor SFTP en su sshd_configarchivo.

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

NOTA: si el usuario tiene acceso de escritura ~/.ssh/authorized_keys, puede leerlo y / o modificarlo. Por ejemplo, podrían descargarlo, editarlo y volver a cargarlo, quitándolo commmand=...y otorgándole acceso ilimitado al comando, incluido el shell. Si el usuario tiene acceso de escritura ~/.ssh, también podría simplemente desvincular y volver a crear el archivo, o chmodpara acceder a escritura. Existen muchas soluciones posibles, como ~/.ssh/authorized_keysguardar los archivos en un lugar que el usuario no pueda escribir, como por ejemplo:

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

Pregunta 2

Y dado que estoy en una dirección IP dinámica, ¿cómo puedo superar el problema del "host desconocido perdido" cada vez que cambia mi IP?

Esto es más complicado pero se puede hacer usando la from=función dentro del authorized_keysarchivo también. Aquí estamos limitando el acceso de sólo el anfitrión, somehost.dyndns.org.

from = "somehost.dyndns.org", command = "/ usr / libexec / openssh / sftp-server", no-port-forwarding, no-X11-forwarding, no-agent-forwarding, no-pty ssh-dss AAAAC8ghi9ldw == copia de seguridad @ host

Las configuraciones adicionales después de la command=son igualmente importantes, ya que limitarán aún más el uso de la clave SSH.

desglose de características

  • from='hostname1,hostname2,'' - Restringe el acceso desde los patrones de IP o nombre de host especificados
  • command='command' - Ejecuta el comando especificado después de la autenticación
  • no-pty - No asigna una pty (no permite inicio de sesión interactivo)
  • no-port-forwarding - No permite el reenvío de puertos
  • no-X11-forwarding - el usuario no podrá eliminar las GUI X11 de la pantalla
  • no-agent-forwarding - el usuario no podrá reenviar a través de este host a otros hosts internos

Para deshacerse del mensaje sobre los "hosts conocidos faltantes", puede agregar esta opción SSH al cliente cuando se conecta así:

$ ssh -o StrictHostKeyChecking=no ....

Consulte la página de manual ssh_configpara obtener detalles completos sobre este interruptor.

Restringiendo el shell del usuario

Para ambas soluciones anteriores, es probable que desee bloquear al backupusuario limitando también el shell de este usuario en el /etc/passwdarchivo. Por lo general, querrá configurarlo scponly, pero también hay otras opciones para esto. Vea estas preguntas y respuestas de U&L tituladas: " ¿Necesita un shell para SCP? " Para conocer las formas de hacerlo.

El uso de /sbin/nologintambién se puede usar si opta por usar la función chroot sshd_configcomo se describe en el # 1 anterior. Sin embargo, si opta por utilizar el método descrito en el n . ° 2 , es probable que tenga que usar scponlyu otra cosa para el shell del usuario /etc/passwd.


BONIFICACIÓN - Extendiendo # 2 arriba

Si necesita exponer un conjunto de comandos para este usuario, también puede hacerlo. Crea un script así /home/backup/commands.sh:

#!/bin/sh

case $SSH_ORIGINAL_COMMAND in
  "diskspace")
    df -h
    ;;
  "dirlist")
    ls -1
    ;;
  "apache_restart")
    /etc/init.d/apache restart
    ;;
  *)
    echo "Unknown command"
esac

Luego configura el authorized_keysarchivo de esta manera:

command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host

El backupusuario puede ejecutar estos comandos así:

# diskspace
$ ssh -q user@remote_host diskspace
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/dev-root   39G  2.2G   35G   6% /

# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql

Referencias

slm
fuente
Tenga cuidado con los comandos a los que permite que acceda el usuario o el usuario puede tener la capacidad de obtener un shell completo. Como ejemplo, si le da a alguien acceso a vim, podría fácilmente:! / Bin / bash o:! / Bin / someotherprogram.
Rking
@rking - sí, eso es
evidente
Gracias por darme una respuesta tan detallada. La restricción de comando funciona perfecto. pero hay dos problemas. 1) La IP dinámica se refiere a mi computadora, no al servidor. Los nombres de host en el campo "desde" del archivo autorizado_claves solo restringen la dirección desde la cual el servidor puede acceder a mi computadora y no hace nada para resolver el problema de "host desconocido perdido" en mi computadora. 2) Deshabilitar el inicio de sesión de shell para el usuario de respaldo en mi computadora /sbin/nologinevitará que el servidor acceda a mi computadora con SFTP. Esto lo intenté.
Desbordamiento de preguntas
1
Perdón por la confusion. El servidor S se convierte en el cliente cuando realiza la conexión SFTP de back-end a mi computadora C. El problema de "host faltante conocido" se produce cada vez que el servidor S que realiza la copia de seguridad se conecta a una ubicación que no figura en su known_hostsarchivo ssh . Marki proporcionó la solución correcta en su comentario. El fromparámetro en el authorized_keysarchivo en mi equipo C sólo restringe la ubicación desde la que se puede conectar a S C
Pregunta de desbordamiento
Sí, adelante para hacer la edición. Por cierto, me doy cuenta de que /sbin/nologinfunciona si utilizo el comando force en internal-sftplugar del /usr/libexec/openssh/sftp-serverque especificó en el certificado. Supongo que estos son dos subsistemas diferentes. Y crear un directorio chroot para el primero es mucho más sencillo.
Desbordamiento de preguntas
0

Shell restringido

Debe asignar un shell restringido como scponly o rssh.

Cuando usa scp o sftp, se está conectando al sitio remoto a través de ssh y luego el shell remoto ejecuta un proceso scp o un proceso sftp. Lo que necesita es un shell restringido que solo permita que scp o sftp bloqueen el inicio de sesión.

rking
fuente