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

Podobne dokumenty