在Linux上使用沙盒运行不受信任的应用程序

7
我们有一个运行Linux的设备,需要在其上运行不受信任的应用程序。我们试图缓解以下安全问题 -
  1. 不受信任的应用程序不应对核心OS数据和二进制文件产生负面影响
  2. 不受信任的应用程序不应对其他应用程序的数据和二进制文件产生负面影响
  3. 不受信任的应用程序不应占用过多的CPU、内存或磁盘,并导致核心OS或其他应用程序出现DoS/资源饥饿的情况
从不受信任应用程序的角度来看,它只需要能够读取和写入自己的目录,以及可能挂载的USB驱动器。
我们考虑使用以下方法之一 - 方法1 - 使用SELinux作为沙盒
  • 这个可能吗?我已经读了一些关于SELinux的文章,它看起来在设置策略文件和在运行时执行等方面有些复杂。 SELinux是否可以做到并限制不受信任的应用程序只能读/写自己的目录,同时能够设置配额限制?
方法2 - 创建我们自己的沙盒
  • 在安装期间

    • 为每个不受信任的应用程序创建一个新的应用程序用户
    • 将整个应用程序目录和文件的权限设置为只有应用程序用户可以读取和写入
    • 使用ulimit/quota为应用程序用户设置配额
  • 在运行时,使用以下方式启动不受信任的应用程序

    • 关闭所有已打开的文件描述符/句柄
    • 使用chroot将根设置为应用程序目录
    • 在应用程序用户的上下文中启动应用程序
对以上方法有何看法?哪种方法比另一种更安全?是否有其他可能更好的方法?由于某些原因,我们无法选择移动Android,因此无法使用Android本地提供的沙盒功能...
让我知道你的想法。
谢谢,

你的第二个选择听起来很像Android的沙盒功能(除了chroot)- 这些功能在内核用户安全模型保持完整的程度上发挥作用... - Chris Stratton
@chris-stratton - Android是我们用作参考来制定我们的Approach-2的。不幸的是,我们目前无法转向Android本身,因此没有使用Android沙盒的选项... - user967973
使用Linux的命名空间和cgroups怎么样?老实说,我对它不是太熟悉,但根据我的知识,您可以将进程的资源隔离到您设置的内容。换句话说,您可以创建自己的容器化系统,有点像Docker。每个进程/应用程序只能看到和使用分配给它的内容。 - Ayman Nedjmeddine
2个回答

1
SELinux是一组规则,类似于用户权限但更加复杂。您可以为每个进程使用它来设置该进程的域,并允许或拒绝几乎任何访问。这意味着访问文件、网络或进程/线程。因此,它可以用作一种沙盒。但是,您必须为每个进程准备一个规则集,或者可以编写一个脚本,在沙盒应用程序运行之前运行以准备规则本身。
如果您想控制CPU的使用量,SELinux没有CPU计划器,因为任何规则都只有两个逻辑结果“允许”或“拒绝”访问。我建议您使用'cgroups'来控制CPU的使用量。

1

Legato项目使用更高级别的沙箱技术。它使用chroot和bind mount来包含应用程序。其关键特性是正式声明式API,因此应用程序组件可以在受管理的安全配置下与系统服务组件进行通信。服务和应用程序可以根据需要添加、删除和更新。应用程序的内存使用、处理器共享、存储等也得到了严格管理。该项目声称使应用程序开发更加容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接