SystemCallFilter=: фильтр системных вызовов службы
Ограничивает системные вызовы, доступные процессам службы. Вызов вне списка либо завершает процесс сигналом, либо возвращает ошибку — в зависимости от настройки.
Что делает
Списки удобно задавать не поимённо, а готовыми наборами: @system-service покрывает обычные потребности службы, @network-io — работу с сетью, @privileged — привилегированные вызовы (его обычно исключают). Наборы перечисляет systemd-analyze syscall-filter.
Важное следствие: фильтр действует всё время работы, а не только при запуске. Служба может благополучно стартовать и упасть через часы, когда дойдёт до редкой операции. Признак — завершение сигналом SYS и запись audit в журнале ядра.
Где ставится. В секции [Service]. Часто вместе с SystemCallErrorNumber=.
Значения
| Значение | Что происходит |
|---|---|
@system-service | базовый набор для обычных служб. |
~@privileged @obsolete | тильда означает запрет перечисленного вместо разрешения. |
@system-service @keyring | базовый набор плюс работа со связкой ключей. |
Пример
Типичный фильтр для прикладной службы.
[Service]
SystemCallFilter=@system-service
SystemCallFilter=~@privileged @resources
SystemCallErrorNumber=EPERM
SystemCallArchitectures=native
С SystemCallErrorNumber=EPERM запрещённый вызов вернёт ошибку вместо завершения процесса. Это заметно облегчает разбор при подборе фильтра.
Типичные ошибки
Служба падает не при запуске, а позже, при первом запрещённом вызове: сигнал SYS и запись audit в журнале ядра.
Неизвестное имя вызова или набора даёт код 228/SECCOMP при запуске.
Слишком узкий фильтр ломает редкие операции: пересборку индекса, работу с ключами, отправку сигналов.
На ядре без seccomp и в части контейнеров фильтр применить нельзя.
Связанные ошибки
- status=228/SECCOMP в systemdКод 228/SECCOMP: не удалось применить фильтр системных вызовов из SystemCallFilter=. Причины: неизвестное имя вызова, отсутствие поддержки в ядре.
- signal=SYS (status=31/SYS) в systemdПроцесс службы убит сигналом SYS: фильтр системных вызовов запретил вызов. Как найти запрещённый вызов и исправить SystemCallFilter.
- status=244/BPF в systemdКод 244/BPF: не удалось применить ограничения через BPF, например RestrictFileSystems=. В man-странице systemd этот код указан неверно.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.exec(5)
- systemd-analyze(1)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)