Обслуживание веб-сайта с помощью Cloudflare и Nginx в Ubuntu 16.04

Cloudflare – это сервис, который находится между посетителем и сервером веб-сайта и действует как обратный прокси-сервер. Cloudflare предоставляет сеть доставки контента (CDN), а также сервисы для смягчения атак DDoS и распределенные серверы доменных имен.

Nginx – популярный веб-сервер, с помощью которого сегодня обслуживается множество крупных и дорогих сайтов в Интернете. Организации часто используют Nginx для обслуживания сайтов, а Cloudflare – в качестве провайдера CDN и DNS.

В этом мануале вы научитесь защищать свой сайт с помощью сертификата Origin CA от Cloudflare и настраивать Nginx для поддержки авторизации запросов на загрузку. Преимущества этой настройки заключаются в том, что вы можете пользоваться CDN и быстрым разрешением DNS, гарантируя, что все соединения проходят через Cloudflare. Это предотвращает доступ злоумышленников к серверу.

Требования

1: Создание TLS-сертификата Origin CA

Центр сертификации Cloudflare Origin CA позволяет создавать бесплатные сертификаты TLS, подписанные Cloudflare, и устанавливать их на сервер Nginx. Используя TLS-сертификат Cloudflare, вы можете защитить соединение между серверами Cloudflare и Nginx.

Чтобы получить сертификат Origin CA, откройте раздел Crypto в панели управления Cloudflare, кликните Create Certificate в разделе Origin Certificates.

Оставьте опцию Let CloudFlare generate a private key and a CSR.

Нажмите Next, и вы увидите диалог с Origin Certificate и Private key. Вам необходимо перенести сертификат и закрытый ключ с CloudFlare на сервер.

Для хранения сертификата можно использовать каталог /etc/ssl/certs. В каталоге /etc/ssl/private будет храниться файл закрытого ключа. Обе папки уже существуют на сервере.

Сначала скопируйте содержимое сертификата Origin Certificate, отображаемого в диалоговом окне вашего браузера.

Затем на сервере откройте /etc/ssl/certs/cert.pem для редактирования:

sudo nano /etc/ssl/certs/cert.pem

Вставьте содержимое сертификата в файл. Затем сохраните и выйдите из редактора.

Вернитесь в браузер и скопируйте содержимое Private key. Откройте файл /etc/ssl/private/key.pem для редактирования:

sudo nano /etc/ssl/private/key.pem

Вставьте ключ в файл, сохраните его и закройте редактор.

Важно! Сертификату Origin CA доверяет только Cloudflare, поэтому его можно использовать только серверами, которые подключены к Cloudflare. Если в какой-либо момент вы приостановите или отключите Cloudflare, сертификат Origin CA выдаст ошибку, потому что сертификат не является доверенным.

Теперь, когда вы скопировали ключ и сертификат на сервер, вам необходимо обновить конфигурацию Nginx, чтобы использовать их.

2: Установка Origin CA на Nginx

Итак, вы сгенерировали сертификат и закрытый ключ с помощью панели управления Cloudlfare и сохранили файлы на вашем сервере. Теперь нужно обновить конфигурацию Nginx вашего сайта, чтобы веб-сервер мог использовать сертификат и ключ для защиты соединения между серверами Cloudflare и вашим сервером.

Nginx создает виртуальный хост по умолчанию во время установки. Удалите его, если он существует, поскольку у вас уже должен быть пользовательский виртуальный хост.

sudo rm /etc/nginx/sites-enabled/default

Затем откройте конфигурационный файл Nginx для вашего домена:

sudo nano /etc/nginx/sites-available/example.com

Он должен выглядеть так:

server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}

Конфигурационный файл Nginx нужно изменить следующим образом:

  • Настроить прослушивание порта 80 и перенаправить все запросы на использование https.
  • Настроить прослушивание порта 443 и добавить поддержку сертификата и закрытого ключа.

Внесите изменения:

server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;

return 302 https://$server_name$request_uri;


}


server {


# SSL configuration


listen 443 ssl http2;


listen [::]:443 ssl http2;


ssl        on;


ssl_certificate         /etc/ssl/certs/cert.pem;


ssl_certificate_key     /etc/ssl/private/key.pem;

server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}

Сохраните и закройте фал.

Затем проверьте, нет ли в конфигурации Nginx синтаксических ошибок:

sudo nginx -t

Если ошибок не обнаружено, перезапустите Nginx, чтобы обновить параметры:

sudo systemctl restart nginx

Теперь перейдите в раздел Crypto панели Cloudflare и измените режим SSL на Full. Так Cloudflare сможет шифровать соединение между своими серверами и вашим сервером Nginx.

Теперь посетите свой веб-сайт, чтобы убедиться, что он настроен правильно. Вы увидите свою домашнюю страницу, а браузер сообщит, что сайт защищен.

В следующем разделе вы настроите Authenticated Origin Pulls. Это позволит серверу подтвердить, что он действительно взаимодействует с Cloudflare, а не с каким-то другим сервером. При этом Nginx будет настроен только на прием запросов, которые используют действительный сертификат клиента Cloudflare, а запросы, которые не прошли через CloudFlare, будут сброшены.

3: Настройка Authenticated Origin Pulls

Сертификат CA Origin поможет серверу Cloudflare подтвердить, что он взаимодействует с правильным сервером. Но как сервер Nginx может проверить, что он на самом деле взаимодействует с Cloudflare? Для этого нужно настроить аутентификацию клиента TLS.

При рукопожатии TLS обе стороны предоставляют для проверки свои сертификаты. Исходный сервер настроен только на прием запросов, которые используют действительный сертификат клиента Cloudflare. Запросы, которые не прошли через Cloudflare, будут сбрасываться, поскольку у них нет сертификата Cloudflare. Это означает, что злоумышленники не могут обойти меры безопасности Cloudflare и напрямую подключиться к вашему серверу Nginx.

Cloudflare представляет сертификаты, подписанные ЦС, со следующим сертификатом:

-----BEGIN CERTIFICATE-----
MIIGBjCCA/CgAwIBAgIIV5G6lVbCLmEwCwYJKoZIhvcNAQENMIGQMQswCQYDVQQG
EwJVUzEZMBcGA1UEChMQQ2xvdWRGbGFyZSwgSW5jLjEUMBIGA1UECxMLT3JpZ2lu
IFB1bGwxFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEzARBgNVBAgTCkNhbGlmb3Ju
aWExIzAhBgNVBAMTGm9yaWdpbi1wdWxsLmNsb3VkZmxhcmUubmV0MB4XDTE1MDEx
MzAyNDc1M1oXDTIwMDExMjAyNTI1M1owgZAxCzAJBgNVBAYTAlVTMRkwFwYDVQQK
ExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmlnaW4gUHVsbDEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZvcm5pYTEjMCEGA1UEAxMa
b3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDdsts6I2H5dGyn4adACQRXlfo0KmwsN7B5rxD8C5qgy6spyONr
WV0ecvdeGQfWa8Gy/yuTuOnsXfy7oyZ1dm93c3Mea7YkM7KNMc5Y6m520E9tHooc
f1qxeDpGSsnWc7HWibFgD7qZQx+T+yfNqt63vPI0HYBOYao6hWd3JQhu5caAcIS2
ms5tzSSZVH83ZPe6Lkb5xRgLl3eXEFcfI2DjnlOtLFqpjHuEB3Tr6agfdWyaGEEi
lRY1IB3k6TfLTaSiX2/SyJ96bp92wvTSjR7USjDV9ypf7AD6u6vwJZ3bwNisNw5L
ptph0FBnc1R6nDoHmvQRoyytoe0rl/d801i9Nru/fXa+l5K2nf1koR3IX440Z2i9
+Z4iVA69NmCbT4MVjm7K3zlOtwfI7i1KYVv+ATo4ycgBuZfY9f/2lBhIv7BHuZal
b9D+/EK8aMUfjDF4icEGm+RQfExv2nOpkR4BfQppF/dLmkYfjgtO1403X0ihkT6T
PYQdmYS6Jf53/KpqC3aA+R7zg2birtvprinlR14MNvwOsDOzsK4p8WYsgZOR4Qr2
gAx+z2aVOs/87+TVOR0r14irQsxbg7uP2X4t+EXx13glHxwG+CnzUVycDLMVGvuG
aUgF9hukZxlOZnrl6VOf1fg0Caf3uvV8smOkVw6DMsGhBZSJVwao0UQNqQIDAQAB
o2YwZDAOBgNVHQ8BAf8EBAMCAAYwEgYDVR0TAQH/BAgwBgEB/wIBAjAdBgNVHQ4E
FgQUQ1lLK2mLgOERM2pXzVc42p59xeswHwYDVR0jBBgwFoAUQ1lLK2mLgOERM2pX
zVc42p59xeswCwYJKoZIhvcNAQENA4ICAQDKDQM1qPRVP/4Gltz0D6OU6xezFBKr
LWtDoA1qW2F7pkiYawCP9MrDPDJsHy7dx+xw3bBZxOsK5PA/T7p1dqpEl6i8F692
g//EuYOifLYw3ySPe3LRNhvPl/1f6Sn862VhPvLa8aQAAwR9e/CZvlY3fj+6G5ik
3it7fikmKUsVnugNOkjmwI3hZqXfJNc7AtHDFw0mEOV0dSeAPTo95N9cxBbm9PKv
qAEmTEXp2trQ/RjJ/AomJyfA1BQjsD0j++DI3a9/BbDwWmr1lJciKxiNKaa0BRLB
dKMrYQD+PkPNCgEuojT+paLKRrMyFUzHSG1doYm46NE9/WARTh3sFUp1B7HZSBqA
kHleoB/vQ/mDuW9C3/8Jk2uRUdZxR+LoNZItuOjU8oTy6zpN1+GgSj7bHjiy9rfA
F+ehdrz+IOh80WIiqs763PGoaYUyzxLvVowLWNoxVVoc9G+PqFKqD988XlipHVB6
Bz+1CD4D/bWrs3cC9+kk/jFmrrAymZlkFX8tDb5aXASSLJjUjcptci9SKqtI2h0J
wUGkD7+bQAr+7vr8/R+CBmNMe7csE8NeEX6lVMF7Dh0a1YKQa6hUN18bBuYgTMuT
QzMmZpRpIBB321ZBlcnlxiTJvWxvbCPHKHj20VwwAz7LONF59s84ZsOqfoBv8gKM
s0s5dsq5zpLeaw==
-----END CERTIFICATE-----

Также вы можете загрузить сертификат с Cloudflare по этой ссылке.

Скопируйте этот сертификат.

Откройте файл /etc/ssl/certs/cloudflare.crt, где хранится сертификат Cloudflare.

sudo nano /etc/ssl/certs/cloudflare.crt

Вставьте следующий сертификат в файл. Сохраните и закройте его.

Теперь обновите конфигурацию Nginx, чтобы настроить поддержку TLS Authenticated Origin Pulls. Откройте конфигурационный файл своего домена:

sudo nano /etc/nginx/sites-available/example.com

Добавьте директивы ssl_client_certificate и ssl_verify_client, как показано в следующем примере:

. . .
server {
# SSL configuration
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl        on;
ssl_certificate         /etc/ssl/certs/cert.pem;
ssl_certificate_key     /etc/ssl/private/key.pem;
ssl_client_certificate /etc/ssl/certs/cloudflare.crt;
ssl_verify_client on;
. . .

Сохраните файл и закройте редактор.

Убедитесь, что в конфигурациях Nginx нет ошибок:

sudo nginx -t

Если проблем не обнаружено, перезапустите Nginx, чтобы изменения вступили в силу:

sudo systemctl restart nginx

Наконец, чтобы включить Authenticated Pulls, откройте раздел Crypto в панели Cloudflare и включите опцию Authenticated Origin Pulls.

Теперь посетите свой сайт, чтобы убедиться, что он настроен правильно. Как и прежде, вы увидите свою домашнюю страницу.

Чтобы убедиться, что сервер будет принимать запросы через CA Cloudflare, попробуйте отключить Authenticated Origin Pulls, а затем перезагрузить сайт. Появится следующее сообщение об ошибке:

400 Bad Request
No required SSL certificate was sent

Сервер вернет ошибку, если запрос не подписан Cloudflare’s CA.

Протестировав настройку, вернитесь в раздел Crypto и снова включите Authenticated Origin Pulls.

Заключение

В этом мануале вы научились включать поддержку шифрования трафика между Cloudflare и сервером Nginx, используя сертификат CA Origin от Cloudflare, а также настраивать Authenticated Origin Pulls на сервере Nginx. Теперь сервер принимает запросы только от серверов Cloudflare, не позволяя кому-либо подключаться напрямую.

Tags: , ,