При создании современных веб сервисов возникает много задач инфраструктурного характера:
- получить и своевременно обновлять SSL сертификат
- защититься от DDOS атак
- оптимизировать скорость загрузки статики в разных регионах мира
Сегодня существуют сервисы (например Cloudflare), которые упрощают решение этих задач.
Они работают в качестве прокси. Клиент будет подключаться к серверам Cloudflare, который выступит в качестве посредника запросов и ответов. Таким образом клиент не знает реального адреса вашего веб ресурса и взаимодействует с ним через оптимизированные каналы Cloudflare.
![](https://static.codex.so/upload/redactor_images/o_7258695505fef12428c58851390df9af.jpg)
В данной статье мы решим конкретную задачу – покажем как настроить end-to-end шифрование трафика, обеспечить ваш сайт бесплатным SSL сертификатом, а сам сервер настроить таким образом, что обратиться к нему может только аутентифицированный источник со стороны Cloudflare.
Варианты решения проблемы
При подключении вашего домена к Cloudflare и выбора режима прокси, вы автоматически получаете SSL сертификат. Однако, ваш веб-сервер все-равно остается доступен при условии знания его реального IP адреса. Это может приводить к различным проблемам за счет ошибок конфигурации и добавлять новые векторы атак.
IP whitelisting
Если погуглить решения данной проблемы, можно заметить, что интернет в основном полон предложений ограничивать запросы по IP, не принадлежащим Cloudflare.
![](https://static.codex.so/upload/redactor_images/o_d68c5a254653c5ccce843e66b312ef0d.jpg)
SSL client certificates
Мы предлагаем использовать для решения этой задачи штатный функционал Authenticated Origin Pulls. Он заключается в получении SSL сертификата, который Cloudflare будет использовать для аутентификации на вашем веб сервере. Нужно лишь установить его в интерфейсе и настроить веб-сервер для проверки клиентского сертификата и блокирования доступа без него.
![](https://static.codex.so/upload/redactor_images/o_699690f6169c441576abdf1c57417cc6.jpg)
Инструкция по настройке
Допустим, у вас есть домен, который вы уже подключили к Cloudflare и хотите настроить для него защищенное прокси соединение. В нашем случае таким адресом будет example.com
.
Включение прокси для домена
В разделе DNS вашей панели управления необходимо найти или создать доменную А запись и включить режим proxy.
![](https://static.codex.so/upload/redactor_images/o_698baf5ddfe32925fb1126a5794edf32.jpg)
На вкладке SSL/TLS при это нужно выбрать режим end-to-end шифрования Full (strict).
![](https://static.codex.so/upload/redactor_images/o_304be479d42678cf8bf2433d5ece8b73.jpg)
Генерация Origin сертификата
Теперь наступает самое интересное. На вкладке SSL/TLS нужно выбрать секцию Origin Server и нажать кнопку Create Certificate для создания сертификата.
![](https://static.codex.so/upload/redactor_images/o_956b6e3b6701cabe6af2d50442e52959.jpg)
Далее вы можете оставить всё по умолчанию, доверив Cloudflare сгенерировать сертификат для вас, а можете по желанию загрузить свой собственный сертификат.
![](https://static.codex.so/upload/redactor_images/o_aa61029c0a395f5226a800f23b43db78.jpg)
Важно отметить, что в бесплатной версии сертификат будет поддерживаться только для домена 1 и 2 уровней. Проще говоря, если вы владеете доменом example.com
, то вы сможете использовать аутентификацию только для домена example.com
и *.example.com
. Использовать этот подход для домена test.stage.example.com
увы не получится.
В результате вам будут представлены для копирования два файла: сертификат (CRT) и ключ (KEY).
Теперь на предыдущей странице вы можете включить обязательную аутентификацию.
![](https://static.codex.so/upload/redactor_images/o_4525ede22a189c1a70a8867eaa5834ca.jpg)
Настраиваем Nginx
Нам понадобится еще один файл — корневой сертификат, которым подписаны клиентские.
Сохраним все три файла в директорию /etc/ssl
.
- Корневой сертификат
origin-pull-ca.pem
- Ваш сгенерированный Origin сертификат
example_com.crt
- Ваш сгенерированный Origin ключ
example_com.key
Теперь ваша Nginx конфигурация может выглядеть следующим образом.
server {
listen 443 ssl;
server_name example.com;
ssl on;
ssl_certificate /etc/ssl/example.com.crt;
ssl_certificate_key /etc/ssl/example.com.key;
ssl_client_certificate /etc/ssl/origin-pull-ca.pem;
ssl_verify_client on;
location / {
proxy_pass http://localhost:3000/;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
Проверим, что сайт доступен по адресу https://example.com
Дополнительно проверим, что сайт недоступен по прямому адресу без аутентификации:
curl -H "Host: example.com" https://<IP ADDRESS>/ -v -k
В ответ вы должны получить ошибку 400 No required SSL certificate was sent
Выводы
Мы разобрали как включить Cloudflare прокси для вашего домена, автоматически получить бесплатный SSL сертификат и настроить end-to-end шифрование и аутентификацию при помощи штатного функционала Authenticated Origin Pulls.