SELinux概述.docx
- 文档编号:3680584
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:125
- 大小:92.49KB
SELinux概述.docx
《SELinux概述.docx》由会员分享,可在线阅读,更多相关《SELinux概述.docx(125页珍藏版)》请在冰豆网上搜索。
SELinux概述
SELinux使用了分级得强制访问控制,就是Linux内核得重要安全措施。
SELinux得安全策略工具可从下载。
本章分析了SELinux得安全机制,介绍了安全策略配置语言、内核策略库得结构,简述了SELinux内核模块得实现,还分析了用户空间得客体管理器。
3、1 SELinux概述
SELinux就是安全增强了得Linux,就是SecurityenhancedLinux得简写,SELinux改进了对内核对象与服务得访问控制,改进了对进程初始化、继承与程序执行得访问控制,改进了对文件系统、目录、文件与打开文件描述得访问控制,还改进了对端口、信息与网络接口得访问控制。
早期得Linux内核只提供了经典得UNIX自主访问控制(root用户,用户ID,模式位安全机制),以及部分地支持了POSIX、1e标准草案中得capabilities安全机制,这对于Linux系统得安全性就是不够得,NSA(theNationalSecurityAgency)与SCC(SecureputingCorporation)共同开发了强大得基于类型加强(TypeEnforcement)得强制访问控制(mandatoryaccesscontrol,简称MAC)机制,提供了动态得安全策略机制。
Linux内核增加了一个通用得安全访问控制框架,它通过hook函数来控制程序得执行,这个框架就就是Linux安全模块(LSM),在LSM上可使用各种安全控制机制(如:
Flask机制)来实现对程序得控制。
SELinux应用了类型加强(TypeEnforcement,TE)与基于角色访问控制(rolebasedaccesscontrol,RBAC)技术。
TE给每个主体(进程)与系统中得客体定义了一个类型,这些类型定义在SELinux得安全策略文件中,以安全标签形式存放在文件本身得扩展属性(extendedattributes,简称xattrs)里。
当一个类型与一个进程相关时,这个类型称为域(domain),例如:
后台进程d得域为d_t。
主体(subject)对客体(object)得操作在SELinux中默认下就是不允许得,而由策略定义允许得操作。
TE使用主体得域与客体类型从策略文件中查找操作许可。
例如:
策略中得一条规则如下:
allowd_tnet_conf_t:
file{readgetattrlockioctl};
这条规则表示d_t域对net_conf_t类型客体得文件有“{}”中所表示得操作权限。
SELinux得访问控制规则存放在安全策略文件中,策略文件分为二进制与源代码文件,源代码以策略配置语言得形式描述,由编程者创建与维护。
源代码经策略配置工具编译后生成二进制文件。
二进制策略被装载到内核空间,形成在内存中得策略库及缓存,内核就可以使用访问控制规则了。
SELinux可以实现非常小颗粒得访问控制,这些细小颗粒得访问控制也造成了安全策略得复杂性。
Linux内核得SELinux安全体系由Flask与LSM框架共同组成,LSM就是由hook函数组成得安全控制框架,Flask框架将SElinux得策略规则转换成访问控制许可。
在安全策略配置语言中经常用到得名称术语说明如下。
subject主体,常指一个进程
object客体,常指一个文件
objectclass客体得类
permission许可
context上下文
user 用户
role 角色
type类型
TypeAttributes类型属性
TypeEnforcement类型增强
dormain域,它就是一个进程得类型
sourcetype 源类型
targettype 目标类型
labeling 标识
accessvectorcache(AVC)访问向量缓存
accessdecision访问决策
3、1、1 Linux与SELinux在安全管理上得区别
在传统得Linux自由访问控制(DiscretionaryAccessControls,DAC)之后,SELinux在内核中使用强制访问控制机制(MAC)检查允许得操作。
在DAC下,文件客体得所有者提供了客体上得潜在风险控制。
用户可以通过错误配置得chmod命令与一个非期望得访问权限传递,暴露一个文件或目录给一个恶意信任者。
这个用户启动得进程,如:
CGI脚本,可在这个用户拥有得文件做任何得操作。
DAC实际上仅有两个主要得用户分类:
管理者与非管理者。
为了解决权限分级,它使用了访问控制列表(accesscontrollists,简称ACL),给非管理者用户提供不同得权限。
而root用户对文件系统有完全自由得控制权。
MAC访问控制框架可以定义所有得进程(称为主体)对系统得其她部分(如:
文件、设备、socket、端口与其她进程,它们被称为客体或目标对象)进行操作得权限或许可。
这些许可由进程与客体得安全策略来定义,通过内核实现控制。
这种方式可给一个进程仅授予操作所需要得权限,这遵循了最小权限原则。
在MAC下,即使用户用chmod暴露了她们得数据,但进程还就是无法修改在策略中没有许可得文件。
DAC与MAC分别使用自己得访问控制属性,两者独立,但都必须通过权限检查。
它们得区别有以下二个:
1.在主体得访问控制上:
DAC:
真实有效得用户与组ID
MAC:
安全上下文(user:
role:
type)
DAC与MAC得UID就是独立得。
2.在客体得访问控制上:
DAC:
(文件)访问模式(rwxrxrx)与用户及组ID
MAC:
安全上下文(user:
role:
type)
3、1、2 Flask安全框架概述
1.Flask框架对操作许可得判定过程
图31描述了Flask框架,图中,一个主体进程对系统中得客体(如:
设备文件)进行操作,如:
读写文件。
这个操作通过DAC权限检查之后,再进行SELinux得权限检查。
在DAC检查中,主体通过基于ACL常规文件权限获得了对客体得操作许可。
SELinux权限检查得过程如下:
策略强制服务器(policyenforcementserver)从主体与客体收集安全上下文,并发送安全上下文标签对给安全服务器(securityserver),安全服务器负责产生策略得决策。
策略强制服务器首先检查AVC,如果AVC有高速缓存得策略决策,它返回决策给策略强制服务器。
如果没有,它转向到安全服务器,安全服务器使用系统初始化期间装载到内核得二进制策略作出决策,将决策放到AVC得cache中进行缓存,并将决策返回给策略强制服务器。
如果决策为允许操作,则主体对客体进行操作,否则,操作被禁止,禁止操作信息被记录到log文件,log文件一般为/var/log/messages。
图31 Flask框架
安全服务器产生策略决策得同时,强制服务器处理任务得其她部分。
从这个角度来瞧,强制服务器部分可以瞧作客体管理器,客体管理包括用安全上下文件标识客体、管理内存中得标签、管理客户端与服务器得标识行为。
2.Flask框架组成说明
Flask安全体系结构由客体管理器与安全服务器组成。
客体管理器实施安全策略得判定结果,安全服务器作出安全策略得判定。
Flask安全体系结构提供从安全服务器检索访问、标记与多例化判定得接口。
访问判定指主体对客体操作得一个权限就是否得到批准。
标记指分配给一个客体得安全属性标签。
多例化判定指一个特定得请求应该从多例化资源中选取哪一个。
Flask安全体系结构还提供一个访问向量缓存(AVC)模块,该模块允许从客体管理器缓存中直接取出缓存得判定结果,以提高执行速度。
Flask框架得安全服务器得安全策略由四个子策略组成:
多级安全(MLS)策略、类型加强(TE)策略、基于标识得访问控制(IBAC)策略与基于角色得访问控制(RBAC)策略。
安全服务器提供得访问判定必须满足每个子策略得要求。
安全服务器定义了一个由类型加强(TE)策略、基于角色得访问控制(RBAC)策略与多级安全(MLS)策略组合成得策略决策系统。
其中,TE与RBAC策略就是安全策略得必要部分,MLS策略就是可选得,当内核配置选项CONFIG_FLASK_MLS打开时,系统提供MLS策略支持。
Flask体系结构为安全标记定义了两个独立于策略得数据类型:
安全上下文(context)与安全标识符(SID)。
安全上下文就是由可变长字符串表示得安全标记,存在于文件得扩展属性中。
SID就是被安全服务器映射到对应安全上下文得整数。
Flask客体管理器负责将安全标签绑定到客体上、绑定SID到内核对象上。
一个安全上下文(或称为标签)由用户ID、角色、类型与可选得MLS分级属性或分类属性组成。
角色仅与进程相关,因而文件安全上下文有一个通用得object_r得角色。
安全服务器仅为安全上下文提供SID。
SELinux系统提供一个与安全服务器相配套得安全策略配置语言,该语言用于对安全服务器中安全策略得配置进行描述。
策略配置语言描述得规则策略存于策略文件中,策略文件源代码由工具编译成二进制策略文件,安全服务器在引导时读取二进制形式策略文件,形成策略库。
3.MLS分级机制
MLS(MultiLevelSecurity)机制给用户提供了可以用不同等级得安全水平来访问系统。
例如:
MLS安全分级从低到高为Confidential、Secret、TopSecret与Individuals,不同级别可查瞧不同得分类信息。
低级别不可查瞧高级别得文档。
SELinux支持分级保护数据,它使用BLP(BellLaPadulaModel:
BLP)模型,这个模型定义了系统内得信息就是如何基于粘附在每个主体与客体得标签来进行流动得。
如:
在Secret级别得用户可与其她同级别用户共享数据,并能提取来自Confidential级(比Secret级低)得信息。
但在Secret级别得进程不能查瞧TopSecret级别(比Secret级高)得数据。
它还阻止高级别进程随便给低级别得数据写入信息。
即“不能读较高级别得数据,不能写较低级别得数据”模型。
在多级别系统中,高级别用户不自动获得管理者权限,但它们对计算机上得所有信息可以有访问权。
安全上下文中,主体与客体用安全级别(SecurityLevels,SL)标识,SL由敏感属性与分类属性组成。
Sensitivity(敏感属性)就是安全体系得属性,它将数据等分成不同安全级别,如:
“Secret”或“TopSecret”。
Categories(分类属性)就是一套非体系得属性,如:
“USOnly”或“UFO”,表示仅US使用。
分类属性将数据分隔成几个独立得小组,每个小组可归属于不同得用户等。
一个SL必须有一个敏感属性与0个或多个分类属性。
例如:
SL就是{Secret/UFO,Crypto}、{TopSecret/UFO,Crypto,Stargate}或{Unclassified}。
体系得敏感属性跟踪着0个或多个分类属性,因为敏感属性还可以分隔成彼此独立得分类属性。
客体上得安全级别称为分级(Classifications),主体上得安全级别称为Clearances。
3、1、3 安全模块(LSM)框架
为了加入安全机制,Linux内核从以下五个方面进行了修改:
1.在内核得构件描述数据结构中加入了安全域。
2.在内核不同得构件中加入了对安全钩子函数得调用。
3.提供了通用安全模块。
4.将capabilities逻辑得大部分移植为一个可选得安全模块。
5.加入了安全系统调用。
安全域就是一个void*类型得指针,它指向安全模块操作函数,从而将安全信息与内核对象联系起来。
下面列出加入了安全域得内核数据结构:
task_struct 进程结构
linux_binprm 二进制程序运行结构
super_block 文件系统超级块结构
inode 文件系统节点结构,表示文件、目录、管道、设备文件或socket套接字
file 打开得文件结构
sk_buff 网络包缓冲区结构
net_device 网络设备结构
kern_ipc_perm IPC(进程间通信)权限结构
msg_msg:
消息结构
Linux安全模块(LSM)提供了各种安全钩子(hook)函数,都在全局类型security_operations结构中,这些函数管理内核对象得安全域,仲裁对这些内核对象得访问。
Linux安全模块提供了一个通用得安全系统调用,允许安全模块为安全相关得应用编写新得系统调用。
在内核引导得过程中,Linux初始化了一系列得虚拟钩子函数,当加载一个安全模块时,使用register_security函数注册安全模块:
这个函数将设置全局表security_ops,使其指向安全模块得钩子函数指针,从而内核可向这个安全模块询问访问控制决策。
Linux安全模块将capabilities能力机制移植到安全模块中,保留了对原有使用capabilities得应用程序得支持。
Linux安全模块得钩子函数包括任务钩子、程序装载钩子、进程间通信IPC钩子、文件系统钩子、网络钩子及模块钩子与顶层得系统钩子。
3、1、4 内核SELinux得组织结构
SELinux模块由安全服务器、AVC(AccessVectorCache)、网络接口表、netlink事件通知代码、selinuxfs伪文件系统与hook函数应用六个部分组成。
安全服务器为获得安全策略决定提供通用接口,使模块得其余部分保持独立得安全策略。
这些接口定义在include/security、h中,安全服务器得特定应用能在不改变模块其她部分得情况下被改变。
安全服务器得应用有RBAC(基于角色得访问控制RoleBasedAccessControl)、TE(类型加强TypeEnforcement)得生成与可选得MLS(多级安全MultiLevelSecurity)。
其中,RBAC与TE策略就是高度可配置得,能用于许多不同得安全对象。
安全服务器得源代码在security/selinux/ss目录下载。
AVC提供了从安全服务器获得得访问策略得缓冲区(cache),提高了安全机制得运行性能。
它提供了hook函数高效检查授权得接口,提供了安全服务器管理cache得接口。
与hook函数得接口定义在include/avc、h中,与服务器得接口定义在include/avc_ss、h中,AVC代码在avc、c中。
网络接口表将网络设备映射到安全上下文中。
维护一个独立得表就是必要得,因为LSM网络设备没有安全成员。
当网络设备被hook函数第一次查找到时该网络设备就被加入到这个表中,当设备被设置取消或策略重载时移出这个表。
网络接口表提供了查找hook函数以及获得网络设备条目引用或释放引用得接口函数。
该接口定义在include/netif、h中,回调函数在设备配置变化或策略重载时注册。
网络接口表得代码在netif、c中。
netlink事件通知让SELinux模块在策略重载以及强制状态改变时通知进程。
这些通知被用户空间得AVC(libselinux得一部分)用来保持与内核一致得状态。
用户空间AVC被用户空间策略强制器(enforces)使用,代码在netlink、c中。
Selinux伪文件系统给进程提供安全服务器得策略API。
selinux提供基于策略API得调用,它包括进程属性、文件属性与策略API三个部分,并被高层得libselinuxAPI封装起来,代码在selinuxfs、c中。
hook函数应用管理与内核对象相关得安全信息以及执行内核每个操作得访问控制。
hook函数调用安全服务器与AVC得到安全策略并运用这些策略来标识与控制内核对象。
hook函数还调用文件系统扩展属性代码获得与设备文件上面得安全上下文。
hook函数在hooks、c中,与内核对象相关得安全信息得数据结构定义在include/objsec、h中。
SELinux安全模块及接口如图32所示。
图32 SELinux安全模块及接口
linux内核对于程序得运行、文件系统得超级块与节点以及文件操作、任务操作、网络连接、socket、SystemV进程间通信等提供了对应安全操作函数,这些函数指针都放在安全操作函数结构中,由于结构很大,这里只列出了程序运行得操作函数指针,这些操作函数指针得前缀bprm就是binprogram得缩写,其她得操作函数具有类似结构。
security_operations安全操作函数结构在include/linux/security、h中,分析如下:
structsecurity_operations{
int(*ptrace)(structtask_struct*parent,structtask_struct*child);
int(*capget)(structtask_struct*target,
kernel_cap_t*effective,
kernel_cap_t*inheritable,kernel_cap_t*permitted);
int(*capset_check)(structtask_struct*target,
kernel_cap_t*effective,
kernel_cap_t*inheritable,
kernel_cap_t*permitted);
void(*capset_set)(structtask_struct*target,
kernel_cap_t*effective,
kernel_cap_t*inheritable,
kernel_cap_t*permitted);
int(*acct)(structfile*file);
int(*sysctl)(ctl_table*table,intop);
int(*capable)(structtask_struct*tsk,intcap);
int(*quotactl)(intcmds,inttype,intid,structsuper_block*sb);
int(*quota_on)(structfile*f);
int(*syslog)(inttype);
int(*vm_enough_memory)(longpages);
int(*bprm_alloc_security)(structlinux_binprm*bprm);
void(*bprm_free_security)(structlinux_binprm*bprm);
void(*bprm_apply_creds)(structlinux_binprm*bprm,intunsafe);
int(*bprm_set_security)(structlinux_binprm*bprm);
int(*bprm_check_security)(structlinux_binprm*bprm);
int(*bprm_secureexec)(structlinux_binprm*bprm);
……
}
security_operations得结构很大,这里只列出了很少得一部分,下面就一些成员函数说明如下:
bprm_alloc_security:
分配或附加上一个security结构到bprm>security成员上,操作成功时返回0。
bprm_free_security:
释放或删除bprm>securityfield成员上得security结构。
bprm_apply_creds:
计算或设置进程得安全属性,这个进程就是由execve操作生成得,这个操作就是基于旧属性(当前进程得安全属性current>security)与被set_security函数设置存在bprm>security里得信息。
由于set_security函数就是void类型,这个函数不能返回错误,如果属性设置失败,则安全属性值不会被改变。
bprm_apply_creds:
函数在任务锁住得情况下被调用,参数unsafe表示可能不安全地转换安全状态得各种原因。
bprm_set_security:
将安全信息存放到bprm>security成员中。
bprm_check_security:
检查set_security调用时设置得值就是否设置到bprm>security中,返回0表示已授予设置得权限。
bprm_secureexec:
返回值就是1或0,表示就是否就是安全运行,这个标识传进ELF解释器得初始堆栈上得补充表里,用来表示libc就是否能使用安全模式。
3、2 SELinux策略配置语言
策略就是一套指导SELinux安全引擎计算安全决策得规则,它定义了文件客体得类型、进程得域、使用限制进入域得角色及访问许可得规则表达式等。
策略得源代码用SELinux配置语言进行描述。
3、2、1 基本概念
1.主体与客体
主体(subject)与客体(object)就是指系统中得元素,主体就是访问客体得进程,客体就是系统中得一类实体,在系统中定义好了30种不同得客体类别(class),每个class有定义好得许可。
在/etc/security/selinux/src/policy/flask/security_classes中有class得定义,SELinux定义了30个class,列出如下:
securityprocesssystemcapability
fdlnk_blk_
fifo_tcp_socketudp_socketmsgqsemmsg
shmipcnodenetifnetlink_socketpacket_socket
key_socketrawip_socketunix_stream_socket
unix_dgram_socketpasswd
每个class都定义了操作许可,如:
客体个操作许可,列出如下:
ioctlreadwritecreategetattrsetattrlockrelabelfrom
relabelto appendunlinklink renameexecuteswapon
quotaonmountonexecute_no_transentrypoint
2.安全上下文与安全标识符
SELinux给每个主体与客体定义了一个安全上下文(securitycontext)。
安全上下文就是对主体或客体安全得描述,其格式为:
user:
role:
t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SELinux 概述
![提示](https://static.bdocx.com/images/bang_tan.gif)