Použitím Rsync a SSH: klíče, ověřování a automatizace

Source page: http://troy.jdmz.net/rsync/index.html

Tento dokument se týká použití cronu, SSH, a rsync zálohování souborů přes lokální síť nebo internet. Část mé cílem je zajistit, aby se nepožaduje zásah uživatele, je-li počítač restartovat (hesla, klíče nebo klíčových manažerů).

Líbí se mi, jak zálohovat nějaký záznam, pošta, a informace o konfiguraci, někdy o hostiteli přes síť a internet, a tady je způsob, jak jsem zjistil, jak to udělat. Budete potřebovat tyto balíčky nainstalované:

  • rsync
  • openssh
  • cron (nebo vixie-cron)

Vezměte prosím na vědomí tyto pokyny mohou být specifické pro Red Hat Linux verze 7.3, 9 a Fedora Core 3, ale doufám, že nebude příliš těžké přizpůsobit se téměř jakýkoli typ * NIX OS. Manuálové stránky pro ‚ssh‘ a ‚rsync‘ by měly být užitečné pro vás, pokud budete muset změnit některé věci (použít „man ssh“ a „man rsync“ příkazy).

Za prvé, budu definovat některé proměnné. V mém vysvětlení, budu synchronizaci souborů (kopírování pouze nové nebo změněné soubory) na jednu stranu, a já bude startovat tento proces od hostitele chci kopírovat věci. Jinými slovy, budu synchronizovat soubory z/dálkové/dir/na remotehost, as remoteuser k/tomuto/dir/na thishost, as thisuser.

Chci, aby se ujistil, že ‚rsync‘ nad ‚ssh‘ vůbec funguje, než začnu automatizovat proces, takže to vyzkoušet jsem poprvé jako thisuser:

$ rsync -avz -e ssh remoteuser@remotehost:/remote/dir /this/dir/

a zadejte heslo remoteuser@remotehost Na výzvu. Já potřebuji, aby se ujistil, že remoteuser má oprávnění ke čtení do/dálkové/dir/ na remotehost, a že thisuser má oprávnění k zápisu do/tohoto/dir/ na thishost. Také, ‚rsync‘ a ‚ssh‘ by měla být v cestě thisuser (využití „které ssh“ a „který rsync“), ‚rsync‘ by měla být v cestě remoteuser to, a ‚sshd‘ by měl být spuštěn na remotehost.

Konfigurace thishost

Pokud to všechno vyšlo, nebo jsem nakonec udělal to funguje, jsem připraven k dalšímu kroku. Musím generovat soukromý/veřejný pár klíčů pro umožnění ‚ssh‘ spojení bez žádostí o zadání hesla. To může znít jako nebezpečné, a to je, ale je to lepší než uložení hesla uživatele (nebo klíčové heslo) jako prostého textu ve skriptu [0]. Mohu také dát omezení, kde spoje vyrobené s tímto klíčem mohou pocházet z, a na to, co můžete udělat, když spojeni. Každopádně jsem generování klíče budu používat na thishost (jako thisuser):

$ ssh-keygen -t rsa -b 2048 -f /home/thisuser/cron/thishost-rsync-key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in /home/thisuser/cron/thishost-rsync-key.
Your public key has been saved in /home/thisuser/cron/thishost-rsync-key.pub.
The key fingerprint is:
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 thisuser@thishost

a teď máme klíč bez hesla v obou souborech výše [1] výše. Ujistěte se, že žádný jiný neoprávněný uživatel může číst soubor soukromého klíče (ten bez přípony ‚PUB‘).

Tato klávesa neslouží žádnému účelu, dokud dáme veřejnou část do souboru ‚authorized_keys‘ [2] o remotehost, konkrétně jeden pro remoteuser:

/home/remoteuser/.ssh/authorized_keys

I používat scp dostat soubor se k vzdálenému hostiteli:

$ scp /home/thisuser/cron/thishost-rsync-key.pub remoteuser@remotehost:/home/remoteuser/

a pak jsem si připravit věci na remotehost.

Konfigurace remotehost

I ‘ssh’ se k remotehost:

$ ssh remoteuser@remotehost
remoteuser@remotehost’s password: [type correct password here]
$ echo I am now $USER at $HOSTNAME
I am now remoteuser at remotehost

dělat nějakou práci.

Musím se ujistit, že jsem mít adresáře a soubory musím povolit spojení s tímto klíčem [3]:

$ if [ ! -d .ssh ]; then mkdir .ssh ; chmod 700 .ssh ; fi
$ mv thishost-rsync-key.pub .ssh/
$ cd .ssh/
$ if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi
$ cat thishost-rsync-key.pub >> authorized_keys

Nyní je klíč může být použita pro připojení k tomuto hostiteli, ale tyto spoje mohou být odkudkoli (to démon ssh na remotehost umožňuje připojení z) a mohou dělat cokoliv (to remoteuser může dělat), a já nechci, aby , I upravit soubor ‚authorized_keys‘ (s vi) a upravte řádek s ‚thishost-rsync-key.pub‘ informace o tom. Budu přidávat jen pár věcí, v přední části toho, co již existuje, změna vedení (a to, co následuje, je jen jeden řádek s špatně similated zalamování řádků), z toho:

ssh-dss AAAAB3NzaC1kc3MAAAEBAKYJenaYvMG3nHwWxKwlWLjHb77CT2hXwmC8Ap+fG8wjlaY/9t4u
A+2qx9JNorgdrWKhHSKHokFFlWRj+qk3q+lGHS+hsXuvta44W0yD0y0sW62wrEVegz+JVmntxeYc0nDz
5tVGfZe6ydlgomzj1bhfdpYe+BAwop8L+EMqKLS4iSacNjoPlHsmqHMnbibn3tBqJEq2QJjEPaiYj1iP
5IaCuYBhuTKQGa+oyH3mXEif5CKdsIKBj46B0tCy0/GC7oWcUN92QdLrUyTeRJZsTWsxKpRbMliD2pBh
4oyX/aXEf8+HZBrO5vQjDBCfTFQA+35Xrd3eTVEjkGkncI0SAeUAAAAVAMZSASmQ9Pi38mdm6oiVXD55
Kk2rAAABAE/bA402VuCsOLg9YS0NKxugT+o4UuIjyl6b2/cMmBVWO39lWAjcsKK/zEdJbrOdt/sKsxIK
1/ZIvtl92DLlMhci5c4tBjCODey4yjLhApjWgvX9D5OPp89qhah4zu509uNX7uH58Zw/+m6ZOLHN28mV
5KLUl7FTL2KZ583KrcWkUA0Id4ptUa9CAkcqn/gWkHMptgVwaZKlqZ+QtEa0V2IwUDWS097p3SlLvozw
46+ucWxwTJttCHLzUmNN7w1cIv0w/OHh5IGh+wWjV9pbO0VT3/r2jxkzqksKOYAb5CYzSNRyEwp+NIKr
Y+aJz7myu4Unn9de4cYsuXoAB6FQ5I8AAAEBAJSmDndXJCm7G66qdu3ElsLT0Jlz/es9F27r+xrg5pZ5
GjfBCRvHNo2DF4YW9MKdUQiv+ILMY8OISduTeu32nyA7dwx7z5M8b+DtasRAa1U03EfpvRQps6ovu79m
bt1OE8LS9ql8trx8qyIpYmJxmzIdBQ+kzkY+9ZlaXsaU0Ssuda7xPrX4405CbnKcpvM6q6okMP86Ejjn
75Cfzhv65hJkCjbiF7FZxosCRIuYbhEEKu2Z9Dgh+ZbsZ+9FETZVzKBs4fySA6dIw6zmGINd+KY6umMW
yJNej2Sia70fu3XLHj2yBgN5cy8arlZ80q1Mcy763RjYGkR/FkLJ611HWIA= thisuser@thishost

to [4]:

from=”10.1.1.1″,command=”/home/remoteuser/cron/validate-rsync” ssh-dss AAAAB3Nza
C1kc3MAAAEBAKYJenaYvMG3nHwWxKwlWLjHb77CT2hXwmC8Ap+fG8wjlaY/9t4uA+2qx9JNorgdrWKhH
SKHokFFlWRj+qk3q+lGHS+hsXuvta44W0yD0y0sW62wrEVegz+JVmntxeYc0nDz5tVGfZe6ydlgomzj1
bhfdpYe+BAwop8L+EMqKLS4iSacNjoPlHsmqHMnbibn3tBqJEq2QJjEPaiYj1iP5IaCuYBhuTKQGa+oy
H3mXEif5CKdsIKBj46B0tCy0/GC7oWcUN92QdLrUyTeRJZsTWsxKpRbMliD2pBh4oyX/aXEf8+HZBrO5
vQjDBCfTFQA+35Xrd3eTVEjkGkncI0SAeUAAAAVAMZSASmQ9Pi38mdm6oiVXD55Kk2rAAABAE/bA402V
uCsOLg9YS0NKxugT+o4UuIjyl6b2/cMmBVWO39lWAjcsKK/zEdJbrOdt/sKsxIK1/ZIvtl92DLlMhci5
c4tBjCODey4yjLhApjWgvX9D5OPp89qhah4zu509uNX7uH58Zw/+m6ZOLHN28mV5KLUl7FTL2KZ583Kr
cWkUA0Id4ptUa9CAkcqn/gWkHMptgVwaZKlqZ+QtEa0V2IwUDWS097p3SlLvozw46+ucWxwTJttCHLzU
mNN7w1cIv0w/OHh5IGh+wWjV9pbO0VT3/r2jxkzqksKOYAb5CYzSNRyEwp+NIKrY+aJz7myu4Unn9de4
cYsuXoAB6FQ5I8AAAEBAJSmDndXJCm7G66qdu3ElsLT0Jlz/es9F27r+xrg5pZ5GjfBCRvHNo2DF4YW9
MKdUQiv+ILMY8OISduTeu32nyA7dwx7z5M8b+DtasRAa1U03EfpvRQps6ovu79mbt1OE8LS9ql8trx8q
yIpYmJxmzIdBQ+kzkY+9ZlaXsaU0Ssuda7xPrX4405CbnKcpvM6q6okMP86Ejjn75Cfzhv65hJkCjbiF
7FZxosCRIuYbhEEKu2Z9Dgh+ZbsZ+9FETZVzKBs4fySA6dIw6zmGINd+KY6umMWyJNej2Sia70fu3XLH
j2yBgN5cy8arlZ80q1Mcy763RjYGkR/FkLJ611HWIA= thisuser@thishost

kde “10.1.1.1” je IP (verze 4 [5]) adresa thishost a “/home/remoteuser/cron/validovat-rsync” (což je jen jedním z několika možností [6], včetně úprav [7 ] pro zvýšení bezpečnosti) je skript, který vypadá asi takto:

#!/bin/sh

case “$SSH_ORIGINAL_COMMAND” in
*\&*)
echo “Rejected”
;;
*\(*)
echo “Rejected”
;;
*\{*)
echo “Rejected”
;;
*\;*)
echo “Rejected”
;;
*\<*)
echo “Rejected”
;;
*\>*)
echo “Rejected”
;;
*\`*)
echo “Rejected”
;;
*\|*)
echo “Rejected”
;;
rsync\ –server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo “Rejected”
;;
esac

Pokud thishost má proměnlivou adresu, nebo sdílí jeho adresu (přes NAT nebo něco podobného) s hostiteli, kterým nedůvěřujete, vynechejte ‚from =‚10.1.1.1‘,‘ část linky (včetně čárka), ale opustit ‚příkaz‘ část. Tímto způsobem, pouze ‚rsync‘ bude možné od připojení pomocí tohoto klíče. Ujistěte se, že scénář ‚ověřit, rsync‘ je spustitelný remoteuser na remotehost a vyzkoušet.

POZNÁMKA: soukromý klíč, ačkoli nyní poněkud omezen v tom, co to může dělat (a doufejme, kde to lze provést z), umožňuje, aby vlastník zkopírovat libovolný soubor z remotehost že remoteuser přístup. To je nebezpečné, a já by měly učinit všechna opatření I považují za nezbytné pro udržení bezpečnosti a utajení tohoto klíče. Některé z možností by bylo zajištění řádného oprávnění souborů jsou přiřazeny [8], zvažte použití klíče démona cache, a zvážit, zda opravdu potřebujeme tento proces automatizovaný verše rizika.

Všimněte si také: Další detail zabezpečení, aby zvážila, konfigurace SSH daemon na remotehost. Tento příklad je zaměřen na uživatele (remoteuser), který není kořenem. I nedoporučujeme používat kořen jako vzdáleného uživatele, protože root má přístup ke každému souboru na remotehost. sám, že schopnost je velmi nebezpečné, a sankce za chyby nebo konfigurací může být mnohem prudší, než pro ‚normální‘ uživatel. Pokud nechcete použít kořen jako vzdálený uživatel (někdy), a rozhodovat zabezpečení pro remotehost, doporučuji buď:

PermitRootLogin no

nebo:

PermitRootLogin forced-commands-only

být zahrnuty do ‘etc//sshd_config/ssh’ souboru na remotehost. Jedná se o globální nastavení, a to nejen v souvislosti s tímto připojením, tak se určitě nemusíte schopnost tyto možnosti konfigurace zakázat. [9].

Dále jen ‚AllowUsers‘, ‚‘, ‚AllowGroups DenyUsers‘, a klíčová slova ‚DenyGroups‘ lze použít k omezení přístupu SSH na konkrétní uživatele a skupiny. Jsou popsány v manuálové stránce „sshd_config“, ale zmíním, že všichni mohou použít ‚*‘ a ‚?‘ jako zástupné znaky umožnit a zakázat přístup k uživatelům a skupinám, které odpovídají vzory. ‚AllowUsers‘ a ‚DenyUsers‘ může také omezit hostitelem, když je vzor v USER@HOST formě.

Poradce při potížích

Teď, když mám klíč bez hesla na svém místě a nakonfigurován, musím vyzkoušet si to dříve, než ji v cronu (která má svou vlastní malou sadu zavazadel). exit I z SSH do remotehost a pokusit [10]:

$ rsync -avz -e “ssh -i /home/thisuser/cron/thishost-rsync-key” remoteuser@remotehost:/remote/dir /this/dir/

Pokud to nebude fungovat, budu startovat na „příkaz“ omezení na klíč a zkuste to znovu. Pokud se zeptá na heslo, budu kontrolovat oprávnění k souboru soukromého klíče (na thishost, by měla být 600) o ‚authorized_keys‘ a (na remotehost, by měla být 600), na ‚~ /.ssh/‘ adresáře ( na obou hostitelích, by měla být 700), a na domovské adresáře ( ‚~ /‘) sama o sobě (na obou hostitelích, by neměla být zapisovat nikým kromě uživatele). Dojde-li k některé mystický ‚rsync‘ chyba protokolu zmínku scénář ‚ověřit, rsync‘ se mohu ujistit, že oprávnění na ‚potvrdit-rsync‘ (na remotehost, může být 755, je-li každý remotehost uživatel důvěryhodný) umožňují remoteuser číst a spouštět to.

Pokud se věci ještě nefungují, mohou být některé užitečné informace naleznete v log souborech. Log soubory lze obvykle nalézt v adresáři / var/log / adresáře na většině linuxových počítačů, a v adresáři /var/ log/secure log soubor na Red Hat-ish linuxových počítačů. Nejužitečnější logfiles v tomto případě budou k dispozici na remotehost, ale localhost může poskytnout nějaké straně klienta jsou informace obsažené v protokolech [11]. Pokud se nemůžete dostat do protokolů, nebo jsou jen netrpěliví, můžete říci ‚ssh‘ spustitelný poskytovat nějakou protokolování s ‚verbose‘ přikazuje: ‚-v‘, ‚-vv‘, ‚-vvv‘. Čím více V je, tím více upovídaný výstup. Jedním z nich je v příkazu výše, ale pod jednou by měla poskytnout mnohem větší výkon:

$ rsync -avvvz -e “ssh -i /home/thisuser/cron/thishost-rsync-key” remoteuser@remotehost:/remote/dir /this/dir/

Doufejme, že to bude vždy jen bezchybně fungovat, tak jsem nikdy muset rozšířit informace o řešení potíží zde [12] uvedena.

Nastavení cron

Posledním krokem je cron skript. I použít něco jako toto:

#!/bin/sh

RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
KEY=/home/thisuser/cron/thishost-rsync-key
RUSER=remoteuser
RHOST=remotehost
RPATH=/remote/dir
LPATH=/this/dir/

$RSYNC -az -e “$SSH -i $KEY” $RUSER@$RHOST:$RPATH $LPATH

protože je snadno modifikovat kousky příkazového řádku pro jednotlivé hostitele a cesty. Já se obvykle nazývají to něco jako ‚rsync remotehost-zálohy‘, pokud obsahuje zálohy. I test skript taky, jen pro případ, že pečlivě někde vloženy chybu.

Když jsem se dostat skript úspěšně běží, já používám ‚crontab -e‘ vložit řádek pro tuto novou cron:

0 5 * * * /home/thisuser/cron/rsync-remotehost-backups

pro denní 5 AM synchronizace, nebo:

0 5 * * 5 /home/thisuser/cron/rsync-remotehost-backups

za každý týden (5 AM v pátek). Měsíční a roční nich jsou vzácnější pro mne, tak se podívejte na „muže crontabu“ nebo tady o radu ty.

V pořádku! Až na každodenní „držet krok s náplastí“ věc, že záludné „skryté vady“ konfigurační straně a nezapomenutelná „totální selhání lidské logiky“ soubor problémů, moje práce zde je u konce. Užívat si!

Poznámky:
[0] The reason behind choosing a SSH key with no password, over options like ssh-agent or keychain , is that the automated process will survive a reboot of the host machine and execute at the next scheduled time without any intervention on my part (not all machines so automated are always accessable). If you do not have those requirements, these other options may lend your implementation more security.
[1] If remotehost only has SSH1 installed, you may need to use another key type. Instead of ‘rsa’ you will need to use ‘rsa1’. You can use ‘dsa’ instead of ‘rsa’, but it will still only be useful for a SSH2 connection (and key length may be an issue as noted here — thank you@avenjamin). SSH2 connections are more secure than SSH1 connections, but you’ll have to look elsewhere for the details on that (“man ssh-keygen” and Google). Also, the key creation can be done with the command ( ssh-keygen -b 2048 -f keyfile -t rsa -N ” ) to automate the “no key password part”, or ( ssh-keygen -b 2048 -f keyfile -q -t rsa -N ” ) to eliminate any output from the command.
[2] Some configurations use the file ‘authorized_keys2’ instead of ‘authorized_keys’. Look for “AuthorizedKeysFile” in ‘/etc/ssh/sshd_config’.
[3] If you use a shell other than ‘bash’ (or other bourne compatible shell), like ‘csh’ or ‘tcsh’, the commands listed may not work. Before executing them, start up a ‘bash’ (or ‘sh’, or ‘ksh’, or ‘zsh’) shell using the ‘bash’ (or ‘sh’, or ‘ksh’, or ‘zsh’) command. After completing the commands, you will have to exit the ‘bash’ shell, and then exit the shell your host spawns normally.
[4] Remember not to insert any newlines into the “authorized_keys” file. The key information, and the inserted commands associated with that key, should all be on one line. The key you generate (the nonsensical stuff on the key line) will be different from the one here. Choosing an editor that doens’t automatically “wrap” (insert newlines) the text may be pivotal here.
[5] I have seen one host ignore a properly presented IPv4 address and instead see the incoming connection as a IPv6-ish sort of address (“::fff:10.1.1.1”). I found the address in ‘/var/log/messages’ on a Fedora Core 3 Linux host, and it does allow connections from that host with the IPv6-ish version in the ‘authorized_keys’ file.
[6] Another option for validation (and more) is the Perl script located here: http://www.inwap.com/mybin/miscunix/?rrsync, though it is more complicated. A version of this Perl script is now bundled with the rsync source here:http://www.samba.org/ftp/unpacked/rsync/support/rrsync (with improvements). If you are writing a custom script, in whatever language you find comfortable, look inside this one for suggestions.
[7] By the time the ‘validate-rsync’ script runs, a SSH connection has been made with the SSH key you associated with this command in the ‘authorized_keys’ file. This example script basically tries to return ‘Rejected’ to anything other than a command that starts with “rsync –server”, which is what rsync over ssh does on the other end of the connection. I found this out by running ‘ps auxw | grep rsync’ on the remote end of the connection after initializing a long running rsync job, but an rsync pro said you can add ‘-v -v -n’ to your command line options for rsync and it will display the command it will use on the server end, so use that to make your script command more specific if you wish. The first six ‘Rejected’ lines try to elimate shell symbols that will allow a person to execute more than one command within a session (for example, a short rsync and some naughty command you don’t want running remotely). You can also force the transfer to be read only by changing the command to “rsync –server –sender*” (thanks David Fred).
[8] By proper file permissions, I mean secure file permissions. In this you are essentially defending remotehost from remoteuser, so that remoteuser would not be able to modify this setup in any way. That means that remoteuser will not own, or being able to write, the validation script or even remoteusers authorized_keys file. At this point, though, you may want to consider using “Match User” in /etc/ssh/sshd_config and use ChrootDirectory and/or ForceCommand to contain them if security is very important to you. Go as far as you see a need to go. (Thank you Yanek Martinson).
[9] “PermitRootLogin no” does what it says: the root user is not allowed to login via SSH. “PermitRootLogin forced-commands-only” requires that all connections, via SSH as root, need to use public key authentication (with a key like ‘thishost-rsync-key.pub’) and that a command be associated with that key (like ‘validate-rsync’). For more explanation, use the “man sshd_config” command. If you are using Ubuntu, please make sure the package ‘openssh-server’ is installed (it is not installed by default).
[10] All kinds of SSH command line switches can be included (quoted) within the Rsync ‘-e’ command line switch, like non-standard SSH server port connections (for example: “-p 2222” if SSH listens on port 2222), in addition to the private key (“-i identity_file”) switch. (Per Funke suggested this and referenced http://mike-hostetler.com/blog/2007/12/rsync-non-standard-ssh-port).
[11] You can find out what log file SSH will be writing to by looking in two files: ‘/etc/ssh/sshd_config’ and ‘/etc/syslog.conf’. ‘sshd_config’ contains the parameter “SyslogFacility”, which by default is set to “AUTH”, but Red Hat typically sets it to “AUTHPRIV”. Whichever it is, remember the setting and look for it in the ‘syslog.conf’ file. Usually you will find a line with ‘authpriv.*’ followed by some tabs and then the log file you are searching for. Pay no attention to lines with ‘authpriv.none’ in them, as they are probaby taking in a many kinds of messages, but disallowing those from the ‘authpriv’ syslog facility.
[12] Not likely.