2 个版本

使用旧的 Rust 2015

0.4.1 2016 年 10 月 1 日
0.4.0 2016 年 3 月 28 日

#871 in Unix API

LGPL-3.0

150KB
3K SLoC

StemJail:发展用户活动用的监禁机制

StemJail 为最终用户提供了一个机制,根据数据访问模式(使用情况)自动隔离进程。这个概念验证依赖于 Linux 用户命名空间,因此对非特权用户可用。它与管理员放置的常规访问控制相补充,为最终用户提供了另一层安全保障。

警告

此项目是一个正在进行中的项目,尚未准备用于生产。请自行承担风险。API和命令可能会更改。

StemJail 依赖于 Linux 内核安全特性和 Rust 库。此项目非常重视安全性,并将努力保持安全性。

发展监禁机制

配置文件反映用户活动(例如,银行账户、个人照片等)。唯一涉及最终用户的交互步骤是创建配置文件。然后,配置文件被 StemJail 用作域,为每个活动创建专用监禁。

一个常见的监禁从最小有效访问集开始,但具有潜在的广泛访问集。在监禁中,当用户应用程序进程尝试访问路径时,监禁可以演变到一个具有更广有效访问集但更紧潜在访问集的新环境。这样,用户活动(和域)可以自动检测,而不会中断用户的流程。有关更多详细信息,请参阅 StemFlow。

每个监禁都获得一个专用的 /dev/proc/tmp(临时文件)。

架构概述

StemJail 被拆分为多个库,每个库一个

  • stemjail:根据安全策略创建和管理监禁,有三个组件:kageportalmonitor
  • stemflow:访问控制策略引擎(域转换)
  • stemshim:兼容性壳,用于在进程中预加载 StemJail 客户端(kage
  • fd-rs:文件描述符实用工具
  • tty-rs:创建和管理伪终端
  • mnt-rs:挂载点列表

StemJail 的三个组件可以通过 UNIX 套接字进行通信

                   ---------------
                   | Kage client |
                   ---------------
                         ||
                         \/
                  -----------------
                  | Portal daemon |
                  -----------------
                         ||
     ---------------------------------------------
     | jail #1           ||                      |
     |                   \/                      |
     |           ------------------              |
     |           | Monitor daemon |              |
     |           ------------------              |
     |                   /\                      |
     |                   ||                      |
     |  ---------------------------------------  |
     |  | Application client #1 (app. + kage) |  |
     |  ---------------------------------------  |
     |                                           |
     ---------------------------------------------

Kage

“Kage”是StemJail的客户端部分。它有两个角色:网关客户端和监控客户端。

从监狱外部,它可以向一个网关实例发送命令

  • 运行:根据应用程序路径或配置配置文件在新的专用监狱中创建、连接和启动应用程序
  • 信息:创建并下载当前域的图形(DOT文件格式)

从监狱内部,它可以向一个监控实例发送命令

  • 适配器:发送访问通知/请求和列出文件
  • 挂载:从内部或外部挂载(安全模式下禁用)

网关

启动时,网关解析配置配置文件,并监听UNIX套接字以接收来自kage客户端的传入受信任命令。其目的是生成新的监狱,转发I/O(例如,终端)并从其处理的监狱中获取信息。

监控器

监控器是一个服务器,它监听UNIX套接字以接收来自kage客户端的传入不受信任的命令。每个监狱都有自己的监控器,它是其第一个进程。它根据配置配置文件设置监狱的环境(例如,文件系统)。监控器是唯一能够向其监狱添加更多访问权限的进程。

监控器检查每个新的访问请求的监狱策略。如果访问请求被允许,监控器将监狱从当前域转换为与请求匹配的域(如果有的话)。在切换到新域时,监控器将新的访问添加到监狱。这些访问被转换为绑定挂载,从监狱外部公开新的文件层次结构。

用户应用程序

用户应用程序进程应该在监狱中加载StemShim,它钩子open-like函数。这些钩子将访问请求通知监控器,使用StemJail的客户端部分(kage)。每个线程都有一个缓存,以限制请求的数量,以最小化性能影响。

对于恶意进程不通知监控器是无用的,因为这样监狱(以及因此进程)无法获取新的访问。

尝试StemJail

要求

您需要Rust 1.7.0-dev(夜间)和Cargo来构建StemJail及其依赖项。

克隆仓库

$ git clone https://github.com/stemjail/stemjail
$ git clone https://github.com/stemjail/stemshim

构建StemShim

$ cd stemshim
$ make

构建StemJail

$ cd stemjail
$ cargo build

创建配置文件

您需要在config/profiles目录中创建您的配置文件。每个配置文件都必须指定运行您的应用程序所需的所有资源(例如,/usr/lib...)。您的配置文件中的所有路径都必须存在于文件系统中。请参阅示例。

运行网关

要运行网关的发布模式

./tools/portal.sh

运行监狱

目前,我们需要手动设置环境以预加载StemShim

./tools/kage.sh run -t -- /path/to/stemjail/tools/env.sh /path/to/your/application

常见问题解答

如何使用Debian内核启用用户命名空间?

默认情况下(目前),Debian不激活用户命名空间。您可以使用以下方法激活此功能:

# echo 1 > /proc/sys/kernel/unprivileged_userns_clone

如何使用grsecurity启用用户命名空间?

在grsecurity修补的内核中运行的进程需要CAP_SYS_ADMINCAP_SETUIDCAP_SETGID才能使用用户命名空间(参见图kernel/user_namespace.c:create_user_ns)。还需要CAP_DAC_OVERRIDE才能写入/proc/{{uid,gid}_map,setgroups}文件。

此程序是危险的,因为它赋予了StemJail过多的权限,而StemJail尚未准备好安全地管理这些权限。目前,仅用于测试目的!

# setcap cap_sys_admin,cap_setuid,cap_setgid,cap_dac_override=ep /path/to/target/release/portal

我需要在我 vanilla 内核中启用哪些选项?

您需要启用所有Linux命名空间

CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y

StemJail与LXC、Docker、OpenVZ、VServer或chroot之间的区别是什么?

StemJail的目标不是管理虚拟机,而是使用Linux命名空间根据简单的配置来隔离进程。与其他解决方案使用root权限进行管理任务不同,StemJail只依赖于用户命名空间,因此无法执行完整系统所需的所有任务(例如创建设备、挂载任何你想挂载的东西)。因此,如果我们相信内核可以正确地隔离,那么被监禁的(恶意)进程不可能比使用StemJail的用户获得更多的权利。

StemJail与SELinux、AppArmor、Tomoyo或grsecurity RBAC有什么区别?

StemJail的目标是让无特权的用户使用并调整它来保护他们的数据。大多数强制访问控制(MAC)系统都是为管理员(例如root)配置的,以保护系统免受其用户的侵害,并保护用户之间。使用StemJail,我们希望保护我们自己(作为普通用户)免受我们各自的(可能已受损害)进程的侵害。因此,我们希望能够控制我们的应用程序可以访问什么,即使我们不是管理员。

此外,StemJail可以在大多数Linux发行版上运行,无需自定义内核或修补的应用程序!这样,保持你的系统更新就更加容易了。

依赖项

~7MB
~128K SLoC