Za pomocą rsync i SSH Keys, weryfikacji i Automatyzacji


Original: http://troy.jdmz.net/rsync/
Copyright: Troy Johnson

Ten dokument opisuje poprzez crona, SSH i rsync do tworzenia kopii zapasowych plików w sieci lokalnej lub Internecie. Część mojego celem jest zapewnienie nie jest wymagana interwencja użytkownika, gdy komputer zostanie ponownie uruchomiony (na hasła, klucze, lub kierowników kluczowych).
Chciałbym zapasową niektórych rejestrowanie, mail i informacje o konfiguracji czasami na hostach w sieci i Internetu, a tutaj jest sposób znalazłem to zrobić. Trzeba te pakiety zainstalowane:

rsync
openssh
cron (lub vixie-cron)

Prosimy pamiętać, instrukcje te mogą być specyficzne dla wersji Red Hat Linux 7.3, 9, Fedora Core 3, ale mam nadzieję, że nie będzie zbyt trudne, aby dostosować się do niemal dowolnego typu * nix OS. Strony man dla ‘ssh’ i ‘rsync “powinny być pomocne dla Ciebie, jeśli chcesz zmienić kilka rzeczy (użyj” man ssh “i” man rsync “Polecenia).
Po pierwsze, ja zdefiniować kilka zmiennych. W moim wyjaśnieniem, będę synchronizacji plików (kopiowanie tylko nowych lub zmienionych plików) jeden sposób, i będę rozpoczęciem tego procesu z hosta Chcę skopiować rzeczy. Innymi słowy, będę synchronizowanie plików z / remote / dir / na remotehost jak remoteuser, do / to / dir / o thishost jak thisuser.
Chcę się upewnić, że “rsync ‘over’ ssh ‘w ogóle działa, zanim zacznę na automatyzację procesu, więc przetestować go najpierw jako thisuser:
$ Rsync-AVZ-e ssh remoteuser @ remotehost :/ remote / dir / to / dir /
i wpisz hasło remoteuser @ remotehost się monit. I trzeba się upewnić, że remoteuser uprawnienia do odczytu / remote / dir / na remotehost i że thisuser ma uprawnienia do zapisu / to / dir / na thishost. Również ‘rsync’ i ‘ssh’ powinien być w drodze thisuser w (używaj “, który ssh” i “, które rsync”), “rsync” powinny być w ścieżce remoteuser, a “sshd” powinien zostać uruchomiony na remotehost.
Konfigurowanie thishost

Jeśli to wszystko się udało, a ja w końcu się to działa, jestem gotowy do następnego kroku. Muszę wygenerować prywatny / publiczny pary kluczy, aby umożliwić ‘ssh’ połączenia bez pytania o hasło. To może wydawać się niebezpieczne, a to jest, ale jest lepiej niż przechowywanie hasła użytkownika (lub hasło klucza) jako zwykły tekst w skrypcie [0]. Można również umieścić na ograniczenia, gdzie wykonane połączenia z tym kluczem może pochodzić z, i na to, co mogą zrobić, kiedy podłączona. Tak czy owak, wygenerować klucz użyję na thishost (jak thisuser):
$ Ssh-keygen-t rsa-b 2048-f / home / thisuser / cron / thishost-rsync-key
Generowanie publiczny / prywatny pary kluczy RSA.
Wprowadź hasło (hasło nie puste): [naciśnij enter here]
Wpisz to samo hasło jeszcze raz: [Press ENTER tutaj]
Twoja identyfikacja został zapisany w / home / thisuser / cron / thishost-rsync-key.
Klucz publiczny został zapisany w / home / thisuser / cron / thishost-rsync-key.pub.
Odcisk klucza jest:
2e: 28: d9: ec: 85:21: e7: ff: 73: df: 2e: 07:78: f0: d0: a0 thisuser @ thishost
a teraz mamy klucz bez hasła w dwóch plików wymienionych powyżej. [1] Upewnij się, że żaden inny nieautoryzowany użytkownik może odczytać plik z kluczem prywatnym (jeden bez “. Pub” rozszerzenia).
Ten klucz jest bezcelowa dopóki stawiamy publiczną część na ‘authorized_keys’ pliku [2] na remotehost, konkretnie jeden dla remoteuser:
/ Home / remoteuser / .ssh / authorized_keys
Używam scp aby pobrać plik na celu remotehost:
$ Scp / home / thisuser / cron / thishost-rsync-key.pub remoteuser @ remotehost :/ home / remoteuser /
i wtedy mogę przygotować rzeczy na remotehost.
Konfigurowanie remotehost

I ‘ssh’ na do remotehost:
$ Ssh remoteuser @ remotehost
hasło remoteuser @ remotehost w: [type prawidłowe hasło tutaj]
$ Echo Jestem teraz $ USER na $ HOSTNAME
Jestem teraz remoteuser na remotehost
popracować.
Muszę się upewnić, że masz katalog i pliki potrzebne do autoryzacji połączeń z tym klawiszem [3]:
$ If [! Ssh-d];.. Następnie mkdir ssh;. Chmod 700 ssh; fi
$ Mv thishost-rsync-key.pub. Ssh /
$ Cd. Ssh /
$ If [! -F authorized_keys]; następnie dotknij authorized_keys; chmod 600 authorized_keys; fi
$ Cat thishost-rsync-key.pub >> authorized_keys
Teraz klucz może być używany do podłączenia do tego hosta, ale te połączenia mogą być z dowolnego miejsca (to demon ssh na remotehost pozwala na połączenia z) i mogą zrobić wszystko (że remoteuser może zrobić), a ja tego nie chcę . I edycja ‘authorized_keys’ plik (vi) i zmodyfikować linię z informacji “thishost-rsync-key.pub” na jej temat. Ja tylko dodać kilka rzeczy przed, co już jest, zmieniając linię z tego:
ssh-dss AAAAB3NzaC1kc3MAAAEBAKYJenaYvMG3nHwWxKwlWLjHb77CT2hXwmC8Ap + fG8wjlaY/9t4u
+2 Qx9JNorgdrWKhHSKHokFFlWRj + qk3q + lGHS + hsXuvta44W0yD0y0sW62wrEVegz + JVmntxeYc0nDz
5tVGfZe6ydlgomzj1bhfdpYe + BAwop8L + EMqKLS4iSacNjoPlHsmqHMnbibn3tBqJEq2QJjEPaiYj1iP
5IaCuYBhuTKQGa + oyH3mXEif5CKdsIKBj46B0tCy0/GC7oWcUN92QdLrUyTeRJZsTWsxKpRbMliD2pBh
4oyX/aXEf8 + HZBrO5vQjDBCfTFQA +35 Xrd3eTVEjkGkncI0SAeUAAAAVAMZSASmQ9Pi38mdm6oiVXD55
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 +9 ZlaXsaU0Ssuda7xPrX4405CbnKcpvM6q6okMP86Ejjn
75Cfzhv65hJkCjbiF7FZxosCRIuYbhEEKu2Z9Dgh + ZbsZ +9 FETZVzKBs4fySA6dIw6zmGINd + KY6umMW
yJNej2Sia70fu3XLHj2yBgN5cy8arlZ80q1Mcy763RjYGkR/FkLJ611HWIA = thisuser @ thishost
tego [4]:
from = “10.1.1.1” command = “/ home / remoteuser / cron / validate-rsync” ssh-dss AAAAB3Nza
C1kc3MAAAEBAKYJenaYvMG3nHwWxKwlWLjHb77CT2hXwmC8Ap + fG8wjlaY/9t4uA +2 qx9JNorgdrWKhH
SKHokFFlWRj + qk3q + lGHS + hsXuvta44W0yD0y0sW62wrEVegz + JVmntxeYc0nDz5tVGfZe6ydlgomzj1
bhfdpYe + BAwop8L + EMqKLS4iSacNjoPlHsmqHMnbibn3tBqJEq2QJjEPaiYj1iP5IaCuYBhuTKQGa + oy
H3mXEif5CKdsIKBj46B0tCy0/GC7oWcUN92QdLrUyTeRJZsTWsxKpRbMliD2pBh4oyX/aXEf8 + HZBrO5
vQjDBCfTFQA +35 Xrd3eTVEjkGkncI0SAeUAAAAVAMZSASmQ9Pi38mdm6oiVXD55Kk2rAAABAE/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 +9 ZlaXsaU0Ssuda7xPrX4405CbnKcpvM6q6okMP86Ejjn75Cfzhv65hJkCjbiF
7FZxosCRIuYbhEEKu2Z9Dgh + ZbsZ +9 FETZVzKBs4fySA6dIw6zmGINd + KY6umMWyJNej2Sia70fu3XLH
j2yBgN5cy8arlZ80q1Mcy763RjYGkR/FkLJ611HWIA = thisuser @ thishost
gdzie “10.1.1.1” jest IP (wersja 4 [5]) adres thishost i “/ home / remoteuser / cron / validate-rsync” (który jest tylko jedną z kilku opcji [6], w tym dostosowanie [7 ] w celu zwiększenia bezpieczeństwa) to skrypt, który wygląda mniej więcej tak:
#! / Bin / sh

case “$ SSH_ORIGINAL_COMMAND” w
* \ I *)
echo “Odrzucony”
;;
* \ (*)
echo “Odrzucony”
;;
* \ {*)
echo “Odrzucony”
;;
* \, *)
echo “Odrzucony”
;;
* \ <*)
echo "Odrzucony"
;;
* \ `*)
echo "Odrzucony"
;;
* \ | *)
echo "Odrzucony"
;;
rsync \ – server *)
$ SSH_ORIGINAL_COMMAND
;;
*)
echo "Odrzucony"
;;
esac
Jeśli thishost ma zmienny adres lub akcje jego adres (poprzez NAT lub coś podobnego) z gospodarzami nie ufasz, należy pominąć 'from = "10.1.1.1", "część linii (włącznie z przecinkiem), ale pozostawić 'command' część. W ten sposób tylko "rsync" będzie możliwa od połączeń z wykorzystaniem tego klucza. Upewnij się, że 'validate-rsync "skrypt jest wykonywalny przez remoteuser na remotehost i go przetestować.
UWAGA: klucz prywatny, choć teraz nieco ograniczona, co może zrobić (i miejmy nadzieję, gdzie można to zrobić od), umożliwia posiadaczowi skopiować dowolny plik z remotehost że remoteuser ma dostęp. To jest niebezpieczne i należy podjąć wszelkie środki ostrożności, ja mam za niezbędne do utrzymania bezpieczeństwa i tajemnicy tego klucza. Niektóre możliwości byłoby zapewnienie odpowiednich uprawnień do plików są przypisane, za pomocą klucza demona buforowania, i zastanowić się, czy naprawdę trzeba ten proces zautomatyzowany ww ryzyko.
TAKŻE UWAGA: Innym szczegółem bezpieczeństwa do rozważenia jest konfiguracja demona SSH na remotehost. Przykład ten koncentruje się na użytkownika (remoteuser), który nie jest root. Nie polecam korzystania z korzenia jako zdalnego użytkownika ponieważ root ma dostęp do wszystkich plików na remotehost. Że sama zdolność jest bardzo niebezpieczne, a kary za pomyłki lub złej konfiguracji może być znacznie bardziej stroma niż dla "normalnego" użytkownika. Jeśli nie korzystasz z korzenia jako zdalnego użytkownika (ever), a podejmowanie decyzji w zakresie bezpieczeństwa dla remotehost, polecam albo:
PermitRootLogin nie
lub:
PermitRootLogin przymusowe-commands-only
być zawarte w pliku "/ etc / ssh / sshd_config 'na remotehost. Są to ustawienia globalne, nie tylko związane z tym, więc upewnij się, że nie trzeba zdolności te opcje konfiguracyjne zakazania. [8].
W "AllowUsers ',' AllowGroups ',' DenyUsers 'oraz klawisz' DenyGroups" słowa mogą być użyte, aby ograniczyć dostęp SSH do określonych użytkowników i grup. Są one udokumentowane w manualu dla "sshd_config", ale wspomnę, że wszystkie one mogą korzystać z '*' i '?' jako symbole wieloznaczne, aby umożliwić i zabronić dostępu do użytkowników i grup, że wzorce meczu. "AllowUsers" i "DenyUsers" można także ograniczyć przez hosta, gdy wzór jest w postaci użytkownik @ HOST.
Rozwiązywanie problemów

Teraz, że mam klucz bez hasła w miejscu i skonfigurowane, trzeba przetestować go przed włożeniem go cron (który ma swój własny mały zestaw bagażu). I wyjść z sesji ssh do remotehost i spróbować [9]:
$ Rsync-AVZ-e "ssh-i / home / thisuser / cron / thishost-rsync-key" remoteuser @ remotehost :/ remote / dir / to / dir /
Jeśli to nie zadziała, będzie zdjąć "command" ograniczenie na klucz i spróbuj ponownie. Jeśli pyta o hasło, będzie sprawdzić uprawnienia do pliku klucza prywatnego (na thishost, powinno być 600), na "authorized_keys" i (na remotehost, powinno być 600), w katalogu "~ /. Ssh / '( na obu komputerach, należy 700), a na katalogu ("~ /") sam (na obu komputerach, nie powinien być zapisywany przez użytkownika, ale każdy). Jeśli jakiś tajemniczy "rsync" błąd protokołu występuje wspomnieć 'validate-rsync "skrypt, I upewnij się, że uprawnienia' validate-rsync" (na remotehost, może być 755, jeśli każdy użytkownik remotehost jest zaufany) umożliwia remoteuser do odczytu i wykonania to.
Jeśli coś jeszcze nie działa, niektóre przydatne informacje można znaleźć w plikach logów. Pliki dziennika zwykle znajdują się w katalogu / var / log / katalogów na Linux-gospodarzy, w katalogu / var / log / secure pliku dziennika na temat Red Hat-ish gospodarzy Linuxa. Najbardziej przydatne logfiles w tym przypadku będzie można znaleźć na remotehost, ale localhost może dostarczyć pewnych informacji po stronie klienta w swoich dziennikach. [10] Jeśli nie możesz dostać się do kłody, lub są po prostu niecierpliwy, możesz powiedzieć wykonywalnego 'ssh', aby zapewnić pewne rejestrowanie z Komendy 'verbose': '-v', '-vv', '-vvv ". Więcej V-tych, bardziej gadatliwe wyjście. Jeden jest w powyższym poleceniu, ale jeden poniżej powinien dostarczyć znacznie więcej mocy:
$ Rsync-avvvz-e "ssh-i / home / thisuser / cron / thishost-rsync-key" remoteuser @ remotehost :/ remote / dir / to / dir /
Miejmy nadzieję, że będzie to zawsze po prostu pracować bezawaryjnie, więc nigdy nie mam do rozszerzenia informacji o rozwiązywaniu problemów wymienionych tutaj. [11]
Instalator cron

Ostatnim krokiem jest skrypt cron. Ja używam czegoś takiego:
#! / 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 = / to / dir /

$ Rsync-az-e "$ ssh-i $ KEY" $ @ $ RHOST ruser: $ RPATH $ LPATH
ponieważ jest łatwy do modyfikacji kawałki linii poleceń dla różnych komputerów i ścieżek. Ja zazwyczaj nazywają to coś jak "rsync-remotehost-backups" jeśli zawiera kopie zapasowe. Przetestować skrypt też, tylko w przypadku I starannie włożona błąd gdzieś.
Kiedy otrzymuję skrypt uruchomiony pomyślnie, używam "crontab-e", aby wstawić wiersz do nowego cron:
0 5 *** / home / thisuser / cron / rsync-remotehost-backups
do codziennej 5 AM synchronizacji, lub:
0 5 ** 5 / home / thisuser / cron / rsync-remotehost-backups
za tygodniowy (5 AM w piątki). Miesięczne i roczne z nich są rzadsze dla mnie, więc spojrzeć na "crontab man" lub tutaj porady na temat tych.

W porządku! Poza codziennym "Keeping Up z łatkami" rzeczy, podstępnej "ukryte wady konfiguracja" strony, a niezapomniane "całkowita niewydolność ludzkiej logiki" zestawu problemów, moja praca tutaj jest skończona. Enjoy!