25 kwi

Zabezpieczenie Nginx na Ubuntu 16.04 certyfikatem od Let`s Encrypt

Let’s Encrypt to nowy “Certificate Authority” (CA), który pozwala w prosty i darmowy sposób na zainstalowanie certyfikatów TLS/SSL, co z kolei umożliwia aktywację szyfrowanych protokołów HTTPS na serwerach internetowych. Uproszczenie procesu odbywa się poprzez zapewnienie klienckiego oprogramowania, letsencrypt, które ma na celu zautomatyzowanie większości (jeżeli nie wszystkich) wymaganych kroków. Biorąc pod uwagę fakt, że Let’s Encrypt jest nadal w Open Beta, obecnie cały proces pozyskiwania i instalowania certyfikatu jest w pełni zautomatyzowany wyłącznie na serwerach Apache. Niemniej jednak Let’s Encrypt może być wykorzystywany w celu łatwiejszego uzyskania darmowego certyfikatu SSL, który można zainstalować ręcznie, niezależnie od tego, jakiego rodzaju oprogramowania używasz dla swojego serwera.

Pokażemy Ci, jak wykorzystać Let’s Encrypt w celu otrzymania darmowego certyfikatu SSL oraz wykorzystać go dla Nginx dla systemu Ubuntu 16.04. Dodatkowo zaprezentujemy sposób automatycznego odnowienia certyfikatu SSL. Wykorzystanie innego serwera internetowego wymaga zapoznania się z jego dokumentacją. W taki sposób dowiesz się, jak korzystać z certyfikatu z Twoją konfiguracją.

Zaczynamy

Na początku potrzebujemy kilku rzeczy.

Powinieneś posiadać serwer Ubuntu 16.04 z kontem użytkownika z uprawnieniami sudo.

Powinieneś też posiadać lub mieć dostęp do zarejestrowanej domeny, dla której jest planowane użycie certyfikatu. W przypadku braku owej, możesz zarejestrować nową za pomocą naszego panelu.

Przekonaj się, że masz utworzony A Wpis, który kieruje Twoją domenę na publiczny adres IP Twojego serwera. Jest to konieczne ze względu na to, że fakt własności domeny Let’s Encrypt potwierdza poprzez wydanie certyfikatu. Na przykład, jeżeli chcesz uzyskać certyfikat dla example.com, domena powinna być obsługiwana Twoim serwerem. W naszym przypadku użyjemy domeny example.com oraz www.example.com, a więc obydwa rekordy DNS są wymagane.

Po ukończeniu powyższych czynności możemy przystąpić do instalacji klienckiego oprogramowania Let’s Encrypt.

Instalowanie klienta Let’s Encrypt

Najpierw musimy zainstalować na Twoim serwerze oprogramowanie letsencrypt. Zalecamy po prostu sklonować Let’s Encrypt z oficjalnego repozytorium GitHub. W przyszłości będzie on dostępny za pośrednictwem menadżera pakietów.

Instalacja Git i bc

Teraz zainstalujemy Git i bc w celu klonowania repozytorium Let’s Encrypt.

Uaktualnij swojego menadżera pakietów w następujący sposób:
sudo apt-get update
Następnie zainstaluj pakiety git i bc poprzez:
sudo apt-get -y install git bc
Po zainstalowaniu git oraz bc możemy z łatwością ściągnąć letsencrypt klonując repozytorium z GitHub.

Klonowanie Let’s Encrypt

Teraz możemy sklonować repozytorium Let’s Encrypt za pomocą /opt i następującego polecenia:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Powinieneś mieć kopię repozytorium letsencrypt w katalogu  /opt/letsencrypt.

Otrzymanie certyfikatu

Let’s Encrypt dysponuje wieloma sposobami otrzymania certyfikatu SSL poprzez różnorodne wtyczki. W odróżnieniu od wtyczki Apache, większość wtyczek jedynie pomoże w uzyskaniu certyfikatu, który należy skonfigurować ręcznie poprzez wykorzystywany przez Ciebie serwer. Wtyczki, które tylko uzyskują certyfikaty bez ich instalowania, są nazywane „uwierzytelnieniami”, ponieważ są one wykorzystywane w celu uwierzytelnienia konieczności wystawienia certyfikatu serwerowi.

Pokażemy Ci jak używać wtyczki Webroot do uzyskania certyfikatu SSL.

Wykorzystanie wtyczki Webroot

Wtyczka Webroot działa poprzez umieszczenie specjalnego pliku w katalogu /.well-known w DocumentRoot, który może zostać otwarty (za pośrednictwem Twojego serwera internetowego) poprzez serwis Let’s Encrypt w celu walidacji. W zależności od konfiguracji, może zaistnieć konieczność bezpośredniego dostępu do katalogu /.well-known.

Jeżeli wciąż nie zainstalowałeś Nginx, dokonaj tego za pomocą następującego polecenia:
sudo apt-get install nginx
W celu przekonania się, że katalog jest dostępny dla walidacji Let’s Encrypt, zróbny szybką zmianę konfiguracji Nginx. Domyślnie, znajduje się on w /etc/nginx/sites-available/default. Zróbmy to za pomocą nano:
sudo nano /etc/nginx/sites-available/default
W bloku server dodaj następujący blok lokalizacji:

Dodaj do bloku server w rozdział SSL
location ~ /.well-known {
     allow all;
}

Również będziesz musiał zobaczyć jaki jest ustawiony DocumentRoot po wyszukaniu dyrektywy root, ponieważ ścieżka jest wymagana do korzystania z wtyczki Webroot. Jeżeli używasz domyślnego pliku konfiguracyjnego, root będzie następujący /usr/share/nginx/html.

Zapisz i zamknij.

Zresetuj Nginx poleceniem:
sudo service nginx reload
Po określeniu naszego webroot-path, możemy wykorzystać wtyczkę Webroot do otrzymania certyfikatu SSL poprzez te polecenia. Doprecyzujmy też nazwy domen opcją -d . Jeżeli zdecydowałeś się na jeden certyfikat dla wielu domen (np example.com i www.example.com), przekonaj się, że dodałeś je wszystkie. Sprawdź też czy zamieniłeś zaznaczone elementy odpowiednią ścieżką Webroot i domeną (domenami):
cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d com -d www.example.com

Uwaga: Z uwagi na fakt, że oprogramowanie Let’s Encrypt wymaga uprawnień superusera, zostaniesz poproszony o wprowadzenie hasła, jeżeli wcześniej nie użyłeś sudo.
Po inicjalizacji letsencrypt, zostaniesz poproszony o podanie niektórych informacji. Okienka dialogowe z tym związane mogą się różnić, jeżeli wcześniej używałeś Let’s Encrypt. Pomożemy Ci dokonać tego po raz pierwszy.

W okienku dialogowym wprowadź adres email przeznaczony do otrzymywania odpowiednich informacji oraz odzyskiwania klucza:

lets-encypt-e-email

Następnie podpisz Umowę Abonencką Let`s Encrypt. Naciśnij przycisk Agree:

lets-encypt-agreement

Komunikat wyjściowy zobaczysz jedynie w przypadku poprawnego wykonania powyższych czynności. Powinien on wyglądać mniej więcej następująco:

Odpowiedź:
IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to sammy@digitalocean.com
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your
   cert will expire on 2016-03-15. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Zwróć uwagę na zaznaczoną powyżej ścieżkę oraz datę ważności twojego certyfikatu.

Uwaga Zapory Sieciowej: Otrzymanie następującego komunikatu o popełnionym błędzie Failed to connect to host for DVSNI challenge oznacza, że zapora sieciowa Twojego serwera wymaga skonfigurowania w celu umożliwienia ruchu TCP na porcie 80 i 443.

Uwaga: Jeżeli trasowanie twojej domeny odbywa się za pośrednictwem serwisu DNS, mianowicie CloudFlare, powinieneś go wyłączyć do momentu otrzymania certyfikatu.

Pliki certyfikatu

Po otrzymaniu certyfikatu dostaniesz następujące zakodowane pliki PEM:

  • cert.pem: Certyfikat Twojej domeny
  • chain.pem: Łańcuch certyfikatów Let’s Encrypt
  • fullchain.pem: Połączenie cert.pemi chain.pem
  • privkey.pem: Twój personalny klucz certyfikatu

Ważne, żebyś wiedział, gdzie znajdują się nowostworzone pliki certyfikatów w celu ich wykorzystania w konfiguracji serwera. Pliki automatycznie trafiają do podkatalogu /etc/letsencrypt/archive. Niemniej jednak Let`s Encrypt stwarza symboliczne linki do nowostworzonych plików certyfikatów w katalogu /etc/letsencrypt/live/nazwa_domeny. Z uwagi na fakt, że linki zawsze będą wskazywać na nowostworzone pliki certyfikatów, powinieneś używać tego sposobu w odniesieniu do plików certyfikatów.

Istnienie plików sprawdzisz za pomocą polecenia (wpisz swoją nazwę domeny):
sudo ls -l /etc/letsencrypt/live/nazwa_domeny
Wyjściowo powinno być cztery wspomniane wcześniej pliki certyfikatów. Za chwile skonfigurujesz swój serwer wykorzystując fullchain.pem jako plik certyfikatu oraz privkey.pem w jakości klucza pliku certyfikatu.

Generowanie grupy Diffie-Hellmana

Grupa Diffie-Hellmana zapewnia dodatkowe bezpieczeństwo. W celu generowania 2048-bitowej grupy wykorzystaj następujące polecenie:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Może to zająć kilka minut, w zamian otrzymasz silną drupe DH na /etc/ssl/certs/dhparam.pem.

Konfiguracja TLS/SSL na serwerze (Nginx)

Po otrzymaniu certyfikatu SSL należy skonfigurować serwer Nginx.

Edytuj konfiguracje Nginx zawierające blok serwera. Przypominamy, że domyślne znajdują się one w /etc/nginx/sites-available/default :
sudo nano /etc/nginx/sites-available/default

Znajdź blok server. Zakomentuj lub usuń wiersze konfigurujące ten blok serwera do nasłuchiwania na porcie 80. W domyślnej konfiguracji należy usunąć następujące dwie linie:

Konfiguracja Nginx do usunięcia
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

Skonfigurujmy blok serwera do nasłuchiwania na porcie 443 z włączonym SSL. W bloku server { dodaj następujące wiersze jednocześnie zamieniając wszystkie example.com swoją domeną:

Dodatki do konfiguracji Nginx — 1 z 3
listen 443 ssl;
 
server_name example.com www.example.com;
 
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

Teraz twój serwer może korzystać z protokołu SSL i pozwala na wykorzystanie uzyskanego wcześniej serwera Let’s Encrypt SSL.

W celu uruchomienia najbardziej bezpiecznych szyfrów i protokołów SSL oraz wykorzystania wygenerowanej wcześniej silnej grupy Diffie-Hellmana do bloku serwera dodamy następujące wiersze:

Dodatki do konfiguracji Nginx — 2 z 3
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

Następnie, poza oryginalnym blokiem server (nasłuchiwanym na HTTPS, port 443), dodaj następujący blok server w celu przekierowania HTTP (port 80) do HTTPS. Upewnij się, że zastąpiłeś zaznaczony odcinek własną domeną:

Dodatki do konfiguracji Nginx — 3 z 3
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

Zapisz i zamknij.

Teraz wprowadź zmiany w życie poprzez ponowne uruchomienie Nginx:

sudo service nginx reload

Certyfikat Let’s Encrypt TLS/SSL jest na swoim miejscu. Teraz można przetestować certyfikat TLS / SSL poprzez wejście na domenę za pośrednictwem HTTPS w przeglądarce internetowej.

Możesz użyć Qualys SSL Labs Report w celu sprawdzenia wyników konfiguracji:

W przeglądarce:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com

Takie ustawienia SSL powinny zgłaszać ranking A+.

Ustawienie automatycznego odnowienia

Certyfikaty Let’s Encrypt są ważne przez 90 dni. Aby zniwelować margines błędu, zalecamy przeprowadzenie odnowienia każde 60 dni. Obecnie automatyczne odnowienie nie jest jeszcze dostępne jako element samego oprogramowania, jednak możesz przeprowadzić powyższą czynność ręcznie uruchamiając klienta Let’s Encrypt poprzez opcję renew.

Uruchomienie następującego polecenia pozwoli na rozpoczęcie procesu odnowienia dla wszystkich zainstalowanych domen:

/opt/letsencrypt/letsencrypt-auto renew

Z uwagi na fakt, że zainstalowaliśmy certyfikat, polecenie jedynie sprawdzi datę ważności i wydrukuje powiadomienie informujące o tym, że odnowienie certyfikatu nie jest jeszcze możliwe. Powinno to wyglądać podobnie:

Odpowiedź:
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/example.com.conf
 
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.

Pamiętaj, że jeżeli stworzyłeś zestaw certyfikatów z wieloma domenami, na wyjściu zostanie wyświetlona tylko podstawowa domena, natomiast odnowienie będzie ważne dla wszystkich domen certyfikatu.

Zabezpieczenie certyfikatów przed nieaktualnością jest możliwe dzięki stworzeniu cron`a wykonującego polecenia okresowego automatycznego odnowienia. Przykładowo, dopiero po sprawdzeniu daty ważności oraz uruchomieniu odnowienia w przypadku, jeżeli zostało mniej niż 30 dni, jest możliwe stworzenie cron`a uruchamiającego się co tydzień lub codziennie.

Przyszedł czas na modyfikację pliku crontab w celu stworzenia nowego zadania uruchamiającego polecenia cotygodniowego odnowienia. W celu modyfikacji pliku crontab dla użytkownika root uruchom:

sudo crontab -e

Dodaj następujące wiersze:

Zawartość crontab
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

Zapisz i zamknij. Stworzyliśmy nowego cron`a wykonującego polecenie letsencrypt-auto renew  każdego poniedziałku o 2:30 ranem oraz ponownie uruchamiającego Nginx o godz. 2:35 (w taki sposób używamy nowego certyfikatu). Wyniki polecenia zostaną przekierowane do pliku dziennika znajdującego się w /var/log/le-renewal.log.

Aktualizacja Klienta Let’s Encrypt (opcjonalnie)

Jak tylko nowa aktualizacja będzie dostępna dla klienta, możesz zaktualizować swoją lokalną kopię uruchamiając git pull z katalogu Let’s Encrypt:

cd /opt/letsencrypt
sudo git pull

Pozwoli to na załadowanie wszystkich zmian do repozytoriom aktualizującego Twojego klienta.

Podsumowanie

Gratulacje! Teraz Twój serwer VPS używa darmowego certyfikatu Let’s Encrypt TLS/SSL w celu bezpiecznego serwowania treści HTTPS.