Автор выбрал фонд Free and Open Source Fund для получения пожертвования в рамках программы Write for DOnations.
Хотя используемая по умолчанию установка сервера Apache HTTP безопасна для использования, ее конфигурацию можно значительно улучшить с помощью нескольких изменений. Вы можете дополнить уже существующие механизмы безопасности, например, настроив защиту для cookie-файлов и заголовков, чтобы подключения нельзя было перехватывать на уровне клиента пользователя. Благодаря этому вы сможете значительно снизить вероятность атак с использованием ряда методов, например, атаки с помощью межсайтового выполнения сценариев (XSS). Также вы можете предотвратить другие виды атак, в том числе подделку межсайтовых запросов, перехват сеанса, а также DoS-атаки.
В этом обучающем руководстве мы реализуем некоторые рекомендуемые меры, которые помогут снизить видимость информации, размещенной на вашем сервере. Вы научитесь проверять списки директорий и отключать индексирование для проверки доступа к ресурсам. Также вы сможете изменять используемое по умолчанию значение директивы timeout
для борьбы с последствиями DoS-атак. Кроме того, вы узнаете, как отключить метод TRACE, чтобы сеансы нельзя было переключить или взломать. А в конце вы научитесь обеспечивать безопасность заголовков и cookie-файлов.
Большинство настроек конфигурации будет применяться для основного файла конфигурации Apache HTTP, расположенного по адресу /usr/local/etc/apache24/httpd.conf
.
Для прохождения этого обучающего руководства вам потребуется следующее:
Сервер FreeBSD 12, настроенный в соответствии с руководством по началу работы с FreeBSD.
Брандмауэр, настроенный в соответствии с указаниями раздела Настройка брандмауэра статьи Рекомендованные шаги для нового сервера FreeBSD 12.0.
Полный стек FAMP, установленный в соответствии с указаниями руководства Установка Apache, MySQL и PHP (FAMP) в FreeBSD 12.0.
Сертификат Let’s Encrypt, установленный согласно руководству Обеспечение безопасности Apache с помощью Let’s Encrypt в FreeBSD.
Когда все необходимое будет у вас в распоряжении, вы получите систему FreeBSD со стеком, позволяющим обслуживать веб-контент с помощью любого ПО, написанного на PHP, например, популярных CMS-систем. За безопасность подключений будет отвечать Let’s Encrypt.
Баннер операционной системы — это метод, используемый компьютерами, серверами и устройствами всех типов для представления информации о себе в сетях. Злоумышленники могут использовать эту информацию для применения эксплойтов в соответствующих системах. В этом разделе вы сможете сократить количество информации, которое содержит этот баннер.
Набор директив контролирует то, как отображается эта информация. Для нашей цели самой важной директивой будет ServerTokens
; по умолчанию она отображает все данные об операционной системе и скомпилированных модулях для клиента, который подключается к ней.
Вы должны воспользоваться инструментом для сетевого сканирования для проверки того, какая информация в настоящее время раскрывается, прежде чем вносить любые изменения. Чтобы установить nmap
, запустите следующую команду:
- sudo pkg install nmap
Чтобы получить IP-адрес вашего сервера, вы можете воспользоваться следующей командой:
- ifconfig vtnet0 | awk '/inet / {print $2}'
Для проверки ответа веб-сервера используйте следующую команду:
- nmap -sV -p 80 your-server-ip
Вызовите nmap
для выполнения сканирования (используйте флаг -s
), для вывода версии (используйте флаг -V
) на порту 80
(используйте флаг -p
) на указанном IP-адресе или домене.
Вы получите информацию о вашем веб-сервере примерно в следующем виде:
OutputStarting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:30 CET
Nmap scan report for 206.189.123.232
Host is up (0.054s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.41 ((FreeBSD) OpenSSL/1.1.1d-freebsd
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds
Данный вывод показывает, что такая информация, как операционная система, версия Apache HTTP и OpenSSL, является видимой. Она может использоваться злоумышленниками для получения данных о сервере и выбора необходимых инструментов для использования уязвимостей, например, уязвимостей установленного на сервере ПО.
Добавьте директиву ServerTokens
в основной файл конфигурации, поскольку она не настроена по умолчанию. Отсутствие такой настройки заставляет Apache HTTP отображать полную информацию о сервере согласно требованиям документации. Чтобы ограничить объем отображаемой информации о вашем сервере и конфигурации, поместите директиву ServerTokens
в основной файл конфигурации.
Добавьте эту директиву после записи ServerName
в файле конфигурации. Запустите следующую команду для поиска директивы:
- grep -n 'ServerName' /usr/local/etc/apache24/httpd.conf
Вы получите номер строки, которую затем сможете найти с помощью vi
:
Output226 #ServerName www.example.com:80
Запустите следующую команду:
- sudo vi +226 /usr/local/etc/apache24/httpd.conf
Затем добавьте следующую выделенную строку:
. . .
#ServerName www.example.com:80
ServerTokens Prod
Сохраните и закройте файл, введя :wq
и нажав ENTER
.
Если для директивы ServerTokens
указано значение Prod
, она будет отображать только информацию о том, что это веб-сервер Apache.
Чтобы изменения вступили в силу, перезапустите сервер Apache HTTP:
- sudo apachectl restart
Чтобы протестировать изменения, запустите следующую команду:
- nmap -sV -p 80 your-server-ip
Вывод будет выглядеть примерно следующим образом и содержать более сжатую информацию о веб-сервере Apache:
OutputStarting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:58 CET
Nmap scan report for WPressBSD (206.189.123.232)
Host is up (0.056s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds
Вы видели, какая информация о сервере отображалась до внесения изменений, а сейчас мы смогли сократить ее количество до минимума. Благодаря этому вы предоставляете меньше данных о вашем сервере сторонним акторам. На следующем шаге вы научитесь управлять списками директорий вашего веб-сервера.
На этом шаге вы сможете убедиться, что список директорий настроен корректно, поэтому необходимые части системы доступны публично, а остальная часть закрыта.
Примечание. Когда аргумент объявляется, он становится активен, но символ +
может визуально подтверждать, что он активен. Использование знака минус -
говорит о том, что аргумент отклонен, например, Options -Indexes
.
Аргументы со знаками +
и/или -
нельзя смешивать, подобная конструкция считается некорректным синтаксисом в Apache HTTP и может быть отклонена при запуске.
Добавление оператора Options -Indexes
отключает индексирование контента внутри пути /usr/local/www/apache24/data
(read listed) автоматически, если файл .html
отсутствует, и запрещает отображение, если URL видит эту директорию. Также подобная практика будет применяться при использовании конфигураций виртуального хоста, например, хоста, используемого согласно предварительным требованиям для размещения сертификата Let’s Encrypt.
Вы задаете для директивы Options
аргумент -Indexes
и используете директиву +FollowSymLinks
, которая позволит использовать символьные ссылки. Вы должны также воспользоваться символом +
для соблюдения конвенций Apache HTTP.
Запустите следующую команду для получения строки для редактирования в файле конфигурации:
- grep -n 'Options Indexes FollowSymLinks' /usr/local/etc/apache24/httpd.conf
Результат будет выглядеть примерно так:
Output263 : Options Indexes FollowSymLinks
Запустите следующую команду для прямого доступа к строке для редактирования:
- sudo vi +263 /usr/local/etc/apache24/httpd.conf
Теперь вы можете изменить строку согласно желаемой конфигурации:
. . .
#
Options -Indexes +FollowSymLinks
#
. . .
Сохраните и закройте файл, введя :wq
и нажав ENTER
.
Перезапустите Apache HTTP для вступления изменений в силу:
- sudo apachectl restart
В браузере при попытке входа на домен вы увидите сообщение о запрете доступа (ошибку 403). Это результат внесенных вами изменений. Добавление -Indexes
в директиву Options
позволило отключить автоматическое индексирование Apache HTTP, в результате чего файл index.html
по указанному пути отсутствует.
Вы можете решить эту проблему, разместив файл index.html
внутри виртуального хоста (VirtualHost
), который вы активировали согласно предварительным требованиям для использования сертификата Let’s Encrypt. Вам нужно будет воспользоваться блоком по умолчанию внутри Apache HTTP и разместить его в той же папке, что и DocumentRoot
, объявленный в виртуальном хосте.
<VirtualHost *:80>
ServerAdmin your_email@your_domain.com
DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
ServerName your_domain.com
ServerAlias www.your_domain.com
ErrorLog "/var/log/your_domain.com-error_log"
CustomLog "/var/log/your_domain.com-access_log" common
</VirtualHost>
Для этого используйте следующую команду:
- sudo cp /usr/local/www/apache24/data/index.html /usr/local/www/apache24/data/your_domain.com/index.html
Теперь вы должны увидеть сообщение It works! при посещении вашего домена.
В этом разделе вы добавили ограничения для директивы Indexes
и запретили автоматическое включение в список и отображение контента, за исключением того, который вы опубликовали намеренно. Теперь, если файл index.html
отсутствует внутри пути данных, Apache HTTP не будет автоматически создавать индекс содержимого. На следующем шаге мы перейдем к дальнейшему сокрытию данных и настроим другие директивы.
Директива Timeout
задает лимит времени, в течение которого Apache HTTP будет ждать нового ввода/вывода, прежде чем отклонять запрос подключения. Такие проблемы могут возникать в силу разных обстоятельств, например, в случае, если пакеты не будут поступать на сервер или данные не будут подтверждены как полученные клиентом.
По умолчанию для директивы timeout задается значение 60
секунд. В условиях медленного подключения к Интернету такое значение по умолчанию может быть разумным, но одна минута — это довольно долго, особенно если сервер обслуживает пользователей с быстрым доступом в Интернет. Кроме того, время, когда сервер не закрывает соединение, может быть использовано для совершения DoS-атак. При большом количестве злонамеренных подключений сервер может не справляться, а его работа может замедляться.
Чтобы изменить значение, найдите записи Timeout
в файле httpd-default.conf
:
- grep -n 'Timeout' /usr/local/etc/apache24/extra/httpd-default.conf
Вывод будет выглядеть примерно следующим образом:
Output 8 # Timeout: The number of seconds before receives and sends time out.
10 Timeout 60
26 # KeepAliveTimeout: Number of seconds to wait for the next request from the
29 KeepAliveTimeout 5
89 RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
В строке вывода 10
задается значение директивы Timeout
. Чтобы получить доступ к этой строке, запустите следующую команду:
- sudo vi +10 /usr/local/etc/apache24/extra/httpd-default.conf
Вы должны изменить значение на 30
секунд, например, следующим образом:
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 30
Сохраните и закройте файл, введя :wq
и нажав ENTER
.
Значение директивы Timeout
должно обеспечивать баланс между временем, достаточно долгим, чтобы создавать надежные и успешные подключения, но достаточно коротким, чтобы не допустить нежелательных попыток подключения.
Примечание. DoS-атаки могут очень легко истощать все ресурсы сервера. Дополнительной и очень эффективной контрмерой является использование поточного MPM для достижения наилучших результатов работы Apache HTTP с подключениями и процессами. В руководстве Настройка Apache HTTP с MPM Event и PHP-FPM во FreeBSD 12.0 описаны шаги для активации этой возможности.
Чтобы изменения вступили в силу, перезапустите сервер Apache HTTP:
- sudo apachectl restart
Вы изменили значение директивы Timeout
по умолчанию для частичного смягчения последствий DoS-атак.
Гипертекстовый транспортный протокол был разработан в соответствии с моделью клиент-сервер, и как таковой этот протокол имеет методы для получения или размещения информации от сервера и на сервере. Сервер должен понимать эти наборы методов и взаимодействие между ними. На этом шаге вы настроите минимальный набор необходимых методов.
Метод TRACE, который считался безвредным, стал инструментом для совершения атак с помощью межсайтового отслеживания. Атаки такого типа позволяют злоумышленникам красть сеансы пользователя с помощью этого метода. Метод был создан для отладки, когда сервер возвращает тот же запрос, который первоначально отправляется клиентом. Поскольку cookie из сеанса браузера отправляются на сервер, они будут отправлены обратно. Однако эти cookie могут быть перехвачены злоумышленником, который затем может перенаправлять соединение браузера на находящийся под его контролем сайт, а не на оригинальный сервер.
Из-за подобной возможности злонамеренного использования метода TRACE рекомендуется использовать его только в процессе отладки, не допуская в продакшен. В этом разделе вы отключите этот метод.
Откройте файл httpd.conf
с помощью следующей команды и нажмите G
, чтобы перейти в самый конец файла:
- sudo vi /usr/local/etc/apache24/httpd.conf
Добавьте следующий путь входа в конце файла:
. . .
TraceEnable off
Рекомендуется использовать только методы, которые вы будете использовать в вашем веб-сервере Apache HTTP. Это позволит ограничить потенциальные точки входа для злоумышленников.
Директива LimitExcept
может быть полезна в этом случае, запрещая использование любых других методов, кроме объявленных. Например, конфигурация в этом случае может выглядеть следующим образом:
DocumentRoot "/usr/local/www/apache24/data"
<Directory "/usr/local/www/apache24/data">
Options -Indexes +FollowSymLinks -Includes
AllowOverride none
<LimitExcept GET POST HEAD>
deny from all
</LimitExcept>
Require all granted
</Directory>
Как указано в директиве LimitExcept
, в данной конфигурации допускаются только методы GET, POST и HEAD.
GET
является частью протокола HTTP и используется для получения данных.POST
также является частью протокола HTTP и используется для отправки данных на сервер.HEAD
похож на GET
, но не имеет код для отправки ответа.Вы должны будете воспользоваться следующей командой и разместить блок LimitExcept
внутри файла:
- sudo vi +272 /usr/local/etc/apache24/httpd.conf
Чтобы настроить конфигурацию, вы должны разместить следующий блок в строке директивы DocumentRoot
, откуда будет считываться содержимое, а именно внутрь записи Directory
:
. . .
<LimitExcept GET POST HEAD>
deny from all
</LimitExcept>
. . .
Чтобы применить изменения, перезапустите Apache HTTP:
- sudo apachectl restart
Новая версия директивы AllowedMethods
предоставляет аналогичный функционал, хотя она пока используется в экспериментальном порядке.
Вы увидели, что такое методы HTTP, порядок их использования и защиту от злоумышленников, которую они обеспечивают, на примере метода TRACE, а также процесс объявления того, какие методы разрешено использовать. Далее вам предстоит поработать над дополнительными мерами защиты для HTTP-заголовков и cookie-файлов.
На этом шаге вы настроите конкретные директивы для защиты сеансов, которые будут создавать клиентские устройства при посещении вашего веб-сервера Apache HTTP. Таким образом ваш сервер не будет загружать нежелательный контент, средства шифрования не пострадают, а вы не станете жертвой отслеживания контента.
Заголовки — это компоненты методов запроса. Существует заголовки для настройки аутентификации, связи между сервером и клиентом, кэширования, согласования содержимого и т. д.
Cookie — это элементы информации, передаваемые сервером в браузер. Эти элементы позволяют серверу распознавать браузер клиента на разных компьютерах. Также они позволяют серверам распознавать сеансы пользователя. Например, они могут отслеживать корзину покупок зарегистрированного пользователя, платежную информацию, историю и т. д. Cookie-файлы используются и хранятся в браузере клиента, поскольку HTTP — это протокол без состояния, что означает, что после закрытия соединения сервер не запоминает запрос, отправленный тем или иным клиентом.
Важно обеспечить защиту заголовков, а также cookie-файлов, поскольку они обеспечивают связь между веб-браузером клиента и веб-сервером.
Модуль headers
активирован по умолчанию. Чтобы убедиться, что он загружен, вы должны воспользоваться следующей командой:
- sudo apachectl -M | grep 'headers'
Вывод должен выглядеть так:
Outputheaders_module (shared)
Если вы не получили какого-либо результата, проверьте, включен ли модуль в файл Apache httpd.conf
:
- grep -n 'mod_headers' /usr/local/etc/apache24/httpd.conf
В выводе вы должны увидеть незакомментированную строку, которая будет указывать на конкретный модуль для заголовков:
. . .
122 LoadModule headers_module libexec/apache24/mod_headers.so
. . .
Удалите хэштег в начале строки mod_headers.so
, если он присутствует, чтобы активировать директиву.
Используя следующие директивы Apache HTTP, вы сможете защитить заголовки и cookie от вредоносной активности, а также снизить возможные риски для клиентов и серверов.
Теперь вы можете настроить защиту заголовка. Необходимо разместить все эти значения заголовка в одном блоке. Вы можете указывать любые значения, но рекомендуется использовать их все.
Откройте файл httpd.conf
с помощью следующей команды и нажмите G
, чтобы перейти в самый конец файла:
- sudo vi /usr/local/etc/apache24/httpd.conf
Добавьте следующий блок в конце файла:
. . .
<IfModule mod_headers.c>
# Add security and privacy related headers
Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always edit Set-Cookie (.*) "$1; HttpOnly; Secure"
Header set X-Content-Type-Options "nosniff"
Header set X-XSS-Protection "1; mode=block"
Header set Referrer-Policy "strict-origin"
Header set X-Frame-Options: "deny"
SetEnv modHeadersAvailable true
</IfModule>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
: строгая безопасность передачи информации по протоколу HTTP (HTTP Strict Transport Security, HTSTS) — это используемый веб-серверами и клиентами (в основном браузерами) механизм коммуникации строго с помощью HTTPS. С помощью этого метода вы сможете избежать атак через посредника, когда третья сторона в процессе коммуникации может получить доступ к битам, а также вскрыть их.
Header always edit Set-Cookie (. *) "$1; HttpOnly; Secure"
:`` флаги HttpOnly
и Secure
в заголовках помогают предотвратить атаки с использованием межсайтового выполнения сценариев (XSS). Cookie-файлы могут использоваться злоумышленниками, которые представляются кем-то другим (кража личности), или похищаться.
Header set Referrer-Policy "strict-origin"
: заголовок Referrer-Policy указывает, какая информация указывается в качестве информации об источнике ссылки в поле заголовка.
Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;"
: заголовок Content-Security-Policy (CSP) позволяет практически полностью предотвратить загрузку контента, не указанного в параметрах, что очень полезно для предотвращения атак с использованием межсайтового выполнения сценариев (XSS). Существует множество возможных параметров для настройки политики для этого заголовка. В целом необходимо настроить его для загрузки контента из одного сайта и обновления любого контента с происхождением из HTTP.
Header set X-XSS-Protection "1; mode=block"
: данный заголовок поддерживает старые браузеры, которые не работают с заголовками Content-Security-Policy
. Заголовок ‘X-XSS-Protection’ обеспечивает защиту от атак с использованием межсайтового выполнения сценариев. Вам не нужно задавать этот заголовок, если только вам не нужно поддерживать старые версии браузера, что бывает очень редко.
Header set X-Frame-Options: "deny"
: предотвращение атак с использованием кликджекинга. Заголовок ‘X-Frame-Options’ говорит браузеру, может ли страница отображаться в <frame>
, <iframe>
, <embed>
или <object>
. Таким образом содержимое других сайтов не может быть встроено в другие сайты, что не позволяет выполнять атаки с использованием кликджекинга. Здесь вы запрещаете любое отображение во фрейме, чтобы веб-страница не могла быть встроена куда-либо еще, даже внутри одного веб-сайта. Вы можете изменить эту настройку согласно вашим потребностям, если, например, вам нужно разрешить отображение некоторых страниц, в частности, рекламных публикаций или взаимодействие с конкретными веб-сайтами.
Header set X-Content-Type-Options "nosniff"
: заголовок ‘X-Content-Type-Options’ контролирует типы MIME, запрещая их изменение или выполнение. Типы MIME — это стандарты формата файлов; они работают для текста, аудио, видео, изображений и т. д. Эти блоки заголовков не дают злоумышленникам получать информацию об этих файлах и пытаться изменить типы файлов.
Перезапустите Apache для вступления изменений в силу:
- sudo apachectl restart
Чтобы проверить уровни безопасности ваших настроек конфигурации, откройте веб-сайт заголовков безопасности. После выполнения указаний данного руководства ваш домен должен получить оценку А.
Примечание. Если в результате проверки заголовков на сайте https://securityheaders.com/
вы получили оценку F
, причиной этому может быть отсутствие index.html
внутри DocumentRoot
вашего сайта, как указано в конце шага 2. Если в результате проверки вы получили любую оценку, кроме A
и F
, еще раз проверьте каждый набор заголовков
на наличие опечаток, которые могли привести к снижению оценки.
На этом шаге мы поработали с семью настройками для повышения безопасности заголовков и cookie-файлов. Эти действия помогут предотвратить межсайтовое выполнение сценариев, кликджекинг и другие типы атак.
В этом обучающем руководстве мы изучили несколько аспектов безопасности, от раскрытия информации до защиты сеансов, задав альтернативные настройки конфигурации для важных с точки зрения безопасности функций.
Дополнительную информацию о ресурсах или методах повышения безопасности Apache можно найти по этим ссылкам:
Дополнительные инструменты для защиты Apache HTTP:
mod_evasive
— полезный инструмент для смягчения последствий DoS-атак. Дополнительную информацию см. в статье Защита от DoS и DDoS с помощью mod_evasive в руководстве по работе с Apache.
fail2ban
— это программное обеспечение для предотвращения повторных попыток входа в систему несанкционированных пользователей. Дополнительную информацию см. в руководстве Защита сервера Apache с помощью Fail2Ban.
ModSecurity
— это брандмауэр веб-приложения (или WAF), который предоставляет широкий диапазон возможностей на основе предварительно заданных правил, написанный SpyderLabs и участниками сообщества. Дополнительную информацию об этом инструменте см. в руководстве Настройка ModSecurity в Apache.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!