【发布时间】:2013-03-15 16:35:18
【问题描述】:
我们有一台运行 Linux 的设备,我们需要在此设备上运行不受信任的应用程序。我们正在努力缓解以下安全问题 -
- 不受信任的应用程序不应对核心操作系统数据和二进制文件产生不利影响
- 不受信任的应用程序不应对其他应用程序的数据和二进制文件产生不利影响
- 不受信任的应用程序不应消耗过多的 CPU、内存或磁盘,并导致核心操作系统或其他应用程序出现 DoS/资源不足的情况
从不受信任的应用程序的角度来看,它只需要能够读取和写入自己的目录,也可能是挂载的 USB 驱动器
我们正在考虑使用以下方法之一 -
方法 1 - 将 SELinux 用作沙箱
- 这可能吗?我已经阅读了一些 SELinux,它在设置策略文件和在运行时强制执行等方面看起来有点复杂。SELinux 可以做到这一点并将不受信任的应用程序限制为只读/写它自己的目录并且还能够设置配额限制?
方法 2 - 自行创建新沙盒
-
在安装期间
- 为每个不受信任的应用程序创建一个新的应用程序用户
- 给整个应用目录和文件加盖权限,只有应用用户可以读写
- 使用 ulimit/quota 为应用程序用户设置配额
-
在运行时,使用启动不受信任的应用程序
- 关闭所有打开的文件描述符/句柄
- 使用 chroot 将根设置为应用程序目录
- 在应用程序用户的上下文中启动应用程序
对以上内容有什么想法吗?哪种方法比另一种更安全?还有另一种可能效果更好的方法吗?由于某些原因,我们无法选择迁移 Android,因此我们无法使用 Android 原生提供的沙盒功能...
告诉我
谢谢,
【问题讨论】:
-
您的选择 2 实际上听起来很像 Android 的沙盒功能(chroot 除外) - 这些功能在内核用户安全模型保持不变的程度上起作用...
-
@chris-stratton - 我们使用 Android 作为参考来提出我们的 Approach-2。不幸的是,我们目前无法迁移到 Android 本身,因此无法选择使用开箱即用的 Android 沙盒...
-
使用 Linux 的命名空间和 cgroups 怎么样?老实说,我对它不太熟悉,但是根据我的拙见,您可以将进程的资源隔离为仅设置的资源。换句话说,您创建自己的容器化系统,有点像 Docker。每个进程/应用程序只能查看和使用分配给它的内容。
标签: embedded-linux selinux sandbox