В современной ИТ-инфраструктуре запуск сервиса «как есть» — это осознанный и зачастую неоправданный риск. Мы привыкли полагаться на внешние межсетевые экраны, но забываем, что самая опасная атака - та, что происходит во внутреннем контуре системы.
Systemd Hardening — это стратегия усиления защиты, использующая встроенные механизмы менеджера служб для глубокой изоляции процессов (песочницы) и жесткого ограничения их прав в ОС Linux. В этой статье мы разберем, как превратить стандартные процессы Apache и 1С в изолированные сущности, минимизируя «поверхность атаки».
Мы переходим от модели «разрешено всё, что не запрещено» к модели архитектурной изоляции. Наша цель - поместить процесс в «бетонную коробку»: даже если злоумышленник получит контроль над веб-сервером, у него не будет инструментов для продвижения по системе.
Эта концепция строится на трех столпах:
Прежде чем возводить стены, нужно понять, насколько они сейчас «картонные». В systemd встроен мощный инструмент для аудита безопасности.
Команда systemd-analyze security <service_name> проверяет различные настройки сервиса, связанные с безопасностью, назначая каждому из них числовое значение «уровня подверженности» (Exposure), в зависимости от того, насколько важна настройка. Затем он рассчитывает общий уровень воздействия для всего сервиса, который является оценкой в диапазоне 0.0 (идеально)...10.0 (небезопасно), указывающей на то, насколько уязвима служба с точки зрения безопасности.
При работе с результатами анализа важно избегать ложных выводов. Высокий показатель подверженности не является автоматическим подтверждением наличия активной дыры в безопасности. Это лишь индикатор того, что служба имеет избыточные права.
Ключевые аспекты глубокого анализа:
Apache часто становится «входной дверью» для злоумышленников. Наша задача — сделать эту дверь максимально узкой и закрытой.
Глубокое управление доступом к данным
Мы реализуем принцип «белого списка» для файловой системы:
Безопасность памяти и вызовов
Для 1С требуется более гибкий подход из-за использования JIT-компиляции и сложного взаимодействия между процессами (ragent, rmngr, rphost).
Особенности настройки для 1С:
Для обоих сервисов создается персональная «виртуальная реальность»:
Эта таблица является ключевым аргументом для специалистов по информационной безопасности, объясняющим, зачем нужна каждая конкретная строка в конфигурации.
| Параметр | Обоснование для ИБ-специалиста | Цель настройки |
|---|---|---|
| User/Group=… | Принцип наименьших привилегий (PoLP) | Исключение запуска от root. Взлом процесса не дает прав суперпользователя |
| ProtectSystem=strict | Монтирование всей ОС (/usr, /bin, /lib) в режиме ReadOnly | Защита от модификации бинарных файлов и внедрения Rootkit-ов |
| NoExecPaths=/ | Запрет исполнения кода из любой точки ФС | Блокировка запуска произвольных скриптов, загруженных в /tmp или /var |
| ReadWritePaths=... | Белый список путей с правами записи | Ограничение области повреждения данных (Blast Radius) рабочими папками |
| ExecPaths=... | Явное разрешение запуска конкретных исполняемых файлов | Whitelisting кода. Запрещает запуск gcc, python, nc, perl и инструментов атаки |
| CapabilityBoundingSet=... | Ограничение возможностей процесса (POSIX capabilities) | Удаление опасных прав (доступ к дискам, управление сетью) |
| NoNewPrivileges=yes | Контроль SUID-переходов | Запрет на повышение привилегий через сторонние исполняемые файлы |
| SystemCallArchitectures=native | Блокировка вызовов других архитектур | Защита от эксплойтов, использующих "переход" между x32 и x64 |
| SystemCallFilter=... | Фильтрация системных вызовов (seccomp) | Ядро запрещает вызовы mount, reboot, ptrace и другие нецелевые функции |
| PrivateDevices=yes | Изоляция от /dev/. Процесс не видит физические диски | Защита от прямого чтения данных с носителей или перехвата ввода-вывода |
| PrivateTmp=yes | Уникальная, пустая папка /tmp для сервиса | Защита от атак через временные файлы и предотвращение утечки данных |
| ProtectHostname=yes | Запрет изменения имени хоста | Предотвращение манипуляций с сетевой идентификацией сервера |
| ProtectKernelModules=yes | Запрет на загрузку модулей ядра | Блокировка попыток внедрения на уровень ядра и сокрытие следов взлома |
| ProtectProc=invisible | Ограничение видимости других процессов в /proc | Защита от сбора информации о других сервисах в системе |
| LockPersonality=yes | Запрет изменения домена исполнения (personality) | Защита от эмуляции других ОС, используемой в сложных эксплойтах |
| MemoryDenyWriteExecute=no | Вынужденная мера для 1С | 1С использует JIT. Разрешено, но компенсировано через NoExecPaths |
| RestrictAddressFamilies=... | Белый список сетевых протоколов | Запрет экзотических протоколов. Оставлены только TCP/UDP и Netlinks |
| RestrictNamespaces=yes | Запрет создания контейнеров внутри процесса | Предотвращение атак типа "Container breakout" |
| RestrictRealtime=yes | Запрет планировщика реального времени | Защита от DoS-атак: процесс не сможет "повесить" CPU |
| RestrictSUIDSGID=yes | Запрет на создание файлов с битами SUID/SGID | Исключает создание "черных ходов" для повышения прав |
| SocketBindDeny/Allow | Запрет на создание файлов с битами SUID/SGID | Исключает создание "черных ходов" для повышения прав |
Для достижения максимального уровня защиты мы объединяем все разобранные параметры в итоговые конфигурационные файлы (drop-in unit files).
Итоговая конфигурация для Apache
(/etc/systemd/system/apache2.service.d/hardening.conf)
Mask=0077
# Безопасность памяти и вызовов
#
CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID
SystemCallArchitectures=native
SystemCallFilter=@system-service mincore
SystemCallFilter=~memfd_create
SystemCallFilter=~@clock @mount @reboot
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
LockPersonality=yes
ProtectControlGroups=yes
ProtectHome=yes
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectProc=invisible
ProtectSystem=strict
ProcSubset=pid
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
RestrictNamespaces=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
# Сетевые ограничения
#
SocketBindDeny=any
SocketBindAllow=tcp:80
SocketBindAllow=tcp:443
SocketBindAllow=udp:443
Итоговая конфигурация для 1С:Предприятие (/etc/systemd/system/srv1cv8-8.3.24.1342@2141.service.d/hardening.conf)
Конфигурация адаптирована под специфику работы кластера 1С:
[Unit]
Description=1C:Enterprise Server 8.3 (8.3.24.1342) 2141 (%I)
[Service]
# Задаем переменные для отдельного сервис 1С
Environment=SRV1CV8_DATA=/home/usr_1c_21/.1cv8/1C/1cv8
Environment=SRV1CV8_PORT=2140
Environment=SRV1CV8_REGPORT=2141
Environment=SRV1CV8_RANGE=2160:2191
Environment=SRV1CV8_DEBUG=-debug
# Определяем Java
Environment=JAVA_HOME=/usr/lib/jvm/bellsoft-java11-runtime-full-amd64
# Переопределяем пользователя по-умолчанию
User=usr_1c_21
Group=grp1cv8
# Реализация «белого списка» для файловой системы:
#
ProtectSystem=strict
NoExecPaths=/
ReadWritePaths=/var/1C /home/usr_1c_21/.1cv8 /tmp
# Разрешаем запуск основных процессов 1С ragent rmngr dbda rphost и исполняемых файлов
ExecPaths=/opt/1cv8/x86_64/8.3.24.1342
# Разрешаем запуск java
ExecPaths=/usr/lib/jvm/bellsoft-java11-runtime-full-amd64
# Разрешаем запуск утилит необходимых для 1С
ExecPaths=/bin/sh /usr/bin/awk /usr/bin/sort /usr/bin/sed /sbin/ldconfig /sbin/ldconfig.real /usr/bin/wc /usr/bin/grep /usr/bin/fc-list
ExecPaths=/lib/x86_64-linux-gnu
UMask=0077
# Безопасность памяти и вызовов
#
CapabilityBoundingSet=CAP_SYS_RESOURCE CAP_NET_BIND_SERVICE CAP_CHOWN CAP_SETGID CAP_SETUID
NoNewPrivileges=no
LockPersonality=yes
SystemCallArchitectures=native
MemoryDenyWriteExecute=no
SystemCallFilter=@system-service @ipc @process @memlock @signal @timer
SystemCallFilter=prlimit64 mincore fallocate flock getdents getdents64 fstatfs
# Изоляция (Namespaces)
#
PrivateDevices=yes
PrivateTmp=yes
ProtectHostname=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectControlGroups=yes
ProtectKernelLogs=yes
ProtectProc=default
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX AF_NETLINK
RestrictNamespaces=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
# Сетевые ограничения
#
SocketBindDeny=any
# Разрешаем tcp ragent
SocketBindAllow=ipv4:tcp:2140
# Разрешаем tcp rmngr
SocketBindAllow=ipv4:tcp:2141
# Разрешаем tcp rphost
SocketBindAllow=ipv4:tcp:2160-2191
# Разрешаем udp ragent
SocketBindAllow=ipv4:udp:2140
# Разрешаем udp rmngr
SocketBindAllow=ipv4:udp:2141
# Разрешаем udp rphost
SocketBindAllow=ipv4:udp:2160-2191
Самым убедительным доказательством успешного Hardening-а является изменение рейтинга безопасности в сервисе.
Состояние «До» (сервис из коробки)
При стандартной установке Apache или 1С результат systemd-analyze security обычно выглядит пугающе:


Состояние «После»
После применения наших конфигураций картина радикально меняется:


Внедрение перечисленных настроек превращает стандартный сервер в настоящую «изолированную крепость». Такой подход не только значительно усложняет жизнь потенциальному атакующему, но и приводит систему в соответствие с жесткими требованиями регуляторов.
Использование systemd-analyze security в сочетании с глубокой настройкой юнитов — это современный стандарт администрирования Linux, который должен стать обязательным для любой промышленной инсталляции 1С или веб-сервисов.
Обеспечение информационной безопасности является критически важным для любой ИТ-структуры. Если вы хотите узнать больше о современных инструментах и подходах к информационной безопасности или вы готовы предложить тему для обсуждения, напишите нам на corp@1c-prem.ru. Будем рады, если в итоге нашего разговора появится новая статья или интересная тема для вебинара.