При создании современных веб сервисов возникает много задач инфраструктурного характера:
- получить и своевременно обновлять SSL сертификат
- защититься от DDOS атак
- оптимизировать скорость загрузки статики в разных регионах мира
Сегодня существуют сервисы (например Cloudflare), которые упрощают решение этих задач.
Они работают в качестве прокси. Клиент будет подключаться к серверам Cloudflare, который выступит в качестве посредника запросов и ответов. Таким образом клиент не знает реального адреса вашего веб ресурса и взаимодействует с ним через оптимизированные каналы Cloudflare.

В данной статье мы решим конкретную задачу – покажем как настроить end-to-end шифрование трафика, обеспечить ваш сайт бесплатным SSL сертификатом, а сам сервер настроить таким образом, что обратиться к нему может только аутентифицированный источник со стороны Cloudflare.
Варианты решения проблемы
При подключении вашего домена к Cloudflare и выбора режима прокси, вы автоматически получаете SSL сертификат. Однако, ваш веб-сервер все-равно остается доступен при условии знания его реального IP адреса. Это может приводить к различным проблемам за счет ошибок конфигурации и добавлять новые векторы атак.
IP whitelisting
Если погуглить решения данной проблемы, можно заметить, что интернет в основном полон предложений ограничивать запросы по IP, не принадлежащим Cloudflare.

SSL client certificates
Мы предлагаем использовать для решения этой задачи штатный функционал Authenticated Origin Pulls. Он заключается в получении SSL сертификата, который Cloudflare будет использовать для аутентификации на вашем веб сервере. Нужно лишь установить его в интерфейсе и настроить веб-сервер для проверки клиентского сертификата и блокирования доступа без него.

Инструкция по настройке
Допустим, у вас есть домен, который вы уже подключили к Cloudflare и хотите настроить для него защищенное прокси соединение. В нашем случае таким адресом будет example.com
.
Включение прокси для домена
В разделе DNS вашей панели управления необходимо найти или создать доменную А запись и включить режим proxy.

На вкладке SSL/TLS при это нужно выбрать режим end-to-end шифрования Full (strict).

Генерация Origin сертификата
Теперь наступает самое интересное. На вкладке SSL/TLS нужно выбрать секцию Origin Server и нажать кнопку Create Certificate для создания сертификата.

Далее вы можете оставить всё по умолчанию, доверив Cloudflare сгенерировать сертификат для вас, а можете по желанию загрузить свой собственный сертификат.

Важно отметить, что в бесплатной версии сертификат будет поддерживаться только для домена 1 и 2 уровней. Проще говоря, если вы владеете доменом example.com
, то вы сможете использовать аутентификацию только для домена example.com
и *.example.com
. Использовать этот подход для домена test.stage.example.com
увы не получится.
В результате вам будут представлены для копирования два файла: сертификат (CRT) и ключ (KEY).
Теперь на предыдущей странице вы можете включить обязательную аутентификацию.

Настраиваем 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.