我尝试为基于 busybox 的 LXC 容器设置一个非常严格的 seccomp 白名单。我从 Ubuntu 的文件开始/usr/share/doc/lxc/examples/seccomp-v1.conf
。它似乎包含最有用的系统调用,但似乎没有进一步记录。
我使用这个文件启动了我的容器,几乎一切正常,只是nginx
没有启动。使用strace
我发现缺少两个系统调用(带有*pid*
/ 的东西*gid*
)。ausyscall
帮助我将名字翻译成数字。之后,nginx
就开始了。
现在,我想将文件减少到真正需要的程度。为此,我编写了一个脚本,该脚本循环遍历文件,临时删除一行并测试所有功能是否仍然在容器中工作。最后,它能够创建一个新的(更具限制性的)白名单。
由于这个过程非常耗时,上周每天晚上都会运行几次迭代。目前我陷入困境是因为lxc-attach fails providing an interactive console
。我尝试找到一种更快的调试方法,最好是 syslog 或 Lxc 记录所有 seccomp 违规。
我尝试在内核命令行上进行设置audit=1
,但只有一次我在 syslog 中看到与 seccomp 相关的审核消息。相比之下,Lxc 仅显示“容器违反了 seccomp”,这不能帮助我找到问题所在的系统调用。更新:如果auditd
安装了,则会写入日志/var/log/audit/audit.log
并且不再检查内核命令行参数。
问:有没有更有效的方法来生成有用的 seccomp 白名单?除了 lxc-default kexec_load
、open_by_handle_at
、init_module
和finit_module
之外,还有哪些建议可以阻止delete_module
?是否有危险系统调用列表?
答案1
与此同时,我发现在安装了用于获取 ausyscall 工具/var/log/audit/audit.log
后,现在会转到 seccomp 审核日志而不是 syslog 。auditd
如果没有该工具,日志就无处可去。
该文件包含类似以下的行
type=SECCOMP msg=audit(1444422928.758:649196): auid=0 uid=100033 gid=100033 ses=1 pid=18459 comm="nginx" exe="/usr/sbin/nginx" sig=31 arch=c000003e syscall=288 compat=0 ip=0x7f2f71555467 code=0x0
它清楚地说明了哪个进程和哪个系统调用违反了规则 - 这对我很有帮助。
但我没有回答这个问题。仍然有一些未解答的问题,我仍在寻找一种比尝试和错误更有效的方法来设置这样的白名单文件。