Download: SysadminWarsztat
Transkrypt
Download: SysadminWarsztat
Warsztat administratora Wskazówki speców: Kopie zapasowe przez rsync i SSH BEZPIECZNA PRZYSTAŃ Nie zawsze opłaca się uruchamiać napęd taśm tylko po to, żeby utworzyć kopie zapasowe lub odtworzyć kilka plików. Narzędzie rsync przesyła ważne pliki na inny komputer, skąd można je łatwo odzyskać. MARC ANDRÉ SELIG SYSADMIN wym. Prostotę kopii pełnych połączono więc z wydajnością kopii przyrostowych. W celu określenia, które dane uległy zmianie od ostatniej kopii zapasowej, rsync porównuje wielkości plików i ich znaczniki czasowe lub sumy kontrolne MD4. Rsync posiada zaawansowany mechanizm, dzięki któremu wielkie pliki nie są kopiowane w całości; kopiowane są tylko części, które uległy zmianie. Rsync sam nie transportuje danych siecią; może korzystać z dowolnego tunelu. Tradycyjnie korzystano w tym celu z protokołu zdalnej powłoki rsh; dziś jednak znacznie lepiej nadaje się do tego SSH, który szyfruje transmitowane dane. Na Rysunku 1 pokazano, jak przebiega tworzenie kopii zapasowej z użyciem narzędzi rsync i SSH. W celu zapewnienia maksymalnej ochrony w nieprzyjaznym środowisku musimy odpowiednio zabezpieczyć usługę SSH. Ewentualny błąd może narazić posiadane systemy na dostęp ze strony nieautoryzowanych osób. Protokół SSH jest następcą zdalnej powłoki rsh, dlatego jego głównym przeznaczeniem jest zdalne administrowanie. Polecenie ssh uzytkownik@host spowoduje udostępnienie użytkownikowi interfejsu powłoki komputera host. Preferowane klucze J ak mogliśmy przeczytać w ostatnim Warsztacie administratora [1], podstawą każdej strategii wykonywania kopii zapasowych jest utworzenie pełnej kopii na oddzielnym nośniku. Jednak odtwarzanie danych z taśm albo dysków CD lub DVD jest często zbyt czasochłonne. Czasami sens ma wprowadzenie procedur wykonywania kopii online, w przypadku których odtworzenie danych sprowadza się do wykonania napisanego wcześniej skryptu. Istnieją gotowe rozwiązania do tworzenia kopii zapasowych online, np. Rsnapshot [2]. W tym Warsztacie administratora pokażemy metodę wykorzystującą narzędzia rsync i SSH. Współpraca Praktyczne narzędzie rsync, współpracując z protokołem SSH, może przesłać kopię zapasową przez sieć do drugiego komputera. Połączenie tych narzędzi pozwala rozwiązać dwa problemy. Po pierwsze, kopiowanie plików nie obciąża mocno sieci, ponieważ rsync umie kompresować dane. Po drugie, SSH czyni kopie bezużytecznymi dla ewentualnych podsłuchiwaczy korzystających ze snifferów sieciowych. Rsync ma także tę zaletę, że przesyła siecią tylko te porcje danych, które uległy zmianie, łącząc je z ostatnią pełną kopią znajdującą się na komputerze docelo- Domyślnie SSH dokonuje uwierzytelnienia z użyciem hasła użytkownika. Ponadto serwer, do którego użytkownik się loguje, musi się uwiarygodnić. Do potwierdzania tożsamości serwerów SSH wykorzystuje algorytmy kryptograficzne. Gdy wszystkie podmioty biorące udział w transakcji dokonały już prawidłowego uwierzytelnienia, dane są szyfrowane i przesyłane siecią. Klient Połączenie sieciowe Pipe Rsync SSH Komputer z kopią zapasową Pipe SSH /home/ /home/frida/ /home/diego/ /backup/home/ /backup/home/frida/ /backup/home/diego/ /etc/ /backup/etc/ /etc/X11/ /backup/etc/X11/ /etc/crontab /backup/etc/crontab ... Rsync /backup/... Rysunek 1: Rsync tworzy kopie zapasowe i za pomocą SSH przesyła je na inny komputer. SSH przekazuje dane przez zwykły potok. Na drugim końcu demon SSH dostarcza je procesowi rsync. Rsync nie przesyła niezmienionych plików, tym samym oszczędzając zasoby sieciowe. WWW.LINUX-MAGAZINE.PL NUMER 17 CZERWIEC 2005 71 SYSADMIN Warsztat administratora nięcia wprowadzania hasła dla klucza; należy jednak pamiętać, że takie pominięcie hasła spowoduje pozostawienie klucza w niezabezpieczonej postaci na lokalnym dysku twardym. Bezpieczniej jest użyć agenta SSH. Program ten rozRysunek 2: Przy uwierzytelnianiu z użyciem kluczy sens ma szyfrowuje klucze prywatne po określenie hasła chroniącego klucz prywatny. Przy takim wprowadzeniu hasła i zapisuje uwierzytelnianiu podczas logowania trzeba podać hasło kluje w pamięci RAM. Z klucza cza prywatnego. prywatnego mogą korzystać wszyscy ci, którzy mają dostęp do działającej Zazwyczaj administratorzy życzą sobie taw systemie usługi sshagent. Osoba atakująca, kiej automatyzacji, żeby podawanie hasła żeby odczytać hasło, musiałaby mieć dostęp zdalnego dostępu SSH nie było konieczne. do zasobów pamięci operacyjnej. Tworzenie kopii zapasowych najczęściej odJeśli dostęp do haseł agenta ma mieć usłubywa się z poziomu usługi cron. Przy takiej ga cron lub inne skrypty, możemy wywołać metodzie uruchamiania skryptu pytanie program ssh-agent podczas lub po uruchomieo hasło stwarzałoby dużą przeszkodę. Aby go niu systemu i skierować wyniki jego działauniknąć, często zamiast haseł administratonia do pliku. Plik ten zawiera dwie zmienne rzy wybierają metodę uwierzytelniania za środowiskowe, przez które SSH korzysta pomocą pary kluczy. Taka para, składająca z usług agenta. Zazwyczaj administrator dosię z klucza publicznego i prywatnego, w unidaje zmienne pliku do zestawu zmiennych kalny sposób identyfikuje określonego użytśrodowiskowych poleceniem „.”, po którym kownika. następuje nazwa polecenia ssh-add i hasło. Do tworzenia asymetrycznej pary kluczy Od tej pory agent przechowuje klucz prywatDSA służy polecenie ssh-keygen -t dsa. Klucz ny w pamięci: prywatny, domyślnie zapisany w pliku ~/.ssh/id_dsa, pozostaje na komputerze lokalnym. Klucz publiczny (~/.ssh/id_dsa.pub) $ ssh-agent >~mas/tmp/agent.sh należy skopiować na wszystkie komputery, $ . ~mas/tmp/agent.sh do których użytkownik ma się logować. Agent pid 21681 W tym celu wystarczy zapisać treść klucza $ ssh-add publicznego na komputerze docelowym Enter passphrase for U w pliku ~/.ssh/authorized_keys. Plik ten może /Users/mas/.ssh/id_dsa: zawierać wiele kluczy (chodzi o sytuacje, $ w których dany użytkownik dysponuje wieloma parami kluczy). Tak utworzony plik wystarczy dostarczyć Od tej pory uwierzytelnianie odbywa się programom wymagającym współpracy z agenw bezpieczniejszy, asymetryczny sposób. Dotem. myślnie nie można zalogować się zdalnie jako root. Demon SSH ignoruje plik /roTunelowanie przez rsync ot/.ssh/authorized_keys. Aby zezwolić na zdalPoza zwykłym logowaniem do komputera ne logowanie przez SSH, wartość zmiennej zdalnego, SSH udostępnia inną funkcję, barPermitRootLogin w pliku /etc/ssh/sshd_config dzo przydatną z perspektywy tworzenia kopii należy zmienić na yes. zapasowych. Potrafi przekazywać dowolne dane szyfrowanym potokiem do zdalnego demona SSH. Automatyczne logowanie Dzięki temu do skopiowania katalogu na Podczas generowania pary kluczy program inny komputer wystarczy proste polecenie: ssh-keygen prosi o podanie hasła. Hasło to słucd katalog && tar cf – . | ssh uzytkownik@komży do szyfrowania klucza prywatnego. Unieputer tar xf -. Plik utworzony programem tar możliwia to zalogowanie się do innych komjest przekazywany potokiem do zdalnego deputerów nawet osobie, która włamała się do mona SSH, który ponownie wywołuje tar katalogu domowego danego użytkownika i rozpakowuje paczkę. Z tego mechanizmu (Rysunek 2). może korzystać rsync. Parametr -e ssh powoOczywiście, skrypty wykonywane automaduje przekazanie plików właśnie do oprogratycznie nie mogą żądać podania hasła. Dlatemowania SSH. Ewentualnie można odpogo też ssh-keygen dopuszcza możliwość pomi- 72 NUMER 17 CZERWIEC 2005 WWW.LINUX-MAGAZINE.PL wiednio ustawić zmienną środowiskową RSYNC_RSH: $ RSYNC_RSH=ssh $ export RSYNC_RSH Listingu 1: Kopiowanie bez zabezpieczeń 01 #!/bin/sh 02 03 . ~mas/tmp/agent.sh 04 /usr/bin/rsync -rlptH -delete /Users/ uzytkownik@hostzdalny:/export/backup Listingu 2: Lepszy sposób kopiowania 01 #!/bin/sh 02 03 AGENT=/root/agent.sh 04 05 [ -O $AGENT -a ! -w $AGENT ] || exit 255 06 07 . $AGENT 08 09 /usr/bin/rsync -rlHpt -delete /Users/ uzytkownik@hostzdalny:/export/backup Tabela 1: Opcje programu rsync -a Archiwum: przetwarzanie rekursywne z uwzględnieniem dowiązań i praw dostępu -v Pokazuj wskaźnik postępu -c Porównuj sumy kontrolne plików -C Ignoruj pliki o niekrytycznym znaczeniu -u Aktualizacja: nie zastępuj nowych plików -H Odwzoruj dowiązania stałe na komputerze docelowym -n Nic nie rób, a jedynie zasymuluj prawdziwe działanie -e ssh Nawiąż połączenie z wykorzystaniem SSH -delete Usuń z komputera docelowego te pliki, które zostały skasowane lokalnie -modify-window=N Informacja o tym, jak bardzo różniące się znaczniki czasu mają być interpretowane jako równe -z Zip: Kompresuj pliki przed przesłaniem (mniejsze zużycie zasobów sieciowych, większe obciążenie procesora) Warsztat administratora Aby za każdym razem nie ustawiać tej zmiennej ręcznie, powyższe linijki można dopisać do pliku .bashrc w katalogu domowym użytkownika. Na potrzeby zadań usługi cron zmienne te trzeba ustawić w odpowiednim pliku crontab. Inną ważną opcją programu rsync jest -a, włączająca tryb archiwizowania. W wyniku jej zastosowania przesyłane są wszystkie wskazane katalogi, w tym podkatalogi, pliki, dowiązania symboliczne i pliki urządzeń, wraz z informacjami o prawach dostępu, czasie modyfikacji, właścicielu i grupie. Jest także opcja -v, która powoduje wyświetlanie każdego przesłanego pliku, oraz -H, która wykonuje (czasochłonne) sprawdzanie i odwzorowanie dowiązań stałych. Można również podać opcję -delete, która usuwa na komputerze zdalnym te pliki, które usunięto lokalnie; powoduje to dokładne od- Właściciele i kopie zapasowe Mechanizm kopii zapasowych w naszym przykładzie tworzy pełny obraz kopiowanych katalogów na komputerze docelowym. Katalogi te można odtwarzać w locie, bez gorączkowego szukania odpowiednich taśm i bez oczekiwania całymi wiekami na ich odczytanie. Ze względów bezpieczeństwa, na komputerach docelowych system przechowuje dane z prawami dostępu właściwymi dla użytkownika nobody. Nie są więc zachowywane informacje o właścicielu plików i prawach dostępu dla grupy. W przypadku tworzenia kopii zapasowej katalogów domowych istnieje obejście tego problemu, wykorzystujące fakt, że nazwa użytkownika i grupy w takim katalogu zazwyczaj odpowiada jego nazwie: polecenie chown -R mas:users mas przywraca informacje o własności plików w katalogu domowym użytkownika mas. Takie rozwiązanie działa jednak tylko w komputerach mających identyczne konta użytkowników. Następujący miniaturowy skrypt przywraca informacje o własności katalogów domowych w kopii zapasowej na podstawie nazw tych katalogów: #!/bin/sh cd /backup for i in *; do chown -R $i:users $i done Ewentualnie można zezwolić na wykonywanie kopii zapasowych z konta root, mając jednak na uwadze wszystkie tego konsekwencje związane z bezpieczeństwem. wzorowanie kopii na komputerze zdalnym, bez pozostawiania nieużywanych już plików. Dodatkowe opcje wymieniono w Tabeli 1. Przykład Listing 1 zawiera trywialny przykład zastosowania omawianego rozwiązania. Skrypt kopiuje katalog /Users do katalogu /export/backup na komputerze hostzdalny. W linijce czwartej następuje odczytanie wcześniej wygenerowanego pliku z informacjami wymaganymi do dostępu SSH. Linijka ta nie jest potrzebna, jeśli podczas tworzenia kluczy SSH zrezygnujemy z podania hasła. Następnie skrypt wywołuje program rsync. Do zdalnego systemu logujemy się z prawami użytkownika uzytkownik. Zamiast opcji -a zastosowano tutaj opcje -rlpt, w wyniku których katalog jest kopiowany rekursywnie z uwzględnieniem dowiązań, praw dostępu i znaczników czasu. Do zachowania informacji o właścicielu i grupie, skrypt musiałby zalogować się do zdalnego systemu jako root. Ponadto opcje -H i --delete wymuszają synchronizowanie dowiązań stałych i usunięcie na zdalnym komputerze tych plików, które usunięto lokalnie. Do wykonania w pełni automatycznej kopii zapasowej wszystkich katalogów domowych wymagane są przywileje roota. Następujący wpis w pliku /etc/crontab powoduje uruchomienie skryptu co noc o godzinie 2:30: 3 2 * * * root /usr/local/bin/U Ursync-backup.sh Bezpieczeństwo Na Listingu 1 widzimy, że użytkownik mas tworzy plik agent.sh i zapisuje go w swoim katalogu domowym. Plik ten jest regularnie przetwarzany i wykonywany z prawami roota. Każdy użytkownik z dostępem do konta mas (w tym mas) może więc uruchamiać polecenia z przywilejami superużytkownika! Tę wadę usunęliśmy w programie pokazanym na Listingu 2. Plik agent.sh przeniesiono z katalogu domowego użytkownika do katalogu roota, który (jak zakładamy) jest chroniony przed zapisem przez innych użytkowników. Ponadto sprawdzamy właściciela i prawa dostępu do programu agent.sh; skrypt nie zostanie przetworzony, jeśli nie będą one właściwe. Dobrze byłoby, gdyby program do tworzenia kopii zapasowych nie musiał być wykonywany z przywilejami roota. Niestety, zazwyczaj jest to niemożliwe, chyba że tworzy- WWW.LINUX-MAGAZINE.PL SYSADMIN my kopię zapasową jednego katalogu domowego (wtedy wystarczy uruchomienie programu z prawami jego właściciela). Podatne na ataki miejsca naszego rozwiązania występują nie tylko na komputerach klientów. Odpowiedniej ochrony wymaga także komputer, na którym mają być zapisywane kopie zapasowe. W skryptach na Listingach 1 i 2 dostęp do zdalnego komputera odbywa się bez użycia konta root; logujemy się jako nieuprzywilejowany użytkownik. Jedynym przeznaczeniem takiego konta może być zapisywanie kopii zapasowych. Mimo ochrony klucza hasłem i korzystania z programu ssh-agent, klucz SSH pozostaje słabym miejscem, które może zostać wykorzystane do ataku na serwer kopii zapasowych. Gdybyśmy logowali się zdalnie jako root, atakujący mógłby przejąć całkowitą kontrolę nad takim serwerem. Wydzielone konto na potrzeby kopii zapasowych Dobrze jest więc utworzyć konto o minimalnych przywilejach, wystarczających tylko do wykonania kopii zapasowej. Taki specjalny użytkownik musiałby mieć tylko prawo do zapisu do odpowiednich katalogów z kopiami zapasowymi. W naszym przykładzie specjalny użytkownik ma jednak spore uprawnienia na komputerze źródłowym. Mianowicie, może odczytać zawartość i skopiować wszystkie katalogi domowe. W zależności od tego, czyje dane zapisane są w tych katalogach, czasem wystarczy tylko tyle, żeby atakujący mógł włamać się do komputera źródłowego. Innymi słowy, konto i komputer docelowy są zagrożone danymi znajdującymi się na komputerach źródłowych; z drugiej strony, dane hosta mogą ułatwić „dobranie się” do komputerów-klientów. Między komputerem źródłowym a docelowym istnieje relacja zaufania, którą uważny administrator powinien dobrze przeanalizować i uwzględnić. SSH umożliwia ograniczenie liczby programów, które może uruchamiać specyficzny użytkownik. Opisane mechanizmy uwierzytelniania zmniejszają ryzyko włamania do naszych komputerów. ■ INFO [1] Marc André Selig, „Warsztat administratora”: Linux Magazine 05/05, str. 72 [2] Charly Kühnast, „Migawki, ale nie na kliszy”: Linux Magazine 04/05, str. 59 NUMER 17 CZERWIEC 2005 73