【问题标题】:Running an untrusted application on Linux in a sandbox在沙盒中的 Linux 上运行不受信任的应用程序
【发布时间】:2013-03-15 16:35:18
【问题描述】:

我们有一台运行 Linux 的设备,我们需要在此设备上运行不受信任的应用程序。我们正在努力缓解以下安全问题 -

  1. 不受信任的应用程序不应对核心操作系统数据和二进制文件产生不利影响
  2. 不受信任的应用程序不应对其他应用程序的数据和二进制文件产生不利影响
  3. 不受信任的应用程序不应消耗过多的 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


【解决方案1】:

SELinux 是一组规则,其应用有点类似于用户权限,甚至更复杂。您可以为每个进程使用它来设置该进程的域并允许或拒绝几乎任何访问。这意味着访问文件、网络或进程/线程。这样它就可以用作一种沙盒。但是,您必须为每个进程准备一个规则集,或者您可以制作一个必须在沙盒应用程序之前运行的脚本以自行准备规则。

如果您想控制 CPU 消耗,SELinux 没有 CPU 规划器,因为任何规则都只有“允许”或“拒绝”访问这两个逻辑结果之一。我建议您使用“cgroups”来控制 CPU 消耗。

【讨论】:

    【解决方案2】:

    legato project 使用更高级别的沙盒。它使用 chroot 和绑定挂载来包含应用程序。它的一个关键特性是正式的声明式 API,因此应用程序组件可以在托管安全配置下与系统服务组件通信。并且可以根据需要添加和删除服务和应用程序,也可以通过无线方式进行更新。应用程序内存使用、处理器共享、存储等也受到密切管理。它声称使应用程序开发更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      相关资源
      最近更新 更多