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_config
archivo de configuración. NOTA: Esto restringirá al usuario, backup
para 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_config
archivo. 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_config
archivo.
# 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 chmod
para acceder a escritura. Existen muchas soluciones posibles, como ~/.ssh/authorized_keys
guardar 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_keys
archivo 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_config
para obtener detalles completos sobre este interruptor.
Restringiendo el shell del usuario
Para ambas soluciones anteriores, es probable que desee bloquear al backup
usuario limitando también el shell de este usuario en el /etc/passwd
archivo. 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/nologin
también se puede usar si opta por usar la función chroot sshd_config
como 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 scponly
u 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_keys
archivo de esta manera:
command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host
El backup
usuario 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