Безпечна веб-комунікація: Wildcard HTTPS з Let's Encrypt та Nginx
12:44, 07.12.2023
Безпечна веб-комунікація має вирішальне значення для належного функціонування вашого сервера.
Існує багато різних підходів, які гарантують, що робота вашого сервера буде зашифрованою і, таким чином, захищеною. Звичайно, рекомендується використовувати різні заходи безпеки в комбінації для посилення веб-комунікації.
У цій статті ми розглянемо різні методи веб-захисту, а також те, як їх вмикати та комбінувати на вашому сервері.
Налаштування правил брандмауера для HTTP/S
Брандмауер - це програмне забезпечення, яке гарантує безпеку операційної системи, регулюючи доступ і фільтруючи інформацію, що надходить з Інтернету. За допомогою брандмауера ви дозволяєте або блокуєте трафік або певні типи трафіку.
Коли ви дозволяєте трафік HTTP/S, ви вказуєте брандмауеру ввімкнути шифрування даних через HTTPS з Інтернету. Якщо ви встановлюєте конфігурацію трафіку HTTP/S, ви дозволяєте доступ до веб-сайтів, які використовують згадані протоколи, в деяких розділах веб-сайту або до всього веб-сайту, що працює на HTTP/S.
Наприклад, правила брандмауера в CentOS 7 і їх налаштування за замовчуванням не дозволяють доступ до протоколів HTTP/S. Навіть за допомогою клієнта Let's Encrypt доступ буде дозволено, якщо змінити конфігурацію правил брандмауера.
Щоб змінити конфігурацію правил брандмауера за замовчуванням і дозволити трафік HTTP/S, вам знадобиться наступне:
- Хмарний сервер з RHEL 7 або CentOS 7, який підтримує брандмауер
- Доступ до вашого сервера
- Базове розуміння SSH
Спочатку увійдіть на сервер через SSH і переконайтеся, що брандмауер підтримується за допомогою команди "systemctl status firewalld".
Далі виконайте наступну команду для HTTP:
sudo firewall-cmd --permanent --zone=public --add-service=http
Команда для HTTPS:
sudo firewall-cmd --permanent --zone=public --add-service=https
Перезавантажте брандмауер, щоб зберегти зміни за допомогою команди:
sudo firewall-cmd --reload
Після виконання цих кроків ваш сервер матиме необхідну конфігурацію для перегляду версій HTTP і HTTPS вашого сайту. Після завершення налаштування брандмауера ви можете встановити сертифікати.
Керування оновленням сертифікатів
Якщо ви керуєте кількома доменами (хостами) на вашому сервері, вам можуть бути корисні wildcard сертифікати. Wildcard сертифікати - це SSL-сертифікати, які можуть гарантувати безпеку для декількох хостів. Керування кількома хостами на вашому сервері за допомогою wildcard сертифікатів може допомогти вам заощадити час і гроші.
Загалом, Let's Encrypt може автоматично встановлювати необхідні сертифікати і запускати веб-сервіси відповідно до них. Якщо у вас вже є клієнт Let's Encrypt - чудово! Якщо ж ні, вам необхідно встановити клієнти Nginx і Certbot перед тим, як встановити клієнт Let's Encrypt. Для генерації сертифікатів для вашого сервера вам також знадобиться доменне ім'я і DNS-провайдер, який підтримує клієнт Certbot.
Після встановлення клієнта Certbot ви можете розпочати генерацію сертифікатів.
Майте на увазі, що клієнт Let's Encrypt вимагає підтвердження від DNS, щоб видати вам wildcard сертифікати.
Щоб отримати wildcard сертифікати, скористайтеся наступною командою:
*sudo certbot certonly --manual --preferred-challenges=dns --email xyz@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d example.com -d .example.com
Де:
certonly - запит сертифікатів
-manual - отримання сертифікатів
-preferred-challenges=dns - авторизація через DNS
-server - сервер, який використовується для генерації сертифікатів
-agree-tos - згода з умовами та положеннями
-d - домен (або хост), для якого генеруються сертифікати
Деякі сертифікати мають термін дії. Отже, коли скрипт отримання сертифікатів завершиться, ви можете поновити сертифікати.
Ви можете перевірити, чи буде оновлення працювати для поточних (не прострочених) сертифікатів, імітуючи їх статус закінчення терміну дії за допомогою наступної команди в Certbot:
sudo certbot renew --dry-run
Щоб оновити сертифікати в Certbot, скористайтеся наступною командою:
sudo certbot renew
Після цього перезавантажте веб-сервіс для отримання оновлених сертифікатів, використовуючи:
sudo nginx -s reload
Якщо ви хочете зробити цей процес автоматичним, ви можете зробити це за допомогою скрипта нижче.
sudo vi /etc/cron.daily/letsencrypt-renew
#!/bin/sh
if certbot renew > /var/log/letsencrypt/renew.log 2>&1 ; then
nginx -s reload
fi
exit
sudo chmod +x /etc/cron.daily/letsencrypt-renew
Скрипт оновить сертифікати і направить результати в файл журналу; в разі успішного оновлення, скрипт виконає перезавантаження клієнта Nginx для того, щоб зміни були застосовані.
Після завершення процесу ви можете автоматизувати скрипт за допомогою Crontab, відкривши crontab root-користувача і використовуючи наведену нижче команду редагування:
sudo Crontab -e
Щоб автоматизувати його, введіть у вікні crontab команду, наведену нижче:
01 02,14 * * * /etc/cron.daily/letsencrypt-renew,
де час оновлення скрипта - 02:01 і 14:01, що означає, що скрипт оновлюється двічі на день. Ви можете встановити найбільш зручний для вас час.
Потім збережіть зміни.
Скасування сертифікатів для підвищення безпеки
Щоб видалити SSL-сертифікати з сервера, скористайтеся наступною командою з назвою вашого домену (або хоста):
sudo certbot revoke --cert-path /etc/letsencrypt/live/domain_name/cert.pem
Після виконання команди ви не отримаєте жодних сповіщень про зміни в сертифікатах. Проте, ви можете повторити команду, і якщо вона покаже, що сертифікат вже скасовано, це означає, що процес завершено успішно.
Посилення заходів веб-безпеки
Коли ви отримуєте або поновлюєте сертифікати, перевірте Nginx клієнта на предмет подальшого налаштування HTTPS.Використання виключно безпечних протоколівНе всі протоколи безпеки розробляються однаково, деякі з них менш безпечні, ніж інші. Наприклад, сертифікати SSLv2 і SSLv3 відстають за рівнем безпеки від сертифікатів TLS. Вважається, що сертифікати SSL мають певні недоліки щодо протоколів безпеки. Таким чином, виникла потреба замінити їх на кращі протоколи. У випадку SSL це TLSv1.1 і TLSv1.2.Однак навіть у випадку з TLS-сертифікатами краще використовувати новіші сертифікати, хоча деякі браузери все одно вимагатимуть старіші версії
Активація HTTP Strict Transport Security (HSTS)
Strict Transport Security захищає сертифікати TLS, гарантуючи безпечний зв'язок з веб-сайтами, які їх використовують. Тому навіть якщо є проблеми з конфігурацією або впровадженням, HSTS надасть достатній рівень безпеки сертифікатів, зробивши деякі посилання безпечними. Він також сповіщатиме користувачів про атаки, вимикаючи вбудовану в сертифікати функцію попередження про перехід за посиланням.
Увімкнути HTST можна за допомогою наступної команди:
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
Вдосконалення пакетів шифрування
Завданням пакетів шифрів є оцінка того, наскільки безпечним є зв'язок між веб-сервером і клієнтами-відвідувачами.
Нижче наведено приклад, створений для ключів RSA та ECDSA:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA: ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384: ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256: DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256
Врешті-решт, клієнт вказує на пакет шифрів, які він використовує, і надає серверам можливість вибирати пакети шифрів. Клієнт встановлює шифри на сервері у порядку спадання, від найбезпечнішого до найменш безпечного. Щоб увімкнути цю функцію, скористайтеся наступною командою:
ssl_prefer_server_ciphers on;
Зверніть увагу, що це працює з протоколами SSL, а саме SSLv3 і новішими.
Імплементація алгоритму Діффі-Геллмана
Алгоритм Діффі-Геллмана - це протокол, який обмінюється ключами між двома сторонами для створення взаємного секрету, який не може бути виявлений за межами двосторонньої комунікації. DH - це, по суті, спосіб шифрування, який наказує двом сторонам використовувати відкритий ключ для шифрування або розшифрування даних, якими вони обмінюються. Простіше кажучи, секретна інформація змішується з відкритою інформацією, так що розпізнати секретну інформацію буде неможливо. Це корисний метод для створення спільного ключа між сервером і клієнтом і використання цього ключа для шифрування даних, якими вони обмінюються.
Статичний DH відрізняється від свого ефемерного алгоритму тим, що останній генерує тимчасовий ключ для кожної взаємодії, не повторюючи його. Таким чином, DHE сприяє довгостроковій безпеці, оскільки тимчасовий ключ не може бути втраченим, як і захищені ним дані.
Ви можете використовувати алгоритм DHE за допомогою наступної команди:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Отримані дані можна використовувати в конфігурації Nginx, наприклад, так:
ssl_dhparam /etc/ssl/certs/dhparam.pem;
Автоматичне перенаправлення незашифрованих з'єднань
Корисним способом гарантувати безпеку веб-спілкування є перенаправлення незашифрованих HTTP-з'єднань на зашифровані HTTPS. Ви можете зробити це за допомогою наступної команди:
server { listen 80;
ім'я_сервера ім'я_домену;
return 301 https://$ім'я_сервера$request_uri;
}
Таким чином, ви створюєте лише сегмент HTTP, щоб ваш веб-сервер міг його помітити і оновити HTTP-з'єднання до HTTPS. Таким чином, навіть якщо в посиланні використовується "http:", воно буде перетворено в "https:".
Інтегрування всіх заходів безпеки в конфігурації
Незважаючи на те, що клієнт Certbot зберігає конфігурацію Nginx при використанні CentOS, редагування конфігурації клієнта Nginx вручну перешкоджає оновленню файла в майбутньому. Для цього створіть новий файл Nginx за допомогою наступної команди:
sudo vi /etc/nginx/conf.d/domain_name.conf
За допомогою цієї команди ви створюєте окремий файл Nginx, який буде відстежувати HTTPS-з'єднання, використовуючи всі заходи безпеки, згадані вище.
Щоб додати заходи безпеки, продублюйте наступний приклад в Nginx:
# HTTPS server
server{
listen 443 ssl;
ім'я_сервера ім'я_домену;
ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384: ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256: DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
# HTTP redirect
server {
listen 80;
ім'я_сервера ім'я_домену;
return 301 https://$server_name$request_uri;
}
Переконайтеся, що ви зберегли файл в Nginx, а потім перезавантажте Nginx наступною командою:
sudo systemctl restart nginx
Тепер ви можете відкрити ваш сайт у веб-браузері за адресою https://domain_name. Якщо він завантажиться, це означає, що установка пройшла успішно.
Якщо ви хочете додатково перевірити, наскільки добре працює серверне шифрування в браузері, скористайтеся тестом Qualys SSL Labs. Введіть ім'я вашого домену (хоста) на їхньому веб-сайті та натисніть кнопку "Надіслати". Тест надасть інформацію про різні аспекти вашого серверного шифрування.