Вопрос или проблема
Я пытался загрузить профиль AppArmor для службы, которая работает в пользовательском экземпляре systemd. У меня есть два файла службы: sample.service для процесса и sample-profile-loader.service, который загружает его профиль AppArmor usr.bin.Sample. Профиль AppArmor расположен в /lib/systemd/system, а файл службы процесса – в /usr/lib/systemd/user. Обе службы включены.
[Unit] # sample-profile-loader.service
Before=sample.service
[Service]
Type=oneshot
ExecStart=/use/bin/apparmor-loader.sh
/etc/apparmor.d/usr.bin.sample
[Install]
Wanted by=multi-user.target
[Unit] # sample.service
Requires=sample-profile-loader.service
After=sample-profile-loader.service
[Service]
Type=simple
ExecStart=/usr/bin/sample
[Install]
WantedBy=multi-user.target
После первой загрузки, когда я проверяю aa-status, профиль загружен. Но когда я выполняю systemctl restart sample.service –user, я получаю сообщение об ошибке: “Не удалось запустить sample.service. Не удалось загрузить единицу sample-profile-loader.service. Нет такого файла или каталога”.
Я искал решение в Google, но пока ничего не нашел. Будет очень хорошо, если вы сможете дать мне какой-либо совет.
Systemd предлагает эту переменную для файлов единиц AppArmorProfile=
, и установите её на профиль, который у вас есть. Я не уверен насчет каталога… попробуйте узнать, как добавить пути, чтобы AppArmor мог находить профили…
Нет необходимости различать профили AppArmor для пользовательских и системных служб. Их можно вместе разместить в папке /etc/apparmor.d и загрузить в ядро с помощью apparmor_parser.sh.
Ответ или решение
Чтобы загрузить профиль AppArmor для службы, работающей в пространстве пользователя systemd, вам следует учитывать несколько ключевых моментов. Ваша текущая настройка указывает на некоторые проблемы, особенно при перезапуске службы. Вот шаги, которые могут помочь вам решить проблему:
-
Размещение профилей AppArmor: Убедитесь, что профили AppArmor находятся в правильной директории. Обычно профили AppArmor размещаются в
/etc/apparmor.d/
. Не рекомендуется размещать их в каталогах systemd, так как это может привести к путанице. Переместите ваш профильusr.bin.sample
в/etc/apparmor.d/
. -
Изменение файла службы загрузки профиля: Измените вашу службу
sample-profile-loader.service
, чтобы она загружала профиль напрямую из правильной директории. Вот пример, как это может выглядеть:[Unit] Before=sample.service [Service] Type=oneshot ExecStart=/usr/bin/apparmor_parser -r /etc/apparmor.d/usr.bin.sample [Install] WantedBy=multi-user.target
-
Использование переменной AppArmorProfile: Вместо создания отдельной службы для загрузки профиля, вы можете использовать переменную
AppArmorProfile=
непосредственно в вашем файле сервисаsample.service
. Например:[Unit] Requires=sample-profile-loader.service After=sample-profile-loader.service [Service] Type=simple ExecStart=/usr/bin/sample AppArmorProfile=/etc/apparmor.d/usr.bin.sample [Install] WantedBy=multi-user.target
-
Обновление зависимостей: Убедитесь, что зависимости между службами указаны правильно. Если
sample.service
зависит отsample-profile-loader.service
, то при каждом изменении профиля вам нужно перезагрузить обе службы, чтобы изменения вступили в силу. -
Проверка статуса: После внесения изменений перезапустите обе службы и проверьте их состояние с помощью команды:
systemctl --user status sample.service systemctl --user status sample-profile-loader.service
-
Использование команд AppArmor: Чтобы убедиться, что профиль загружен корректно, проверьте статус профиля с помощью:
sudo aa-status
-
Логирование и отладка: Если возникнут ошибки, воспользуйтесь журналами для получения дополнительной информации о проблеме:
journalctl --user -xe
Следуя этим шагам, вы сможете корректно загружать профиль AppArmor для вашего сервиса, работающего в пространстве пользователя systemd. Это обеспечит стабильную работу вашего приложения с нужными ограничениями безопасности.