*Автор выбрал фонд Electronic Frontier Foundation для получения пожертвований в рамках программы Write for DOnations.*

Введение

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

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

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

Предварительные требования

cloudflare illustration for: Предварительные требования

Для прохождения данного обучающего руководства вам потребуется следующее:

Шаг 1 — Генерирование сертификата TLS от ЦС Origin

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

Для генерирования сертификата с использованием ЦС Origin выполните вход в свою учетную запись Clouflare через браузер. Выберите домен, который хотите защитить, и перейдите в раздел SSL/TLS панели управления Cloudflare. Откройте вкладку Origin Server (Сервер Origin) и нажмите кнопку Create Certificate (Создать сертификат):

Оставьте выбранной опцию по умолчанию Let Cloudflare generate a private key and a CSR (Позволить Cloudflare сгенерировать закрытый ключ и CSR).

Нажмите Next (Далее), и вы увидите диалоговое окно с сертификатом Origin и закрытым ключом. Вам потребуется переместить сертификат Origin и закрытый ключ с сервера Cloudflare на ваш сервер. Для дополнительной безопасности информация закрытого ключа больше не будет отображаться, поэтому вам следует скопировать ключ на свой сервер, прежде чем нажать OK.

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

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

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

				
					
sudo nano /etc/ssl/cert.pem

				
			

Добавьте в файл содержимое сертификата. Сохраните файл и закройте редактор.

Затем вернитесь в браузер и скопируйте содержимое закрытого ключа. Откройте файл /etc/ssl/key.pem для редактирования:

				
					
sudo nano /etc/ssl/key.pem

				
			

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

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

[warning]

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

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

Шаг 2 — Установка сертификата ЦС Origin в Nginx

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

Для начала убедитесь, что брандмауэр UFW разрешает трафик HTTPS. Включите опцию Nginx Full, которая открывает порт 80 (HTTP) и порт 443 (HTTPS):

				
					
sudo ufw allow 'Nginx Full'

				
			

Перезагрузите UFW:

				
					
sudo ufw reload

				
			

Убедитесь, что новые правила разрешены и брандмауэр UFW активен:

				
					
sudo ufw status

				
			

Результат должен будет выглядеть следующим образом:

				
					
[secondary_label Output]

Status: <^>active<^>



To Action From

-- ------ ----

OpenSSH ALLOW Anywhere

<^>Nginx Full<^> <^>ALLOW<^> Anywhere

OpenSSH (v6) ALLOW Anywhere (v6)

<^>Nginx Full (v6)<^> <^>ALLOW<^> Anywhere (v6)

				
			

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

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

				
			

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

				
					
sudo nano /etc/nginx/sites-available/<^>your_domain<^>

				
			

Файл должен выглядеть следующим образом:

				
					
[label /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 и использование сертификата Origin и закрытого ключа, добавленных на предыдущем шаге.

Измените файл, чтобы он выглядел следующим образом:

				
					
[label /etc/nginx/sites-available/your_domain]

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 on;<^>

 <^>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 на Full (strict) (Полный (строгий)). Это предпишет Cloudflare всегда шифровать соединение между Cloudflare и вашим сервером Nginx.

Теперь откройте свой сайт по адресу https://<^>your_domain<^> и убедитесь, что он правильно настроен. Вы увидите свою домашнюю страницу, и браузер сообщит, что сайт защищен.

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

Шаг 3 — Настройка запросов pull ЦС Origin с аутентификацией

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

При установлении связи TLS с аутентификацией клиента обе стороны предоставляют сертификат для проверки. Сервер Origin настроен так, чтобы принимать только те запросы, в которых используется действующий сертификат клиента от 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 для использования запросов pull ЦС Origin с аутентификацией TLS. Откройте файл конфигурации вашего домена:

				
					
sudo nano /etc/nginx/sites-available/&lt;^&gt;your_domain&lt;^&gt;

				
			

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

				
					
[label /etc/nginx/sites-available/your_domain]

. . .



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;

 &lt;^&gt;ssl_client_certificate /etc/ssl/cloudflare.crt;&lt;^&gt;

 &lt;^&gt;ssl_verify_client on;&lt;^&gt;



 . . .

				
			

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

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

				
					
sudo nginx -t

				
			

Если проблем обнаружено не будет, перезапустите Nginx для активации изменений:

				
					
sudo systemctl restart nginx

				
			

Для аутентификации запросов pull откройте раздел SSL/TLS в панели управления Cloudflare, перейдите на вкладку Origin Server (Сервер Origin) и включите опцию Authenticated Origin Pulls (Запросы pull сервера Origin с аутентификацией).

Откройте сайт по адресу https://<^>your_domain<^> для проверки правильности настройки. Как и в предыдущем случае, вы увидите свою домашнюю страницу.

Чтобы ваш сервер принимал только запросы, подписанные ЦС Cloudflare, отключите опцию Authenticated Origin Pulls (Запросы pull сервера Origin с аутентификацией) и перезагрузите свой сайт. Вы должны получить следующее сообщение об ошибке:

Ваш сервер Origin выдаст сообщение об ошибке, если запрос не подписан ЦС Cloudflare.

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

Теперь вы знаете, что все работает нормально, и вам нужно будет вернуться в раздел SSL/TLS на панели управления Cloudflare, перейти на вкладку Origin Server (Сервер Origin) и включить опцию Authenticated Origin Pulls (Запросы pull ЦС Origin с аутентификацией).

Заключение

В этом обучающем модуле мы защитили сайт на базе Nginx посредством шифрования трафика между Cloudflare и сервером Nginx с использованием сертификата ЦС Origin от Cloudflare. Затем мы настроили запросы pull ЦС Origin с аутентификацией на сервере Nginx, чтобы он принимал только запросы с серверов Cloudflare, и чтобы никто больше не мог подключиться к серверу Nginx напрямую.