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

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

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

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

Требования

  • Сервер Ubuntu 20.04, настроенный по этому мануалу.
  • Nginx, установленный по мануалу Установка Nginx в Ubuntu 20.04
  • Аккаунт Cloudflare.
  • Зарегистрированный домен, добавленный в ваш аккаунт Cloudflare, который указывает на сервер Nginx. Полезную информацию вы найдете в мануалах Смягчение DDoS-атаки сайта с помощью CloudFlare и Введение в DNS: основные термины, компоненты и понятия.
  • Виртуальный хост Nginx для вашего домена, который вы можете создать по инструкциям раздела 5 мануала Установка Nginx в Ubuntu 20.04.

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

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

Чтобы сгенерировать сертификат Origin CA, откройте панель управления Cloudflare в браузере. Выберите домен, для которого переназначен сертификат, и перейдите в раздел SSL/TLS панели управления. Откройте вкладку Origin Server и нажмите кнопку Create Certificate.

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

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

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

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

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

sudo nano /etc/ssl/cert.pem

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

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

sudo nano /etc/ssl/key.pem

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

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

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

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

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

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

Сначала нам нужно внести поправку в настройки UFW, чтобы он мог поддерживать трафик HTTPS. Включите стандартный профиль Nginx Full, который поддерживает трафик по портам 80 и 443.

sudo ufw allow 'Nginx Full'

Перезапустите брандмауэр:

sudo ufw reload

Убедитесь, что новые правила вступили в силу:

sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)           ALLOW       Anywhere (v6)

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

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

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

sudo nano /etc/nginx/sites-available/your_domain

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

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

В файл Nginx нужно внести такие изменения:

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

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

server {
listen 80;
listen [::]:80;
server_name your_domain www.your_domain;
return 302 https://$server_name$request_uri;
}
server {
# SSL configuration
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate         /etc/ssl/cert.pem;
ssl_certificate_key     /etc/ssl/key.pem;
server_name your_domain www.your_domain;
root /var/www/your_domain/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

Теперь перейдите в раздел SSL/TLS в панели Cloudflare, откройте вкладку Overview и измените режим SSL/TLS encryption mode на Full (strict). Так Cloudflare сможет шифровать соединение между своими серверами и вашим сервером Nginx.

Затем посетите свой веб-сайт (https://your_domain), чтобы убедиться, что он настроен правильно. Вы должны увидеть свою домашнюю страницу, а браузер сообщит, что сайт защищен.

В следующем разделе мы настроим 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-----
MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
fVQ6VpyjEXdiIXWUq/o=
-----END CERTIFICATE-----

Также можно загрузить сертификат напрямую с Cloudflare.

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

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

sudo nano /etc/ssl/cloudflare.crt

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

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

sudo nano /etc/nginx/sites-available/your_domain

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

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

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

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

sudo nginx -t

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

sudo systemctl restart nginx

Чтобы включить Authenticated Pulls, откройте раздел SSL/TLS в панели Cloudflar, перейдите во вкладку Origin Server и включите опцию Authenticated Origin Pulls.

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

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

400 Bad Request
No required SSL certificate was sent

Сервер возвращает ошибку, если запрос не подписан центром Cloudflare.

Примечание: Большинство браузеров кэшируют запросы, поэтому во время проверки вы можете использовать режим инкогнито. Чтобы Cloudflare не кэшировал запросы при настройке вашего веб-сайта, перейдите в раздел Overview в панели управления Cloudflare и щелкните переключатель Development Mode.

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

Заключение

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

Tags: , , , ,

Добавить комментарий