В прошлой статье, «Протокол Невозможной Ошибки», я рассказал вам историю изгнания призрака. Историю о том, как невидимая стена заперла меня снаружи моего собственного сервера, и как я был вынужден пойти на крайние меры — полное отключение системного телохранителя AppArmor.
Это было полевое хирургическое вмешательство. Быстрое, грязное, но необходимое для спасения «пациента». Но жить без иммунной системы — это путь к медленной смерти. Временное решение не должно становиться постоянным.
Эта статья — вторая, заключительная часть того расследования. Здесь мы не просто изгоняем демона. Мы ловим его, заковываем в цепи и заставляем служить нам. Мы превращаем обезумевшего Цербера в верного сторожевого пса. Это не просто инструкция. Это акт восстановления порядка из хаоса. Мы не просто включим рубильник. Мы заставим его работать правильно.
Часть 1: Диагностика. Почему охранник спал на посту?
После того как доступ к серверу был восстановлен, я вернул AppArmor в строй базовой командой sudo systemctl enable --now apparmor
. И столкнулся с шокирующей правдой. Я думал, что телохранитель сошел с ума. Оказалось, он просто не пришел на работу.
Вот команда, которая вскрыла всю глубину проблемы:
sudo apparmor_status
И вот что она показала. Это «рентгеновский снимок» больной системы:
apparmor module is loaded.
13 profiles are loaded.
13 profiles are in enforce mode.
/usr/bin/man
/usr/sbin/chronyd
... (еще несколько системных утилит)
0 processes have profiles defined.
Объяснение на пальцах: Переведу с технического на человеческий.
apparmor module is loaded
: «Сигнализация в здании установлена и подключена к сети».13 profiles are loaded
: «У нас есть 13 инструкций для охранников, как себя вести».0 processes have profiles defined
: «Ни один из охранников не вышел на свой пост».
Система безопасности была включена, но она охраняла только саму себя и несколько подсобных помещений (man
, chronyd
). А самые важные объекты — веб-сервер (Apache/Nginx), обработчик PHP, база данных (MySQL) — стояли с распахнутыми настежь дверями. AppArmor просто не знал об их существовании.
Часть 2: Вооружение. Выдаем охраннику полный свод правил.
Проблема заключалась в том, что в системе по умолчанию не было «инструкций» (профилей) для большинства популярных сервисов. Их нужно было установить вручную. Мы не просто говорим охраннику «охраняй», мы даем ему толстую папку с фотографиями всех сотрудников, расписанием их работы и четкими правилами, что делать с незнакомцами.
Эта команда — и есть та самая папка с инструкциями.
# Устанавливаем базовые и расширенные профили для AppArmor
sudo apt-get install apparmor-utils apparmor-profiles apparmor-profiles-extra -y
Пояснение:
apparmor-utils
: Дает нам инструменты для тонкой настройки и диагностики (те самыеaa-complain
,aa-enforce
).apparmor-profiles
иapparmor-profiles-extra
: Это и есть сокровище. Это огромный набор готовых, проверенных сообществом профилей безопасности для десятков приложений: Apache, Nginx, PHP-FPM, MySQL, Postfix и многих других.
После установки этих пакетов и перезапуска сервиса (sudo systemctl restart apparmor
) картина изменилась, но не до конца. Статус показал 42 profiles are loaded
, но все еще 0 processes have profiles defined
. Охранники получили инструкции, но так и не вышли на посты.
Часть 3: Перезагрузка сознания. Заставляем систему проснуться.
В мире Linux часто недостаточно просто перезапустить один сервис. Чтобы вся система полностью переосознала себя и применила новые, фундаментальные правила безопасности ко всем своим компонентам, нужен самый надежный и древний ритуал системного администратора.
Полная, чистая перезагрузка.
sudo reboot
Подводный камень: Может показаться, что это слишком грубый метод, но в данном случае он единственно верный. При старте с нуля операционная система проходит всю цепочку инициализации. Запуская Apache, она видит: «Ага, для тебя теперь есть профиль AppArmor, надевай его». Запуская PHP-FPM, она говорит: «И для тебя есть, будь добр соответствовать». Это гарантирует, что ни один процесс не проскользнет мимо нашего нового контроля.
Часть 4: Момент Истины. Проверка боевой готовности.
После того как сервер вернулся в онлайн, я затаил дыхание и снова выполнил команду проверки. Момент истины.
sudo apparmor_status
И вот он. Вид здоровой, правильно настроенной системы безопасности.
apparmor module is loaded.
42 profiles are loaded.
...
4 processes have profiles defined.
0 processes are in enforce mode.
4 processes are in complain mode.
/usr/sbin/dnsmasq (728) dnsmasq
/usr/sbin/php-fpm8.2 (627) php-fpm
/usr/sbin/php-fpm8.2 (1323) php-fpm
/usr/sbin/php-fpm8.2 (1324) php-fpm
Расшифровка победы:
4 processes have profiles defined
: Есть! Охранники вышли на посты. AppArmor теперь активно контролирует 4 процесса, включая три наших процесса PHP-FPM.4 processes are in complain mode
: Это идеальное состояние после установки. Режимcomplain
(жалобы) не блокирует подозрительные действия, а лишь записывает их в лог. Это позволяет убедиться, что профиль не мешает нормальной работе сайта, прежде чем переводить его в жесткий режимenforce
.
Эпилог. Крепость построена.
То, что началось как отчаянная борьба с невидимым врагом, закончилось постройкой настоящей цифровой крепости. Мы не просто починили ошибку. Мы прошли путь от полного неведения до тотального контроля.
Этот опыт доказывает фундаментальную истину: безопасность — это не флажок «включено/выключено». Это процесс. Это знание. Это понимание того, как работает твой собственный инструмент.
Теперь Цербер не просто прикован к воротам. Он накормлен, обучен и знает в лицо каждого, кому разрешен вход. А для всех остальных у него есть только один ответ — молчаливая и непробиваемая стена системной защиты. И на этот раз эта стена работает на нас.