SElinux.docx
- 文档编号:10719105
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:23
- 大小:270.84KB
SElinux.docx
《SElinux.docx》由会员分享,可在线阅读,更多相关《SElinux.docx(23页珍藏版)》请在冰豆网上搜索。
SElinux
SElinux
一.简介
SELinux全称是SecurityEnhancedLinux,由美国国家安全部(NationalSecurityAgency)领导开发的GPL项目,它拥有一个灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击,相当于B1级的军事安全性能。
比MSNT的C2等高得多。
SELinux起源于自1980开始的微内核和操作系统安全的研究,这两条研究线路最后形成了一个叫做的分布式信任计算机(DistributeTrustedMach(DTMach))的项目,它融合了早期研究项目的成果(LOCK【锁】,它包含一组安全内核类型强制;TrustedMach【信任计算机】,它将多层安全控制合并到计算机微内核中)。
美国国家安全局的研究组织参加了DTMach项目,付出了巨大努力,并且继续参与了大量的后续安全微内核项目。
最终,这些工作和努力导致了一个新的项目产生,那就是Flask,它支持更丰富的动态类型的强制机制。
由于不同平台对这这项技术没有广泛使用,NAS认为需要在大量的社团中展示这个技术,以说明它的持久生命力,并收集广泛的使用支持意见。
在1999年夏天,NSA开始在Linux内核中实现Flask安全架构,在2000年十二月,NSA发布了这项研究的第一个公共版本,叫做安全增强的Linux。
因为是在主流的操作系统中实现的,所以SELinux开始受到Linux社区的注意,SELinux最迟是在2.2.x内核中以一套内核补丁的形式发布的。
随着2001年Linux内核高级会议在加拿大渥太华顺利召开,Linux安全模型(LSM[7])项目开始为Linux内核创建灵活的框架,允许不同的安全扩展添加到Linux中。
NSA和SELinux社区是SELinux的主要贡献者,SELinux帮助LSM实现了大量的需求,为了与LSM一起工作,NSA开始修改SELinux使用LSM框架。
2002年八月LSM核心特性被集成到Linux内核主线,同时被合并到Linux2.6内核。
2003年八月,NSA在开源社区的帮助下,完成了SELinux到LSM框架的迁移,至此,SELinux进入Linux2.6内核主线,SELinux已经成为一种全功能的LSM模块,包括在核心Linux代码集中。
数个Linux发行版开始在2.6内核中不同程度使用SELinux特性,但最主要是靠RedHat发起的FedoraCore项目才使SELinux具备企业级应用能力,NSA和RedHat开始联合集成SELinux,将其作为FedoraCoreLinux发行版的一部分。
在RedHat参与之前,SELinux总是作为一个附加的软件包,需要专家级任务才能进行集成。
RedHat开始采取行动让SELinux成为主流发行版的一部分,完成了用户空间工具和服务的修改,默认开启增强的安全保护。
从FedoraCore2开始,SELinux和它的支持基础架构以及工具得到改进。
在2005年早些时候,RedHat发布了它的EnterpriseLinux4(REL4),在这个版本中,SELinux默认就是完全开启的,SELinux和强制访问控制已经进入了主流操作系统和市场。
SELinux仍然是一个相对较新和复杂的技术,重要的研究和开发在继续不断地改进它的功能。
应用SELinux后,可以减轻恶意攻击或恶意软件带来的灾难,并提供对机密性和完整性有很高要求的信息很高的安全保障。
普通Linux安全和传统Unix系统一样,基于自主存取控制方法,即DAC,只要符合规定的权限,如规定的所有者和文件属性等,就可存取资源。
在传统的安全机制下,一些通过setuid/setgid的程序就产生了严重安全隐患,甚至一些错误的配置就可引发巨大的漏洞,被轻易攻击。
而SELinux则基于强制存取控制方法,即MAC,透过强制性的安全策略,应用程序或用户必须同时符合DAC及对应SELinux的MAC才能进行正常操作,否则都将遭到拒绝或失败,而这些问题将不会影响其他正常运作的程序和应用,并保持它们的安全系统结构。
二.Selinux管理配置
1.Selinux控制规则及相关概念
1.1.DAC(自主存取控制)依据程序运行时的身份决定权限,是大部分操作系统的权限存取控制方式。
也就是依据文件的own,group,other/r,w,x权限进行限制。
Root有最高权限无法限制。
r,w,x权限划分太粗糙。
无法针对不同的进程实现限制。
1.2.MAC(强制存取控制)依据条件决定是否有存取权限。
可以规范个别细致的项目进行存取控制,提供完整的彻底化规范限制。
可以对文件,目录,网络,套接字等进行规范,所有动作必须先得到DAC授权,然后得到MAC授权才可以存取。
1.3.TE(类型强制)所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的。
在SELinux中,访问控制属性叫做安全上下文。
所有客体(文件、进程间通讯通道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:
用户、角色和类型标识符。
Selinux对一些命令做了修改.ls–Zps–Zauxid–Z
例如:
[root@localhost~]#id-Z
root:
system_r:
unconfined_t:
SystemLow-SystemHigh
注:
这里的第四部分SystemLow-SystemHigh为安全上下文的扩展属性在后面会有介绍。
在SELinux中,访问控制属性总是安全上下文三人组形式,所有客体和主体都有一个关联的安全上下文,因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。
如上例中unconfined_t决定访问权限。
1.3.1.安全上下文:
安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),"域"和"域类型"意思都是一个.
1.3.2.类型:
安全上下文中的用户和角色标识符除了对强制有一点约束之外对类型强制访问控制策略没什么影响,对于进程,用户和角色标识符显得更有意义,因为它们用于控制类型和用户标识符的联合体,这样就会Linux用户账号关联起来;然而,对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么作用。
用一个例子来解释以上概念:
假如我们设定1.httpd这个进程使用httpd_t这个域类型运行.
2.将httpd进程使用的端口标记为httpd_port_t类型.
3.将网页目录标记为httpd_sys_content_t类型.
4.限制以httpd_t域运行的httpd程序只能监听httpd_port_t类型的端口,并限制此域的进程只能存取标记为httpd_sys_content_t的网页文件。
1.4.RBAC(基于角色的访问控制)
SELinux提供了一种依赖于类型强制(TE)基于角色的访问控制(RBAC),角色用于组域类型和限制域类型与用户之间的关系,SELinux中的用户关联一个或多个角色,使用角色和用户,RBAC特性允许有效地定义和管理最终授予Linux用户的特权。
注:
组域类型指的是将多个域类型关联到一个角色。
SELinux中的角色和用户构成了它的RBAC特性的基础,SELinux中的访问权不是直接授予用户或角色的,角色扮演的是类型强制的一个支持特性,它和用户一起为Linux用户及其允许允许的程序提供了一种绑定基于类型的访问控制,SELinux中的RBAC通过定义域类型和用户之间的关系对类型强制做了更多限制,以控制Linux用户的特权和访问许可,RBAC没有允许访问权,在SELinux中,所有的允许访问权都是由类型强制提供的。
警告:
Linux和SELinux有它们自己的用户标识符,如/etc/passwd中定义的用户,那就是"Linux用户"来,SElinux指的是SELinux策略中在安全上下文中定义的用户标识符。
SELinux中的RBAC特性依赖并支持TE特性,我们通过将域类型和一个或多个角色进行关联,而不是直接将权限授给用户,RBAC通过在安全上下文中控制域类型、角色和用户的关联实现对TE策略更多的约束,也就是说,域转换是受用户的角色约束的,最终约束了用户的总体权限。
我们不会直接将域类型和用户进行关联,相反,域类型是与角色进行关联的,然后再将角色与SELinux用户进行关联,这就间接增加了两个效果,首先,他简化了管理所有策略的复杂度,一个系统可能只有三或四个角色,但有成千上万的用户和域类型,直接将域类型与用户进行关联,将会导致管理非常困难,将域类型分配给一小撮描述类型(如普通用户域类型)特权集的角色,然后将这些橘色指派给用户,这样就更容易管理了。
SELinux中的角色也允许我们限制用户的访问,对于任何进程,同一时间只有一个角色(即进程安全上下文中的角色)是"活动的",因为域类型是与角色进行关联的,域转换就会受到与它们关联的活动角色的限制了。
限制域转换只对当前活动的角色有效,允许用户关联更多的角色,不会获得所有角色访问权的并集,例如:
我们可以将一个用户与系统管理角色和受限的普通用户角色进行关联,在后面进行交互时将会使用普通用户角色,而不是管理角色,在常规使用过程中,普通用户角色将会被激活,阻止访问权授予管理域类型,仅当必需执行系统管理任务时激活管理角色(即通过域转换改变),这与标准Linux下使用普通账户切换到root账户进行系统管理非常类似,但比准Linux方式更精细。
关键要记住角色仅仅是一套域类型的集合,他可以方便地与用户建立联系,它们不是SELinux中独立的访问控制机制。
简单一点说就是,我们可以制定很多角色指定不同的权限规范,那样就可以规范不同的用户又不同的角色,只有切换到特定的角色才有特定的存取权限。
对于用户来说,被划分成一些role,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。
因为,那些role可以执行那些domain也是在策略里设定的。
role也是可以迁移的,但是也只能按策略规定的迁移。
1.5.DT(域类型转换)
域类型转换可以实现权限的扩展或者缩小,防止权限升级。
例如:
A进程运行在A_t域中,B进程运行在B_t域中。
当以A_t运行B进程的时候可以规范B进程是要沿用A_t环境呢,还是继承自己的B_t环境。
举个例子进行说明:
1.5.1.环境介绍.察看当前用户的类型,vsftpd启动脚本的类型以及vsftpd执行程序的类型.
[root@localhost~]#id-Z
user_u:
system_r:
unconfined_t
[root@localhost~]#ls-Z/etc/init.d/vsftpd
-rwxr-xr-xrootrootsystem_u:
object_r:
initrc_exec_t/etc/init.d/vsftpd
[root@localhost~]#ls/usr/sbin/vsftpd-Z
-rwxr-xr-xrootrootsystem_u:
object_r:
ftpd_exec_t/usr/sbin/vsftpd
1.5.2.selinux策略文件里的定义如下:
type_transitionunconfined_tinitrc_exec_t:
processinitrc_t
这条定义了以类型为unconfined_t身份执行类型为initrc_t的文件时进程的类型转换为initrc_t.
type_transitioninitrc_tftpd_exec_t:
processftpd_t
这条定义了以类型为initrc_t身份执行类型为ftpd_exec_t文件时进程类型转换为ftp_t.
1.5.3.整个运行流程如下:
1.5.3.1.类型为unconfined_t的进程执行类型为initrc_exec_t类型的/etc/init.d/vsftpd文件,根据策略规定执行中的进程运行在initrc_t域中.
1.5.3.2.在initrc_t域中运行的进程会执行类型为ftpd_exec_t的/usr/sbin/vsftpd程序,根据策略文件的规定,/usr/sbin/vsftpd程序会在ftp_t域中运行.
1.5.3.3.最后我们就可以规范ftp_t类型可以存取的类型来限制ftp服务器.
1.5.3.4.小结
1.5.3.4.1./etc/init.d目录下所有文件的类型为initrc_exec_t
1.5.3.4.2.在selinux策略中定义了只能使用/etc/init.d目录下的脚本来启动服务.
1.5.3.4.3.启动的服务会进行类型转换而受到selinux策略里的环境而规范.
1.6.Selinux配置文件及设定
1.6.1.Selinux配置文件主目录是/etc/selinux
[root@localhosttargeted]#ls/etc/selinux/
configmlsrestorecond.confsemanage.confstricttargeted
1.6.1.1.使用config文件来配置selinux
SELINUX=enforcing
#此项定义selinux状态。
#enforcing—是强制模式系统受selinux保护。
#permissive—是提示模式系统不会受到selinux保护,只是收到警告信息。
#disabled—禁用selinux。
#SELINUXTYPE=typeofpolicyinuse.Possiblevaluesare:
#targeted-Onlytargetednetworkdaemonsareprotected.
#strict-FullSELinuxprotection.
SELINUXTYPE=targeted
#此项定义selinux使用哪个策略模块保护系统。
#targeted—小红帽开发的策略,只对apache,sendmail,bind,postgresql等网络服务保护,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。
#Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂。
#mls,是一个较新的安全策略。
#以上三种策略配置都放置在/etc/selinux目录中,目录和策略名称相同。
1.6.2.targeted目录是targeted策略配置目录,contexts/子目录包括了许多帮助系统服务和实用程序管理文件安全上下文标记的大量文件,它们也包括登陆进程的默认安全上下文,通常,这些文件只应该由策略开发人员修改,但管理员可能偶尔也需要修改一下,下面列出这些文件的主要用途,你也可以略过这个部分的阅读。
1.6.2.1.contexts/customizable_types:
包括一列当使用restorecon或setfiles实用程序修复文件标记问题时不会被重新标记的类型,这个特性在帮助保护某些文件标记时特别有用,使用SELinux应用程序接口(API)检查上下文是否自定义的是is_context_customizable(3)。
1.6.2.2.contexts/default_contexts:
在初始登陆过程中,用户可能登陆会话可能不止得到一个角色/类型组授权,如管理员就可以以特权用户和非特权用户登陆,这个文件提供了一个方法决定初始登陆使用哪个登陆进程(login,ssh等)作为默认的角色/类型组。
注意,如果有contexts/users/[USER]文件的话,这些默认值可能会被一个特殊用户覆盖。
1.6.2.3.contexts/users/[USER]:
这个文件和default_contexts文件的格式一样,除了default_contexts是为一个特殊用户设计的外,如果某个用户的文件已经存在,默认的角色/类型组由该文件的第一个决定。
1.6.2.4.contexts/failsafe_context:
如果登陆进程不能决定用户的默认安全上下文,用户将不能登陆进系统,这和default_contexts文件被破坏会改变非常类似,这个文件提供了一个合理的安全上下文故障自动转移机制,至少允许管理员登陆,它提供最后的登陆进程失败前使用的默认安全上下文,通常是:
sysadm_r:
sysadm_t
这样的话,至少管理员可以登陆。
1.6.2.5.contexts/default_type:
这个文件包括一列实用程序(如newrole)使用的角色/类型组,如果我们使用newrole修改我们的角色,但不指定类型,实用程序将会咨询这个文件以确定默认的类型和角色,如果我们使用命令newrole-rsysadm_r,而且这个文件有一行的内容为sysadm_r:
sysadm_t,这个命令将会尝试使用sysadm_t作为我们的默认用户域类型。
1.6.2.6.contexts/files/file_contexts:
这个文件包括与文件有关的安全上下文标记信息,作为策略构建过程的一部分,为与文件有关的客体使用初始化安全上下文,它安装在这里帮助实用程序修复标记问题。
1.6.2.7.contexts/files/file_contexts.home_dirs:
这个文件是使用/usr/sbin/genhomedircon脚本自动生成的,它的格式与file_contexts一致,但它只用于标记用户home目录。
1.6.2.8.contexts/files/homedir_template:
这个文件包括一个/usr/sbin/genhomedircon脚本使用它产生标记块的模板。
1.6.2.9.contexts/files/media:
这个文件包括挂载在/media/目录下的存储设备的安全上下文,通过libselinuxmatchmediacon(3)API使用它。
1.6.2.10.contexts/initrc_context:
这个文件包括一个角色/类型组,用于run_init的安全上下文,即管理员以init相同的方式启动系统服务,这样它就可以执行由init初始化的存储在/etc/rc.d/目录下的脚本,这个角色/类型组通常和init用来启动系统服务的角色/类型组一致
1.6.2.11.contexts/removable_context:
这个文件包括可移动媒体设备的默认安全上下文,这个安全上下文用于media上下文文件没有标记的设备
1.6.3.检查selinux策略相关命令
1.6.3.1.seinfo
1.6.3.2.sesearch–a
1.6.3.3.sesearch–a–tftpd_t
1.6.4.设置selinux相关命令
1.6.4.1.sestatus查询selinux工作状态
[root@localhostselinux]#sestatus
SELinuxstatus:
enabled
SELinuxfsmount:
/selinux
Currentmode:
enforcing
Modefromconfigfile:
enforcing
Policyversion:
21
Policyfromconfigfile:
targeted
1.6.4.2.selinuxenabled检查selinux是否开启,配合echo$?
.传回值是0为开启,1为关闭.
[root@localhostselinux]#selinuxenabled
[root@localhostselinux]#echo$?
0
1.6.4.3.setenforce设定selinux运行状态,1开启,0关闭.
[root@localhostselinux]#setenforce1
1.6.4.4.selinux的boolean值.selinux策略中定义许多boolean值,用户自定义要让selinux开启保护某些程序,或者是关闭对某些程序,程序中的某个项目的保护.目录位置/selinux/boolean/下相关文件.
1.6.4.4.1.查看boolean值
[root@localhost~]#getsebool-a
[root@localhost~]#getsebool-a|grepftp
1.6.4.4.2.设置boolean值,-P为设置永久生效.
[root@localhost~]#setseboolftpd_disable_transoff
[root@localhost~]#setsebool-Pftpd_disable_transoff
注:
不建议使用setsebool-Pftpd_disable_transoff,这样会让ftp服务器失去selinux保护.
试验1:
启动vsftp服务器后以本地帐户登陆服务器,你是否看到本地帐号不能切换到家目录的出错信息?
使用以下命令允许本地帐户进入家目录.(off是禁止本地帐户切换到家目录)
[root@localhost~]#setsebool-Pftp_home_diron
1.6.5.查看安全上下文相关命令
1.6.5.1.查看用户安全上下文,下面是普通用户和超级用户的安全上下文,从第一个字段一次为用户标识,角色,域类型.超级用户的第四字段为扩展的MLS或MCS.(见附录)
tomyang@localhost~]$id-Z
user_u:
system_r:
unconfined_t
[root@localhost~]#id-Z
root:
system_r:
unconfined_t:
SystemLow-SystemHigh
1.6.5.2.查看文件安全上下文
[onlyc@localhost~]$ls-Z/home/onlyc/
drwxr-xr-xonlyconlycuser_u:
object_r:
user_home_tDesktop
1.6.5.3.查看进程的安全上下文
user_u:
system_r:
ftpd_t7950?
Ss0:
00/usr/sbin/vsftpd
1.6.6.认识安全上下文,安全上下文以用户:
角色:
类型(域)的形式出现.(这里的用户指的是selinu用户)
1.6.6.1.用户:
root表示root帐号身份,user_u表示普通无特权用户(一般用户),system_u表示系统进程.通过用户可以确认身份类型,一般搭配角色使用,身份和不同的角色搭配时权限不同.帐户之间切换时此用户身份不变.但是在targeted策略环境下用户标识没有实质作用.
1.6.6.2.角色:
object_r一般为文件目录的角色,system_r一般为进程的角色.在targeted策略环境中用户的角色一般为system_r.在strict策略中用户的角色被细分为sysadm_r,system_r,user_r,staff_r角色.用户的角色类似组的概念,不同的角色具有不同的身份权限.一个用户可以具备多个角色,但是同一时间只能使用一个角色.但是在targeted策略环境下角色没有实质作用.在targeted策略环境中所有的进程文件的角色都是system
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SElinux