[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: