rsync todos los archivos de la máquina remota a través de SSH sin usuario root?

68

Tengo este comando para hacer una copia de seguridad de una máquina remota. El problema es que necesito derechos de root para leer y copiar todos los archivos. No tengo un usuario root habilitado por razones de seguridad y uso sudoel modo Ubuntu. ¿Necesitaría alguna tubería genial o algo para hacer esto?

rsync -chavzP --stats [email protected]:/ /media/backupdisk/myserverbackup/
redanimalwar
fuente
3
Solo usa la rootcuenta en primer lugar. sudo, especialmente combinado con NOPASSWDlo recomendado en los comentarios, realmente no mejora la seguridad de su máquina.
Martin von Wittich

Respuestas:

89

En primer lugar, recomendaría que solo use la cuenta raíz. Si lo configura así:

  • Configure su sshd_configen la máquina de destino para PermitRootLogin without-password.
  • Úselo ssh-keygenen la máquina que extrae la copia de seguridad para crear una clave privada SSH (solo si aún no tiene una clave SSH). No establezca una frase de contraseña. Google un tutorial si necesita detalles para esto, debería haber muchos.
  • Agregue el contenido de /root/.ssh/id_rsa.publa máquina de respaldo a la /root/.ssh/authorized_keysde su máquina de destino.
  • Ahora su máquina de respaldo tiene acceso de root a su máquina de destino, sin tener que usar autenticación de contraseña.

entonces la configuración resultante debería ser bastante segura.


sudo, especialmente combinado con NOPASSWDlo recomendado en los comentarios, no tiene beneficios de seguridad con solo usar la cuenta raíz. Por ejemplo esta sugerencia:

agregue lo siguiente a su /etc/sudoersarchivo:rsyncuser ALL= NOPASSWD:/usr/bin/rsync

esencialmente da rsyncuserpermisos de raíz de todos modos. Usted pregunta:

@MartinvonWittich ¿Es fácil obtener un shell raíz completo porque se rsyncejecuta con sudo? Camina [m] e [a través] que por favor.

Bueno, simple Con la configuración recomendada, rsyncuserahora puede ejecutarse rsynccomo root sin siquiera solicitar una contraseña. rsynces una herramienta muy poderosa para manipular archivos, por lo que ahora rsyncusertiene una herramienta muy poderosa para manipular archivos con permisos de root. Encontrar una manera de explotar esto me llevó solo unos minutos (probado en Ubuntu 13.04, requiere dash, bashno funcionó):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

Como puede ver, me he creado un shell de raíz; whoamiidentifica mi cuenta como root, puedo crear archivos /etcy puedo leer /etc/shadow. Mi hazaña era establecer el bit setuid en el dashbinario; hace que Linux siempre ejecute ese binario con los permisos del propietario, en este caso root.

Tener una raíz real no es [recomendado] por buenas razones. - redanimalwar Hace 15 horas

No, trabajar torpemente alrededor de la cuenta raíz en situaciones en las que es absolutamente apropiado usarlo no es por buenas razones. Esta es solo otra forma de programación de culto de carga : realmente no entiendes el concepto detrás de sudo vs root, simplemente aplicas ciegamente la creencia "la raíz es mala, sudo es buena" porque lo has leído en alguna parte.

Por un lado, hay situaciones en las sudoque definitivamente es la herramienta adecuada para el trabajo. Por ejemplo, cuando trabajas de manera interactiva en un escritorio gráfico de Linux, digamos Ubuntu, entonces tener que usar sudoestá bien en esos raros casos en los que a veces necesitas acceso root. Ubuntu intencionalmente tiene una cuenta raíz deshabilitada y lo obliga a usar sudode forma predeterminada para evitar que los usuarios usen siempre la cuenta raíz para iniciar sesión. Cuando el usuario solo quiere usar, por ejemplo, el navegador web, iniciar sesión como root sería algo peligroso y, por lo tanto, no tener una cuenta raíz de forma predeterminada impide que las personas estúpidas hagan esto.

Por otro lado, hay situaciones como la suya, en las que un script automatizado requiere permisos de root para algo, por ejemplo, para hacer una copia de seguridad. Ahora, usar sudola cuenta raíz no solo no tiene sentido, también es peligroso: a primera vista rsyncuserparece una cuenta ordinaria sin privilegios. Pero como ya he explicado, sería muy fácil para un atacante obtener acceso completo a la raíz si ya hubiera obtenido rsyncuseracceso. Entonces, esencialmente, ahora tiene una cuenta raíz adicional que no se parece en absoluto a una cuenta raíz, lo que no es algo bueno.

Martin von Wittich
fuente
2
Buena explicación ¿Sería otra razón para usar sudo sobre la raíz la situación en la que varias personas tienen roles de administrador de sistemas en un servidor? De esta manera, cada uno puede usar sus propias claves SSH en lugar de compartir la clave SSH de root.
Nathan S. Watson-Haigh
2
@ NathanS.Watson-Haigh, podría poner todas las claves SSH con la misma facilidad /root/.ssh/authorized_keys, o incluso crear múltiples cuentas raíz con diferentes hogares para que cada usuario pueda tener su propio shell, hogar y .ssh/authorized_keys:)
Martin von Wittich
2
También puede restringir las teclas ssh para que solo permitan ciertos comandos. Definitivamente es una buena idea, ya que si estás automatizando algo, probablemente estarás haciendo estas claves ssh sin ninguna frase de contraseña, o al menos para que estén accesibles todo el tiempo que una máquina esté funcionando. (lo que significa que la raíz en esa máquina otorga acceso a la raíz en otras máquinas.)
Peter Cordes
2
Las preocupaciones de Martin con respecto al uso de sudo root son válidas, pero parece que podrían mitigarse especificando los parámetros rsync exactos en el archivo sudoers. De acuerdo con la página del comando man sudoers (5) en Ubuntu: "Si un Cmnd tiene argumentos de línea de comando asociados, entonces los argumentos en el Cmnd deben coincidir exactamente con los dados por el usuario en la línea de comando (o coincidir con los comodines si hay alguno) ". Si el archivo sudoers especifica el comando rsync exacto con las opciones exactas (incluyendo origen y destino), entonces parece que debería ser seguro.
44
Una consideración que no se mencionó anteriormente: sshdgeneralmente no registra qué clave autorizada se utilizó para conectarse a una cuenta, por lo que si se conecta de bobesa manera sudo, obtendrá una mejor pista de auditoría que si se conecta rootdirectamente con bobla clave.
Coderer
71

Utilice la --rsync-pathopción para hacer que el rsynccomando remoto se ejecute con sudoprivilegios. Su comando debería ser, por ejemplo:

rsync -chavzP --rsync-path="sudo rsync" --stats [email protected]:/ .

Si le sudosolicita una contraseña, debe evitarla mediante el uso de un NOPASSWDprivilegio con la cuenta de usuario remota (no tiene sentido para root, puede tener sentido en otros casos de uso), o si no desea hacerlo:

  • Asegúrese de que la opción tty_ticketsesté deshabilitada para el usuario que está utilizando, por ejemplo ejecutando sudo visudo -f /etc/sudoers.d/local-rsync e ingresando:

    Defaults:your.username.for.rsync !tty_tickets
    
  • Asegúrese de que la opción requirettyesté deshabilitada para el usuario que está utilizando; podría estar desactivada de manera predeterminada. El método es el mismo que el anterior.

  • Sembrar la sudocontraseña en la máquina remota, ejecutando p. Ej. ssh -t [email protected] sudo

M_dk
fuente
1
@scai la contraseña que se solicita es muy probablemente la sudocontraseña, no la sshcontraseña
umläute
2
@redanimalwar le permite a tu usuario sudo /usr/bin/rsyncsin pedir una frase de contraseña; verifica man sudoerscómo hacer esto; es posible que desee crear un usuario de respaldo adicional para esto.
umläute
55
Para permitir la sudo /usr/bin/rsyncejecución sin requerir una contraseña, agregue lo siguiente a su /etc/sudoersarchivo: rsyncuser ALL= NOPASSWD:/usr/bin/rsyncEsto permitirá al usuario rsyncuser (como se mencionó anteriormente, sería mejor crear un usuario de respaldo dedicado) con el nombre de usuario que desee.
M_dk
44
@M_dk ahora rsyncesencialmente siempre tiene permisos de root; Probablemente sea muy fácil obtener un shell raíz completo en esa cuenta. Creo que es mejor usar la cuenta raíz real en primer lugar.
Martin von Wittich
1
La respuesta de ninguna manera hablando de echo "password" | somethingque en realidad nunca usé esto y estoy de acuerdo con los problemas de seguridad que vienen al permitir que la ejecución sudoless de rsync (que tampoco se sugiere aquí) sea mala. Lo que tty_ticketsno tengo realmente idea, parece necesario y un problema de seguridad. Esto funcionaría de forma segura sin modificar nada simplemente ejecutando sodo en ssh y luego ejecutando el comando ¿verdad? Pero dado que hice esa pregunta con fines de secuencias de comandos, estoy totalmente de acuerdo en que ssh basado en claves sin pw es lo seguro y correcto. Acepté la respuesta de Martins en su lugar.
redanimalwar
17

Una manera simple de hacer esto es usar el ssh-askpassprograma gráfico con sudo, esto evita el hecho de que sudono está conectado al terminal y le permite ingresar la contraseña de manera segura:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  [email protected]:/ .

Por supuesto, el ssh-askpassprograma debe instalarse en la ubicación dada y debe ejecutar una sesión X en la máquina en la que está trabajando. Hay algunas variaciones en el ssh-askpassprograma que también deberían funcionar (versiones de Gnome / KDE). También un sudoprograma de reemplazo gráfico como gksuo kdesudotambién debería funcionar.

Graeme
fuente
rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .no funciona rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]. Oh, ubuntu envía gnome-ssh-askpass, pero es /usr/bin/ssh-askpass, en lugar de /usr/lib/ssh/x11.... Así que funcionó :)
Peter Cordes
1
Esta es una de las mejores soluciones, ya que no necesita ninguna reconfiguración en el otro extremo, solo necesita el askpass instalado y el reenvío X habilitado, los cuales deberían ser bastante comunes.
David Gardner el
1
Funciona como un encanto después de la instalación ssh-askpass. Solo tenía que buscar el significado de -chavzPe, sería genial explicarlas como opciones largas.
krlmlr
Intenté esto, pero el mensaje se abre en la máquina remota y no se reenvía a la máquina local. X11Forwarding está funcionando, pregunte lo esperado, que verifiqué ejecutando xeyesusando SSH.
Joyce Babu
7

Si su usuario ya tiene privilegios de sudo que están protegidos con una contraseña, los mantendré como están y solo agregaré una estrofa para usar rsync sin contraseña:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 
Gunnar Thielebein
fuente
5

Me encontré con este problema hoy y lo resolví sin la necesidad de modificar los archivos de configuración o otorgar permisos de nivel raíz a las cuentas de usuario. Mi configuración particular fue que el usuario Aen la máquina footenía que copiar todos los directorios de los usuarios de la foomáquina baren un backupdirectorio que ese usuario Aposeía. (El usuario Atiene privilegios de sudo foo).

El comando que utilicé está debajo. Fue invocado por el usuario Aen el /homedirectorio en foo.

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

Esto ejecuta rsync como sudo para que foose pueda acceder a todos los directorios de usuarios pero le dice a rsync que use ssh para acceder a la máquina barusando las Acredenciales del usuario . Mis necesidades eran ligeramente diferentes a las de la pregunta anterior, pero esto me permitió obtener rápidamente una copia de seguridad de todos los directorios de usuarios en una máquina en particular que administro sin interferir con la configuración del sistema.

Ken Anderson
fuente
2
Esto es brillante. Olvidé la -iopción de ssh. Puedes usarlo --rsync-path="sudo /usr/bin/rsync" si tienes sudo en la máquina bar. Esto luego lee root@fooy escribe como root@bar, pero transfiere a través de A@foo-> B@bar. ¡Gracias!
ctbrown
No conservará el propietario (por ejemplo, root), ¿estoy en lo cierto?
Andris
3

Ejecutar rsync como daemon en la máquina de destino te permite hacer lo que quieras.

Konstantin
fuente
1
Voté esta respuesta, pero sería mejor con alguna explicación de cómo ejecutar el demonio rsynch y cómo lo usas con acceso root.
Mike Lippert
rsync como daemon no coincidiría con este caso, porque rsync eliminará los permisos de root incluso cuando se inicie como root, entonces no todos los archivos podrían transferirse.
teissler
2

Mi solución es usar --rsync-path="sudo rsync"pero pide contraseña, solución alternativa:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  [email protected]:/ .
Bulat
fuente
1
Por lo general, no es una buena idea poner las contraseñas en una línea de comandos; se vuelven visibles en el árbol de procesos, por ejemplo. A veces reemplazo la contraseña real en este tipo de declaración con la $( cat my_password.txt )cual es un poco mejor, pero generalmente se prefiere configurar los permisos en cualquiera de los extremos, y / o usar claves SSH, de tal manera que no se requieran contraseñas en la CLI
JDS