Как защитить Nginx в Ubuntu 14.04
Nginx — очень безопасный и надежный веб-сервер даже с настройкой по умолчанию. Однако есть много способов еще больше обезопасить Nginx.
В этой статье мы будем использовать исключительно программное обеспечение с открытым исходным кодом, пытаясь следовать некоторым популярным подходам к усилению защиты веб-серверов и стандартам безопасности. А именно, мы будем говорить о предотвращении раскрытия информации, принудительном шифровании, проведении аудитов и ограничении доступа.
Предпосылки
Прежде чем следовать этому руководству, убедитесь, что выполнены следующие предварительные условия:
- Капля Ubuntu 14.04 (подробности см. (Начальная настройка сервера с Ubuntu 14.04)
- Веб-сервер Nginx установлен и настроен, как описано в разделе Как установить Nginx в Ubuntu 14.04 LTS.
- Зарегистрированный домен или поддомен указывал на IP-адрес дроплета. Это понадобится вам для проверки настроек SSL. Для получения дополнительной информации прочитайте эту статью о том, как указать на серверы имен DigitalOcean от общих регистраторов доменов.
- Пользователь sudo без полномочий root (подробности см. в Initial Server Setup with Ubuntu 14.04)
Если не указано иное, все команды, требующие привилегий root в этом руководстве, должны выполняться от имени пользователя без полномочий root с привилегиями sudo.
Шаг 1 — Обновление всего программного обеспечения
Обновление вашего программного обеспечения до последней версии — отличный первый шаг к защите всей вашей системы, а не только Nginx.
Предупреждение: перед обновлением всех пакетов в вашей системе обязательно определите, вызовет ли это проблемы с чем-либо, работающим в вашей системе, кроме Nginx. Рекомендуется сделать резервную копию всей системы перед выполнением операции, затрагивающей одновременно столько пакетов. Вы можете вернуться к резервной копии, если возникнут проблемы после обновления всех пакетов. Чтобы обновить список пакетов репозитория, а затем все установленные в данный момент пакеты, управляемые с помощью apt-get
на вашем сервере Ubuntu, выполните команды:
- sudo apt-get update && sudo apt-get upgrade
Кроме того, вы можете просто обновить Nginx до последней версии в репозитории Ubuntu. Это обновит пакет Nginx и все необходимые зависимости:
- sudo apt-get upgrade nginx
Шаг 2 — Предотвращение раскрытия информации
Чтобы приступить к защите вашего веб-сервера Nginx, давайте начнем с ограничения информации, которую он раскрывает. Ценная информация просачивается на каждом уровне, от заголовков HTTP-сервера до отчетов об ошибках приложений.
Итак, давайте начнем с заголовков HTTP. По умолчанию Nginx показывает свое имя и версию в заголовках HTTP. Вы можете проверить эту информацию с помощью curl
следующим образом:
- curl -I http://localhost
Вывод должен выглядеть так:
Output of curl -I http://localhostHTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
...
Как видите, в приведенном выше выводе можно увидеть версию Nginx и название операционной системы. Это не обязательно серьезная проблема, а скорее часть головоломки, которую злоумышленник попытается решить, чтобы скомпрометировать ваш сервер Nginx. Вот почему мы скроем эту информацию, открыв основной файл конфигурации Nginx /etc/nginx/nginx.conf
с помощью nano следующим образом:
- sudo nano /etc/nginx/nginx.conf
Затем внутри части конфигурации http
добавьте строку server_tokens off;
следующим образом:
http {
##
# Basic Settings
##
server_tokens off;
...
После этого сохраните и закройте файл, а затем перезагрузите Nginx, чтобы изменения вступили в силу:
- sudo service nginx reload
Теперь, если вы снова попробуете ту же команду curl:
- curl -I http://localhost
Вы увидите меньше информации:
Output of curl -I http://localhostHTTP/1.1 200 OK
Server: nginx
...
Приведенный выше вывод раскрывает только тот факт, что это сервер Nginx. Вы можете задаться вопросом, можете ли вы удалить это тоже. К сожалению, это нелегко сделать, потому что для этого нет опции конфигурации. Вместо этого вам придется перекомпилировать Nginx из исходного кода, что не стоит усилий.
Помимо заголовка Server
, есть еще один заголовок с конфиденциальной информацией — X-Powered-By
. Этот заголовок обычно показывает версию PHP, Tomcat или любого другого серверного движка за Nginx. Если вы запустите Nginx с PHP, вывод curl
будет выглядеть так:
Output of curl -I http://localhost on nginx with phpHTTP/1.1 200 OK
Server: nginx
...
X-Powered-By: PHP/5.5.9-1ubuntu4.14
...
Приведенный выше заголовок X-Powered-By
показывает, что сервер — это Ubuntu 14, работающий под управлением PHP версии 5.5.9. Очень важно скрыть эту информацию от заголовка X-Powered-By
. Вы не можете сделать это в Nginx, но вместо этого вы должны найти соответствующую опцию в движке бэкэнда. Например, в случае с PHP необходимо установить параметр expose_php=Off
в основном файле конфигурации php.ini
. По умолчанию для этого параметра установлено значение On
.
Следующее, что нужно сделать, это изменить страницы ошибок 4xx (на стороне клиента), информация с которых может быть использована злоумышленником. Обычно это страницы с ошибками Unauthorized 401
и Forbidden 403
. Если вы не отлаживаете проблему, обычно нет необходимости показывать эти ошибки постоянным посетителям. Если вам нужно узнать об этих ошибках, вы все равно сможете найти их в журнале ошибок Nginx (/var/log/nginx/error.log
).
Чтобы изменить эти две страницы ошибок, откройте файл конфигурации для вашего блока сервера, например файл по умолчанию:
- sudo nano /etc/nginx/sites-enabled/default
Внутри основной части конфигурации сервера server
укажите:
server {
...
error_page 401 403 404 /404.html;
...
После сохранения изменений в файл обязательно перезагрузите Nginx, чтобы он вступил в силу, с помощью команды:
- sudo service nginx reload
Приведенные выше советы дают вам представление о предотвращении раскрытия информации — показывайте как можно меньше ненужного веб-контента. Скрывать служебную и отладочную информацию нужно не только в Nginx, но и в бэкэнд-движках (PHP, Tomcat и т. д.) и, конечно же, в веб-приложениях.
Шаг 2 — Настройка SSL
Запуск безопасного протокола HTTPS с SSL на Nginx является обязательным для любого сайта, который обрабатывает конфиденциальную информацию, такую как учетные данные пользователей, личные данные и т. д. SSL — это единственный способ убедиться, что независимо от того, где находятся пользователи вашего сайта и какое подключение к Интернету они используют, информация, которую они получают и отправляют, будет защищена.
В статье Как создать SSL-сертификат на Nginx для Ubuntu 14.04 объясняется, как легко настроить бесплатный SSL с конфигурацией HTTPS по умолчанию. Хотя эта статья является хорошим началом, она не сможет эффективно защитить ваши данные. В настоящее время настройки и алгоритмы SSL по умолчанию недостаточно сильны, чтобы помешать злоумышленнику расшифровать ваш трафик.
Вот почему мы настроим SSL-сертификат для Nginx с более надежными алгоритмами и настройками шифрования. Это обеспечит более высокий уровень защиты ваших данных, а ваш HTTPS-сервис будет соответствовать самым высоким стандартам и практикам безопасности.
Начнем с создания каталога для наших SSL-сертификатов с помощью команды:
- sudo mkdir /etc/nginx/ssl/
Для нашего SSL нам понадобится сертификат с надежным алгоритмом подписи SHA256. В целях тестирования или в непроизводственной среде вы можете использовать самозаверяющий сертификат и игнорировать предупреждения SSL. Давайте создадим его с помощью команды:
- sudo openssl req -x509 -nodes -sha256 -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
Эта команда задаст вам несколько простых вопросов о деталях вашего сайта и бизнеса. После этого он создаст 2048-битный зашифрованный ключ RSA в файле /etc/nginx/ssl/nginx.key
и сертификат SHA256 в файле /etc/nginx/ssl/nginx. crt
.
Затем вам нужно будет сгенерировать более сильные параметры DH длиной 4096 бит. Приготовьтесь подождать некоторое время, в зависимости от вашей капли, это может занять до 30 минут. Запустите команду:
- sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
Теперь вы можете настроить часть SSL вашего блока сервера. В качестве примера давайте настроим блок сервера по умолчанию. Откройте его файл конфигурации для редактирования с помощью nano:
sudo nano /etc/nginx/sites-enabled/default
В этом файле отредактируйте часть конфигурации сервера, добавив часть SSL после директивы server_name
следующим образом:
server {
...
server_name localhost;
### SSL Part
listen 443 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
...
Вот какие инструкции мы указали с помощью вышеуказанных директив:
listen
— включить прослушиватель SSL на порту 443, т. е. порте HTTPS.ssl_protocols
— включите только эти три протокола, которые в настоящее время считаются безопасными —TLSv1 TLSv1.1 TLSv1.2
.ssl_ciphers
— включите только эти безопасные шифры SSL:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
ssl_prefer_server_ciphers
— убедитесь, что клиент соблюдает настройки шифрования сервера.ssl_dhparam
— используйте настраиваемые надежные параметры Диффи-Хелмана, которые мы создали ранее.ssl_certificate
— используйте наш самозаверяющий SSL-сертификат. Обязательно измените его, если вы используете другой сертификат.ssl_certificate_key
— используйте наш закрытый ключ SSL, который мы создали ранее.
Чтобы вышеуказанные настройки вступили в силу, вам придется снова перезагрузить nginx командой:
- sudo service nginx reload
Чтобы протестировать новую конфигурацию SSL, лучше всего использовать внешний инструмент, например, предоставленный SSL Labs. Там вы должны игнорировать предупреждение о том, что SSL не является доверенным. Это естественно, потому что это самозаверяющий сертификат. Обратите внимание, что этот сайт будет тестировать только сайты с зарегистрированным доменным именем. Вы не можете протестировать SSL-соединение только с IP-адресом вашего дроплета.
Общий результат должен быть \T, как и для \Тестирование, но по сути это A (самый высокий из возможных) и должно быть написано Если вопросы доверия игнорируются: A
примерно так:
Позже вы, вероятно, захотите удалить предупреждение SSL и сделать тест SSL чистым «A». Один из вариантов — использовать Let’s Encrypt, как описано в статье Как защитить Nginx с помощью Let’s Encrypt в Ubuntu 14.04. Это бесплатно. , позволяет указать размер ключа RSA до 4096 и не выдает предупреждения о самоподписании. В противном случае вы можете выбрать любого из коммерческих поставщиков SSL. Когда вы выбираете одного, просто убедитесь, что вы выбрали сертификат SHA256.
Шаг 3 — Ограничение доступа по IP
Парольной аутентификации не всегда достаточно для обеспечения безопасности важных областей вашего сайта, таких как панели управления сайтом, phpmyadmin и т. д. Иногда злоумышленники используют слабые пароли или уязвимости программного обеспечения в таких областях для получения несанкционированного доступа. Вот почему настоятельно рекомендуется добавить дополнительное ограничение IP-адресов, если вы можете определить IP-адреса законных пользователей.
Например, если у вас есть сайт WordPress и его административная область находится по адресу /wp-admin/
, вы должны ограничить доступ к нему только своим IP-адресом или IP-адресами всех администраторов. Для этого откройте соответствующий блок сервера — блок сервера по умолчанию для Nginx — /etc/nginx/sites-enabled/default
:
sudo nano /etc/nginx/sites-enabled/default
Внутри части конфигурации server
добавьте:
server {
...
location /wp-admin/ {
allow 192.168.1.1/24;
allow 10.0.0.1/24;
deny all;
}
...
...
В приведенном выше коде обязательно замените 192.168.1.1
и 10.0.0.1
вашими IP-адресами. Точно так же вы можете разрешить доступ для других IP-адресов или даже сетей, изменив маску сети (/24
).
Чтобы такие настройки вступили в силу, вам придется снова перезагрузить Nginx командой:
- sudo service nginx reload
Теперь, если вы попытаетесь получить доступ к части /wp-admin/
вашего сайта с помощью браузера за пределами разрешенных диапазонов IP-адресов, вы получите сообщение об ошибке. Эта ошибка будет 403 Forbidden (если только вы не изменили эту ошибку на 404 Not found, как объяснялось ранее). При этом истинный код ошибки вы увидите в журнале ошибок командой:
- sudo tail /var/log/nginx/error.log
Ошибка доступ запрещен
будет отображаться следующим образом:
Output of sudo tail -f /var/log/nginx/error.log...
2016/01/02 04:16:12 [error] 4767#0: *13 access forbidden by rule, client: X.X.X.X, server: localhost, request: "GET /wp-admin/ HTTP/1.1", host: "Y.Y.Y.Y"
...
Сочетание применения нескольких подходов к безопасности, таких как изменение страницы с ошибкой и ограничение доступа по IP, показывает кумулятивный эффект усиления защиты Nginx. Например, вместо обычной страницы администрирования WordPress злоумышленники и используемые ими автоматизированные инструменты увидят страницу 404 not found. Это сбивает с толку и может помешать им попробовать другие подходы к компрометации вашего WordPress.
Шаг 4. Проведение аудита безопасности
Всегда полезно иметь проверку безопасности, независимую от вашего собственного мнения. Для этой цели вы можете использовать инструмент аудита безопасности, который сканирует веб-уязвимости. Таких инструментов много, в том числе и коммерческих, и для начала вы можете использовать бесплатный wapiti с открытым исходным кодом. В Wapiti могут отсутствовать некоторые функции более продвинутых инструментов, но он даст вам представление о том, что такое аудит безопасности.
Вы можете установить wapiti на Ubuntu через apt:
- sudo apt-get install wapiti
Затем запустите сканирование вашего сайта с помощью wapiti с помощью команды:
wapiti http://example.org -n 10 -b folder
Обязательно замените example.org
названием вашего сайта. Мы передали команде два дополнительных аргумента. Первый -n 10
ограничивает количество URL-адресов с одним и тем же шаблоном до 10, чтобы предотвратить бесконечные циклы. Второй аргумент -b folder
устанавливает область сканирования только для данного домена.
После завершения сканирования вы получите результаты в каталоге с именем generated_report
внутри каталога, из которого вы запустили сканирование. Для лучшего просмотра загрузите этот каталог на свой локальный компьютер и откройте файл index.html
в веб-браузере.
В отчете вы увидите уязвимости, отсортированные по 10 различным категориям: SQL-инъекция, слепая SQL-инъекция, обработка файлов, межсайтовый скриптинг, CRLF, выполнение команд, потребление ресурсов, обход Htaccess, резервный файл и потенциально опасный файл.
В идеале ваш отчет должен выглядеть так, если уязвимостей не обнаружено:
Если есть уязвимости, вы можете развернуть соответствующую часть сканирования для получения дополнительной информации.
Обязательно запускайте такие сканирования часто и с помощью различных инструментов, чтобы обеспечить наиболее полный и тщательный аудит вашего Nginx и веб-сайтов.
Шаг 5. Принятие дополнительных мер безопасности
Некоторые темы, касающиеся безопасности Nginx, не рассматриваются в этой статье, потому что о них уже есть отличные статьи. Пожалуйста, ознакомьтесь со следующими:
- Как установить и настроить Naxsi в Ubuntu 14.04
Naxsi — это брандмауэр веб-приложений для Nginx. Он защищает вас как от известных, так и от неизвестных веб-уязвимостей, используя набор вредоносных сигнатур.
Вы должны знать, что Naxsi — это сложное программное обеспечение, и его настройка требует времени и усилий. К счастью, для большинства популярных веб-приложений существуют готовые конфигурации, которые при необходимости можно настроить дополнительно.
- Как защитить сервер Nginx с помощью Fail2Ban в Ubuntu 14.04
Fail2ban — отличный инструмент, который поднимает веб-безопасность на новый уровень и активно защищает ваш сервер nginx. До сих пор мы ограничивали пользователей в поиске определенной информации и доступе к разделам нашего сайта. С помощью fail2ban вы можете дополнительно блокировать злоумышленников на определенные периоды времени, когда вы обнаружите, что они выполняют вредоносную деятельность.
- Мониторинг стека LEMP с помощью Monit в Ubuntu 14.04
Мониторинг необходим для обеспечения безопасности, и Monit — отличный инструмент для этой цели с хорошей поддержкой Nginx. Веб-журналы не только показывают следы злонамеренных действий, но также показывают всплески загрузки ЦП и использования памяти.
В этой статье особое внимание уделите Шагу 5 — Мониторинг журналов на наличие ошибок и ключевых слов. Там вы можете настроить настраиваемые оповещения, которые будут отправляться при событиях безопасности, например, когда кто-то получает доступ или пытается получить доступ к конфиденциальным частям вашего сайта (сайтов).
- Как настроить брандмауэр с помощью Iptables в Ubuntu 14.04
Наличие брандмауэра очень важно для безопасности вашего nginx и вашей капли в целом. Убедитесь, что вы добавили порт https (tcp 443) к разрешенным входящим соединениям помимо стандартного порта http (tcp 80).
- Как установить Aide на VPS DigitalOcean
Средство проверки целостности файлов и каталогов, такое как AIDE, предупреждает об изменениях в файлах и каталогах. Это особенно удобно для веб-файлов, потому что вы должны знать, когда части вашего сайта изменяются и добавляются новые файлы/каталоги. Чтобы узнать больше об AIDE, вы можете начать со статьи.
Приведенная выше статья немного устарела и не написана специально для Ubuntu. Однако вы сможете легко адаптировать его и применить для Ubuntu 14.04. Когда вы настраиваете AIDE или другой подобный инструмент, убедитесь, что ваши веб-журналы и временные файлы, такие как веб-кеш, исключены из-под контроля.
Заключение
После прочтения этой статьи вы должны чувствовать себя более уверенно в отношении безопасности Nginx. Просто обязательно ищите баланс между функциональностью и безопасностью, чтобы вы были уверены, что ваша веб-среда работает так, как задумано, но в то же время безопасно. Кроме того, имейте в виду, что защита Nginx — это постоянная задача, требующая регулярного обновления, перенастройки, сканирования и т. д.