《Firejail》软件评测

文章访问量:

评分:8/10

一款基于Linux的沙盒软件。

使用文档

Github地址

Firejail用起来方便,可以看成是Linux版的Sandboxie。Sandboxie没白名单功能(我不知道其他版本有没有,至少我用的这个是没有的),只支持黑名单。而Firejail支持在将某个目录列入黑名单的同时,将该目录下的部分目录或文件列入白名单,也就是局部黑名单。

FIrejail的沙盒功能强依赖于它的配置文件。在没配置文件(–noprofile)的情况下运行沙盒,无异于系统裸奔。不过在/etc/firejail文件夹下已经有为一系列Linux应用预设的配置文件了。当然你要是想自己写个也没问题,语法和用法都很简单。

Firejail比较有意思的是seccomp预定义好的系统调用组,如果你想学习系统调用的话可以从这入手。预定义seccomp过滤组的路径在 /usr/share/doc/firejail/syscalls.txt 。

Firejail没ptrace高效。当然,这两个东西本来就不应该拿来对比。毕竟前者是一个除seccomp之外,还集成了网络隔离等功能的沙盒软件;而后者则是Linux中的一个系统调用。虽然都说seccomp比ptrace高效,但也不是这么进行对比的。

不过你要说Firejail特别低效嘛,那也不至于。经过我的测试,分别通过Firejail和用ptrace过滤系统调用的Online Judge平台运行同一份C++用户代码,前者包括Firejail沙盒初始化进程在内需要50ms(输入通过管道),不包括初始化的话则是20~25ms。而后者仅需要8ms。

那Firejail到底好不好用?我是觉得还不错。配置文件编写起来也挺顺手的。如果没有啥特殊需要的话,我觉得Firejail作为一个隔离环境的沙盒软件来说已经够用了。当然你也可以选择用docker,看自己喜好。

不过在实际运行中,我发现Firejail的timeout参数可能有点性能问题。timeout参数可以设定某个沙盒进程在xxx秒后自动消亡。但设置了这个参数之后,沙盒的整体运行速度就变慢了。我怀疑是timeout参数会导致沙盒在沙盒内的进程消亡时,不会马上随之消亡,而是延迟了一会后才会消亡。因为经过实验后我发现:沙盒进程的初始化时间不变,沙盒内运行的用户程序也没变。那要么是Firejail在设置了timeout参数后性能大幅下降,要么就是沙盒随沙盒内进程的消亡而消亡。

我之前说Firejail没ptrace高效,实际上有点问题。

我之前是用go写的监控代码,我的想法是通过GNU的time工具去衡量firejial代码的执行时间,然后再简单的减去沙盒进程的初始化时间,最后得到程序在沙盒中运行的时间。

但我后面又通过写一个C++程序 —— 先fork运行我要监控的程序,父进程通过gettimeofday获取子进程的运行时间 —— 去进行监控。然后在Firejail沙盒里面去运行监控程序和被监控程序,发现这么测出来的时间要比我通过GNU time工具要少的多。

比如写者的学校用的OJ,运行时间用的是最大值,最后算出来是8ms执行完一个样例。然后我到Firejail里面去跑同一题,样例数据也是通过管道传递给子进程,发现1.5ms就能执行完一个样例。

所以Firejail按道理来说是要比ptrace高效的,这也符合seccomp比ptrace高效的基本预期。

Subscribe
提醒
0 评论
Inline Feedbacks
View all comments
0
在此留下你的评论x