Konfiguracja Let’s Encrypt z wykorzystaniem serwera Apache / NGINX

Kategoria:

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ść.

Konfiguracja Rekordów DNS w serwisie OVH

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).

Weryfikacja działania Rekordów A za pomocą polecenia ping

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:

Warto również zaktualizować oprogramowanie serwera przed wykonywaniem dalszych prac:

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

Instalacja pakietu python3-certbot-apache

Rysunek 3. Instalacja pakietu python3-certbot-apache.

Instalacja pakietu python3-certbot-nginx

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:

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:

Wersja wykorzystywanego serwera Apache

Rysunek 4. Wersja wykorzystywanego serwera Apache.

Wersja wykorzystywanego serwera NGINX

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

Ustawione dyrektywy ServerTokens na Prod oraz ServerSignature na Off w pliku 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

Odkomentowanie linii server_tokens off w pliku 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:

Wynik powinien wyglądać podobnie jak na poniższym zrzucie ekranu:

Apache:

Wynik polecenia apache2ctl configtest

Rysunek 6. Wynik polecenia apache2ctl configtest.

NGINX:

Wynik polecenia nginx -t

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.)

Wynik polecenia certbot --apache2 -d dsecure.dev -d www.dsecure.dev

Rysunek 7. Wynik polecenia certbot –apache2 -d dsecure.dev -d www.dsecure.dev.

Wynik polecenia certbot --nginx -d dsecure.dev -d www.dsecure.dev

Rysunek 7.1. Wynik polecenia certbot –nginx -d dsecure.dev -d www.dsecure.dev

Wynik polecenia certbot --apache2 -d dsecure.dev -d www.dsecure.dev

Rysunek 8. Wynik polecenia certbot –apache2 -d dsecure.dev -d www.dsecure.dev.

Wynik polecenia certbot --nginx -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.

Połączenie za pomocą szyfrowanego protokołu HTTPS do www.dsecure.dev

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ć.

Bądź pierwszy i oceń tą stonę