Обслуживание сайта на Cloudflare и Nginx

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

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

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

Требования

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

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

Центр сертификации Cloudflare Origin CA позволяет создавать подписанные Cloudflare бесплатные TLS-сертификаты и устанавливать их на сервер 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;
        }

Сюда нужно внести такие поправки:

  • Настроить прослушивание порта 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;
    }
}

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

Проверьте файл на наличие ошибок:

sudo nginx -t

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

sudo systemctl restart nginx

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

После этого посетите свой сайт (https://your_domain) и убедитесь, что он настроен правильно. На экране вы должны увидеть свою домашнюю страницу, а браузер сообщит, что сайт защищен.

Чтобы просмотреть детали сертификата, откройте Developer Tools, выберите Security tab, а затем View Certificate.

https://assets.digitalocean.com/articles/68249/L9dOHLP.png

Примечание: Возможно, вы заметили, что в сертификате Cloudflare не отмечен как издатель. Это связано с тем, что Cloudflare может использовать другие центры сертификации, такие как Let’s Encrypt. Полный список можно найти в документации Cloudflare.

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

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

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

При TLS-рукопожатии обе стороны предоставляют свои сертификаты на проверку. При этом сервер настроен только на прием запросов, которые используют валидный сертификат клиента 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, где будет храниться наш сертификат.

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_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, а затем перезагрузить сайт. Появится следующее сообщение об ошибке:

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

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

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

Заключение

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

Tags: , ,

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