antitree/syscall2seccomp

GitHub: antitree/syscall2seccomp

通过分析 sysdig 或 strace 输出,自动生成 Docker 容器的自定义 seccomp 安全配置文件。

Stars: 92 | Forks: 12

# syscall2seccomp 一个帮助构建自定义 Docker seccomp profile 的工具,通过从各种工具中提取 syscall 并将其输出为 [Docker custom seccomp profiles](https://docs.docker.com/engine/security/seccomp/) JSON 格式。 从理论上讲,这允许你生成一个仅包含所需 syscall 的自定义白名单,并阻止/报错/崩溃\* 所有其他 syscall 尝试。 用法: 使用 [`sysdig`](https://www.sysdig.com/) ``` python3 ./syscall2seccomp.py -s path-to-sysdig-output ``` 使用 `strace` ``` python3 ./strace2seccomp.py path-to-strace-output ``` ## 使用 Sysdig 的示例 启动 `sysdig` ``` sudo sysdig container.name=myawesomecontainer > myawesomecontainer.sysdig ``` 启动你的容器 ``` docker run --name myawesomecontainer nginx ``` 执行容器的所有正常活动,然后将其关闭。 将输出转换为 seccomp profile ``` python3 syscall2seccomp.py -s myawesomecontainer.sysdig > myawesomecontainer.json ``` 启动你的容器并启用 seccomp 过滤 ``` docker run \ --security-opt seccomp=$PWD/myawesomecontainer.json \ nginx ``` ## 使用 Strace 的示例 在应用程序上运行 strace 并保存输出: ``` strace -o wget.strace wget https://www.antitree.com ``` 将输出转换为 Docker profile: ``` python3 ./syscall2seccomp.py wget.strace > wget.seccomp ``` *注意:我省略了花费 2-300 小时调试为什么 strace 没有包含你需要的某个 syscall 的步骤。* 启动一个应用了自定义 profile 的 docker 容器: ``` docker run -it \ --security-opt seccomp=$PWD/wget.seccomp \ busybox wget https://www.antitree.com ``` ## 常见问题解答 **Sysdig 还是 Strace?** Sysdig 对容器来说很棒。[去看看吧](https://www.sysdig.org/)。 **我运行了示例,但它提示 "operation not permitted"** 没错。通过使用自定义 seccomp profile,你也移除了默认的 seccomp profile,而且无法保证你已经获取了应用程序发出的每一个 syscall。这就是问题的本质。在实践中,我发现 `sysdig` 更擅长捕获容器级别的 syscall,除了你的应用程序启动后需要的那些 syscall 之外。 **为什么要使用自定义 seccomp profile?** Seccomp BPF 是一个强大的工具,可以防止潜在的恶意系统调用被发送到你的容器内部。最小化应该被允许的 syscall 可以最小化攻击面,并可能防止容器逃逸。这就是其理念。 你应该为你的每个容器使用自定义 seccomp profile 吗?可能不需要。管理如此多的自定义 profile、一致地部署它们以及将其集成到单元测试中,很可能带来的工作量(和风险)超过了其价值。 **所以你不推荐自定义 seccomp profile,那为什么要制作这个工具?** 使用场景是那些想要尝试自定义 seccomp profile 并将其应用他们运行的几个 Docker 容器的个人。在这种情况下,如果他们花时间定制 profile 使其比默认 profile _更_ 安全,它确实会带来一些价值。 对于涉及大规模部署和编排的企业,我只是想让大家尽可能容易地看到管理自定义 seccomp profile 是多么麻烦。 也许 Docker 会通过允许你应用多个 seccomp profile(目前是最后应用的 profile 生效)或者在 Swarm 中辅助管理 profile 来解决这个问题,但在这一点上,构建自定义 AppArmor profiles 更有价值。 **为什么你会自动添加一堆 syscall?** [Syscalls.py](https://github.com/antitree/syscall2seccomp/blob/master/syscalls.py#L321-L337) 包含了任何容器所需的 syscall 列表,原因有很多。参见:https://github.com/moby/moby/issues/22252 **那 seccomp BPF 参数呢?那不是 BPF 的意义所在吗?** 祝你好运。那需要对 strace 输出进行真正的审查,但这至少是一个简单的起点。
标签:Docker, Hpfeeds, Python, Seccomp, Strace, Syscall, Web开发, Web截图, 安全配置, 安全防御评估, 容器安全, 应用加固, 搜索语句(dork), 无后门, 无线安全, 权限控制, 白名单, 目录遍历, 私有化部署, 系统调用, 系统追踪, 网络信息收集, 网络安全审计, 请求拦截, 逆向工具, 防御规避