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), 无后门, 无线安全, 权限控制, 白名单, 目录遍历, 私有化部署, 系统调用, 系统追踪, 网络信息收集, 网络安全审计, 请求拦截, 逆向工具, 防御规避