解决由于 SystemCallFilter= 导致的 systemd 服务崩溃

解决由于 SystemCallFilter= 导致的 systemd 服务崩溃

在 OpenSUSE 中,coturn-4.5.2-4.1.x86_64.service文件包含看似生成的部分,其中包含允许的功能和系统调用。他们可能正在尝试将其沙箱化,以防出现漏洞。一切都很好,除了进程在启动后几乎立即被终止,我必须一一删除所有限制才能找到罪魁祸首:

SystemCallFilter=~ ... @privileged ...

当服务被终止时,系统日志中不会记录有用的信息。仅有的

主进程退出,code=killed,status=31/SYS

手册说:

@privileged 所有需要超级用户能力的系统调用(capability(7))

我实际上想知道失败的实际系统调用以及缺少哪些功能。

答案1

当服务执行未包含在系统调用中的系统调用时SystemCallFilter=设置,默认操作是进程终止SIGSYS,因此该进程转储一个核心。因此,您可以检查核心文件并查找其中的系统调用号。

例子:

# coredumpctl debug
(gdb) p $rax
157

我们的示例系统调用号也是如此157,我们可以在表中查找它,例如:

https://github.com/torvalds/linux/blob/v5.15/arch/x86/entry/syscalls/syscall_64.tbl

IE

157 common  prctl           __x64_sys_prctl

因此,prctl必须添加到SystemCallFilter=.

另一次重新启动可能会因另一次系统调用而失败,因此可能需要一些迭代。

您还可以检查系统执行(5)对于一些可能缺失的系统调用组,可以添加到SystemCallFilter=可能会加快这一过程。

此外,可以通过以下方式查找不同组在当前运行的 systemd 中确切包含哪些系统调用:

systemd-analyze syscall-filter

如果服务文件也包含,SystemCallErrorNumber=那么您必须删除它才能让进程核心转储。

相关内容