Введение
В этой лабораторной работе вы научитесь защищать веб-сервер Nginx в Linux, внедряя HTTPS с использованием самоподписанного сертификата. Вы начнете с установки веб-сервера Nginx и убедитесь, что он работает корректно, заложив основу для безопасной конфигурации. После первоначальной настройки вы будете использовать набор инструментов OpenSSL для генерации самоподписанного SSL-сертификата, который является критически важным компонентом для обеспечения зашифрованных коммуникаций.
После создания сертификата вы перейдете к изменению конфигурации Nginx для обслуживания веб-контента по безопасному протоколу HTTPS. Заключительные этапы лабораторной работы посвящены проверке и тестированию. Вы активируете новую конфигурацию и будете использовать такие инструменты командной строки, как curl и openssl, для тестирования HTTPS-соединения и проверки деталей вашего вновь созданного самоподписанного сертификата, подтверждая, что ваш сервер должным образом защищен.
Установка и запуск веб-сервера Nginx
На этом этапе вы установите веб-сервер Nginx. Nginx — это высокопроизводительный веб-сервер, широко используемый для обслуживания веб-контента. Сначала мы установим его, а затем проверим, что он работает корректно. Эта работающая инстанция Nginx послужит основой для нашей последующей конфигурации HTTPS.
Во-первых, лучшей практикой является обновление списка пакетов вашей системы, чтобы гарантировать получение последних версий программного обеспечения.
Выполните следующую команду в вашем терминале:
sudo apt update
Вы увидите, как система получает информацию о пакетах из своих настроенных источников. Вывод будет выглядеть примерно так:
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Fetched 1,585 kB in 2s (924 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
Теперь вы можете приступить к установке Nginx. Мы будем использовать команду apt install. Флаг -y добавлен для автоматического подтверждения установки, избегая любых интерактивных запросов.
sudo apt install nginx -y
Процесс установки загрузит и настроит Nginx и его зависимости. По завершении вы должны увидеть вывод, указывающий на то, что пакет nginx был установлен.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
nginx-common nginx-core
...
Setting up nginx-common (1.18.0-6ubuntu14.4) ...
Setting up nginx-core (1.18.0-6ubuntu14.4) ...
Setting up nginx (1.18.0-6ubuntu14.4) ...
Processing triggers for ufw (0.36.1-4ubuntu0.1) ...
Processing triggers for man-db (2.10.2-1) ...
Хотя процесс установки часто запускает службу, хорошей практикой является явное управление ею. Мы будем использовать systemctl, стандартную утилиту для управления службами в современных системах Linux.
Запустите службу Nginx с помощью этой команды:
sudo systemctl start nginx
Эта команда не выдаст никакого вывода, если она выполнится успешно. Чтобы убедиться, что служба запущена, проверьте ее статус.
sudo systemctl status nginx
Вывод предоставит подробную информацию о службе. Найдите строку Active: active (running), которая подтверждает, что Nginx запущен и работает.
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-10-30 08:30:00 UTC; 5s ago
Docs: man:nginx(8)
Main PID: 1234 (nginx)
Tasks: 2 (limit: 4617)
Memory: 4.8M
CPU: 43ms
CGroup: /system.slice/nginx.service
├─1234 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─1235 "nginx: worker process"
Теперь вы успешно установили и запустили веб-сервер Nginx. На следующем шаге вы сгенерируете цифровой сертификат, который является предварительным условием для включения HTTPS.
Генерация самоподписанного SSL-сертификата с помощью OpenSSL
На этом этапе вы создадите самоподписанный цифровой сертификат и соответствующий ему закрытый ключ. Для включения HTTPS веб-серверу нужен цифровой сертификат для подтверждения своей личности клиентам и закрытый ключ для установления безопасного зашифрованного соединения. Мы будем использовать утилиту командной строки openssl, мощный инструмент для работы с SSL/TLS.
Цифровой сертификат связывает открытый ключ с идентификатором (например, доменным именем веб-сайта). Обычно сертификаты выдаются и подписываются доверенным Центром Сертификации (CA). Однако для целей тестирования и разработки мы можем создать самоподписанный сертификат, который подписывается его собственным создателем. Хотя браузеры будут отображать предупреждение безопасности для таких сертификатов, они вполне функциональны для лабораторной среды, подобной этой.
Сначала создадим выделенный каталог в папке конфигурации Nginx для хранения нашего SSL-сертификата и ключа. Это позволит организовать наши файлы и обеспечить их безопасность.
sudo mkdir -p /etc/nginx/ssl
Теперь мы используем одну команду openssl для генерации как 2048-битного RSA закрытого ключа, так и самоподписанного сертификата, действительного в течение 365 дней. Мы поместим их непосредственно в каталог /etc/nginx/ssl/.
Вот разбивка параметров команды:
req -x509: Создает самоподписанный сертификат.-nodes: Запрещает шифрование закрытого ключа парольной фразой. Это важно, чтобы Nginx мог запуститься без ручного вмешательства.-days 365: Устанавливает срок действия сертификата на один год.-newkey rsa:2048: Генерирует новый 2048-битный RSA закрытый ключ.-keyout: Указывает выходной файл для закрытого ключа (/etc/nginx/ssl/nginx.key).-out: Указывает выходной файл для сертификата (/etc/nginx/ssl/nginx.crt).-subj: Предоставляет информацию о субъекте сертификата неинтерактивно.CN=localhost— это Общее Имя (Common Name), которое должно соответствовать адресу, используемому для доступа к сайту.
Выполните следующую команду:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt \
-subj "/C=US/ST=State/L=City/O=LabOrg/OU=IT/CN=localhost"
После выполнения команды вы увидите вывод, подтверждающий генерацию ключа.
Generating a RSA private key
writing new private key to '/etc/nginx/ssl/nginx.key'
-----
Закрытый ключ (/etc/nginx/ssl/nginx.key) чрезвычайно чувствителен. Если он будет скомпрометирован, злоумышленник сможет выдать себя за ваш сервер. Поэтому крайне важно ограничить его права доступа к файлу, чтобы только пользователь root мог его читать.
sudo chmod 600 /etc/nginx/ssl/nginx.key
Эта команда устанавливает права доступа на чтение и запись только для владельца (root) и никаких прав для кого-либо еще. Это критически важная мера безопасности.
Отлично! Теперь вы создали самоподписанный сертификат (nginx.crt) и безопасный закрытый ключ (nginx.key). На следующем шаге вы настроите Nginx для использования этих двух файлов для включения HTTPS.
Настройка Nginx для обслуживания контента по HTTPS
На этом этапе вы измените конфигурацию Nginx для включения HTTPS. Имея готовый сертификат и закрытый ключ из предыдущего шага, вам теперь нужно указать Nginx их использовать. Это включает редактирование файла конфигурации сайта Nginx для прослушивания порта 443 (стандартный порт для HTTPS) и указание путей к вашим файлам сертификата и ключа.
Перед редактированием любого файла конфигурации разумно создать резервную копию. Это позволит вам легко вернуться к исходному состоянию, если что-то пойдет не так. Давайте сделаем резервную копию файла конфигурации сайта Nginx по умолчанию.
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
Теперь вы отредактируете основной файл конфигурации с помощью текстового редактора nano. Этот файл содержит блоки сервера, которые определяют, как Nginx обрабатывает входящие запросы.
sudo nano /etc/nginx/sites-available/default
В редакторе nano вы увидите блок сервера по умолчанию, настроенный для HTTP на порту 80. Прокрутите вниз до раздела конфигурации SSL, который обычно закомментирован. Вам нужно раскомментировать этот раздел и убедиться, что он соответствует приведенной ниже конфигурации. Этот блок указывает Nginx прослушивать безопасные соединения на порту 443 и указывает, какой сертификат и ключ использовать для TLS-рукопожатия.
Удалите существующий закомментированный блок сервера SSL и замените его следующим содержимым, или просто раскомментируйте и отредактируйте его, чтобы он соответствовал.
## --- CONTENT TO ADD/UNCOMMENT IN /etc/nginx/sites-available/default ---
server {
listen 443 ssl;
listen [::]:443 ssl;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name localhost;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
try_files $uri $uri/ =404;
}
}
## --- END CONTENT ---
Вот что означают эти директивы:
listen 443 ssl: Указывает Nginx прослушивать входящие соединения на порту 443 и обрабатывать их с использованием протокола SSL/TLS.server_name localhost: Определяет, какой блок сервера использовать для запросов кlocalhost.ssl_certificate: Указывает путь к вашему файлу открытого сертификата (nginx.crt).ssl_certificate_key: Указывает путь к вашему файлу закрытого ключа (nginx.key).
После добавления содержимого сохраните файл и выйдите из nano, нажав Ctrl+X, затем Y и Enter.
Перед применением изменений крайне важно протестировать конфигурацию Nginx на наличие синтаксических ошибок. Это предотвратит сбой вашего веб-сервера из-за некорректной конфигурации.
sudo nginx -t
Если конфигурация верна, вы увидите сообщение об успехе.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Если вы увидите какие-либо ошибки, откройте файл конфигурации снова и внимательно проверьте наличие опечаток или отсутствующих точек с запятой.
Теперь вы успешно настроили Nginx для обслуживания контента по HTTPS. Следующий шаг — применить эти изменения, перезапустив службу и протестировав соединение.
Активация и тестирование HTTPS-конфигурации с помощью curl
На этом этапе вы примените новую конфигурацию Nginx и убедитесь, что ваш веб-сервер корректно обслуживает контент по HTTPS. Хотя вы изменили файл конфигурации на диске, работающий процесс Nginx по-прежнему использует старую конфигурацию. Вам необходимо перезапустить службу, чтобы изменения вступили в силу.
Чтобы применить новую конфигурацию, перезапустите службу Nginx с помощью systemctl.
sudo systemctl restart nginx
Эта команда не выводит никакого сообщения в случае успеха. Nginx теперь будет прослушивать порт 443 и готов обрабатывать HTTPS-запросы, используя предоставленный вами сертификат и ключ.
Теперь давайте протестируем HTTPS-эндпоинт. Мы будем использовать curl, утилиту командной строки для передачи данных по URL. Мы попытаемся получить главную страницу с нашего сервера, используя протокол https://.
При подключении к серверу по HTTPS ваш клиент (в данном случае curl) проверяет, подписан ли сертификат сервера доверенным Центром Сертификации (CA). Поскольку мы создали самоподписанный сертификат, он по умолчанию не является доверенным, и curl откажется подключаться, выдав ошибку валидации сертификата.
Чтобы обойти это для нашего теста, мы используем флаг -k или --insecure. Этот флаг указывает curl пропустить проверку сертификата. Это небезопасно и не должно использоваться в продакшене, но необходимо для тестирования самоподписанного сертификата в лабораторной среде.
Выполните следующую команду для тестирования вашего HTTPS-сервера:
curl -k https://localhost
Если ваша конфигурация верна, curl успешно подключится к серверу и выведет HTML-содержимое страницы приветствия Nginx по умолчанию.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Получение этого HTML-вывода подтверждает, что ваш сервер Nginx успешно настроен и обслуживает контент по зашифрованному HTTPS-соединению. На последнем шаге вы узнаете, как просмотреть сертификат, который представляет сервер.
Проверка SSL-сертификата сервера с помощью OpenSSL
На этом заключительном этапе вы изучите детали цифрового сертификата, который ваш сервер Nginx представляет клиентам. Это важнейший навык для устранения неполадок с TLS/HTTPS и проверки личности сервера. Вы снова будете использовать инструмент openssl, но на этот раз в качестве клиента для подключения к собственному серверу и проверки предоставляемого им сертификата.
Мы будем использовать комбинацию двух команд openssl, соединенных конвейером (|).
openssl s_client -connect localhost:443: Эта команда действует как универсальный SSL/TLS-клиент и подключается к указанному серверу и порту. Она выведет сертификат сервера вместе с деталями сеанса.openssl x509 -text -noout: Эта команда используется для разбора и отображения содержимого сертификата X.509 в удобочитаемом формате.
Мы передадим вывод s_client напрямую в x509 для разбора сертификата на лету. echo | в начале предотвращает ожидание ввода пользователя командой s_client, а 2>/dev/null скрывает сообщения о статусе соединения. Для наглядности мы сохраним вывод в файл.
Выполните следующую команду, чтобы подключиться к вашему серверу, извлечь сертификат, разобрать его и сохранить детали в файл с именем /tmp/server_certificate_details.txt.
echo | openssl s_client -connect localhost:443 2> /dev/null | openssl x509 -text -noout > /tmp/server_certificate_details.txt
Теперь отобразите содержимое только что созданного файла, чтобы увидеть детали сертификата.
cat /tmp/server_certificate_details.txt
Вы увидите подробную разбивку свойств сертификата.
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
Validity
Not Before: Oct 30 09:00:00 2023 GMT
Not After : Oct 29 09:00:00 2024 GMT
Subject: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:
...
Exponent: 65537 (0x10001)
...
Уделите минуту изучению вывода. Обратите внимание на следующие ключевые поля:
- Issuer (Издатель): Сущность, подписавшая сертификат.
- Subject (Субъект): Сущность, которой выдан сертификат.
- CN (Common Name) (Общее имя): Конкретный домен, для которого предназначен сертификат (
localhost).
Поскольку это самоподписанный сертификат, поля Issuer и Subject идентичны. Это определяющая характеристика самоподписанного сертификата. Вы также можете увидеть период действия и детали открытого ключа.
Поздравляем! Вы успешно настроили веб-сервер Nginx с самоподписанным SSL-сертификатом, сконфигурировали его для HTTPS, протестировали соединение и просмотрели детали сертификата. Теперь у вас есть базовое понимание компонентов, участвующих в обеспечении безопасности веб-трафика с помощью TLS/HTTPS.
Резюме
В этой лабораторной работе вы изучили полный процесс внедрения HTTPS на веб-сервере Nginx в среде Linux с использованием самоподписанного сертификата. Вы начали с создания основы, которая включала обновление списка пакетов системы и установку веб-сервера Nginx с помощью менеджера пакетов apt. Основная часть лабораторной работы была посвящена безопасности, где вы использовали набор инструментов OpenSSL для генерации приватного ключа и соответствующего самоподписанного SSL-сертификата, которые являются необходимыми компонентами для включения зашифрованных соединений.
После создания сертификата вы приступили к настройке сервера Nginx. Это включало изменение его конфигурационных файлов для создания блока сервера, который прослушивает порт 443 для HTTPS-трафика, и указание путей к вашему новому сертификату и приватному ключу. Чтобы завершить процесс, вы активировали новую конфигурацию и выполнили важные шаги проверки. Вы использовали команду curl для тестирования HTTPS-соединения из командной строки и подтвердили, что сервер отвечает безопасно. Наконец, вы использовали OpenSSL в качестве клиентского инструмента для проверки сертификата сервера, подтвердив, что обслуживается правильный сертификат.



