Използване на Rsync и SSH. Ключове, валидация и автоматизиране.
* Source text URL: http://troy.jdmz.net/rsync/index.html
Този документ описва използването на Cron, SSH и Rsync за създаване на резервни копия (бекъп) на файлове в локалната мрежа или по Интернет. Една от целите ми е да премахна необходимостта от намеса на потребителя след рестартиране на компютъра (за пароли, ключове и ключови мениджъри).
Обикновено правя бекъп копия на някои логове, поща и информация относно конфигурации на мрежови хостове или в интернет и ето един удобен начин за това, който открих. Ще трябва да инсталирате следните пакети:
- Rsync
- OpenSSH
- Cron (или Vixie-Cron)
Моля, обърнете внимание, че тези инструкции може да се отнасят конкретно до Red Hat Linux версии 7.3, 9 и Fedora Core 3, но, надявам се, няма да е много трудно те да се адаптират към почти всяка операционна система *NIX.
Man страниците за "ssh" и "rsync" биха Ви били от полза, ако имате нужда да измените нещо (използвайте командите "man ssh" и "man rsync").
Първо ще дефинирам някои променливи. В обяснението си, аз ще синхронизирам файлове (ще копирам само нови или изменени файлове) в едната посока и ще започна процеса от хоста, на който искам да копирам нещата. С други думи, ще синхронизирам файлове от /remote/dir/на remotehost, като remoteuser, към/this/dir/на thishost, като thisuser.
Искам да се убедя, че “rsync” върху “ssh” работи като цяло преди да започна да автоматизирам процеса, така че първо го проверявам като thisuser:
$ rsync -avz -e ssh remoteuser@remotehost:/remote/dir/this/dir/
и въвеждам паролата за remoteuser@remotehost, когато това бъде предложено. Необходимо е да се убедя, че remoteuser има позволение за четене в/remote/dir/на remotehost, и че thisuser има позволение за запис в/this/dir/на thishost. Също така "rsync " и "ssh" трябва да са в пътеката (path) на thisuser (използвайте "which ssh" и "which rsync"), "rsync" трябва да е в пътеката на remoteuser, а "sshd" трябва да е пусната на remotehost.
Конфигурация на thishost
Ако всичко това е проработило или аз съм го накарал да проработи в крайна сметка, то аз съм готов за следващата стъпка. Трябва да генерирам два ключа, личен и публичен, за да разреша ‘ssh’ връзка без нужда от парола. Това може да звучи небезопасно и е така, но е по-добре от запазването на потребителска парола (или ключова парола) като открит текст в скрипта [0] . Също така мога да поставям ограничения откъде могат да идват връзките, осъществени с този ключ, и какво могат да правят те след свързване. Във всеки случай генерирам ключа, който ще ползвам на
thishost (като 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
и ние вече имаме ключ без парола в двата горепосочени файла [1]. Убедете се, че друг неопълномощен потребител не може да прочете личния ключ (този с ‘.pub’ разширението).
Този ключ не служи за нищо, докато не добавим публичната част към
"authorized_keys" файла [2] на remotehost, в частност тази за remoteuser:
/home/remoteuser/.ssh/authorized_keys
Използвам scp, за да пренеса файла върху remotehost:
$ scp/home/thisuser/cron/thishost-rsync-key.pub remoteuser@remotehost:/home/remoteuser/
и тогава мога да подготвя нещата на remotehost.
Конфигурация на remotehost
Получавам достъп до remotehost със ‘ssh’:
$ ssh remoteuser@remotehost
remoteuser@remotehost’s password: [type correct password here]
$ echo I am now $USER at $HOSTNAME
I am now remoteuser at remotehost
за да извърша някои неща.
Трябва да съм сигурен, че работя с необходимата директория и файлове, за да разрешавам връзки с този ключ [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
Сега ключът може да се използва, за да се осъществяват връзки с този хост, но тези връзки могат да идват отвсякъде (откъдето ssh daemon-ът на remotehost позволява връзки) и те могат да правят всичко (което remoteuser може да прави), а това не е желателно. Аз ще редактирам "authorized_keys" файла (с vi) и ще модифицирам реда с информацията “thishost – Rsync – key.pub”. Ще добавя само няколко неща пред това, което вече е там, променяйки реда от следното:
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
на следното [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
където "10.1.1.1" е IP (версия 4 [5]) адресът на thishost, а "/home/remoteuser/cron/validate-rsync" (който е само една от няколко опции, включително кустомизация за повишаване на сигурността) е скрипт, който изглежда горе-долу така:
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
*\|*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac