Table of Contents
Wprowadzenie
W poniższym wpisie omawiamy zagadnienie z dziedziny kryptografii, a dokładniej uwierzytelnianie serwerów oraz bezpieczeństwo komunikacji między przeglądarką i stroną www. Jeśli zastanawiałeś się kiedyś co i w jaki sposób umożliwia szyfrowanie ruchu w przeglądarce internetowej, to odpowiedzią jest certyfikat TLS. Dzięki certyfikatowi zapewnione są uwierzytelnienie serwera (opcjonalnie klienta) oraz poufność danych przesyłanych pomiędzy przeglądarką, a serwerem aplikacji webowej. Pomimo, że może się to wydawać skomplikowanym zagadnieniem, wcale nie jest takie trudne i zaraz się o tym przekonasz.
Let’s Encrypt to organizacja non-profit zapewniająca dostęp do bezpłatnych automatycznych certyfikatów TLS, umożliwiających szyfrowanie komunikacji HTTP aka HTTPS i zielona kłódka. Darmowy certyfikat może zostać wydany każdemu właścicielowi domeny, a co za tym idzie właścicielom stron osobistych, blogów czy też portali firmowych. Niniejszy artykuł tłumaczy w jaki sposób skonfigurować darmowy certyfikat TLS od Let’s Encrypt z wykorzystaniem serwera Apache lub NGINX w celu włączenia szyfrowania protokołu HTTP. Pamiętaj, że samo posiadanie certyfikatu nie sprawia, że Twój serwer będzie bezpieczniejszy, natomiast spowoduje, że użytkownicy będą czuli się bezpieczniejsi w interakcji z Twoją stroną a komunikacja pomiędzy użytkownikiem a Twoim portalem będzie szyfrowana. Aby zweryfikować bezpieczeństwo serwera oraz uruchomionej na nim strony powinniście przeprowadzić testy penetracyjne.
Sposób otrzymywania certyfikatu TLS jest mocno uproszczony i sprowadza się do wykorzystania polecenia klienta Certbot, który automatyzuje większość wymaganych kroków potrzebnych do otrzymania oraz odnawiania certyfikatu. W chwili pisania tego artykułu cały proces pozyskiwania i instalowania certyfikatu jest w pełni zautomatyzowany między innymi dla serwerów aplikacji internetowych takich jak Apache i NGINX.
Wymagania
Aby móc poprawnie skonfigurować certyfikat TLS z wykorzystaniem Let’s Encrypt dla swojego serwera Apache lub NGINX, będziesz potrzebował:
- serwer z systemem operacyjnym Debian lub Ubuntu, w którym możesz wykonywać polecenia za pomocą sudo lub jako użytkownik root oraz masz otwarte porty HTTP (80) i HTTPS(443),
- w pełni zarejestrowaną domenę,
- uzupełniony Rekord A, w którym twoja_domena wskazuje na publiczny adres IP Twojego serwera,
- uzupełniony Rekord A z adresem www.twoja_domena, który wskazuje na publiczny adres IP Twojego serwera.
Rekord A w DNS odpowiada za przypisanie adresu IP do domeny.
To dzięki niemu w przeglądarce wykorzystujesz adres np. https://dsecure.me a nie adres IP.
Na potrzebny niniejszego opisu wykorzystamy domenę dsecure.dev, która została kupiona za pomocą OVH oraz serwer uruchomiony w serwisie DigitalOcean z systemem operacyjnym Ubuntu 20.04 (LTS). Na rysunku nr 1 przedstawiona została konfiguracja rekordów DNS zawierająca między innymi dwa Rekordy A wskazujące na serwer, który będziemy konfigurować w dalszej części wpisu. Pamiętaj, że propagacja zmian w rekordach DNS może trwać do 24 godzin, dlatego jeżeli teraz przystępujesz do zmiany swoich rekordów, uzbrój się w cierpliwość.
Rysunek 1. Konfiguracja Rekordów DNS w serwisie OVH.
Jeśli rekordy zostały poprawnie skonfigurowane to za pomocą polecenia ping w konsoli będziesz mógł sprawdzić czy DNS wskazuje na Twój adres IP serwera (Rysunek 2).
Rysunek 2. Weryfikacja działania Rekordów A za pomocą polecenia ping
Kupując domenę w dowolnym serwisie, warto zwrócić uwagę czy rejestrator domeny obsługuje opcję DNSSEC (DNS Security Extensions). Jest to rozszerzenie podnoszące poziom bezpieczeństwa protokołu DNS. DNSSEC tworzy bezpieczny system nazw domen, wprowadzając podpisy kryptograficzne. Podpisy są dodawane do już istniejących rekordów DNS i opierają się na kryptografii klucza publicznego, certyfikatach i podpisach cyfrowych. Więcej informacji na ten temat możecie znaleźć np. tutaj lub tutaj.
Instalacja Certbot
Pierwszym krokiem do wykorzystania Let’s Encrypt jest zainstalowanie klienta Certbot na serwerze. W zależności od wykorzystywanego przez nas typu serwera WWW, wymagana jest instalacja innej wtyczki Certbot. Chociaż całość poniższej konfiguracji została wykonana na serwerze z oprogramowaniem Ubuntu 20.4, polecenia działają też na systemie Debian. W pierwszej kolejności wykonaj polecenie, które odświeży informacje na temat pakietów w repozytorium:
Dla obu serwerów:
sudo apt update
Warto również zaktualizować oprogramowanie serwera przed wykonywaniem dalszych prac:
sudo apt upgrade
Serwer Apache: instalujemy oprogramowanie Certbot z wtyczką dla serwera Apache:
sudo apt install certbot python3-certbot-apache
Serwer NGINX: instalujemy oprogramowanie Certbot z wtyczką dla serwera NGINX:
sudo apt install certbot python3-certbot-nginx
Rysunek 3. Instalacja pakietu python3-certbot-apache.
Rysunek 3.1. Instalacja pakietu python3-certbot-nginx.
Konfiguracja serwera Apache / NGINX
Apache:
Aby Certbot zadziałał, musi znaleźć dyrektywy ServerName i ServerAlias pasujące do żądanej domeny w plikach konfiguracyjnych Apache / NGINX. Katalog sites-available przechowuje wszystkie konfiguracje stron www Twojego serwera.
NGINX:
Aby Certbot zadziałał, musi znaleźć dyrektywę server_name pasującą do żądanej domeny w plikach konfiguracyjnych NGINX. Katalog sites-available przechowuje wszystkie konfiguracje stron www Twojego serwera.
Poniżej będziemy używać domeny dsecure.dev jako przykładu, w swojej konfiguracji zastąp ją swoją domeną. Przed dokonaniem zmian, zrób kopię zapasową edytowanych plików!
Przygotowanie nowej konfiguracji dla domeny rozpoczynamy od wykorzystania polecenia cp.
Serwer Apache:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/dsecure.dev.conf
Serwer NGINX:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/dsecure.dev
Następnie wyłączamy domyślną konfigurację poprzez usunięcie linku symbolicznego z katalogu sites-enabled:
Serwer Apache:
sudo rm /etc/apache2/sites-enabled/000-default.conf
Serwer NGINX:
sudo rm /etc/nginx/sites-enabled/default
Włączamy nową konfigurację za pomocą linku symbolicznego:
Serwer Apache:
sudo ln -s /etc/apache2/sites-available/dsecure.dev.conf /etc/apache2/sites-enabled/dsecure.dev.conf
Serwer NGINX:
sudo ln -s /etc/nginx/sites-available/dsecure.dev /etc/nginx/sites-enabled/dsecure.dev
Edytujemy plik dsecure.dev.conf :
Serwer Apache:
sudo nano /etc/apache2/sites-available/dsecure.dev.conf
Serwer NGINX:
sudo nano /etc/nginx/sites-available/dsecure.dev
I szukamy dyrektyw ServerName oraz ServerAlias:
Serwer Apache:
...
ServerName dsecure.dev;
ServerAlias www.dsecure.dev;
...
Serwer NGINX:
server_name dsecure.dev www.dsecure.dev;
W przypadku serwera dsecure.dev, konfiguracja będzie wyglądać tak jak na poniższym snippecie:
Serwer Apache:
ServerName dsecure.dev
ServerAlias www.dsecue.dev
ServerAdmin [email protected]
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Serwer NGINX:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name dsecure.dev www.dsecure.dev;
location / {
try_files $uri $uri/ =404;
}
}
Dodatkowo zalecamy usunięcie informacji o wersji oraz typie wykorzystywanego oprogramowania. Jeśli tego nie zrobimy, ułatwiamy pracę potencjalnemu atakującemu eksponując wersję wykorzystywanego oprogramowania. Ułatwia to szukanie podatności i gotowych exploitów. Aby sprawdzić czy Twój serwer informuje o wersji możesz wykorzystać poniższe polecenie:
Dla obu serwerów:
curl -v twoja_domena
Informacja ta może być zawarta w ciele odpowiedzi jak i w nagłówkach. Na rysunku poniżej przedstawiona jest przykładowa odpowiedź z serwera:
Rysunek 4. Wersja wykorzystywanego serwera Apache.
Rysunek 4.1. Wersja wykorzystywanego serwera NGINX.
Serwer Apache:
W celu wyłączenia ekspozycji wersji Apache, należy zmodyfikować dyrektywy ServerTokens na <istyle=”font-size: 18px; color: black;”>Prod oraz ServerSignature na Off w pliku:
sudo nano /etc/apache2/conf-enabled/security.conf
Rysunek 5. Ustawione dyrektywy ServerTokens na Prod oraz ServerSignature na Off w pliku security.conf.
Serwer NGINX:
W celu wyłączenia pokazywania wersji NGINX, należy odkomentować linię server_token off; w pliku:
sudo nano /etc/nginx/nginx.conf
Rysunek 5.1. Odkomentowanie linii server_tokens off w pliku nginx.conf
Po wykonaniu powyższych zmian, sprawdź poprawność konfiguracji za pomocą polecenia:
Serwer Apache:
sudo apache2ctl configtest
Serwer NGINX:
sudo nginx -t
Wynik powinien wyglądać podobnie jak na poniższym zrzucie ekranu:
Apache:
Rysunek 6. Wynik polecenia apache2ctl configtest.
NGINX:
Rysunek 6.1. Wynik polecenia nginx -t
Następnie zrestartuj serwer:
Apache:
sudo systemctl reload apache2
NGINX:
sudo systemctl reload nginx
Generowanie certyfikatu TLS
Ostatnim krokiem jaki został nam do wykonania jest wygenerowanie certyfikatów za pomocą polecenia Certbot. Zainstalowana przez nas wcześniej wtyczka Apache / NGINX zajmie się skonfigurowaniem HTTPS dla naszego serwera.
W tym celu wygenerowania certyfikatów TLS wykonaj polecenie:
Dla serwera Apache:
sudo certbot --apache -d dsecure.dev -d www.dsecure.dev
Powyższe polecenie uruchamia Certbot z wtyczką –apache i flagą -d do określenia nazw domen, dla których certyfikat ma być wygenerowany.
Dla serwera NGINX:
sudo certbot --nginx -d dsecure.dev -d www.dsecure.dev
Powyższe polecenie uruchamia Certbot z wtyczką –NGINX i flagą -d do określenia nazw domen, dla których certyfikat ma być wygenerowany.
Jeżeli po raz pierwszy używasz Certbota, zostaniesz poproszony o podanie adresu e-mail oraz zaakceptowanie warunków korzystania z usługi. Po wykonaniu tej czynności Certbot skomunikuje się z serwerem Let’s Encrypt, a następnie sprawdzi, czy jesteś właścicielem domeny, dla której chcesz pobrać certyfikat. Jeśli wszystko się powiedzie, w ostatnim kroku cerbot zapyta jak skonfigurować ustawienia HTTPS. W naszym przypadku chcemy aby wszystkie połączenia z serwerem odbywały się szyfrowanym protokołem HTTPS więc wybieramy automatyczne przekierowanie (opcja nr. 2) (Rysunki 7 / 7.1. / 8 / 8.1.)
Rysunek 7. Wynik polecenia certbot –apache2 -d dsecure.dev -d www.dsecure.dev.
Rysunek 7.1. Wynik polecenia certbot –nginx -d dsecure.dev -d www.dsecure.dev
Rysunek 8. Wynik polecenia certbot –apache2 -d dsecure.dev -d www.dsecure.dev.
Rysunek 8.1. Wynik polecenia certbot –nginx -d dsecure.dev -d www.dsecure.dev
W wyniku powyższego polecenia certyfikaty są pobierane i instalowane. Jeśli wszystko się powiedzie spróbuj ponownie załadować swoją witrynę za pomocą https:// i zwróć uwagę na wskaźnik bezpieczeństwa przeglądarki. Powinien wskazywać, że witryna jest odpowiednio zabezpieczona, zwykle ikoną zielonej kłódki. Sprawdź również automatyczne przekierowanie HTTP na HTTPS próbując otworzyć witrynę za pomocą schematu http:// Jeśli przetestujesz swój serwer za pomocą testu SSL Labs Server, powinien otrzymać on ocenę A. Na końcu za pomocą polecenia curl możesz sprawdzić czy informacja o wersji wykorzystywanego Apache / MGINX została usunięta z odpowiedzi serwera.
Rysunek 9. Połączenie za pomocą szyfrowanego protokołu HTTPS do www.dsecure.dev.
Rysunek 10. Wynik testu SSL Labs Server.
Rysunek 11 Odpowiedź serwera nie zawierająca wersji wykorzystywanego Apache.
Rysunek 11.1. Odpowiedź serwera nie zawierająca wersji wykorzystywanego MGINX.
Automatyczne odnawianie certyfikatu
Certyfikaty Let’s Encrypt są ważne tylko przez dziewięćdziesiąt dni. Ma to na celu zachęcenie użytkowników do automatyzacji procesu odnawiania certyfikatów. Zainstalowane oprogramowanie Certbot zrobi to za nas, dodając automatycznie skrypt do /etc/cron.d. Skrypt ten jest uruchamiany dwa razy dziennie i automatycznie odnawia każdy certyfikat w ciągu trzydzieści dni przed wygaśnięciem.
Aby przetestować proces odnawiania dla obu serwerów, możesz wykonać test za pomocą polecenia:
sudo certbot renew --dry-run
Jeśli w wyniku polecenia nie widzisz żadnych błędów to znaczy że wszystko działa tak jak należy i w razie potrzeby Certbot odnowi Twoje certyfikaty oraz zrestartuje serwer Apache / MGINX. Jeśli automatyczny proces odnawiania kiedykolwiek się nie powiedzie, Let’s Encrypt wyśle wiadomość na podany przez Ciebie adres, e-mail, informujący że certyfikat wkrótce wygaśnie.
Rysunek 12. Wynik polecenia certbot renew –dry-run.
Podsumowanie
W niniejszym artykule zainstalowaliśmy cerbota, klienta Let’s Encrypt, pobraliśmy certyfikaty TLS dla domeny dsecure.dev, skonfigurowaliśmy serwer Apache i NGINX do korzystania z tych certyfikatów oraz skonfigurowaliśmy automatyczne odnawianie certyfikatów. Jeśli masz dodatkowe pytania dotyczące korzystania z Certbota, dobrym miejscem do poszukiwania odpowiedzi jest dokumentacja. Jeżeli potrzebujesz pomocy możesz, również skontaktować się z nami za pomocą formularza kontaktowego.
W kolejnym artykule przedstawimy sposób integracji Cloudflare z serwerem Apache oraz NGINX. Omówimy też czym jest Cloudflare i dlaczego warto z niego korzystać.