sincronizzare tutti i file della macchina remota su SSH senza l'utente root?


68

Ho questo comando per eseguire il backup di una macchina remota. Il problema è che ho bisogno dei diritti di root per leggere e copiare tutti i file. Non ho abilitato l'utente root per motivi di sicurezza e utilizzo sudoUbuntu. Avrei bisogno di tubature interessanti o qualcosa per farlo?

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/

3
Usa l' rootaccount in primo luogo. sudo, in particolare combinato con NOPASSWDquanto raccomandato nei commenti, non migliora davvero la sicurezza della tua macchina.
Martin von Wittich,

Risposte:


89

Consiglierei di utilizzare l'account di root in primo luogo. Se lo configuri in questo modo:

  • Configura il tuo sshd_configcomputer di destinazione su PermitRootLogin without-password.
  • Utilizzare ssh-keygensulla macchina che estrae il backup per creare una chiave privata SSH (solo se non si dispone già di una chiave SSH). Non impostare una passphrase. Google un tutorial se hai bisogno di dettagli per questo, ci dovrebbero essere molti.
  • Aggiungi il contenuto del /root/.ssh/id_rsa.pubcomputer di backup al computer /root/.ssh/authorized_keysdi destinazione.
  • Ora il tuo computer di backup ha accesso root al tuo computer di destinazione, senza dover utilizzare l'autenticazione con password.

quindi l'installazione risultante dovrebbe essere abbastanza sicura.


sudo, in particolare combinato con NOPASSWDquanto raccomandato nei commenti, non ha vantaggi in termini di sicurezza rispetto al solo utilizzo dell'account root. Ad esempio questo suggerimento:

aggiungi quanto segue al tuo /etc/sudoersfile:rsyncuser ALL= NOPASSWD:/usr/bin/rsync

essenzialmente dà rsyncusercomunque i permessi di root. Tu chiedi:

@MartinvonWittich È facile ottenere una shell radice completa perché rsynceseguita con sudo? Cammina [m] e [attraverso] che per favore.

Bene semplice. Con la configurazione consigliata, rsyncuserora può essere eseguito rsynccome root senza nemmeno che sia richiesta una password. rsyncè uno strumento molto potente per manipolare i file, quindi ora rsyncuserha uno strumento molto potente per manipolare i file con i permessi di root. Trovare un modo per sfruttarlo mi ha richiesto solo pochi minuti (testato su Ubuntu 13.04, richiede dash, bashnon ha funzionato):

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:::

Come puoi vedere, mi sono creato una shell di root; whoamiidentifica il mio account come root, posso creare file /etce posso leggere da /etc/shadow. Il mio exploit è stato quello di impostare il bit setuid sul dashbinario; fa sì che Linux esegua sempre quel binario con le autorizzazioni del proprietario, in questo caso root.

Avere una vera radice non è [raccomandato] per buoni motivi. - redanimalwar 15 ore fa

No, aggirare goffamente l'account root in situazioni in cui è assolutamente appropriato usarlo non è per buone ragioni. Questa è solo un'altra forma di programmazione di culto del carico : non capisci davvero il concetto dietro sudo vs root, applichi semplicemente alla cieca la convinzione che "root è cattivo, sudo è buono" perché l'hai letto da qualche parte.

Da un lato, ci sono situazioni in cui sudoè sicuramente lo strumento giusto per il lavoro. Ad esempio, quando lavori in modo interattivo su un desktop grafico Linux, diciamo Ubuntu, quindi dover usare sudova bene in quei rari casi in cui a volte hai bisogno dell'accesso root. Ubuntu ha intenzionalmente un account root disabilitato e ti costringe a utilizzare sudoper impostazione predefinita per impedire agli utenti di utilizzare sempre sempre l'account root per accedere. Quando l'utente desidera semplicemente utilizzare ad esempio il browser Web, accedere come root sarebbe una cosa pericolosa , e quindi non avere un account root di default impedisce alle persone stupide di farlo.

D'altra parte, ci sono situazioni come la tua, in cui uno script automatizzato richiede autorizzazioni di root per qualcosa, ad esempio per eseguire un backup. Ora usare sudoper aggirare l'account di root non è solo inutile, è anche pericoloso: a prima vista rsyncusersembra un normale account senza privilegi. Ma come ho già spiegato, sarebbe molto facile per un utente malintenzionato ottenere pieno accesso alla radice se avesse già ottenuto l' rsyncuseraccesso. Quindi, essenzialmente, ora hai un account root aggiuntivo che non assomiglia affatto a un account root, il che non è una buona cosa.


2
Bella spiegazione. Un altro motivo per usare sudo su root potrebbe essere nella situazione in cui più persone hanno ruoli di amministratore di sistema su un server? In questo modo ognuno può usare le proprie chiavi SSH invece di condividere la chiave SSH di root?
Nathan S. Watson-Haigh,

2
@ NathanS.Watson-Haigh potresti anche inserire facilmente tutte le chiavi SSH /root/.ssh/authorized_keyso persino creare più account root con case diverse in modo che ogni utente possa avere la sua shell, home e .ssh/authorized_keys:)
Martin von Wittich,

2
Puoi limitare i tasti ssh a consentire solo determinati comandi. Sicuramente una buona idea, poiché se stai automatizzando qualcosa, probabilmente realizzerai queste chiavi ssh senza alcuna passphrase, o almeno così saranno accessibili tutto il tempo in cui una macchina è in esecuzione. (nel senso che root su quella macchina concede l'accesso a root su altre macchine.)
Peter Cordes

2
Le preoccupazioni di Martin sull'uso di sudo root sono valide, ma sembra che potrebbero essere mitigate specificando gli esatti parametri rsync nel file sudoers. Secondo la pagina man sudoers (5) su Ubuntu: "Se un Cmnd ha argomenti della riga di comando associati, allora gli argomenti nel Cmnd devono corrispondere esattamente a quelli forniti dall'utente sulla riga di comando (o corrispondere ai caratteri jolly se ce ne sono) ". Se il file sudoers specifica l'esatto comando rsync con le opzioni esatte (inclusi sorgente e destinazione), allora dovrebbe essere sicuro.

4
Una considerazione non menzionata in precedenza: sshdgeneralmente non registra quale chiave autorizzata è stata utilizzata per connettersi a un account, quindi se ci si connette come boballora sudo, si ottiene una pista di controllo migliore rispetto a quando ci si collega rootdirettamente con bobla chiave.
Coderer,

71

Utilizzare l' --rsync-pathopzione per eseguire il rsynccomando remoto con sudoprivilegi. Il tuo comando dovrebbe quindi essere ad esempio:

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .

Se sudoti viene richiesta una password, devi evitarlo utilizzando un NOPASSWDprivilegio con l'account utente remoto (inutile per il root, può avere senso in altri casi d'uso) o se non vuoi farlo:

  • Assicurati che l'opzione tty_ticketssia disabilitata per l'utente che stai utilizzando, eseguendo ad es. sudo visudo -f /etc/sudoers.d/local-rsync E inserendo:

    Defaults:your.username.for.rsync !tty_tickets
    
  • Assicurati che l'opzione requirettysia disabilitata per l'utente che stai utilizzando: potrebbe essere disattivata per impostazione predefinita. Il metodo è lo stesso di cui sopra.

  • Semina la sudopassword sul computer remoto, eseguendo ad es ssh -t user@192.168.1.2 sudo


1
@scai la password che viene richiesta è molto probabilmente la sudopassword, non la sshpassword
umläute

2
@redanimalwar consente al tuo utente di sudo /usr/bin/rsyncnon richiedere una passphrase; controlla man sudoerscome farlo; potresti voler creare un ulteriore utente di backup per questo.
umläute,

5
Per consentire sudo /usr/bin/rsyncl'esecuzione senza richiedere come password aggiungere quanto segue al /etc/sudoersfile: rsyncuser ALL= NOPASSWD:/usr/bin/rsyncCiò consentirà all'utente rsyncuser (come menzionato sopra sarebbe meglio creare un utente di backup dedicato) con il nome utente desiderato.
M_dk,

4
@M_dk ora ha rsyncessenzialmente sempre i permessi di root; probabilmente è molto facile ottenere una shell radice completa in quell'account. Penso che sia meglio usare l'account root reale in primo luogo.
Martin von Wittich,

1
La risposta in nessun modo a proposito del echo "password" | somethingfatto che in realtà non l'ho mai usato e sono d'accordo con i problemi di sicurezza che derivano dal lasciare l'esecuzione improvvisa di rsync (anche qui non suggerita) è cattiva. Cosa tty_ticketsnon ho in realtà idea, sembra necessario e un problema di sicurezza. Funzionerebbe in modo sicuro senza modificare nulla semplicemente eseguendo sodo su ssh e quindi eseguendo il comando giusto? Ma dal momento che ho posto questa domanda per scopi di script, sono totalmente d'accordo sul fatto che ssh basato su chiave senza pw sia sicuro e giusto. Ho accettato invece la risposta di Martins.
redanimalwar,

17

Un modo semplice per farlo è usare il ssh-askpassprogramma grafico con sudo, questo aggira il fatto che sudonon è collegato al terminale e ti permette di inserire la password in sicurezza:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  user@192.168.1.2:/ .

Ovviamente il ssh-askpassprogramma deve essere installato nella posizione indicata ed è necessario eseguire una sessione X sulla macchina su cui si sta lavorando. Ci sono alcune varianti del ssh-askpassprogramma che dovrebbero funzionare (versioni di Gnome / KDE). Anche un sudoprogramma di sostituzione grafica come gksuo kdesudodovrebbe funzionare.


rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .non funziona rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]. Oh, Ubuntu distribuisce gnome-ssh-askpass, ma lo è /usr/bin/ssh-askpass, invece di /usr/lib/ssh/x11.... Quindi ha funzionato :)
Peter Cordes,

1
Questa è una delle soluzioni migliori in quanto non ha bisogno di alcuna riconfigurazione dall'altra parte - ha solo bisogno di askpass installato e X forwarding abilitato, entrambi i quali dovrebbero essere abbastanza comuni.
David Gardner,

1
Funziona come un fascino dopo l'installazione ssh-askpass. Ho dovuto solo cercare il significato di -chavzPe, sarebbe fantastico spiegarle come lunghe opzioni.
krlmlr,

Ho provato questo, ma il prompt si sta aprendo sul computer remoto e non viene inoltrato al computer locale. X11Forwarding funziona chiedendo previsto, che ho verificato eseguendo xeyesutilizzando SSH.
Joyce Babu,

7

Se il tuo utente ha già i privilegi di sudo che sono protetti con una password, li terrei così come sono e aggiungerei solo una stanza per usare rsync senza una password:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 

5

Ho riscontrato questo problema oggi e l'ho risolto senza la necessità di modificare i file di configurazione o concedere autorizzazioni a livello di root agli account utente. La mia configurazione particolare era che l'utente Asulla macchina foodoveva copiare tutte le directory degli utenti foosulla macchina barin una backupdirectory di Aproprietà dell'utente . (L'utente Aha i privilegi di sudo attivi foo).

Il comando che ho usato è sotto. È stato invocato dall'utente Anella /homedirectory on foo.

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

Questo esegue rsync come sudo in modo che foosia possibile accedere a tutte le directory degli utenti, ma dice a rsync di usare ssh per accedere alla macchina barusando le Acredenziali dell'utente . Le mie esigenze erano leggermente diverse dalla domanda precedente, ma questo mi ha permesso di ottenere rapidamente un backup di tutte le directory degli utenti su una determinata macchina che gestisco senza confondere con la configurazione del sistema.


2
È brillante. Ho dimenticato l' -iopzione ssh. Puoi usare --rsync-path="sudo /usr/bin/rsync" se hai sudo sulla macchina bar. Questo quindi legge come root@fooe scrive come root@bar, ma trasferendo tramite A@foo-> B@bar. Grazie!
ctbrown,

Non conserverà il proprietario (es. Root), ho ragione?
Andris,

3

L'esecuzione di rsync come demone sul computer di destinazione ti consente di fare ciò che desideri.


1
Ho votato a favore di questa risposta, ma sarebbe meglio con qualche spiegazione su come far funzionare il demone rsynch e su come lo usi con accesso root.
Mike Lippert,

rsync come demone non corrisponde a questo caso, perché rsync rilascerà i permessi di root anche quando avviato come root quindi non tutti i file potrebbero essere trasferiti.
Teissler,

2

La mia soluzione è utilizzare --rsync-path="sudo rsync"ma richiede password, soluzione alternativa:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

1
Di solito non è una buona idea mettere le password in una riga di comando a riga singola; diventano visibili nell'albero del processo, per esempio. A volte sostituisco la password effettiva in questo tipo di istruzione con la $( cat my_password.txt )quale è leggermente migliore, ma di solito è preferibile configurare le autorizzazioni su entrambe le estremità e / o utilizzare le chiavi SSH, in modo tale che le password non siano richieste sulla CLI
JDS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.