Cześć, Habrżytel! W książce David Clinton opisuje 12 rzeczywistych projektów, w tym automatyzację systemu tworzenia kopii zapasowych i przywracania, konfigurację osobistej chmury plikowej w stylu Dropbox oraz tworzenie własnego serwera MediaWiki. Na interesujących przykładach poznasz wirtualizację, odzyskiwanie po awarii, bezpieczeństwo, tworzenie kopii zapasowych, wdrażanie DevOps oraz rozwiązywanie problemów systemowych. Każdy rozdział kończy się przeglądem praktycznych zaleceń, słownikiem nowych terminów oraz ćwiczeniami.
Fragment „10.1. Tworzenie tunelu OpenVPN”
W tej książce już sporo mówiłem o szyfrowaniu. SSH i SCP mogą chronić dane przesyłane przez połączenia zdalne (rozdział 3), szyfrowanie plików pozwala zabezpieczyć dane w przechowywaniu na serwerze (rozdział 8), a certyfikaty TLS/SSL mogą chronić dane podczas ich przesyłania między stronami a przeglądarkami klientów (rozdział 9). Ale czasami Twoje dane wymagają ochrony w szerszym zakresie połączeń. Na przykład, być może niektórzy członkowie Twojego zespołu muszą pracować w drodze, łącząc się z siecią przez Wi-Fi w publicznych punktach dostępu. Zdecydowanie nie należy zakładać, że wszystkie takie punkty dostępu są bezpieczne, ale Twoim ludziom potrzebny jest sposób dostępu do zasobów firmy — i w tym przypadku pomoże VPN.
Dobrze zaprojektowany tunel VPN zapewnia bezpośrednie połączenie między zdalnymi klientami a serwerem w taki sposób, aby ukrywać dane podczas ich przesyłania przez niebezpieczną sieć. I co z tego? Już widziałeś wiele narzędzi, które mogą to zrobić za pomocą szyfrowania. Prawdziwa wartość VPN polega na tym, że po otwarciu tunelu można podłączać zdalne sieci, jakby wszystkie były lokalne. W pewnym sensie korzystasz z obejścia.
Korzystając z takiej rozszerzonej sieci, administratorzy mogą wykonywać swoją pracę na swoich serwerach z dowolnego miejsca. Ale co ważniejsze, firma z zasobami rozproszonymi w kilku oddziałach może uczynić je widocznymi i dostępnymi dla wszystkich grup, które ich potrzebują, niezależnie od tego, gdzie się znajdują (rys. 10.1).
Sam tunel sam w sobie nie gwarantuje bezpieczeństwa. Jednak jeden ze standardów szyfrowania może być włączony w strukturę sieci, co znacznie zwiększa poziom bezpieczeństwa. Tunele stworzone przy użyciu pakietu OpenVPN z otwartym kodem źródłowym korzystają z tego samego szyfrowania TLS/SSL, o którym już czytałeś. OpenVPN nie jest jedyną dostępną opcją do tunelowania, ale jest jedną z najbardziej znanych. Uważa się, że jest nieco szybszy i bezpieczniejszy niż alternatywny protokół tunelowania na poziomie 2, który wykorzystuje szyfrowanie IPsec.
Czy chcesz, aby w Twoim zespole wszyscy bezpiecznie komunikowali się ze sobą, będąc w drodze lub pracując w różnych budynkach? W tym celu należy stworzyć serwer OpenVPN, aby umożliwić współdzielenie aplikacji i dostęp do lokalnego środowiska sieciowego serwera. Aby to działało, wystarczy uruchomić dwie maszyny wirtualne lub dwa kontenery: jeden do pełnienia roli serwera/gospodarza, a drugi jako klient. Stworzenie VPN to skomplikowany proces, dlatego warto poświęcić kilka minut na zobrazowanie całości.

10.1.1. Konfigurowanie serwera OpenVPN
Zanim zaczniesz, podam Ci przydatną radę. Jeśli zamierzasz wszystko zrobić samodzielnie (co zdecydowanie polecam), prawdopodobnie odkryjesz, że pracujesz z kilkoma oknami terminala otwartymi na pulpicie, z których każde jest podłączone do swojej maszyny. Istnieje ryzyko, że w pewnym momencie wpiszesz polecenie nie do tego okna. Aby tego uniknąć, możesz użyć polecenia hostname, aby zmienić nazwę maszyny wyświetlaną w wierszu polecenie na coś, co jasno pokaże Ci, gdzie się znajdujesz. Gdy to zrobisz, musisz wylogować się z serwera i zalogować ponownie, aby nowe ustawienia weszły w życie. Oto jak to wygląda:

Trzymając się tego podejścia i nadając odpowiednie nazwy każdej maszynie, z którą pracujesz, będziesz mógł łatwo śledzić, gdzie się znajdujesz.
Po użyciu hostname możesz napotkać irytujące komunikaty Unable to Resolve Host OpenVPN-Server podczas wykonywania kolejnych poleceń. Zaktualizowanie pliku /etc/hosts odpowiednią nową nazwą hosta powinno rozwiązać problem.
Przygotowanie Twojego serwera do OpenVPN
Aby zainstalować OpenVPN na swoim serwerze, potrzebne są dwa pakiety: openvpn i easy-rsa (do zarządzania procesem generowania klucza szyfrującego). Użytkownicy CentOS powinni najpierw zainstalować repozytorium epel-release, jeśli to konieczne, tak jak robiliście to w rozdziale 2. Aby móc sprawdzić dostęp do aplikacji serwerowej, możesz także zainstalować serwer WWW Apache (apache2 dla Ubuntu i httpd na CentOS).
Podczas konfigurowania serwera polecam aktywację zapory, która zablokuje wszystkie porty, z wyjątkiem 22 (SSH) i 1194 (domyślny port OpenVPN). Ten przykład ilustruje, jak działa ufw w Ubuntu, ale jestem pewien, że nadal pamiętasz o programie firewalld CentOS z rozdziału 9:
# ufw enable
# ufw allow 22
# ufw allow 1194Aby zezwolić na wewnętrzne routowanie między interfejsami sieciowymi na serwerze, musisz odkomentować jeden wiersz (net.ipv4.ip_forward = 1) w pliku /etc/sysctl.conf. To pozwoli na przekierowywanie zdalnych klientów w miarę ich łączenia. Aby nowa opcja zaczęła działać, uruchom polecenie sysctl -p:
# nano /etc/sysctl.conf
# sysctl -pTeraz środowisko serwerowe jest w pełni skonfigurowane, ale trzeba jeszcze wykonać kilka rzeczy, zanim będziesz gotowy: musisz przejść przez następujące kroki (szczegółowo omówimy je później).
- Utwórz na serwerze zestaw kluczy dla infrastruktury kluczy publicznych (PKI) za pomocą skryptów dostarczonych z pakietem easy-rsa. W istocie serwer OpenVPN działa również jako własny urząd certyfikacji (CA).
- Przygotuj odpowiednie klucze dla klienta
- Skonfiguruj plik server.conf dla serwera
- Skonfiguruj swojego klienta OpenVPN
- Sprawdź swój VPN
Generowanie kluczy szyfrujących
Aby nie komplikować spraw, można skonfigurować swoją infrastrukturę kluczy na tej samej maszynie, na której działa serwer OpenVPN. Jednak w zaleceniach dotyczących bezpieczeństwa często sugeruje się użycie osobnego serwera CA do wdrożeń w środowisku produkcyjnym. Proces generowania i dystrybucji zasobów klucza szyfrującego do użycia w OpenVPN ilustruje rys. 10.2.

Kiedy instalowałeś OpenVPN, automatycznie utworzono katalog /etc/openvpn/, ale obecnie jest on pusty. Pakiety openvpn i easy-rsa zawierają przykłady plików szablonów, które możesz wykorzystać jako podstawę dla swojej konfiguracji. Aby uruchomić proces certyfikacji, skopiuj katalog szablonu easy-rsa z /usr/share/ do /etc/openvpn i przejdź do katalogu easy-rsa/:
# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsaKatalog easy-rsa teraz będzie zawierał dość wiele skryptów. W tabeli 10.1 wymienione są narzędzia, które będziesz używać do generacji kluczy.

Wymienione operacje wymagają uprawnień roota, dlatego musisz stać się rootem za pomocą sudo su.
Pierwszy plik, z którym będziesz pracować, nazywa się vars i zawiera zmienne środowiskowe, których easy-rsa używa przy generowaniu kluczy. Musisz edytować ten plik, aby używać własnych wartości zamiast wartości domyślnych, które już są. Oto jak będzie wyglądał mój plik (listing 10.1).
Listing 10.1. Główne fragmenty pliku /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"Uruchomienie pliku vars pozwoli przekazać jego wartości do środowiska powłoki, skąd zostaną one włączone do treści twoich nowych kluczy. Dlaczego polecenie sudo samo w sobie nie działa? Ponieważ na pierwszym etapie edytujemy skrypt o nazwie vars, a następnie go stosujemy. Stosowanie oznacza, że plik vars przekazuje swoje wartości do środowiska powłoki, skąd zostaną włączone do treści twoich nowych kluczy.
Upewnij się, że uruchomisz plik ponownie, używając nowej powłoki, aby zakończyć niedokończony proces. Po wykonaniu tych kroków, skrypt poprosi cię o uruchomienie innego skryptu, clean-all, aby usunąć wszelkie zawartości z katalogu /etc/openvpn/easy-rsa/keys/:

Oczywiście, następnym krokiem będzie uruchomienie skryptu clean-all, a następnie build-ca, który używa skryptu pkitool do stworzenia certyfikatu głównego. Zostaniesz poproszony o potwierdzenie ustawień identyfikacji podanych w vars:
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private keyNastępnie następuje skrypt build-key-server. Ponieważ używa on tego samego skryptu pkitool razem z nowym certyfikatem głównym, zobaczysz te same pytania dotyczące potwierdzenia tworzenia pary kluczy. Kluczom zostaną nadane nazwy na podstawie przekazanych argumentów, które, chyba że uruchamiasz wiele VPN na tym komputerze, zwykle będą server, jak w przykładzie:
# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base UpdatedOpenVPN korzysta z parametrów generowanych za pomocą algorytmu Diffiego-Hellmana (z zastosowaniem build-dh), aby ustalić uwierzytelnienie dla nowych połączeń. Tworzony tutaj plik nie musi być tajny, ale musi być wygenerowany przy użyciu skryptu build-dh dla kluczy RSA, które są aktywne w danym momencie. Jeśli w przyszłości utworzysz nowe klucze RSA, będziesz także musiał zaktualizować plik oparty na algorytmie Diffiego-Hellmana:
# ./build-dhTwoje klucze po stronie serwera trafią teraz do katalogu /etc/openvpn/easy-rsa/keys/, ale OpenVPN tego nie wie. Domyślnie OpenVPN będzie szukać kluczy w /etc/openvpn/, dlatego skopiuj je:
# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpnPrzygotowanie kluczy szyfrowania klienta
Jak już widziałeś, w szyfrowaniu TLS używane są pary odpowiednich kluczy: jeden jest zainstalowany na serwerze, a drugi — na zdalnym kliencie. Oznacza to, że będziesz potrzebować kluczy klienta. Nasz stary znajomy pkitool — to właśnie to, czego potrzebujesz do tego. W tym przykładzie, uruchamiając program w katalogu /etc/openvpn/easy-rsa/, przekazujemy mu argument client, aby wygenerować pliki o nazwach client.crt i client.key:
# ./pkitool clientDwa pliki klienta wraz z oryginalnym plikiem ca.crt, który wciąż znajduje się w katalogu keys/, powinny być teraz bezpiecznie przekazane twojemu klientowi. Z powodu ich przynależności i praw dostępu, może to nie być łatwe zadanie. Najprostsze podejście — ręczne skopiowanie zawartości oryginalnego pliku (i niczego poza tą zawartością) do terminala działającego na pulpicie twojego komputera (zaznacz tekst, kliknij na nim prawym przyciskiem myszy i wybierz z menu opcję Kopiuj). Następnie wklej to do nowego pliku o tej samej nazwie, którą tworzysz w drugim terminalu podłączonym do twojego klienta.
Ale każdy może skopiować i wkleić. Myśl jak administrator, ponieważ nie zawsze będziesz mieć dostęp do interfejsu graficznego, gdzie możliwa jest operacja wycinania/wklejania. Skopiuj pliki do katalogu domowego swojego użytkownika (aby zdalna operacja scp mogła mieć do nich dostęp), a następnie za pomocą chown zmień właściciela plików z root na zwykłego użytkownika bez uprawnień root, aby umożliwić przeprowadzenie zdalnej operacji scp. Upewnij się, że wszystkie twoje pliki są w tej chwili ustawione i dostępne. Na klienta przeniesiesz je trochę później:
# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crtZ pełnym zestawem kluczy szyfrowania gotowych do działania, musisz poinformować serwer, jak chcesz utworzyć VPN. Robi się to za pomocą pliku server.conf.
Zmniejszamy liczbę uderzeń w klawisze
Czy musisz pisać zbyt wiele? Rozszerzenie z nawiasami pomoże zmniejszyć te sześć poleceń do dwóch. Jestem pewien, że będziesz w stanie nauczyć się tych dwóch przykładów i zrozumieć, co się dzieje. Co ważniejsze, będziesz mógł zrozumieć, jak zastosować te zasady do operacji obejmujących dziesiątki, a nawet setki elementów:
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
Konfiguracja pliku server.conf
Skąd możesz wiedzieć, jak powinien wyglądać plik server.conf? Pamiętaj o szablonie katalogu easy-rsa, który skopiowałeś z /usr/share/? Przy instalacji OpenVPN pozostał skompresowany plik szablonu konfiguracji, który możesz skopiować do /etc/openvpn/. Będę opierać się na założeniu, że szablon jest spakowany, i zapoznam cię z przydatnym narzędziem: zcat.
Już wiesz o wyświetlaniu zawartości pliku na ekranie za pomocą polecenia cat, ale co, jeśli plik jest skompresowany za pomocą gzip? Zawsze możesz rozpakować plik, a wtedy cat chętnie go wyświetli, ale to o jeden lub dwa kroki więcej, niż to konieczne. Zamiast tego, jak pewnie już się domyślasz, możesz wpisać polecenie zcat, aby załadować rozszerzony tekst do pamięci w jednym kroku. W następnym przykładzie, zamiast drukować tekst na ekranie, przekierujesz go do nowego pliku o nazwie server.conf:
# zcat
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
> /etc/openvpn/server.conf
$ cd /etc/openvpnOdstawmy na bok rozbudowaną i przydatną dokumentację dołączoną do pliku i zobaczmy, jak może wyglądać po zakończeniu edytowania. Zwróć uwagę, że średnik (;) informuje OpenVPN, aby nie czytał i nie wykonywał następnej linii (lista 10.2).

Przejdźmy przez niektóre z tych ustawień.
- Domyślnie OpenVPN działa przez port 1194. Możesz to zmienić, na przykład, aby jeszcze bardziej ukryć swoje działania lub uniknąć konfliktów z innymi aktywnymi tunelami. Ponieważ 1194 wymaga minimalnej koordynacji z klientami, najlepiej jest właśnie tak zrobić.
- OpenVPN stosuje do przesyłania danych albo protokół kontrolny transmisji (TCP), albo protokół datagramów użytkownika (UDP). TCP może być trochę wolniejszy, ale jest bardziej niezawodny i z większym prawdopodobieństwem zrozumiały dla aplikacji działających na obu końcach tunelu.
- Możesz określić dev tun, gdy chcesz utworzyć prostszy i bardziej wydajny tunel IP, który przesyła dane i nic więcej. Z drugiej strony, jeśli musisz podłączyć kilka interfejsów sieciowych (i sieci, które reprezentują), tworząc most Ethernet, musisz wybrać dev tap. Jeśli nie rozumiesz, co to wszystko oznacza, użyj argumentu tun.
- Następujące cztery linie przekazują OpenVPN nazwy trzech plików autoryzacji na serwerze oraz plik parametrów dh2048, który wcześniej utworzyłeś.
- Linia server ustawia zakres i maskę podsieci, które będą używane do przypisywania adresów IP klientom podczas logowania.
- Opcjonalny parametr push "route 10.0.3.0 255.255.255.0" umożliwia zdalnym klientom dostęp do prywatnych podsieci za serwerem. Aby to zadziałało, potrzebna jest także konfiguracja sieci na samym serwerze, aby prywatna podsieć wiedziała o podsieci OpenVPN (10.8.0.0).
- Linia port-share localhost 80 pozwala na przekazywanie ruchu klientów przychodzącego przez port 1194 do lokalnego serwera WWW słuchającego na porcie 80. (Będzie to przydatne, jeśli zamierzasz zaangażować serwer WWW do testowania swojej VPN.) Działa to tylko wtedy, gdy wybrany jest protokół tcp.
- Linie user nobody i group nogroup powinny być aktywne — w tym celu należy usunąć średniki (;). Wymuszenie pracy zdalnych klientów jako nobody i nogroup zapewnia, że sesje na serwerze będą nieuprzywilejowane.
- log wskazuje, że bieżące zapisy w dzienniku będą nadpisywać stare zapisy przy każdym uruchomieniu OpenVPN, podczas gdy log-append dodaje nowe zapisy do istniejącego pliku dziennika. Sam plik openvpn.log zapisywany jest w katalogu /etc/openvpn/.
Ponadto do pliku konfiguracyjnego często dodaje się również wartość client-to-client, aby kilka klientów mogło widzieć się nawzajem oprócz serwera OpenVPN. Jeśli jesteś zadowolony z konfiguracji, możesz uruchomić serwer OpenVPN:
# systemctl start openvpnZe względu na zmieniający się charakter relacji między OpenVPN a systemd, do uruchomienia usługi czasami może być wymagany taki składnia: systemctl start openvpn@server.
Uruchomienie ip addr, aby wyświetlić listę interfejsów sieciowych twojego serwera, powinno teraz wyświetlić odnośnik do nowego interfejsu o nazwie tun0. OpenVPN utworzy go, aby obsługiwać przychodzących klientów:
$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft foreverMożliwe, że będziesz musiał zrestartować serwer, zanim wszystko zacznie działać prawidłowo. Następnym krokiem jest komputer klienta.
10.1.2. Konfiguracja klienta OpenVPN
Tradycyjnie tunele budowane są z co najmniej dwoma wyjściami (w przeciwnym razie nazwalibyśmy je jaskiniami). Prawidłowo skonfigurowany OpenVPN na serwerze kieruje ruch do tunelu i z tunelu z jednej strony. Będziesz również potrzebować oprogramowania działającego po stronie klienta, to znaczy na drugim końcu tunelu.
W tej sekcji skupię się na ręcznej konfiguracji komputera z systemem Linux w roli klienta OpenVPN. To jednak nie jest jedyny sposób, w jaki ta funkcjonalność jest dostępna. OpenVPN obsługuje aplikacje klienckie, które można instalować i używać na komputerach stacjonarnych i laptopach z systemem Windows lub macOS, a także na smartfonach i tabletach z systemem Android i iOS. Szczegóły można znaleźć na stronie openvpn.net.
Pakiet OpenVPN będzie musiał zostać zainstalowany na komputerze klienta, tak jak był zainstalowany na serwerze, chociaż nie ma tu potrzeby w easy-rsa, ponieważ używane klucze już istnieją. Musisz skopiować plik szablonu client.conf do katalogu /etc/openvpn/, który został właśnie utworzony. Tym razem plik nie zostanie skompresowany, więc standardowe polecenie cp świetnie poradzi sobie z tym zadaniem:
# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf
/etc/openvpn/Większość ustawień w twoim pliku client.conf będzie dość zrozumiała: powinny odpowiadać wartościom na serwerze. Jak pokazano w poniższym przykładzie pliku, unikalnym parametrem jest remote 192.168.1.23 1194, który wskazuje klientowi adres IP serwera. Upewnij się, że to adres twojego serwera. Musisz również zmusić komputer klienta do weryfikacji certyfikatu serwera, aby zapobiec potencjalnemu atakowi 'człowiek w środku'. Jednym ze sposobów jest dodanie linii remote-cert-tls server (listing 10.3).

Teraz możesz przejść do katalogu /etc/openvpn/ i wyodrębnić klucze certyfikacyjne z serwera. Zastąp adres IP serwera lub nazwę domeny w przykładzie własnymi wartościami:

Nic ciekawego prawdopodobnie się nie wydarzy, dopóki nie uruchomisz OpenVPN na kliencie. Ponieważ musisz przekazać kilka argumentów, zrobisz to z wiersza poleceń. Argument —tls-client informuje OpenVPN, że będziesz działać jako klient i łączyć się za pomocą szyfrowania TLS, a —config wskazuje na twój plik konfiguracyjny:
# openvpn --tls-client --config /etc/openvpn/client.confDokładnie przeczytaj wyjście polecenia, aby upewnić się, że jesteś poprawnie połączony. Jeśli coś pójdzie nie tak za pierwszym razem, może to być spowodowane niezgodnością ustawień między plikami konfiguracyjnymi serwera a klientem lub problemem z połączeniem sieciowym/zaporą. Oto kilka wskazówek dotyczących rozwiązywania problemów.
- Dokładnie przeczytaj wyjście operacji OpenVPN na kliencie. Często zawiera cenne wskazówki na temat tego, co dokładnie nie mogło zostać wykonane i dlaczego.
- Sprawdź komunikaty o błędach w plikach openvpn.log i openvpn-status.log w katalogu /etc/openvpn/ na serwerze.
- Sprawdź powiązane z OpenVPN i odpowiednie czasowo komunikaty w dziennikach systemowych na serwerze i kliencie. (journalctl -ce wyświetli najnowsze wpisy.)
- Upewnij się, że masz aktywne połączenie sieciowe między serwerem a klientem (więcej informacji — w rozdziale 14).
O autorze
David Clinton — administrator systemów, wykładowca i autor. Zarządzał, pisał o tym i tworzył materiały edukacyjne dla wielu ważnych dyscyplin technicznych, w tym systemów Linux, chmur obliczeniowych (w szczególności AWS) oraz technologii kontenerowych, takich jak Docker. Napisał książkę Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Wiele jego kursów wideo można znaleźć na stronie Pluralsight.com, a linki do innych jego książek (dotyczących administracji Linuxa i wirtualizacji serwerów) są dostępne pod adresem .
» Więcej szczegółów o książce można znaleźć na
»
»
Dla użytkowników Habr zniżka 25% przy użyciu kuponu — Linuxa
Po dokonaniu płatności za wersję papierową książki, na e-mail zostanie wysłana elektroniczna wersja książki.
Źródło: habr.com
