Rsync archivos raíz entre sistemas sin especificar contraseña

Rsync archivos raíz entre sistemas sin especificar contraseña

Esto me parece muy complicado.

He configurado mis dos sistemas para poder rsyncarchivos entre ellos como yo, sin especificar contraseña. Ahora el problema son los rsyncarchivos que pertenecen a root. En mis dos sistemas, no hay contraseñas de root. La única manera de convertirse en root es a través de sudo. Por lo tanto, no puedo dar una contraseña sudo rsyn local root@remote:ni usar mi agente ssh para proporcionar una frase de contraseña. No quiero configurar una contraseña de root en ningún sistema; y necesito que los archivos sean propiedad de root en ambos sistemas.

EDITAR: Usar los archivos que pertenecen rootes solo un ejemplo, necesito una forma para que mi cuenta sin privilegios lea/escriba archivos del sistema (incluidos los de propiedad raíz) fácilmente. Un ejemplo es copiar mi entorno /root configurado en el sistema recién instalado. Los dos sistemas son en realidad dos máquinas virtuales bajo un solo host, por lo que no es una gran preocupación para mí copiar archivos de propiedad raíz entre ellos.

EDITAR 2: Si solo quiero copiar mi entorno /root configurado en el sistema recién instalado, puedo usar tar:

sudo tar cvzf - /root | ssh me@remote sudo tar xvzf - -C /

Pero necesito rsyncactualizar de vez en cuando. ¿Alguna manera fácil de hacerlo realidad?

EDITAR 3: formule formalmente la pregunta

Muy bien, todo comenzó con la pregunta de cómo almacenar rsyncarchivos que pertenecen a la raíz entre dos sistemas como un usuario normal sin privilegios, sin especificar una contraseña, con la condición de que:

  1. La rootcuenta está bloqueada en ambos sistemas. Es decir, no hay rootcontraseñas. La única forma de convertirse en root es a través de sudo(práctica de seguridad recomendada, consultehttp://help.ubuntu.com/community/RootSudo)
  2. No quiero estar completamente sin contraseña, sudopero tampoco quiero estar escribiendo contraseñas todo el tiempo.
  3. El usuario normal sin privilegios ha introducido su frase de contraseña ssh en el agente ssh.

Gracias

Respuesta1

Puedes hacerlo directamente con rsync con el uso creativo de --rsync-pathla opción. Entonces usarías:

rsync -a -e "ssh" --rsync-path="sudo rsync" localdir/ [email protected]:/remotedir

Tenga en cuenta que esto requiere que "sudo rsync" en el host remoto NO solicite una frase de contraseña. Esto se puede lograr de varias maneras:

  • haciendo sudo -vde forma remota antes de ejecutar rsync (ideal para trabajos únicos de rsync). Su sudo no debe usar tty_ticketsla opción para que esto funcione.
  • instalar username ALL= NOPASSWD:/usr/bin/rsyncen /etc/sudoersun host remoto.
  • usandoautenticación-agente-ssh-pamen control remoto para/etc/pam.d/sudo

Por supuesto, también podría, en lugar de "rsync over ssh", usar "rsync en modo demonio" (consulte rsyncd.conf(5)y /etc/default/rsyncen Debian GNU/Linux, por ejemplo) para lograr lo que desea, con el beneficio adicional de una mejor velocidad de transferencia.

Respuesta2

La solución.

  1. Agregar la clave ssh del usuario a la raíz remota funciona, pero solo a mitad de camino, es decir, ahora rsyn ... root@remote:...funciona. La parte desafiante sudo rsyn ...también es conseguir trabajo.
  2. Para conseguir sudo rsyn ...trabajo, lo que se necesita es: usar el agente SSH para la autenticación sudo,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/
  3. Para instalar el módulo PAM pam-ssh-agent-auth en Ubuntu, puede usar el ppa que acabo de crear,https://launchpad.net/~suntong001/+archive/ppa. Probado bien en Ubuntu 12.04 preciso y 13.10 picante.

HT

Respuesta3

Otra forma sería crear un script .sh en ambos servidores, que contenga sus scripts rsync.

Luego ejecútelos mediante cronjob o mediante ssh:

ssh not-your-root-user@remoteserver sudo sh your-rsync-script.sh

O simplemente ejecute su script rsync directamente a través de ssh

ssh not-your-root-user@remoteserver sudo rsync local root@remote

Preferiría cronjob si es un trabajo rsync programado.

Respuesta4

Bueno, depende de lo que quieras hacer. ¿Es necesario que los archivos sean propiedad de root en ambos sistemas? No lo harán si simplemente está haciendo una copia de seguridad para poder ejecutarlo rsynccomo root pero iniciando sesión en el servidor remoto como su usuario normal.

Cree una clave para que local rootinicie sesión como usuario normal remoto (la usaré xptcomo su nombre de usuario normal):

sudo -i
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub xpt@remote

Ahora deberías poder hacer una operación sin contraseña ssho rsync(como root) así:

rsync /path/to/local xpt@remote

Si los archivos deben ser propiedad del root en ambos sistemas, las cosas se vuelven un poco más complejas. Lo más fácil sería simplemente configurar una contraseña de root en ambos sistemas:

sudo -i
passwd 

Ahora puedes iniciar sesión como root a tu gusto.

Por supuesto, elmejorlo que se podría hacer seríano copiar archivos a través de la red como root. Realmente no puedo imaginar por qué querrías hacerlo y el riesgo realmente no vale la pena, simplemente copia los archivos y juega con ellos sudosegún sea necesario una vez que los hayas copiado.


ACTUALIZAR:

Repito que la forma más sencilla de hacer esto es crear una contraseña de root para cada máquina y luego copiarla como root. No entiendo por qué no quieres esto, es tan simple como ejecutar sudo passwd.

De todos modos, si insistes en que no quieres crear una contraseña de root, la única forma de evitarlo que veo es ejecutar dos comandos:

  1. Ejecute rsyncpara copiar a un directorio grabable por el usuario (yo uso mktmppara crear un nombre de directorio aleatorio):

    dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
    
  2. Mover el contenido aremote:/root

    ssh -t lacoloc@badabing sudo rsync -avz "$dir"/* /root
    

    La -topción fuerza la asignación de tty y es necesaria para ejecutar sudocomandos en el sistema remoto.

Puedes combinar los dos agregando esto a tu ~/.bashrcarchivo (avísame si no usas bash):

function Rrsync(){
    dir=`mktemp -u` &&
    sudo rsync -avz $1 $2:$dir &&
    ssh -t $2 sudo rsync -avz $dir/ $3 && rm -rf $dir
}

Luego puedes llamar a la función de esta manera:

Rrsync /root xpt@remote /root
------ ----- ---------- -----
   |     |       |        |---> The target directory on the remote server
   |     |       |------------> username@server 
   |     |--------------------> Path to local source directory
   |--------------------------> The function name

Tenga en cuenta que es posible que tenga que jugar agregando/eliminando una barra diagonal /del origen y los destinos de rsync dependiendo de si está copiando un directorio o el contenido del directorio. Ver man rsync.

Para que esto funcione sin contraseña, tendrás que ejecutarlo ssh-keygencomo ssh-copy-idroot como describí al principio. Aún tendrá que ingresar su contraseña para los dos sudocomandos, una vez para su máquina local y otra para la remota.

información relacionada