Использование rsync и SSH. Ключи, проверки и автоматизации

Этот документ покрытия, используя крон, ssh, и rsync к файлам резервных копий по локальной сети или Интернету. Часть моей цели должна гарантировать, что никакое вмешательство пользователя не требуется, когда компьютер перезапущен (для паролей, ключей или ключевых менеджеров).

Мне нравится копировать некоторое журналирование, почту и конфигурационную информацию иногда об узлах по сети и Интернете, и вот способ, которым я нашел, чтобы сделать это. Вам будут нужны эти установленные пакеты:

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

Обратите внимание на то, что эти инструкции могут быть определенными для Red Hat версии 7.3, 9 Linux и Ядро Fedora 3, но я надеюсь, что им не будет слишком трудно адаптировать, почти любой *NIX type OS. Страницы справочника для ‘ssh’ и ‘rsync’ должны быть полезны Вам, если Вы должны измениться, некоторые вещи (используйте “man ssh” и “man rsync” команды).

Во-первых, я определю некоторые переменные. В моем объяснении я буду синхронизировать файлы (копирование только новых или измененных файлов) один путь, и я буду запускать этот процесс с узла, в который я хочу скопировать вещи. Другими словами, я буду синхронизировать файлы от/remote/dir/на remotehost, как remoteuser, к/this/dir/на thishost, как thisuser.

Я хочу удостовериться, что ‘rsync’ по ‘ssh’ работает вообще, прежде чем я начну автоматизировать процесс, таким образом, я тестирую его сначала как thisuser:

$ rsync -avz -e ssh
[email protected]:/remote/dir /this/dir/

и введите в пароле [email protected], когда запрошено. Я действительно должен удостовериться, что remoteuser считал полномочия в/remote/dir/на remotehost, и что у thisuser есть полномочия записи к/this/dir/на thishost. Кроме того, ‘rsync’ и ‘ssh’ должен быть по пути thisuser (использование, “который ssh” и, “который 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 [email protected]
и теперь у нас есть ключ без пароля в этих двух файлах, упомянутых выше [1]. Удостоверьтесь, что никакой другой неавторизованный пользователь не может считать файл с закрытым ключом (тот без ‘.pub’ расширение).

Этот ключ не служит никакой цели, пока мы не помещаем общедоступную часть в ‘authorized_keys’ файл [2] на remotehost, в частности тот для remoteuser:

/home/remoteuser/.ssh/authorized_keys

Я использую scp, чтобы закончить файл к remotehost:

 

$ scp/home/thisuser/cron/thishost-rsync-key.pub
[email protected]:/home/remoteuser/

и затем я могу подготовить вещи на remotehost.

Конфигурирование remotehost

Я ‘ssh’ к remotehost:

$ ssh [email protected]
[email protected]’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 демон на remotehost позволяет соединения от), и они могут сделать что-либо (что remoteuser может сделать), и я не хочу это. Я редактирую ‘authorized_keys’ файл (с vi) и изменяю строку с ‘thishost-rsync-key.pub’ информацией о нем. Я буду только добавлять несколько вещей перед тем, что уже там, изменяя строку (и что следует, всего одна строка с ужасно similated обертывание строки) от этого:

 

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= [email protected]

к этому [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= [email protected]

где “10.1.1.1” IP (версия 4 [5]) адрес thishost, и “/home/remoteuser/cron/validate-rsync” (который является только одной из нескольких опций [6], включая настройку [7], чтобы улучшить безопасность) сценарий, который выглядит примерно так:

 

#!/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

Если thishost имеет переменный адрес или совместно использует его адрес (через NAT или что-то подобное) с узлами, Вы не доверяете, опускаете ‘от = “10.1.1.1”‘, часть строки (включая запятую), но оставляют часть ‘команды’. Таким образом, только ‘rsync’ будет возможен от соединений, используя этот ключ. Удостоверьтесь, что ‘проверить-rsync’ сценарий – исполнимая программа remoteuser на remotehost, и протестируйте его.

ОБРАТИТЕ ВНИМАНИЕ НА ТО, ЧТО: закрытый ключ, хотя теперь несколько ограничено в том, что это может сделать (и надо надеяться где это может быть сделано от), позволяет обладателю копировать любой файл с remotehost, к которому у remoteuser есть доступ. Это опасно, и я должен принять любые меры предосторожности, которые я считаю необходимыми, чтобы поддержать безопасность и тайну этого ключа. Некоторые возможности гарантировали бы, что надлежащие полномочия файла присвоены [8], рассматривают использование ключевого демона кэширования и рассматривают, нужны ли мне действительно автоматизированные стихи этого процесса риск.

ТАКЖЕ ПРИМЕЧАНИЕ: Другая деталь безопасности, чтобы рассмотреть является конфигурацией демона SSH на remotehost. Этот пример фокусируется на пользователе (remoteuser), кто не корень. Я рекомендую не использовать корень в качестве удаленного пользователя, потому что у корня есть доступ к каждому файлу на remotehost. Одна только та возможность очень опасна, и штрафы за ошибку, или неверная конфигурация может быть намного более крутой, чем те для ‘нормального’ пользователя. Если Вы не используете корень в качестве своего удаленного пользователя (никогда), и Вы принимаете решения безопасности для remotehost, я рекомендую также:

PermitRootLogin no

или:

PermitRootLogin forced-commands-only

будьте включены в ‘/etc/ssh/sshd_config’ файл на remotehost. Это глобальные настройки, не только связанные с этим соединением, так быть уверенным, что Вам не нужна возможность, которую запрещают эти параметры конфигурации. [9].

‘AllowUsers’, ‘AllowGroups’, ‘DenyUsers’ и ключевые слова ‘DenyGroups’ могут использоваться, чтобы ограничить доступ SSH к определенным пользователям и группам. Они задокументированы в страницу справочника для “sshd_config”, но я упомяну, что они все могут использовать ‘*’ и’?’ как подстановочные знаки, чтобы позволить и запретить доступа пользователям и группам то соответствие образцы. ‘AllowUsers’ и ‘DenyUsers’ могут также ограничить узлом, когда образец находится в форме [email protected]

Исправление проблем

Теперь, когда у меня есть ключ без пароля на месте и сконфигурированный, я должен проверить его прежде, чем поместить его в задание крона (у которого есть его собственный маленький набор багажа). Я выхожу от ssh сеанса до remotehost и пробую [10]:

$ rsync -avz -e “ssh -i /home/thisuser/cron/thishost-rsync-key” [email protected]:/remote/dir /this/dir/

Если это не будет работать, я сниму ограничение “команды” на ключ и попробую еще раз. Если это попросит пароль, я проверю полномочия на файле с закрытым ключом (на thishost, должен быть 600), на ‘authorized_keys’ и (на remotehost, должен быть 600), на ‘~/.ssh /’ каталог (на обоих узлах, должен быть 700), и на корневом каталоге (‘~ /’) самом (на обоих узлах, не должно быть writeable никем, но пользователем). Если некоторая загадочная ‘rsync’ ошибка протокола произойдет, упоминая ‘проверить-rsync’ сценарий, я удостоверюсь, что полномочия на ‘проверяют-rsync’ (на remotehost, может быть 755, если каждому remotehost пользователю доверяют), позволяют remoteuser читать и выполнять его.

Если вещи все еще не удаются, немного полезной информации может быть найдено в файлах журнала. Файлы журнала, обычно находимые в/var/log/каталоге на большинстве узлов Linux, и в/var/log/secure файле журнала на выходе Red Hat узлы Linux. Самые полезные файлы журнала в этом экземпляре будут найдены на remotehost, но localhost может предоставить некоторую информацию о стороне клиента в своих журналах [11]. Если Вы не можете добраться до журналов или просто нетерпеливы, Вы можете сказать ‘ssh’ исполнимой программе предоставлять некоторому журналированию ‘многословные’ команды: ‘-v’, ‘-vv’, ‘-vvv’. Чем больше v’s, тем более многословный вывод. Каждый находится в команде выше, но тот ниже должен обеспечить намного больше вывода:

$ rsync -avvvz -e “ssh -i /home/thisuser/cron/thishost-rsync-key” [email protected]:/remote/dir /this/dir/

Хотелось бы надеяться, это будет всегда просто работать безупречно, таким образом, я никогда не должен буду расширять информацию о поиске и устранении неисправностей, перечисленную здесь [12].

Установка Cron Job

Последний шаг – сценарий крона. Я использую что-то вроде этого:

#!/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

потому что просто изменить остатки командной строки для различных узлов и путей. Я буду обычно вызывать его что-то как ‘rsync-remotehost-backups”, если это будет содержать резервные копии. Я тестирую сценарий также, на всякий случай я тщательно вставил ошибку где-нибудь.

Когда я получаю сценарий, работающий успешно, я использую ‘crontab-e’, чтобы вставить строку для этого нового задания крона:

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

для ежедневной синхронизации 5:00, или:

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

для еженедельника (5:00 по пятницам). Ежемесячные и ежегодные более редки для меня, таким образом посмотрите “на человека crontab” или здесьдля совета относительно тех.

Хорошо! За исключением повседневного “не отставания от патчей” вещь, коварная “скрытая часть” дефектов конфигурации и незабываемый “полный отказ человеческого логического” набора проблем, здесь сделана моя работа. Наслаждайтесь!
Примечания:

[0] Причина позади выбора ключа SSH без пароля, по опциям как ssh-агент или keychain для ключей, состоит в том, что автоматизированный процесс переживет перезагрузку хост-машины и выполнится в следующий запланированный раз без любого вмешательства с моей стороны (не, все машины, так автоматизированные, всегда доступны). Если у Вас нет тех требований, эти другие опции могут предоставить Вашей реализации больше безопасности.

[1] Если у remotehost только есть установленный SSH1, Вы, возможно, должны использовать другой ключевой тип. Вместо ‘rsa’ Вы должны будете использовать ‘rsa1’. Вы можете использовать ‘dsa’ вместо ‘rsa’, но это все еще только будет полезно для соединения SSH2 (и длина ключа может быть проблемой, как отмечено здесь – спасибо @avenjamin). Соединения SSH2 более безопасны, чем соединения SSH1, но Вы должны будете в другом месте искать детали о том (“man ssh-keygen” и Google). Кроме того, ключевое создание может быть сделано с командой (ssh-keygen-b 2048-f файл ключей-t rsa-N ”), чтобы не автоматизировать “ключевую часть пароля”, или (ssh-keygen-b 2048-f файл ключей-q-t rsa-N ”), чтобы устранить любой вывод из команды.

[2] Некоторые конфигурации используют файл ‘authorized_keys2’ вместо ‘authorized_keys’. Ищите “AuthorizedKeysFile” в ‘/etc/ssh/sshd_config ‘.

[3] Если Вы используете оболочку кроме ‘удара’ (или другая граница совместимая оболочка), как ‘csh’ или ‘tcsh’, перечисленные команды могут не работать. Прежде, чем выполнить их, запустите ‘удар’ (или ‘sh’, или ‘ksh’, или ‘zsh’) оболочка, используя ‘удар’ (или ‘sh’, или ‘ksh’ или ‘zsh’) команда. После завершения команд Вы должны будете выйти из оболочки ‘удара’, и затем выйти из оболочки Ваша икра узла обычно.

[4] Не забудьте не вставлять любые новые строки в “authorized_keys” файл. Ключевая информация и вставленные команды, связанные с тем ключом, должны все быть на одной строке. Ключ, который Вы генерируете (бессмысленный материал на ключевой строке) будет отличаться от той здесь. При выборе редактора, которого автоматически “обертывают” doens’t (вставляют новые строки) текст может быть основным здесь.

[5] Я видел, что один узел игнорирует правильно представленный адрес IPv4 и вместо этого рассматриваю входящее соединение как вид выхода IPv6 адреса (“:: fff:10.1.1.1”). Я счел адрес в ‘/var/log/messages’ ‘на Ядре Fedora 3 узлами Linux, и это действительно позволяет соединения от того узла с версией выхода IPv6 в’ authorized_keys’ файл.

[6] Другая опция для проверки допустимости (и больше) является сценарием Perl, расположенным здесь: http://www.inwap.com/mybin/miscunix/?rrsync, хотя это более сложно. Версия этого сценария Perl теперь связана rsync источником здесь: http://www.samba.org/ftp/unpacked/rsync/support/rrsync (с улучшениями). Если Вы пишете пользовательский сценарий, на любом языке Вы считаете удобными, посмотрите в этом для предложений.

[7] К этому времени ‘проверить-rsync’ выполнения сценария связь SSH была установлена с ключом SSH, который Вы связали с этой командой в ‘authorized_keys’ файле. Этот сценарий в качестве примера в основном пытается возвратиться ‘Отклоненный’ к чему-либо кроме команды, которая запускается с “rsync – сервер”, который является тем, что rsync по ssh делает на другом конце соединения. Я узнал это рабочим ‘PS auxw | grep rsync’ на удаленном конце соединения после инициализации длительного rsync задания, но rsync про сказало, что Вы можете добавить ‘-v-v-n ‘к Вашим параметрам командной строки для rsync, и это выведет на экран команду, которую это будет использовать на конце сервера, так использование, что, чтобы сделать Вашу команду сценария более определенной, если Вы желаете. Первые шесть’ Отклоненных ‘строк пробуют к символам оболочки elimate, которые позволят человеку выполнять больше чем одну команду в сеансе (например, короткий rsync и некоторая непослушная команда, которую Вы не хотите выполнять удаленно). Вы можете также вынудить передачу быть только для чтения, изменив команду на “rsync – сервер – отправитель*” (благодарит David Fred).

[8] Надлежащими полномочиями файла я имею в виду безопасные полномочия файла. В этом Вы по существу защищаете remotehost от remoteuser, так, чтобы remoteuser не был бы в состоянии изменить эту установку всегда. Это означает, что remoteuser не будет владеть, или способность записать, сценарий проверки допустимости или даже remoteusers authorized_keys файл. При этом, хотя, Вы можете хотеть рассмотреть использование “Пользователя Соответствия” в/etc/ssh/sshd_config и использовать ChrootDirectory и/или ForceCommand, чтобы содержать их, если безопасность очень важна для Вас. Пойдите, насколько Вы видите потребность пойти. (Спасибо Yanek Martinson).

[9] “PermitRootLogin не” делает то, что он говорит: пользователю root не разрешают войти в систему через SSH. “PermitRootLogin “вызвал команды только””, требует, что все соединения, через SSH как корень, потребность использовать аутентификацию с открытым ключом (с ключом как ‘thishost-rsync-key.pub’) и что команда связана с тем ключом (как ‘проверяют-rsync’). Для большего количества объяснения используйте “человека sshd_config” команда. Если Вы используете Ubuntu, удостоверьтесь, что пакет ‘openssh-сервер’ установлен (это не установлено по умолчанию).

[10] Все виды переключателей командной строки SSH могут быть включены (заключенные в кавычки) в Rsync ‘-e’ переключатель командной строки, как нестандартные соединения порта сервера SSH (например: “-p 2222”, если SSH слушает на порте 2222), в дополнение к закрытому ключу (“-i identity_file”) переключатель. (На Funke предложил этот и сослался на http://mike-hostetler.com/blog/2007/12/rsync-non-standard-ssh-port).

[11] Вы можете узнать, в какой файл журнала SSH будет писать, смотря в двух файлах: ‘/etc/ssh/sshd_config’ и ‘/etc/syslog.conf’. ‘sshd_config’ содержит параметр “SyslogFacility”, который по умолчанию установлен в “AUTH”, но Red Hat обычно устанавливает его в “AUTHPRIV”. Какой бы ни это, помните установку и ищите ее в ‘syslog.conf’ файле. Обычно Вы будете находить строку с ‘authpriv.*’ сопровождаемый некоторыми вкладками и затем файлом журнала Вы ищете. Не уделите внимания строкам с ‘authpriv.none’ в них, поскольку они – проребенок, берущий во многих видах сообщений, но отвергающий тем от ‘authpriv’ средства системного журнала.

[12] Вряд ли.

Источник (Original article): http://troy.jdmz.net/rsync/index.html