SELinux TE规则

合集下载

SELinux

SELinux

SELinux分析(南昌大学王博)摘要:SELinux全称是Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击,相当于B1级的军事安全性能。

应用SELinux 后,可以减轻恶意攻击或恶意软件带来的灾难,并提供对机密性和完整性有很高要求的信息很高的安全保障。

关键字:信息安全,SELinux,DAC,MAC,SUID/SGID一.DAC,MAC,SUID/ SGIDDAC (Discretionary access control,自主访问控制):自主访问控制基于对主体及主体所属的主体组的识别,来限制对客体的访问,还要校验主体对客体的访问请求是否符合存取控制规定来决定对客体访问的执行与否。

这里所谓的自主访问控制是指主体可以自主地(也可能是单位方式)将访问权,或访问权的某个子集授予其它主体。

自主访问控制是一种最为普遍的访问控制手段,用户可以按自己的意愿对系统的参数做适当修改以决定哪些用户可以访问他们的文件,亦即一个用户可以有选择地与其它用户共享他的文件,用户有自主的决定权。

传统Linux,Windows采用是这种访问控制手段.MAC (Mandatory Access Control ,强制访问控制):强制访问控制机制是通过对主体和客体的安全级别进行比较来确定授予还是拒绝用户对资源的访问,从而防止对信息的非法和越权访问,保证信息的保密性。

强制访问控制允许加载新的访问控制模块,并借此实施新的安全策略,其中一部分为一个很小的系统子集提供保护并加强特定的服务,其他的则对所有的主体和客体提供全面的标签式安全保护。

与自主访问控制不同的是,强制访问控制由安全管理员管理,由安全管理员根据一定的规则来设置,普通数据库用户不能改变他们的安全级别或对象的安全属性;自主访问控制尽管也作为系统安全策略的一部分,但主要由客体的拥有者管理. ,MAC机制不再允许对象(比如程序、文件或文件夹等)的拥有者随意修改或授予此对象相应的权限,而是透过强制的方式为每个对象统一授予权限,SELinux采用的就是这种访问控制策略.SUID/SGID有时,没有被授权的用户需要完成某项任务。

selinux规则编译

selinux规则编译

selinux规则编译
编译SELinux规则是一项复杂的任务,它涉及到创建和修改SELinux策略,以确保系统安全性。

下面我将从多个角度来回答这个问题。

首先,要编译SELinux规则,你需要安装SELinux开发包。

这通常是通过在Linux系统上安装selinux-devel或者selinux-policy-devel软件包来实现的,具体取决于你所使用的Linux发行版。

安装这些开发包可以提供编译SELinux规则所需的工具和库。

其次,一旦安装了开发包,你需要使用SELinux策略编译器(如checkpolicy)来编译SELinux规则。

这通常涉及编写一个SELinux策略源文件(通常以.te为扩展名),然后使用checkpolicy工具将其编译成二进制策略模块(.pp文件)。

在编写SELinux规则时,你需要考虑到系统中的各种进程、文件和网络资源,并确保你的规则不会破坏系统的正常运行。

这需要对SELinux策略语言的理解,以及对系统安全性的深入了解。

最后,一旦你编译好了SELinux规则,你需要加载这些规则到
系统中,以确保它们生效。

这通常涉及使用semodule工具来加载编译好的策略模块。

总的来说,编译SELinux规则需要对SELinux策略语言和系统安全性有深入的理解,以及使用相关的工具来完成编译和加载。

希望这些信息能够帮助你更好地理解如何编译SELinux规则。

SELinux的策略与规则管理相关命令

SELinux的策略与规则管理相关命令

SELinux的策略与规则管理相关命令SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。

1、setinfo命令语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、⾝份识别、⾓⾊、类型等所有信息。

-t:列出SELinux所有类型(type)的种类。

-r:列出SELinux所有⾓⾊(role)的种类。

-u:列出SELinux所有⾝份识别(user)的种类。

-b:列出所有规则的种类(布尔值)。

实例列出与httpd有关的规则:seinfo -b | grep httpd来⾃:语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、⾝份识别、⾓⾊、类型等所有信息。

-t:列出SELinux所有类型(type)的种类。

-r:列出SELinux所有⾓⾊(role)的种类。

-u:列出SELinux所有⾝份识别(user)的种类。

-b:列出所有规则的种类(布尔值)。

实例列出与httpd有关的规则:seinfo -b | grep httpd来⾃:语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、⾝份识别、⾓⾊、类型等所有信息。

-t:列出SELinux所有类型(type)的种类。

-r:列出SELinux所有⾓⾊(role)的种类。

-u:列出SELinux所有⾝份识别(user)的种类。

-b:列出所有规则的种类(布尔值)。

实例列出与httpd有关的规则:seinfo -b | grep httpd来⾃:seinfo(选项)来⾃:seinfo(选项)来⾃:setinfo (选项)-a:列出该类型或布尔值的所有相关信息-A:列出SELinux的状态、规则布尔值、⾝份识别、⾓⾊、类型等所有信息。

-t:列出SELinux所有类型(type)的种类。

-r:列出SELinux所有⾓⾊(role)的种类。

Android系统添加SELinux权限

Android系统添加SELinux权限

Android系统添加SELinux权限CPU:RK3288系统:Android 5.1SELinux 主要由美国国家安全局开发。

2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。

通过虚拟⽂件系统 proc 来读写 gpio 的⽅法⾮常受欢迎,不仅因为其省去了 hal 层、 jni 层的代码,⽽且可以直接通过 adb shell 来读写 gpio。

在 user 版本,虽然驱动代码中已经将节点权限设置为 777 或者 666,但是在 adb shell 中写 gpio 时会报出权限不⾜的问题。

最快的解决办法是将系统编译成 userdebug 版本或者 eng 版本,也可以对系统 root。

下⾯是编译成 user 版本的解决⽅法,前提是驱动已经OK。

cust_gpios 是驱动中通过 proc_mkdir 创建的⽬录,relay 是通过 proc_create 创建的节点,对应⼀个⽅向为输出 gpio1、在 adb 中读,没有问题,但是写 gpio 会报出权限不⾜shell@rk3288:/proc/cust_gpios $ cat relaycat relay1shell@rk3288:/proc/cust_gpios $ echo0 > relayecho0 > relay/system/bin/sh: can't create relay: Permission deniedkenel 中打印出的错误信息如下type=1400 audit(1358758415.820:7): avc: denied { write} for pid=1229 comm="sh" name="relay" dev="proc" ino=4026533065 scontext=u:r:shell:s0 tcontext=u:object_r:proc:s0 tclass=file permissive=0解释:write:表⽰没有 write 权限shell:shell 中缺少权限,⽂件名与此相同,xxx.teproc:proc ⽂件系统缺少权限file:file 类型的⽂件2、添加 shell 权限,scontext 对应的是 shell ,所以需要在 shell.te 最后⾯中添加path:\device\rockchip\common\sepolicy\shell.teallow shell proc:file write;3、添加后编译会报错如下,这是因为添加了不允许的规则libsepol.report_failure: neverallow on line 344 of external/sepolicy/app.te (or line 4313 of policy.conf) violated by allow shell proc:file { write };需要在 app.te 中的 344 ⾏中不允许的规则中删除添加的权限,⽤⼤括号括起来path:\external\sepolicy\app.teneverallow {appdomain -shell}proc:dir_file_class_set write;此时可以在 adb 来通过 proc 虚拟⽂件系统正常读写 gpio4、操作 gpio 最终要由上层 apk 来读写,同样写 gpio 时,kernel 和 logcat 都会报出权限不⾜,解决⽅法与上⾯类似type=1400 audit(1358758857.090:8): avc: denied { write } for pid=1208 comm="ron.gpiocontorl" name="relay" dev="proc" ino=4026533065 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:proc:s0 tclass=file permissive=0添加权限path:device\rockchip\common\sepolicy\untrusted_app.teallow untrusted_app proc:file write;添加后编译报错libsepol.report_failure: neverallow on line 344 of external/sepolicy/app.te (or line 4313 of policy.conf) violated by allow untrusted_app proc:file { write };删除不允许的权限path:\external\sepolicy\app.teneverallow {appdomain -shell -untrusted_app}proc:dir_file_class_set write;此时 adb 和 apk 中都能正常读写 gpio。

SELinux的安全机制有哪些

SELinux的安全机制有哪些

SELinux的安全机制有哪些SELinux一直被认为是最安全的Linux系统,因为SELinux是由美国国家安全局开发的,有多层安全机制。

那么SELinux安全机制有哪些?下面店铺就为大家介绍一下具体的内容吧,欢迎大家参考和学习。

SELinux的安全机制:类型强制策略相比SELinux引入的MAC(强制访问控制)是比较遥远的。

然而,在一些情况下,特别是在分类的政府应用的子集中,传统的MLS(多层安全机制)强制访问控制加上TE是非常有价值的。

在意识到这个情形之后,SELinux也包括一些MLS的形式。

在SELinux中,MLS的特征是可选的,并且相比两个强制访问控制机制来说是次要的。

对于绝大部分安全应用来说,包括许多没有很少有数据分类的应用来说,对于增强型安全机制,TE策略是最合适的机制。

尽管如此,MLS 的添加也提高了一些应用的安全性。

MLS的实际实现是非常复杂的。

被MLS系统使用的安全层是分层的敏感度和一系列非层次目录集合(包括空集合)的综合体。

这些敏感度和目录被用来反映真实信息的机密性和用户许可。

在大多数SELinux 策略中,敏感度(s0,s1…)和目录(c0,c1…)被给予通用的名称,使用户空间程序和类库来分配用户有意义的名称。

(例如,s0可能与UNCLASSIFIED相关联,s1可能与SECRET相关联。

)为了支持MLS,安全上下文被扩展包含安全层次,例如这些user_r:role_type:sensitivity[:category,…][-sensitity[:catagory,…]]注意,MLS安全上下文一定至少有一个安全层(该安全层是由一个单独的敏感度和0个或者是多个目录组成),但是能够包含两个安全层。

这两个安全层分别被称作低层(或者是当前进程层)和高层(进程间隙),如果高安全层丢失了,那么他就被认为是和低层(通常情况下)是一样的。

特别的,对于大多数客体和进程来说,低安全层和高安全层通常是一样的。

selinux中te文件、file_contexts、property_contexts理解

selinux中te文件、file_contexts、property_contexts理解

selinux中te文件、file_contexts、property_contexts理解在SELinux(Security-Enhanced Linux)中,有一些关键的文件和配置文件用于定义策略和上下文,其中包括`te` 文件、`file_contexts` 文件和`property_contexts` 文件。

1. TE 文件(Type Enforcement):-定义:TE 文件是SELinux 政策中的一部分,包含了类型强制规则。

这些规则定义了系统上各种对象(如进程、文件、套接字等)如何与彼此交互的策略。

-文件扩展名:TE 文件通常以`.te` 为扩展名。

例如,`example.te`。

-内容:TE 文件包含了SELinux 策略的核心规则,定义了对象的类型、访问规则以及允许或拒绝的操作。

2. file_contexts 文件:-定义:`file_contexts` 文件用于定义文件上下文规则,即文件和目录在SELinux 中的安全上下文。

-文件位置:通常位于`/etc/selinux/targeted/contexts/files/` 目录下。

-内容:文件上下文规则描述了不同路径下文件的安全上下文,以及这些上下文与SELinux 类型之间的映射关系。

3. property_contexts 文件:-定义:`property_contexts` 文件用于定义Android 系统中的文件上下文和属性上下文的映射。

-文件位置:通常位于Android 系统的`/system/etc/selinux/` 目录下。

-内容:文件包含了Android 系统属性(例如`ro.build.type`)和与其关联的SELinux 安全上下文。

这些文件的作用是协同工作,构建SELinux 的安全策略。

TE 文件定义了SELinux 规则,file_contexts 文件定义了文件的安全上下文,而property_contexts 文件则定义了Android 系统中文件属性的安全上下文。

android selinux规则

这些规则是通过SELinux策略文件(如sepolicy)定义和实施的。策略文件包含了一系列 的规则和规范,用于指定哪些操作是允许的,哪些是禁止的。这些规则是根据Android系统 的需求和安全策略来定义的,以确保系统的安全性和稳定性。
请注意,对于开发人员和终端用户来说,直接修改和管理SELinux规则是不常见的。通常 情况下,应用程序开发人员和终端用户只需要遵守系统的安全策略,并确保应用程序的正常 运行和安全性。
android selinux规则
在Android系统中,SELinux(Security-Enhanced Linux)是一种强制访问控制(MAC )机制,用于保护系统的安全性。下面是一些常见的Android SELinux规则:
1. 文件访问规则:SELinux规定了哪些进程可以访问特定的文件和目录。例如,只有特定 的系统服务才能访问敏感的系统配置文件。
2. 进程间通信规则:SELinux控制进程之间的通信,以防止恶意应用程序访问其他应用程 序的敏感数据。例如,只有具有特定权限的应用程序才能访问网络通信。
android selinux规则
3. 网络访问规则:SELinux规定了哪些应用程序可以访问网络资源,以及它们可以访问的 端口和协议。这有助于防止恶意应用程序通过网络传输恶意代码或窃取用户数据。
4. 进程权限规则:SELinux定义了每个进程的安全上下文,以确保进程只能执行其具有权 限的操作。这有助于防止恶意应用程序获取不应有的权限。
5. 安全域规则:SELБайду номын сангаасnux通过定义安全域来隔离和保护不同的系统组件和应用程序。每个 安全域都有自己的安全策略,以确保它们之间的隔离和互不干扰。
android selinux规则

selinux 强制访问控制规则

selinux 强制访问控制规则Selinux强制访问控制规则Selinux(Security-Enhanced Linux)是一种在Linux操作系统中实现强制访问控制(MAC)的安全机制。

它通过强制执行访问控制规则,限制了进程对系统资源的访问权限,提供了更高的安全性和保护性。

Selinux的强制访问控制规则主要包括以下几个方面:1. 标签类型(Type):Selinux通过标签类型来区分不同的对象。

每个文件、进程或网络端口都被赋予一个唯一的标签类型。

标签类型定义了对象的安全上下文,包括其访问权限和行为限制。

2. 标签角色(Role):Selinux通过标签角色来区分不同的角色。

每个进程都被赋予一个标签角色,用于定义其对系统资源的访问权限。

标签角色定义了进程的权限范围,限制了其能够执行的操作。

3. 标签级别(Level):Selinux通过标签级别来区分不同的安全级别。

每个对象都被赋予一个标签级别,用于定义其对其他对象的访问权限。

标签级别定义了对象之间的安全隔离性,限制了高级别对象对低级别对象的访问。

4. 访问控制规则(Rule):Selinux通过访问控制规则来限制对象之间的访问。

访问控制规则定义了对象之间的访问策略,包括允许或禁止某些操作。

这些规则是基于标签类型、标签角色和标签级别来定义的,确保了对象之间的安全访问。

Selinux的强制访问控制规则是在操作系统内核层面实现的,与传统的自由访问控制(DAC)不同。

DAC是基于用户和组的访问控制,而Selinux是基于标签的访问控制。

由于Selinux的标签是与对象绑定的,即使用户具有访问权限,但如果对象的标签不允许该操作,用户仍无法执行。

Selinux的强制访问控制规则可以有效地防止攻击者利用操作系统的漏洞进行非法操作。

例如,一个恶意程序试图修改系统文件,但其标签类型不允许写入该文件,Selinux将会阻止该操作。

这样可以减轻系统管理员的负担,提高系统的安全性。

selinux机制原理_概述及解释说明

selinux机制原理概述及解释说明1. 引言:1.1 概述:SELinux(Security-Enhanced Linux)是一种用于Linux操作系统的强制访问控制(MAC)安全机制,它通过为每个对象和主体分配唯一的标签,并使用这些标签来管理对系统资源的访问权限,从而提供了更高级别的系统安全性。

SELinux广泛应用于各种Linux发行版中,并成为许多关键部署环境中不可或缺的安全功能。

1.2 文章结构:本文首先对SELinux机制进行概述,包括其基本原理和概念。

然后介绍了安全策略与访问控制在SELinux中扮演的角色,并阐述了标签和标记机制在实现安全性方面的重要性。

接下来,我们将深入了解SELinux的工作原理,包括类型强制访问控制(TE)机制、强制访问控制(MAC)模型与规则引擎等方面。

此外,我们还会提供一些利用SELinux保护系统安全的实例和示例。

在完成对SELinux机制原理和工作原理的详细介绍后,我们将说明如何与Linux 内核集成以及各种实现方式。

这部分将涵盖SELinux在Linux内核中位置、关键组件的介绍,以及如何解决不同发行版和版本之间的差异。

最后,我们会提供一些开启、关闭或配置SELinux策略的方法和技巧指南。

1.3 目的:本文旨在为读者深入了解SELinux机制原理提供一个全面而清晰的解释。

通过详细阐述SELinux的基本概念、工作原理、与Linux内核的集成方式等内容,读者可以更好地理解SELinux对系统安全性的重要性和实际应用。

同时,本文也将帮助读者掌握使用和配置SELinux策略的方法,进一步提升系统的安全性。

2. SELinux机制原理:2.1 SELinux概述:SELinux(Security-Enhanced Linux)是一种强制访问控制(MAC)机制,旨在增强Linux操作系统的安全性。

它通过强制策略来控制进程、文件和网络资源的访问,以及保护系统免受恶意软件和未经授权的访问。

SELinux三种模式

SELinux三种模式⼀、SELinux三种模式简介Enforcing:强制模式。

代表SELinux在运⾏中,且已经开始限制domain/type之间的验证关系Permissive:宽容模式。

代表SELinux在运⾏中,不过不会限制domain/type之间的验证关系,即使验证不正确,进程仍可以对⽂件进⾏操作。

不过如果验证不正确会发出警告Disabled:关闭模式。

SELinux并没有实际运⾏⼆、getenforce命令功能:查看当前SELinux的运⾏模式三、sestatus命令功能:查看当前系统上⾯SELinux的策略,运⾏模式等信息命令格式:sestatus [-vb]相关参数与选项:-v:检查列于/etc/sestatus.conf内的⽂件御锦城的安全上下⽂-b:将⽬前策略的规则布尔值列出,亦即某些规则是否要启动(0/1)之意演⽰案例可以看到当前的策略为targeted。

模式为enforcing四、SELinux的配置⽂件(/etc/selinux/config)SELINUX=enforcing:当前SELinux的模式SELINUXTYPE=targeted:当前SELinux的策略如果想要修改策略和模式,就更改这个⽂件⾥⾯的内容即可五、SELinux模式的更改(setenforce命令)SELinux模式的更改规则:①不论是从Enforcing或Permissive改为Disabled,还是由Disabled改为Enforcing或Permissive,系统都需要重新启动。

因为SELinux是整合到内核中的②在SELinux已经运⾏的模式下:只能够在Enforcing和Permissive两种模式之间进⾏切换,⽽不能直接关闭SELinux(Disabled),如果你使⽤getenforce发现当前SELinux模式为Disabled时,请⽴即到/etc/selinux/config⽂件中将SELinux改为Enforcing,然后重新启动系统③如果你从Disable转到启动SELinux的模式时,系统必须针对⽂件写⼊安全上下⽂的信息,因此启动过程会花费不少时间等待重新写⼊SELinux安全上下⽂(有时成为SELinux Label),⽽且在写完之后还要再重新启动⼀次④如果你在Enforcing模式,但是可能由于⼀些设置的问题导致SELinux让某些服务⽆法正常地运⾏,此时可以将Enforcing的模式改为宽容(Permissive)的模式,让SELinux只会警告⽽,⽽不会直接阻⽌主体进程的读取权限setenforce命令格式:# 转换为Permissive宽容模式setenforce 0# 转换为Enforcing强制模式setenforce 1注意事项:setenforce⽆法设置SELinux为Disabled模式演⽰案例六、restorecon -Rv 命令介绍:当你从Disabled切换为Enforcing模式时,会有⼀堆服务⽆法顺利启动,会跟你说/lib/xxx⾥⾯的数据没有权限读取,所以启动失败。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 简介SELinux策略语言主要描述policy.conf的相关语法,其相关部分如下图所示:2. 类型强制概念SELinux策略大部分内容都是由多条类型强制规则构成的,这些规则控制被允许的使用权,大多数默认转换标志,审核,以及固定部分的检查。

SELinux策略大部分都是一套声明和规则一起定义的类型强制(TE:Type Enforcement)策略,一个定义良好、严格的TE策略可能包括上千个TE规则,TE规则数量的巨大并不令人惊奇,因为它们表达了所有由内核暴露出的允许对资源的访问权,这就意味着每个进程对每个资源的访问尝试都必须至少要有一条允许的TE访问规则,如果我们仔细思考一下现代Linux操作系统中进程和资源的数量,就明白为什么在策略中有那么多的TE规则了。

当我们添加由TE规则控制的审核配置和标志时,对于具有严格限制的SELinux策略,常常会见到它包含有上千条规则,在“创建和编写SELinux安全策略”中,我们将会讨论如何创建和管理这些大量的规则,本文旨在理解TE规则是如何工作的。

TE规则的绝对数量对理解SELinux策略是一个大的挑战,但是规则本身并不复杂,它们的分类相对较少,所有的规则基本上都属于两类范畴:•访问向量(AV)规则•类型规则我们使用AV规则允许或审核两个类型之间的访问权,我们在某些情况下使用类型规则控制默认的标记决定。

SELinux的一个重要概念是TE规则是将权限与程序的访问结合在一起,而不是结合用户。

所有SELinux 策略语言特性都是处理主体(正常的运行中的进程)对客体(文件、目录和套接字等)的访问权的,主要集中于程序访问控制决策,这也是SELinux的主要益处,它允许SELinux策略编写者基于程序的功能和安全属性,加上用户要完成任务需要的所有访问权做出访问决策,可以将程序限制到功能合适,权限最小化的程度,因此,即使它出了故障或被攻击破坏,但整个系统的安全并不会受到威胁。

SELinux是不会管用户的,可以给同一个程序指定多个域类型(因此有不同的特权集),这样就允许引入角色的概念,尽管如此,访问控制的标准仍然是基于程序的域类型而不是用户的特权。

焦点是程序的访问权,而不是用户的访问权。

3. 类型、属性和别名正如你从术语类型强制猜测的那样,类型是构成TE规则的最小单位,SELinux主要就是使用类型来确定什么访问是被允许的;属性和别名是为减轻管理和使用类型的策略特性,我们使用属性利用单个标识符来引用一组类型。

通常,策略语言允许我们在TE规则中类型的适当位置使用属性,而别名允许我们为类型定义另一个名字,别名标识符和类型标识符做同等地位对待。

3.1 类型声明在使用类型前,必须使用type语句明确地声明一个类型标识符,SELinux没有预定义类型,我们必须自行声明,例如:假设我们想声明一个类型(httpd_t),并打算将其作为Web服务器的域类型,而另一个类型(http_user_content_t)准备应用于用户数据文件,即Web服务器显示内容的文件,我们使用type 语句进行声明,如下:[cpp]view plaincopy声明了类型后就可以在安全上下文、TE规则和其它策略语句中使用它们了。

类型声明的语法:• type 类型名称[alias 别名集] [,属性集];1) 别名集:如果指定的不止一个别名标识符,要在一对大括号中用空格将各个别名区别开来,如:alias {aliasa_t aliasb_t}。

2) 属性集:是一个或多个预先声明的属性标识符,如果同时指定多个属性标识符,属性之间使用逗号进行分隔,如:type bin_t, file_type, exec_type;3) 类型声明在整个策略中,以及基础载入模块和非基础载入模块中都是有效的。

但在有条件的语句中无效。

3.2 类型和属性可能你已经想到,一个大型的,复杂的策略可能包括上万个代表系统上不同资源的类型,例如:Fedora Core 4(FC 4)的targeted策略相对较小,但也声明了超过800个类型。

由于默认的规则是拒绝所有的访问,所以任何一个访问都需要明确地被允许,这就导致了类型注定会很冗长,这时策略语言的属性特性就派上用场了。

属性可以理解为:1) 类型的性质或属性,或二者兼得2) 一组类型在任何一种情况下,原理都是相同的。

假设我们想让一个备份程序可以访问所有的文件,首先我们创建一个备份应用程序的域类型(backup_t),并允许它访问与任何文件关联的类型:[cpp]view plaincopy为了完成这个例子,我们编写了一个用于其他所有文件类型的规则,依赖声明的类型数量,我们需要大量的allow规则授予备份程序足够的访问权(每个类型都要一个)。

另外,每次向策略中增加一个文件类型时,同时要为backup_t增加一条allow规则,这是一个单调且错误频出的过程,属性使得这种"组访问"更容易指定,通过将所有关联的文件类型定义一个属性,然后授予该属性的访问权(而不是每个类型了),于是,我们可以使用一条规则授予backup_t必需的访问权。

使用attribute语句进行属性声明,如:这个语句声明一个叫做file_type的属性,类型和属性共享相同的命名空间,因此,类型和属性的名字不能雷同,假设我们将所有适当的类型都与属性file_type进行关联,然后就可以使用一条规则来指定backup_t读取这些文件,如:在我们使用了一条规则替代了上千条allow规则,而授予的访问权却是一样的,当这个策略编译好后,这条规则会自动扩展成上千条规则,分别控制不同文件类型的访问,更重要的是,当我们给文件定义了一个新类型时,我们需要做的仅仅是将这个新类型与file_type属性进行关联,域类型backup_t将会自动获得读取访问权。

属性声明语法:• attribute 属性名称;1) 属性和类型,别名都在同一个命名空间,因此不能与其他类型或别名重名。

2) 属性声明在整个策略,基础载入模块和非基础载入模块中都有效,但在有条件的语句中无效。

3.3 关联类型和属性3.3.1 在type中指定属性迄今为止,我们已经讨论了如何定义类型和属性,下面将要讲述的是如何将它们关联起来,最常见的关联方式是在用type语句声明类型时就指定其属性,例如:我们可以将声明http_user_content_t类型的语句修改为:[cpp]view plaincopy这个语句描述了声明类型http_user_content_t时,同时关联了file_type属性,它会自动向具有file_type 属性的类型组中添加http_user_content_t类型,但从概念上将,它实质上已经改变了http_user_content_t 类型的性质,因为它现在已经具有基于属性的访问许可了,而不只局限于类型本身了。

一个类型可以有多个属性,例如:我们可以再为所有Web服务器要用的文件创建一个属性httpdcontent,拥有httpdcontent属性的类型可能是拥有file_type属性的类型的一个子集,下面的代码扩展了我们前面的例子:[cpp]view plaincopy类型具有的属性数量没有限制,就和类型一样,我们可以合理定义相应的属性。

3.3.2 使用typeattribute指定属性除了使用type语句关联类型和属性外,还可以使用typeattribute语句,这个语句允许我们在声明类型时,单独关联属性,在策略中可能也就是一个单独的文件了,例如:将前面举的示例语句:[cpp]view plaincopy分成两条语句进行表述:typeattribute允许我们在一个地方定义类型,在另一个地方关联属性,增强了语言的灵活性,在设计策略源文件时,可以考虑进行模块化设计了。

typeattribute语句语法:• typeattribute 类型名属性名;1) 一个或多个事先声明的属性标识符,如果指出多个属性标识符,属性标识符之间使用逗号分隔,如typeattribute bin_t file_type, exec_type;2) typeattribute语句在单个策略,基础载入模块和非基础载入模块中都是有效的,只有在条件语句中无效。

3.4 别名(为确保兼容性而存在)别名是引用类型时的一个备选的名字,能够使用类型名的地方就可以使用别名,包括TE规则,安全上下文和标记语句,别名通常用于策略改变时保证一致性,例如:一个旧策略可能引用了类型netscape_t,更新后的策略可能将类型名改为mozilla_t了,但同时提供了一个别名netscape_t以保证与旧模块能够正确兼容。

3.4.1 在type中声明别名[cpp]view plaincopy注意别名声明是放在属性的前面的。

3.4.2 使用typealias申明别名[cpp]view plaincopytypealias语句语法•typealias 类型名称alias 别名名称1) 类型名称:要添加别名的类型的名称,类型必须使用type语句单独声明,而且这里只能指定一个类型名称。

2) 别名名称:如果同时指定多个别名,别名之间用空格分开,并使用大括号将所有别名括起来,如{aliasa_t aliasb_t}。

3) typealias语句在单个策略,基础载入模块和非基础载入模块中都有效,只有在条件语句中无效。

4. 访问向量规则AV规则就是按照对客体类别的访问许可指定其具体含义的规则,SELinux策略语言目前支持四类AV 规则:在代码中,客体类别的访问许可集是由一些叫做访问向量的掩码表现的,因此就有了术语访问向量。

•allow:表示允许主体对客体执行允许的操作•dontaudit:表示不记录违反规则的决策信息,且违反规则不影响运行(允许操作且不记录)•auditallow:表示允许操作并记录访问决策信息(允许操作且记录)•neverallow:表示不允许主体对客体执行指定的操作本小节剩余部分将详细讨论这些规则的语法和语义,以及一些示例。

4.1 通用AV规则语法虽然这些规则的用途不一样,但它们的基本语法是一样的,每个规则都要包含下面五个元素:•规则名称:allow,dontaudit,auditallow和neverallow•源类型:授予访问的类型,通常是进程的域类型•目标类型:客体的类型,它被授权可以访问的类型•客体类别:客体的类别•许可:表示主体对客体访问时允许的操作类型(也叫做访问向量)。

一个简单的AV规则有一个源类型,目标类型,客体类别和许可,在我们前面的allow规则中可以看到许多AV规则,如:[cpp]view plaincopy这个allow规则的源类型为user_t,目标类型为bin_t,客体类别file,许可execute,这个规则可以解读为"允许user_t执行类型为bin_t的文件"4.1.1 AV规则的密钥(哈希Key)在内核中,所有的AV规则都是通过一组【源类型+目标类型+类别】进行唯一性标识,这个三重组叫做一个密钥,当做哈希表使用,缓存在策略数据结构中,规则是靠这个密钥存储和检索的,当一个进程产生了一个访问请求时,SELinux LSM模块被要求允许基于这个密钥进行访问。

相关文档
最新文档