让我们看一下 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.c 的
process_crontab
函数中。这显示了应用程序如何调用安全性服务器。作者已声明他们计划提供一个应用程序
AVC
库,以便于应用程序也可以缓存安全性策略以及使用与核心风格一致的接口。这将极大地简化编程工作,我们只能希望这会尽快出现。
安全性增强型 Linux 的前途非常光明,因为它看起来能满足安全 OS 的需要。当然,要达到实际可用的形式还有很多事要做,但是开放源码社团可能会处理这件事。
本文检查了一些代码的内幕,从而显示了它们的工作机制。请记住,这只是从分发的完整代码中抽取的一部分代码片段。应该经常查阅分发站点(请参阅 参考资料),以确保您拿到的是最新版本。
本文已由那些很有资历的同仁们进行了技术审阅,他们不想让我在这公共的场合提到他们。也好,他们知道他们是谁。谢谢。
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 通过合并一个称为 NetTop 的商业产品,
据称 NSA 将替换一些物理上分隔的计算机。
- 在国家安全局的网站上有
新的基于 2.4.2 的 SE Linux
发行版。
-
SE Linux
的文档包括内核安全性机制的设计和实现,以及安全性策略配置的详细信息。
- 从 NSA 站点下载
源代码。

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