Zaszyfruj chmurę, czyli jak zapewnić poufność swoich danych
To, że władze państw interesują się komunikacją internautów i danymi, które przechowują na serwerach dostawców, nie jest żadną niespodzianką – Edward Snowden w zasadzie tylko potwierdził i uściślił podejrzenia. My w Oktawave jesteśmy z dala od Stanów Zjednoczonych i amerykańskie prawo (umożliwiające służbom praktycznie nieograniczony dostęp do prywatnych danych) nas nie obowiązuje. To jednak nie znaczy, że jako dostawca chmury jesteśmy w stanie zapewnić użytkownikom absolutną prywatność. Działając w ramach obowiązującego w Polsce prawa, nie możemy w pewnych sytuacjach odmówić udostępnienia danych użytkowników stronom trzecim, np. policji posiadającej nakaz prokuratorski lub sądowy.
Najlepszy sposób na zachowanie prywatności w Internecie brzmi: nie ufaj nikomu. Jeśli chcesz zwiększyć bezpieczeństwo swoich danych, tak byśmy nawet my nie mogli uzyskać do nich dostępu, a przejęte przez strony trzecie obrazy dysków były dla nich bezużyteczne, musisz sięgnąć po techniki kryptograficzne i sam się zabezpieczyć. Na szczęście nie jest to trudne: dziś pokażemy Ci, jak stworzyć w chmurze Oktawave zaszyfrowany dysk i jak z niego korzystać.
To musisz wiedzieć na początku
Zanim przystąpisz do tworzenia szyfrowanych dysków, zastanów się nad kilkoma kwestiami. Pierwszą z nich jest zarządzanie kluczami szyfrującymi i ich przechowywaniem. Jedno jest pewne: swojego klucza nie powinieneś trzymać w chmurze – powinien on być trzymany tak daleko od danych, jak to jest tylko możliwe. Dobrym rozwiązaniem jest nauczenie się na pamięć frazy odszyfrowującej - polecamy do tego techniki opisane tutaj.
Warto też zaznaczyć, że powinieneś zmienić domyślne hasło roota oraz wyłączyć konto supportowe Oktawave. Wiąże się to z pewnym ryzykiem - jeśli coś pójdzie nie tak, nikt nie będzie mógł Ci pomóc w konfiguracji Twoich usług, ale o to przecież chodzi, prawda?
Druga kwestia to system szyfrowania. Ze względu na wyższe koszty utrzymania instancji Windows, trudności w zabezpieczeniu tego systemu i słabości jego systemu szyfrowania EFS (dane z oryginalnego niezaszyfrowanego pliku pozostają na dysku po stworzeniu nowej, zaszyfrowanej wersji), będziemy korzystać z Linuksa. Tutaj najprościej zastosować działający w przestrzeni użytkownika system EncFS, ale jest on ograniczony w możliwościach, nie chroni przed ciekawskim administratorem z dostępem root. Dlatego o wiele lepiej wykorzystać dobrze zintegrowany z jądrem system dm-crypt/LUKS, pozwalający na szyfrowanie całych partycji w sposób „przezroczysty” dla systemu plików.
A jaki szyfr wybrać? Domyślnie najczęściej obecnie wybiera się dziś AES. W jądrze Linuksa są też inne szyfry blokowe o wysokim poziomie bezpieczeństwa, np. Serpent, Twofish i Camellia - sugerujemy zaznajomienie się z tematem i wybranie dla siebie najlepszej opcji. W rozważaniach należy uwzględnić okres, przez jaki zaszyfrowane dane mają pozostać bezpieczne, czyli po prostu długość klucza.
Trzecia sprawa to przemyślenie, co chcesz szyfrować. Tworząc szyfrowane obrazy maszyn wirtualnych, należy pamiętać o partycji swap, a konkretnie o tym, że powinniśmy ją szyfrować, ze względu na rolę, jaką pełni w systemie. Nie można zapomnieć o szyfrowaniu katalogów domowych (/home/*) i katalogów tymczasowych (/tmp). Zaszyfrowanie całego dysku nie jest możliwe – trzeba przynajmniej mieć odszyfrowaną partycję /boot, by mogła ona wystartować.
Ostatnia wreszcie kwestia to problem restartów instancji. Jeśli używasz obrazów starszych wersji Linuksa z bootloaderem grub v1 (np. Debian 6), wówczas bootloader ten będzie próbował podłączyć szyfrowaną partycję automatycznie podczas startu. Wówczas Twoja instancja nie "wstanie" automatycznie: będzie czekała na hasło do podłączenia zaszyfrowanej partycji. Dlatego musisz wcześniej przeedytować konfigurację bootloadera i wyłączyć automatyczne montowanie systemów plików LUKS. Po restarcie instancji zalogujesz się przez SSH do maszyny wirtualnej i ręcznie podłączysz szyfrowaną partycję. Jak to zrobić – dowiesz się z dokumentacji grub.
Lepiej jednak skorzystać z nowszych dystrybucji, korzystających z bootloadera grub v2 (np. Debian 7). Problemu tego nie ma – system wystartuje bez podłączonej szyfrowanej partycji.
Stworzenie wolumenu OVS i partycjonowanie
Zakładamy, że posiadasz już wirtualną maszynę OCI w Oktawave. Jeśli nie, możesz ją założyć wg wskazówek zawartych w naszej dokumentacji. W poniższym przykładzie będziemy wykorzystywali Debiana 7, ale z niewielkimi zmianami wszystkie opisane poniżej operacje można przeprowadzić w dystrybucjach takich jak Ubuntu, CentOS, OpenSUSE czy Gentoo.
Jeśli masz już uruchomioną instancję, dodajmy do niej dysk. W panelu OKTAWAVE | SERVICES | Oktawave Volume Storage kliknij przycisk ADD STORAGE, podając kolejno jego nazwę (np. crypto_1), wydajność (od Tier-1 do Tier-5), rozmiar w GB i nazwę maszyny wirtualnej, do której szyfrowana partycja będzie podłączona.
Uwaga: ze względu na narzut generowany przez mechanizm szyfrujący dane „w locie”, warto wybrać o jeden poziom wyższą wydajność, niż ta, który planowałbyś dla nieszyfrowanej partycji.
Po kliknięciu przycisku ADD, wolumen OVS zostanie dodany do maszyny wirtualnej. Jak się do niego dostać z poziomu systemu operacyjnego? Zaloguj się jako administrator (root) przez SSH, a po znaku zachęty wpisz, co następuje.
Poznasz w ten sposób nazwę dysku w systemie urządzeń – komunikat informujący o podłączeniu dysku /dev/sdb będzie wyglądał np. tak:
Stwórz partycję na dysku, za pomocą następującego polecenia.
W narzędziu cfdisk utwórz partycję wybierając z menu New, ustalając typ na Primary (główna) i wpisując rozmiar – w naszym wypadku wystarczy wybrać domyślny rozmiar, obejmujący całe 5 GB wolumenu. Z menu wybierz teraz Type, by wybrać typ systemu plików i wybierz z listy 83 – oznaczający partycję Linuksa. Finalnie zapisz wprowadzone zmiany, wybierając z menu Write, potwierdź wszystkie operacje wpisując yes, i wyjdź z cfdiska wybierając Quit.
Stworzyłeś w ten sposób partycję /dev/sdb1.
Zaszyfrowanie partycji
Gdy masz już dysk OVS podłączony do wirtualnej maszyny, zainstaluj pakiety mechanizmu szyfrowania dm-crypt, wpisując w powłoce następujące polecenie.
Teraz należy sformatować zaszyfrowany dysk.
Podczas formatowania zostaniesz zapytany o frazę szyfrującą (passphrase). Podaj ciąg o odpowiednim poziomie złożoności, składającą się przynajmniej z kilkunastu liter, w tym znaków specjalnych (np. „Marysia-miala-owieczke-bial0”). Zapamiętaj ją dobrze, nie zapisuj jej nigdzie. Jeśli ją zapomnisz, nie odzyskasz zaszyfrowanych informacji z dysku.
Sprawdź teraz, czy wszystko odbyło się poprawnie.
# cryptsetup luksDump /dev/sdb1
Powinieneś otrzymać w rezultacie komunikat analogiczny do następującego.
Podłączenie zaszyfrowanej partycji do systemu
Aby móc wykorzystywać zaszyfrowaną partycję, musisz stworzyć odwzorowanie urządzenia, pozwalające na jego zamontowanie w systemie plików. W tym celu wpisz w konsoli, co następuje.
Zostaniesz zapytany o frazę szyfrującą („Marysia-miala...”), więc wprowadź ją.
Teraz pozostaje sformatować odwzorowaną partycję w jednym z obsługiwanych przez Linuksa systemów plików. Tutaj wybraliśmy popularny ext4.
Teraz, gdy wszystko zostało już skonfigurowane, pozostaje podłączyć szyfrowaną partycję do linuksowego systemu.
Możesz też sprawdzić status podłączonej partycji.
Jeśli teraz chcesz przenieść któryś z systemowych katalogów na szyfrowaną partycję (np. /tmp), można to zrobić następująco.
Powinieneś sprawdzić w dokumentacji aplikacji, których używasz na serwerze, gdzie przechowują one swoje pliki. Najczęściej będą to katalogi takie jak /tmp/aplikacja czy /var/log/aplikacja.
Po powiązaniu systemowych katalogów do szyfrowanej partycji przeedytuj plik /etc/fstab, tak aby wprowadzone zmiany pozostawały na stałe. Poniższa linijka wprowadza takie powiązanie dla /tmp.
Automatyzacja podłączania szyfrowanej partycji
Przy starcie instancji w chmurze szyfrowana partycja nie będzie automatycznie uruchamiana. Aby uprościć proces jej podłączania, warto przygotować sobie odpowiedni skrypt.
Po zapisaniu go (z nazwą np. /usr/local/sbin/mount_luks.sh) i nadaniu mu praw uruchamiania przez administratora (chmod 700 /usr/local/sbin/mount_luks.sh), skrypt ten pozwoli na podłączenie szyfrowanej partycji do systemu po restarcie – wystarczy wydać polecenie mount_luks.sh.
Oczywiście skrypt taki może robić znacznie więcej – np. uruchamiać serwer WWW, obsługujący aplikację webową, której dane przechowywane są na zaszyfrowanej partycji. Szczegółowe informacje o uruchamianiu w ten sposób usług czy serwerów znajdziesz w ich dokumentacji.
Przesyłanie informacji na szyfrowaną partycję
Na nic szyfrowanie, jeśli dane, które mają znaleźć się na zaszyfrowanej partycji nie będą przesyłane tam w sposób bezpieczny. Nie możesz do tego używać zwykłego FTP, polecamy wykorzystanie SFTP, czyli SSH File Transfer Protocol. Jeśli masz zainstalowany pakiet openssh-server w swojej wirtualnej maszynie, to masz wszystko, czego potrzebujesz od strony serwera. Dostęp od strony swojego komputera możesz uzyskać przez programy takie jak Filezilla czy WinSCP, których opis wykracza poza zakres tego poradnika. Wystarczy pamiętać, że do zalogowania się wystarczy wykorzystać login i hasło, jakie wykorzystujesz do logowania się po SSH.
To oczywiście wierzchołek góry lodowej, związanej z zabezpieczaniem zdalnych zasobów w chmurze. Aby zwiększyć bezpieczeństwo dostępu, warto całkowicie zrezygnować z haseł logowania i wykorzystać uwierzytelnianie za pomocą kryptografii klucza publicznego. Można też założyć własną sieć prywatną, by łączyć się z maszyną wirtualną w sposób znacznie utrudniający przechwycenie naszej komunikacji. Jak to zrobić, pokażemy w kolejnych poradnikach.
Maciej Kuźniar, prezes Oktawave sp. z o.o. oraz główny architekt. Pasjonat technologii związanych z przetwarzaniem i przechowywaniem danych, posiadający 10 lat doświadczenia w pracy dla klientów klasy enterprise (banki, telekomy, FMCG). Autor koncepcji technologicznie wspierających rozwój startupów oraz rozwiązań architektonicznych gwarantujących wysokie HA i SLA dla systemów IT.