Re: Rsync sobre SSH (forced-commands-only)
Hola, hola.
2014-02-10 21:13 GMT+01:00 Alberto <alberto@bersol.info>:
> Muchas gracias por tu gran respuesta, Francisco
> Aunque, no me acaba de quedar claro algo...
>
Vamos a ver si te puedo ayudar...
> El 10/02/14 09:20, Francisco SG escribió:
> ...
>
>> Y en el authorized_keys lo que defino junto a la clave es lo siguiente:
>> from="xxxxxxxxxxx",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/local/bin/valida-rsync.sh"
>> ssh-dss...
>
> Bueno, no puedo especificar con el "from=xxx" ya que sería una IP
> dinámica, pero por lo demas...
Si la IP es dinámica, pues nada lo olvidamos ;-)
>...
Vamos con el wrap.
>>
>> from="xxxxxxxxxxx",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/local/bin/rrsync
>> -ro proyectos" ssh-rsa...
> ...
>
> El parametro en "~/.ssh/authorized_keys" seria...
>
> command="/usr/local/bin/rrsync -ro /" ssh-dss ...
>
Exactamente, permites sólo lectura y limitas... a la raíz, bueno, en
este caso no tiene sentido ;-), pero en otras ocasiones resulta muy
útil.
> Yo no capisco nada de Perl (si al menos fuera Python...). Tengo que
> definir la variable SSH_ORIGINAL_COMMAND?
> y supongo que los parametros tambien, no?
Oh cielos! hay que mantener un poco el espíritu perlero ;-) soy el
caso opuesto, pero hay que poner remedio a eso :-). No, la variable
SSH_ORIGINAL_COMMAND es lo que pasa el servidor ssh al comando
"forzado", si ves el sh que te puse verás que es lo que usa para el
"case" y lo que ejecuta si está permitido.
Un ejemplo sencillito:
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
"ls*")
$SSH_ORIGINAL_COMMAND
;;
"free*")
free -m
;;
*)
echo "Sólo puedes ejecutar ls y free"
exit 1
;;
esac
(...)
>
> # The client uses "rsync -av -e ssh src/ server:dir/", and sshd on the
> server
> # executes this program when .ssh/authorized_keys has 'command="..."'.
> # For example:
> # command="rrsync logs/client" ssh-rsa
> AAAAB3NzaC1yc2EAAAABIwAAAIEAzGhEeNlPr...
> # command="rrsync -ro results" ssh-rsa
> AAAAB3NzaC1yc2EAAAABIwAAAIEAmkHG1WCjC...
> #
> # Format of the envrionment variables set by sshd:
> # SSH_ORIGINAL_COMMAND=rsync --server -vlogDtpr --partial . ARG
> # push
> # SSH_ORIGINAL_COMMAND=rsync --server --sender -vlogDtpr --partial .
> ARGS # pull
> # SSH_CONNECTION=client_addr client_port server_port
>
> my $command = $ENV{SSH_ORIGINAL_COMMAND};
> die "$0: Not invoked via sshd\n$Usage" unless defined $command;
> die "$0: SSH_ORIGINAL_COMMAND='$command' is not rsync\n" unless $command =~ s/^rsync\s+//;
Aquí lo tienes, sólo permitirá la ejecución de rsync, luego vienen las
definiciones de los parámetros que puedes permitir si quieres afinar
más y al principio en la definición de constantes tienes el archivo de
log y ubicación del rsync (ahora hablo de memoria :-().
En todo caso, si no te sientes cómodo con Perl y puesto que vas a
hacer un backup desde la raíz del sistema, el shell script cuya
dirección te pase parece suficiente, vas a limitar la ejecución al
comando en cuestión y puedes ir ajustando mientras pruebas los
parámetros, en el perl en el fondo es lo mismo, habilitar los
parámetros que quieres permitir y logar en un archivo la ejecución.
Espero que te sirva de ayuda. Si tienes problemas ya sabes.
>
>
> Un saludo,
>
>
>
Un saludo
>
Reply to: