SE linux的秘密2 部分

揭开 SE Linux 的秘密:第 2 部分
深入探讨 NSA 的 Linux 安全性增强型版本的代码

Larry Loeb (larryloeb@prodigy.net)
作者,Secure Electronic Transactions
2001 年 3 月

美国国家安全局 (NSA) 不同寻常地向开放源码社区公布了安全性增强型版本的 Linux -- 包括代码和所有部分。这篇 developerWorks 的第 2 部分专门深入研究了该代码,剖析了 security_av 是如何计算的以及检查如何调用其它 SE Linux 安全性特性。

幼虫、沙砾和代码
让我们看一下 SE Linux 分发版中的一些 C 代码,检验安全性增强的实现细节。

让我们从头开始。在分发版目录 include/linux/flask/flask types.h. 中有包含基本 Flask 类型和常量的头文件,现摘录如下:

/*The security context type
 * is defined as a variable-length string that can be
 * interpreted by any application or user.
 */
typedef char* security_context_t;

/*
 * A security identifier (SID) is a fixed-size value
 * that is mapped by the security server to a 
 * particular security context.
 */
typedef __u32 security_id_t;
#define SECSID_NULL         0x00000000 /* unspecified SID */
#define SECSID_WILD         0xFFFFFFFF /* wildcard SID */

/*
 * Each object class is identified by a fixed-size value.
.
 */
typedef __u16 security_class_t;
#define SECCLASS_NULL           0x0000 /* no class */

/*
 * A persistent security identifier (PSID) is a fixed-size
 * value that is assigned by the file system component
 * to each security context associated with an object
 * in the file system.  
 */
typedef __u32 psid_t;
struct psidtab;


/*
 * An access vector (AV) is a collection of related permissions
 * for a pair of SIDs. 
 */
typedef __u32 access_vector_t;

kernel/flask/access_vectors,我们发现这些结构进一步定义了安全性服务器 AV:

class security
{
    compute_av
    notify_perm
    transition_sid
    member_sid
    sid_to_context
    context_to_sid
    load_policy
    get_sids
    register_avc
    change_sid
}

与过程相关的对象有一个类似于这样的 AV:

class process
{
    execute
    fork
    transition
    sigchld
    sigkill
    sigstop
    signal
    ptrace
    getsched
    setsched
    getsession
    getpgid
    setpgid
    getcap
    setcap
    entrypoint
}

文件对象 AV 是如下结构:

class filesystem
{
    mount
    remount
    unmount
    getattr
    relabelfrom
    relabelto
    transition
    associate
}

class dir
inherits file
{
    add_name
    remove_name
    reparent
    search
    rmdir
    mounton
    mountassociate
}

由于我们进入了 AV 声明,让我们看一下在安全性服务器中进行 AV 计算的代码。记住,如果未击中缓存,那么核心调用 AVC,AVC 调用安全性服务器。

代码片段来自己提供最小实现,该实现提供单一 SID 并授予所有权限。这不是很安全。在该段代码中,计算 AV 并产生一个 SID。请注意,ssid 是源 SID,tsid 是目标 SID。由于我进行了一些注释,破坏了原有的良好格式。

这就是现状。它可能是最简单的,而且不是很有用。想要了解添加了 RBAC、TE 和 MLS 的 security_compute_av 有些什么,请查看 kernel/security/services.c 中的代码。

安全性调用
在 SE Linux 中安全性调用是如何工作的?对于那一点,请参阅代码样本,在其发行版中概述了 call_security.c。包括代码片段和注释。为简短起见,我忽略了在主菜单选项之前出现的正确性检查函数。

代码样本是类似的代码片段,但它来自于上篇文章(请参阅参考资料)提到的 checkpolicy 程序。它显示了其它安全性函数调用的代码,并且完全不需加以说明。checkpolicy 程序包含安全性服务器代码的完整副本,只要执行这个副本,使其允许:(1) 测试/调试用户空间中的代码,(2) 在引导之前检查策略,(3) 把策略编译成其二进制表示。

这个简单示例说明了只可以使用这些调用的方式之一。内核访问向量高速缓存调用 kernel/include/linux/flask/avc.h 中的内联函数 avc_has_perm_ref_audit 中的 security_compute_av。然后,可以通过对象管理器调用 kernel/fs/namei.c 中的 do_link 函数中的 avc_has_perm_ref_audit。这提供了内核如何调用 AVC 以及 AVC 如何调用安全性服务器(如果有高速缓存失配)的示例。

应用程序如何调用 security_compute_av 的示例在 utils/vixie-cron-3.0.1/database.cprocess_crontab 函数中。这显示了应用程序如何调用安全性服务器。作者已声明他们计划提供一个应用程序 AVC 库,以便于应用程序也可以缓存安全性策略以及使用与核心风格一致的接口。这将极大地简化编程工作,我们只能希望这会尽快出现。

结束语
安全性增强型 Linux 的前途非常光明,因为它看起来能满足安全 OS 的需要。当然,要达到实际可用的形式还有很多事要做,但是开放源码社团可能会处理这件事。

本文检查了一些代码的内幕,从而显示了它们的工作机制。请记住,这只是从分发的完整代码中抽取的一部分代码片段。应该经常查阅分发站点(请参阅参考资料),以确保您拿到的是最新版本。

致谢
本文已由那些很有资历的同仁们进行了技术审阅,他们不想让我在这公共的场合提到他们。也好,他们知道他们是谁。谢谢。

参考资料

关于作者
Larry Loeb 是上一世纪许多“死刑架”计算机杂志的编辑或撰稿人。他出版了一本有关 SET 的书籍,SET 是由 Visa 和 MasterCard 为安全电子交易而开发的一种协议。可以通过 larryloeb@prodigy.net 与他联系,大多数情况下您会得到答复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值