Поиск по сайту:

Как защитить 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, выполните команды:

  1. sudo apt-get update && sudo apt-get upgrade

Кроме того, вы можете просто обновить Nginx до последней версии в репозитории Ubuntu. Это обновит пакет Nginx и все необходимые зависимости:

  1. sudo apt-get upgrade nginx

Шаг 2 — Предотвращение раскрытия информации

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

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

  1. curl -I http://localhost

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

Output of curl -I http://localhost
HTTP/1.1 200 OK Server: nginx/1.4.6 (Ubuntu) ...

Как видите, в приведенном выше выводе можно увидеть версию Nginx и название операционной системы. Это не обязательно серьезная проблема, а скорее часть головоломки, которую злоумышленник попытается решить, чтобы скомпрометировать ваш сервер Nginx. Вот почему мы скроем эту информацию, открыв основной файл конфигурации Nginx /etc/nginx/nginx.conf с помощью nano следующим образом:

  1. sudo nano /etc/nginx/nginx.conf

Затем внутри части конфигурации http добавьте строку server_tokens off; следующим образом:

http {

        ##
        # Basic Settings
        ##
        server_tokens off;
...

После этого сохраните и закройте файл, а затем перезагрузите Nginx, чтобы изменения вступили в силу:

  1. sudo service nginx reload

Теперь, если вы снова попробуете ту же команду curl:

  1. curl -I http://localhost

Вы увидите меньше информации:

Output of curl -I http://localhost
HTTP/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 php
HTTP/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).

Чтобы изменить эти две страницы ошибок, откройте файл конфигурации для вашего блока сервера, например файл по умолчанию:

  1. sudo nano /etc/nginx/sites-enabled/default

Внутри основной части конфигурации сервера server укажите:

server {
...
        error_page 401 403 404 /404.html;
...

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

  1. 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-сертификатов с помощью команды:

  1. sudo mkdir /etc/nginx/ssl/

Для нашего SSL нам понадобится сертификат с надежным алгоритмом подписи SHA256. В целях тестирования или в непроизводственной среде вы можете использовать самозаверяющий сертификат и игнорировать предупреждения SSL. Давайте создадим его с помощью команды:

  1. 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 минут. Запустите команду:

  1. 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 командой:

  1. 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 командой:

  1. sudo service nginx reload

Теперь, если вы попытаетесь получить доступ к части /wp-admin/ вашего сайта с помощью браузера за пределами разрешенных диапазонов IP-адресов, вы получите сообщение об ошибке. Эта ошибка будет 403 Forbidden (если только вы не изменили эту ошибку на 404 Not found, как объяснялось ранее). При этом истинный код ошибки вы увидите в журнале ошибок командой:

  1. 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:

  1. 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 — это постоянная задача, требующая регулярного обновления, перенастройки, сканирования и т. д.