Защита с firewalld и SELinux в RHEL

Red Hat Enterprise LinuxBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы узнаете, как обезопасить веб-сервер Apache (httpd) в Red Hat Enterprise Linux (RHEL), управляя политиками SELinux и правилами брандмауэра. Вы пройдете через практический сценарий, в котором настроите httpd для прослушивания нестандартного порта и изучите, как системы SELinux и брандмауэра управляют безопасностью для таких конфигураций. Это упражнение предоставляет практический опыт работы с распространенными задачами администрирования безопасности в среде RHEL.

Вы начнете с настройки службы httpd для работы на пользовательском порту и наблюдения за ее поведением в условиях принудительного применения SELinux. Вы будете использовать команду semanage, чтобы понять и управлять метками портов SELinux, обеспечивая надлежащее соответствие требованиям безопасности. Затем вы будете использовать firewall-cmd, чтобы открыть этот пользовательский порт в брандмауэре системы. Наконец, вы проверите доступность веб-сервера, подтверждая, что ваши конфигурации безопасности применены правильно.

Настройка httpd на пользовательском порту и понимание контекста SELinux

На этом шаге вы узнаете, как настроить веб-сервер Apache (httpd) для работы на нестандартном порту и понять, как SELinux управляет доступом к портам. Мы будем работать с портом 8081 и изучим управление портами SELinux, даже если служба успешно запускается в некоторых конфигурациях.

Необходимые пакеты (httpd, policycoreutils-python-utils и firewalld) уже установлены на этапе настройки. Пакет policycoreutils-python-utils предоставляет команду semanage, которую вы будете использовать на следующем шаге.

Давайте начнем с изменения конфигурации httpd по умолчанию, чтобы он прослушивал нестандартный порт 8081. Основной файл конфигурации для httpd находится по адресу /etc/httpd/conf/httpd.conf. Мы будем использовать редактор nano, чтобы изменить порт прослушивания.

sudo nano /etc/httpd/conf/httpd.conf

В редакторе nano используйте клавиши со стрелками для прокрутки вниз и найдите строку Listen 80. Измените эту строку на:

Listen 8081

Чтобы сохранить файл и выйти из nano, нажмите Ctrl+X, затем Y для подтверждения изменений и, наконец, Enter для записи в файл.

Теперь, когда конфигурация изменена, давайте попробуем запустить службу httpd. В этой контейнерной среде systemctl недоступен. Мы запустим демон httpd напрямую.

sudo /usr/sbin/httpd

Вы можете увидеть предупреждающее сообщение о полном доменном имени сервера, но это нормально, и его можно игнорировать.

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::216:3eff:fe02:1a1e%eth0. Set the 'ServerName' directive globally to suppress this message

Давайте проверим, работает ли служба, проверив наличие процессов httpd.

ps aux | grep httpd

Вы должны увидеть несколько запущенных процессов httpd, что указывает на успешный запуск веб-сервера.

root        4813  0.0  0.2  23364  7736 ?        Ss   09:32   0:00 /usr/sbin/httpd
apache      4814  0.0  0.1  23020  5092 ?        S    09:32   0:00 /usr/sbin/httpd
apache      4815  0.0  0.4 1441064 14620 ?       Sl   09:32   0:00 /usr/sbin/httpd
apache      4816  0.0  0.5 1441064 18736 ?       Sl   09:32   0:00 /usr/sbin/httpd
apache      4837  0.0  0.4 1572200 16872 ?       Sl   09:32   0:00 /usr/sbin/httpd
labex       4996  0.0  0.0   6408  2176 pts/3    S+   09:32   0:00 grep --color=auto httpd

Давайте также проверим журналы ошибок httpd, чтобы увидеть, что произошло во время запуска.

sudo tail /var/log/httpd/error_log

Вы должны увидеть обычные сообщения о запуске, указывающие на правильную работу сервера.

[Tue Jun 17 09:32:46.374275 2025] [core:notice] [pid 4812:tid 4812] SELinux policy enabled; httpd running as context system_u:system_r:unconfined_service_t:s0
[Tue Jun 17 09:32:46.377265 2025] [suexec:notice] [pid 4812:tid 4812] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Tue Jun 17 09:32:46.394284 2025] [lbmethod_heartbeat:notice] [pid 4813:tid 4813] AH02282: No slotmem from mod_heartmonitor
[Tue Jun 17 09:32:46.399433 2025] [mpm_event:notice] [pid 4813:tid 4813] AH00489: Apache/2.4.62 (Red Hat Enterprise Linux) configured -- resuming normal operations
[Tue Jun 17 09:32:46.399458 2025] [core:notice] [pid 4813:tid 4813] AH00094: Command line: '/usr/sbin/httpd'

Интересно, что служба httpd запустилась без каких-либо проблем с SELinux. Давайте проверим, были ли какие-либо отказы SELinux в журнале аудита.

sudo grep AVC /var/log/audit/audit.log | grep httpd

Если результатов нет, это означает, что SELinux не заблокировал службу httpd от привязки к порту 8081. Это может быть связано с тем, что:

  1. Порт 8081, возможно, уже разрешен для HTTP-сервисов по умолчанию в некоторых конфигурациях.
  2. Процесс httpd, возможно, работает в неограниченном контексте.
  3. Порт 8081, возможно, уже определен в политике SELinux.

Давайте проверим текущий режим SELinux:

getenforce

Вы должны увидеть, что SELinux находится в режиме "Enforcing" (принудительное применение), что означает, что он активно применяет политики. Тот факт, что httpd успешно запустился, указывает на то, что порт 8081, возможно, уже имеет правильную маркировку SELinux, или служба работает в неограниченном контексте, как показано в сообщениях журнала. Для целей этого учебного упражнения давайте перейдем к следующему шагу, где мы изучим управление портами SELinux и обеспечим правильную конфигурацию.

Понимание и управление метками портов SELinux с помощью semanage

На этом шаге вы узнаете, как управлять метками портов SELinux с помощью команды semanage. Несмотря на то, что служба httpd в настоящее время работает на порту 8081, важно понимать, как правильно настроить политики портов SELinux для обеспечения безопасности и соответствия требованиям. Вы изучите текущую конфигурацию портов и узнаете, как явно назначить правильный тип SELinux для пользовательских портов.

Во-первых, вам нужно найти правильный тип SELinux для портов веб-сервера. Команда semanage port -l выводит список всех определений портов, известных SELinux. Мы можем направить этот вывод в grep, чтобы найти типы, связанные с http.

sudo semanage port -l | grep http

Вывод показывает несколько типов портов. Наиболее релевантным для стандартного веб-сервера является http_port_t.

http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
http_cache_port_t              udp      3130
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

Как видите, http_port_t присвоен стандартным портам HTTP/HTTPS, таким как 80 и 443. Политика SELinux позволяет процессам с типом httpd_t (наш веб-сервер) привязываться к любому порту, помеченному как http_port_t. Давайте проверим, есть ли порт 8081 в этом списке.

Обратите внимание, что порт 8081 в настоящее время не указан в списке http_port_t. Однако в некоторых конфигурациях RHEL этот порт, возможно, уже определен в политике SELinux. Давайте попробуем добавить его явно для надлежащего соответствия требованиям SELinux, используя команду semanage port -a.

  • Опция -a означает "добавить" (add).
  • Опция -t http_port_t указывает тип для назначения.
  • Опция -p tcp указывает протокол.
sudo semanage port -a -t http_port_t -p tcp 8081

Вы можете увидеть сообщение, указывающее "Port tcp/8081 already defined, modifying instead" (Порт tcp/8081 уже определен, выполняется изменение), что означает, что порт уже был настроен. Это объясняет, почему httpd успешно запустился на предыдущем шаге. Чтобы проверить текущую конфигурацию, снова выведите список определений http_port_t.

sudo semanage port -l | grep '^http_port_t'

Теперь вы должны увидеть порт 8081 в списке.

http_port_t                    tcp      8081, 80, 81, 443, 488, 8008, 8009, 8443, 9000

С явно обновленной политикой SELinux порт 8081 теперь официально распознается как порт HTTP. Служба httpd должна продолжать работать без каких-либо проблем, и вы обеспечили надлежащее соответствие требованиям SELinux.

Давайте проверим, что процесс все еще работает:

ps aux | grep httpd

Вы должны продолжать видеть несколько процессов httpd, что указывает на успешную работу веб-сервера с правильной маркировкой портов SELinux.

root        4813  0.0  0.2  23364  7736 ?        Ss   09:32   0:00 /usr/sbin/httpd
apache      4814  0.0  0.1  23020  5092 ?        S    09:32   0:00 /usr/sbin/httpd
apache      4815  0.0  0.4 1441064 14620 ?       Sl   09:32   0:00 /usr/sbin/httpd
apache      4816  0.0  0.5 1441064 18736 ?       Sl   09:32   0:00 /usr/sbin/httpd
apache      4837  0.0  0.4 1572200 16872 ?       Sl   09:32   0:00 /usr/sbin/httpd
labex       5215  0.0  0.0   6408  2176 pts/3    S+   09:33   0:00 grep --color=auto httpd

Вы успешно настроили политику SELinux, чтобы явно разрешить службе httpd работать на порту 8081, обеспечив надлежащее соответствие требованиям безопасности.

Открытие пользовательского порта в брандмауэре с помощью firewall-cmd

На этом шаге вы настроите брандмауэр системы, чтобы разрешить внешние подключения к вашему веб-серверу на пользовательском порту 8081. Хотя служба httpd теперь работает правильно благодаря изменению политики SELinux, служба firewalld, которая управляет правилами сетевого трафика, по умолчанию, вероятно, блокирует входящие запросы на этом нестандартном порту.

Пакет firewalld уже был установлен на этапе настройки. Однако нам нужно сначала запустить службу firewalld. Давайте проверим текущее состояние и запустим ее, если необходимо.

sudo firewall-cmd --list-all

Если вы видите "FirewallD is not running" (FirewallD не работает), нам нужно запустить демон firewalld. В этой контейнерной среде мы запускаем демон firewalld напрямую. Символ & в конце запускает процесс в фоновом режиме.

sudo /usr/sbin/firewalld &

Подождите немного, пока служба инициализируется, затем убедитесь, что она работает:

sudo firewall-cmd --list-all

Теперь вы должны увидеть текущую конфигурацию брандмауэра для зоны по умолчанию (public).

Давайте протестируем доступ к веб-серверу из командной строки с помощью curl. Эта команда пытается подключиться к localhost на порту 8081.

curl http://localhost:8081

Вы должны увидеть HTML-контент вашей тестовой страницы, что означает, что веб-сервер доступен локально. Это ожидаемо, потому что firewalld обычно разрешает трафик localhost по умолчанию.

Однако для внешнего доступа и правильной настройки безопасности нам все еще нужно правильно настроить брандмауэр для нашего пользовательского порта. Хотя подключения localhost обычно работают независимо от правил брандмауэра, внешние подключения с других машин будут заблокированы без правильной конфигурации брандмауэра.

Сначала давайте проверим текущие правила для зоны по умолчанию (public):

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Теперь добавьте новое правило, чтобы разрешить трафик TCP на порту 8081. Убедитесь, что firewalld запущен, прежде чем выполнять эту команду.

  • --add-port=8081/tcp указывает порт и протокол для открытия.
  • --permanent гарантирует, что правило сохранится после перезагрузки или перезагрузки брандмауэра.
sudo firewall-cmd --permanent --add-port=8081/tcp

Если вы видите "FirewallD is not running" (FirewallD не работает), убедитесь, что вы запустили демон firewalld на предыдущем шаге, и подождите немного, пока он инициализируется.

Команда должна вернуть success (успешно), когда firewalld работает правильно.

success

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

sudo firewall-cmd --reload

Эта команда также должна вернуть success (успешно).

success

Давайте проверим, что порт теперь открыт, снова перечислив правила.

sudo firewall-cmd --list-all

Теперь вы должны увидеть 8081/tcp в разделе ports:.

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 8081/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Вы успешно настроили брандмауэр. Последний шаг — проверить, можете ли вы получить доступ к веб-серверу.

Проверка доступа к стандартным и пользовательским портам веб-сервера

На этом заключительном шаге вы проверите, что все внесенные вами изменения обеспечивают правильную настройку вашего веб-сервера как для локального, так и для внешнего доступа. Вы настроили политику SELinux и открыли необходимый порт в брандмауэре. Теперь вы выполните комплексные тесты для подтверждения конфигурации.

Сначала давайте создадим простую тестовую страницу, чтобы при подключении мы получали пользовательское сообщение. Корневой каталог по умолчанию для httpd/var/www/html. Мы создадим файл index.html в этом каталоге. Вам потребуются привилегии sudo для записи в это местоположение.

echo "Success! Web server on custom port 8081 is working." | sudo tee /var/www/html/index.html

Эта команда помещает сообщение об успехе в файл index.html. Команда tee используется здесь, потому что она позволяет нам записывать в файл, требующий привилегий sudo, при использовании конвейера. Вы должны увидеть сообщение, эхом отраженное в терминале, в качестве подтверждения.

Success! Web server on custom port 8081 is working.

Чтобы завершить упражнение, давайте продемонстрируем контраст, попытавшись получить доступ к стандартному порту HTTP 80. Поскольку наш сервер настроен для прослушивания только на порту 8081, этот запрос должен завершиться неудачей.

curl http://localhost:80

Как и ожидалось, соединение отклонено, потому что ни одна служба не прослушивает этот порт.

curl: (7) Failed to connect to localhost port 80: Connection refused

Это подтверждает, что ваш сервер работает исключительно на пользовательском порту, который вы настроили. В рамках этой лабораторной работы вы изучили критически важный рабочий процесс устранения неполадок для служб в RHEL:

  1. Проверьте состояние службы и журналы.
  2. Исследуйте отказы SELinux в журнале аудита.
  3. Исправьте политики SELinux с помощью semanage.
  4. Настройте правила брандмауэра с помощью firewall-cmd.
  5. Проверьте подключение.

Резюме

В этой лабораторной работе вы узнали, как настроить веб-сервер на пользовательском порту и управлять политиками безопасности SELinux. С предварительно установленными пакетами веб-сервера Apache (httpd), policycoreutils-python-utils и firewalld, вы сосредоточились на понимании управления портами SELinux и конфигурации брандмауэра. Вы изменили файл httpd.conf, чтобы изменить порт прослушивания веб-сервера на нестандартный порт, 8081.

Вы обнаружили, что служба httpd успешно запустилась на пользовательском порту, потому что порт 8081 уже был правильно настроен в политике SELinux. Это предоставило возможность изучить управление портами SELinux и понять, как работает semanage для поддержания правильной маркировки портов. Вы также научились использовать firewall-cmd для управления правилами брандмауэра, обеспечивая соответствие требованиям безопасности и доступность. Несмотря на то, что httpd работал в неконфигурируемом контексте, эта лабораторная работа продемонстрировала важность правильной конфигурации SELinux и брандмауэра для производственных сред.