SElinux安全加固:保护重要文件免遭攻击 (selinux 文件保护)

介绍SElinux安全加固的重要性

随着信息技术的迅猛发展,网络安全问题日益严峻,黑客攻击、病毒入侵、木马病毒等安全威胁层出不穷,对各种网站、服务器、操作系统、网络设备等资产的安全威胁也变得更加严重。面对这些安全威胁,除了安装杀毒软件、加强口令强度等基础防护措施,运维人员还需要深入研究安全技术,提升系统安全性。而SElinux安全加固就是其中的一种重要技术手段,可以帮助运维人员保护重要文件免遭安全攻击。

SElinux的基础概念及架构介绍

SElinux是Security-Enhanced Linux的缩写,它是一种在内核级别实现的强制访问控制(MAC)机制。SElinux机制的基本思想是:在识别和验证身份和权限的基础上,进行更为细致的访问控制。根据最小必要特权原则,SElinux机制使程序可以被授予最小的访问权限,这样可以在一定程度上减少不安全代码或未知风险的影响。

SElinux的架构主要包括内核模块、SElinux策略和用户空间工具三个组成部分。其中,内核模块负责实现SElinux模型中的强制访问控制规则,定义对象的安全属性,并建立与用户空间之间的沟通桥梁。SElinux策略则包含了一个或多个策略文件,通过这些文件来提供系统安全策略,增加系统的完整性和可靠性。用户空间工具主要是一些SElinux扩展的命令行工具和GUI工具,它们可以用于调试和监控SElinux工作情况,帮助运维人员更好地管理安全策略。

SElinux的安全加固思路

对于运维人员来说,SElinux的安全加固思路主要包括以下三个方面:

1. 安全策略优化:运维人员要通过SElinux的策略来实现访问控制,因此在安全加固中,策略优化是关键步骤。具体来说,运维人员可以通过执行命令semanage login -a -s user_u -r s0-s0:c0.c1023 user_name,将用户关联到ACL条目中,从而实现对用户权限的控制;可以通过执行命令auditctl -w -p rwax -k file_change,设置针对特定文件的审计规则,实现对文件存取的记录和警告等。

2. 安全相关配置:运维人员还需要通过配置文件实现SElinux安全加固。其中,/etc/selinux/config是SElinux的主要配置文件之一,运维人员可以通过修改该文件中的各种参数值来实现SElinux的安全加固。例如,通过将SELINUX=enforcing改为SELINUX=permissive,可以将SElinux级别从强制模式改为宽容模式,以便在应用程序出现问题时绕过SElinux的强制访问控制。此外,还可以通过安装一些工具,如SELinux Policy Editor、SETools等,来帮助运维人员管理策略和分析日志。

3. 实时监控和日志审计:SElinux的安全加固不仅仅是一次性的设置,更需要实时监控和日志审计。运维人员需要通过监控SElinux的日志来了解系统变化和发生的各种安全事件,从而及时发现和解决安全问题。而监控工作包括定期检查SElinux日志、设置报警机制、检查安全事件记录等多个方面。此外,如何对日志进行审计,也是SElinux安全加固的关键之一。主要包括对日志的收集、存储与传输,对日志数据进行分析和加工等多个任务。

SElinux的安全加固案例

在实际操作中,有很多应用场景需要使用SElinux来实施安全加固。例如,在RedHat企业版Linux系统中,运维人员可以使用setsebool命令来增强SElinux的安全性,从而保护求不得外泄的文件或目录。具体来说,可以执行命令setsebool -P httpd_read_user_content 1,启用httpd的SELinux访问控制权限,即httpd可以读取用户文件和目录,并且可以相互访问与修改;还可以通过执行命令setsebool -P httpd_can_network_connect 0,禁用httpd进程的网络连接权限,以增强网络安全性。

此外,在CentOS系统中,可以通过以下方法对SElinux进行安全加固:

1. 设定安全主策略:运维人员需要使用selinux-policy-targeted策略文件才能进行SElinux安全加固,因此需要先检查该策略文件是否已经安装。通常情况下,运维人员可以通过yum安装,例如执行命令yum install policycoreutils-python,安装常用的SElinux工具。然后,将安全主策略设置为targeted,具体命令为sed -i ‘s/.*/SELINUX=targeted/g’ /etc/selinux/config。

2. 设定文件和目录的安全属性:在Linux系统中,SElinux机制的基本思想是以过程为中心的访问控制,因此需要为每个进程和文件设置安全属性。运维人员可以通过执行命令chcon -R system_u:object_r:httpd_sys_content_t:/var/www,将/var/www目录及其子目录的安全属性设置为”httpd_sys_content_t”,即可实现对/var/www目录下的所有文件和目录进行安全控制;还可以通过命令chcon -u system_u -r object_r -t httpd_sys_script_exec_t /path/to/cgi-bin/file.cgi,将cgi-bin下的可执行文件的安全属性设为httpd_sys_script_exec_t,以保证安全性。

3. 安装和配置auditd:auditd是一个Linux安全审计单元软件,它可以监视文件系统修改、进程启动和关闭事件等,以便快速发现异常事件。运维人员可以通过命令yum install audit,安装auditd,然后在/etc/audit/auditd.conf文件中设置审计规则和事件过滤器,以定制化监控和审计。

结语

相关问题拓展阅读:

详解 SEAndroid 以及 Hack 其规则(sepolicy)

之前在搞Xposed的时候遇到一个问题是Xposed的卸载原本需要root权限,但是Xposed的原理是hack了zygote这个进程(xposed原理以后有时间再写),而zygote本身是有root权限的,所以Xposed应该是可以利用zygote的root权限来卸载自身。但是实际操作中发现并不可以。经过一番研究发现这是由于SEAndroid的缘故,zygote的一些操作会被SEAndroid限制,它的root权限并不是为所欲为的。下面就要详细的谈一下SEAndroid这个东西,然后再谈一谈如何去更改这个规则。

本文章有三个目的:

1.理解SEAndorid的工作原理

2.能够看懂SEAndroid的规则

3.能够自己增添删改其规则(这一条估计大多数人都御好闷用不到,所以前两条是主要目的)

SEAndroid 是SELinux 在Android 上面的一个移植。SELinux 是Linux上系统保护机制,SELinux 全称 Security Enhanced Linux (安全强化 Linux),是MAC (Mandatory Access Control,强制访问控制系统)的一个实现。其目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。Android系统基于Linux实现。针对传统Linux系统,NSA开发了一套安全机制SELinux,用来加强安全性。然而,由于Android系 统有着独特的用户空间运行时,因此SELinux不能完全适用于Android系统。为此,NSA同Google一起针对Android系统,在SELinux基础上开发了 SEAndroid。

Android 4.4首次引入了这一机制,SEAndroid与SELinux更大的不同在于SEAndroid对Android系统中的Binder做来了适配。进入adb shell 之后可以通过getenforce命令来查看其是否应用。root之后可以镇弯通过setenforce 0关闭SEAndroid。但是目前好像关闭了这一功能。

理解SEAndorid的概念不得不提到DAC 和 MAC。

DAC是传统的Linux的访问控制方式,DAC可以对文件、文件夹、共享资源等进行访问控制。 在DAC这种模型中,文件客体的所有者(或者管理员)负责管理访问控制。DAC使用了ACL(Access Control List,访问控制列表)来给非管理者用户提供不同的权限,而root用户对文件系统有完全自由的控制权。

通俗的说就是,小明如果建立的某个文件他就对这个文件拥有绝对的控制权,他能够自主的控制其他人对该文件的权限。一个文件权限有读(r)写(w)执行(x)三种。我们可以通过ls -l 这个命令看到各个文件的权限情况。然后通过 chmod 这个命令可以指定这个其他人对这个文件的权限。(chmod.txt 这个命令大家应该都明白就不细说了)

但是这个机制有个不好的地方就是root用户可以控制任意文件的权限,可以为所欲为。而且控制粒度较粗,如果我只想让另一个人读我的文件,而这个人跟我不是同一用户组,我只能通过chmod XX4 XX 才能达到这一目的,但是这样的话其他任何人都可以读我的文件。所以说它粒度比较粗。

所以Linux就引入了MAC机制,即强制控制访问。 MAC核心思想 : 即任何进程想在SELinux系统中干任何事情,都必须先在安全策略配置文件中赋予权限。凡是没有出现在安全策略配置文件中的权限,进程就没有该权限。这个机制相当于一个白名单,这个白名单上配置了所有进程的权限,进程只能做白名单上权限内的事情,一旦它想做一个不属于它权限的操作就会被拒绝。

MAC不再像DAC一样简单的把进程分为root others等,而是每个进程(Subject,主体)袜空和文件(Object,客体)都配置了一个类型(Type),当一个进程去操控(读写等)一个文件时,系统会检测该进程类型是否有对该文件类型的操作权限。

通过命令ps -Z 可以查看进程的安全label,ls -Z 可以看到文件的label(安全上下文)。

比如进程安全上下文中的init进程,他的type为init,下面的进程的type为kernel。( 其实进程的type也被称为Domain )

文件安全上下文中的 123.txt 的 type为 tootfs。

(进程和文件安全上下文label格式为 user:role: type :security_level 中的其它几列不用管。这个涉及到SELinux中其它几种访问控制模型,在SEAndroid中我们只用关心他的type就好,比如init进程的  u:r: init: s0,我们只用知道他的type为init。)

知道进程和文件的安全上下文,那具体是怎么通过他们的安全上下文来控制权限的呢?

在手机上有个文件叫做sepolicy,这个文件就是SEAndroid的安全策略配置文件,里面有所有进程的权限配置,进程只能进行它的权限规定内的操作。这个文件就有root权限也删不掉。把这个文件的内容dump出来后会发现里面有好多条规则(我逆过魅族的4000条,三星的20230条)。看两条例子。

allow untrusted_app system_app_data_file : file { read }

allow zygote sdcard_type : file { read write creat rename }

它的具体格式为: allow Domain Type : Class { Permission }   (Domain 是指进程的type)

通过这个格式解读上面的三条规则就是,

1. 允许 untrusted_app类型的进程对 system_app_data_file类型的文件进行read。

2.允许zygote类型的进程对sdcard_type的file进行 read write creat rename。

所以MAC控制方式是这个样子的:当一个进程去操作一个文件的时候,系统会去检测这个进程和文件的上下文,看看这个进程的所属的type有没有对这个的文件的type操作的权限。比如:zygote如果要去读sdcard上的一个文件,这个文件的type为sdcard,zygote的type(Domain)为zygote, 系统去检测看看发现这条规则 allow zygote sdcard_type : file { read write creat rename }。那么这个操作就会被允许执行。zygote要是想删除一个sdcard上的文件,系统发现对应的规则里没有delete,那么就会被deny。(上面的两条规则和这个例子是我自己编的,只是为了说明情况,真实情况下zygote是有权限删除sdcard上的文件的。)

DAC和MAC是同时作用的,一个操作会先后根据DAC和MAC检测完再去执行,不满足任何一个机制的条件都会被拒绝。

上面一节解释了SEAndroid的工作原理,这下知道为什么zygote的root权限并不能为所欲为了,但是如何去更改SEAndroid的规则,扩大zygote的权限。直接更改sepolicy是不行的,因为sepolicy在boot.img里面,每次开机都会重写读取sepolicy这个文件,无法更改成功。

所以要直接解压boot.img替换里面的sepolicy然后重打包。Linux上有一套解压打包工具,windows解压工具为Android-Image-Tools-windows.zip  先找到手机厂商的官方ROM刷机包,找到boot.img解压。里面有个文件是sepolicy。修改sepolicy然后替换它重新打包刷入手机。(好吧其实蛮复杂的,但是我觉得大多数人可能用不到就先这样写吧,以后有需要的话会详细写。本来打算上传自己工具,不知道怎么上传文件。。。 我找不到我工具的链接了,可以去这里找找))

  1.sepolicy-inject:插入规则

2.sesearch:反编译sepolicy

3.seinfo: 查看sepolicy版本

修改sepolicy的命令:push到手机上 直接输入./(相应文件)即可查看其使用方式 (下面是我插入的其中一条命令)

./sepolicy-inject -s zygote -t labeledfs -c filesystem -p remount,getattr,relabelto,transition,quotamod,unmount -P /sepolicy -o /sdcard/sepolicy1

博客是学习的起点而不是终点。。。 这篇文章只是入门SEAndroid,目的性较强,只讲了主要部分,很多内容没有涉及。深入了解SEAndroid的话可以去看看老罗的文章。

**最后, 同学点个赞吧!!! 加个关注好么**

参考链接:

SEAndroid安全机制简要介绍和学习计划 强烈推荐老罗

SEAndroid策略分析 推荐

Android的安全机制

深入理解SELinux

安卓文件访问控制的安全服务位于哪一层

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历散腊脊史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。   SELinux 是 2.6 版本的 Linux 内核中提供的强制访问局庆控制(MAC)系统。对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。   大部分使用 SELinux 的人使用的都是 SELinux 就绪的发行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian或 Centos。它们都是在内核中启用 SELinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 SELinux 的功能。   SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他。SELinux提供了比传统的UNⅨ权限更好的访问控制。   1. 简介   SELinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制。   Security-Enhanced Linux (SELinux)由以下两部分组成:   1) Kernel SELinux模块(/kernel/security/selinux)   2) 用户态工具   SELinux是一个安全体系结构,它通过L(Linux Security Modules)框架被集成到Linux Kernel 2.6.x中。它是NSA (United States National Security Agency)和SELinux社区的联合项目。   SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个【用户】、【进程】、【应用】和【文件】的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查。   SELinux对系统用户(system users)是透明的,只有系统管理员需要考虑在他的服务器中如何制定严格的策略。策略可以根据需要是严格的或宽松的。   只有同时满足了【标准Linux访问控制】和【SELinux访问控制】时,主体才能访问客体。   1.1 DAC与MAC的关键区别(root用户)   安 全增强型Linux(SELinux)开始是由NSA(国家安全局)启动并加入到Linux系统中的一套核心组件及用户工具,可以让应用程序运行在其所需的更低权限上。未 经修改过的Linux系统是使用自主访问控制的,用户可以自己请求更高的权限,由此恶意软件几乎可以访问任何它想访问的文件,而如果你授予其root权 限,那它就无所不能了。   在SELinux中没有root这个概念,安全策略是由管理员来定义的,任何软件都无法取代它。这意味着那些潜在的恶意软件所能造成的损害可以被控制在最小。一般情况下只有非常注重数据安全的企业级用户才会使用SELinux。   操作系统有两类访问控制:自主访问冲渗控制(DAC)和强制访问控制(MAC)。标准Linux安全是一种DAC,SELinux为Linux增加了一个灵活的和可配置的的MAC。   所有DAC机制都有一个共同的弱点,就是它们不能识别自然人与计算机程序之间最基本的区别。简单点说就是,如果一个用户被授权允许访问,意味着程序也被授权访问,如果程序被授权访问,那么恶意程序也将有同样的访问权。 DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,MAC就是避免这些攻击的出路,大多数MAC特性组成了多层安全模型。   SELinux实现了一个更灵活的MAC形式,叫做类型强制(Type Enforcement)和一个非强制的多层安全形式(Multi-Level Security)。   在Android4.2中,SELinux是个可选项,谷歌并没有直接取消root权限或其他功能。这是一个为企业级用户或是对隐私数据极为重视的用户提供的选项,普通消费者则完全可以关闭它。   2. SELinux的运行机制   SELinux决策过程如下图所示:当一个subject(如: 一个应用)试图访问一个object(如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节位于/var/log/messages中。   3. SELinux伪文件系统   /selinux/伪文件系统kernel子系统通常使用的命令,它类似于/proc/伪文件系统。系统管理员和用户不需要操作这部分。/selinux/目录举例如下:   代码如下:   -rw-rw-rw- 1 root root 0 Sep 22 13:14 access   dr-xr-xr-x 1 root root 0 Sep 22 13:14 booleanswroot root 0 Sep 22 13:14 commit_pending_bools   -rw-rw-rw- 1 root root 0 Sep 22 13:14 context   -rw-rw-rw- 1 root root 0 Sep 22 13:14 createwroot root 0 Sep 22 13:14 disable   -rw-r–r– 1 root root 0 Sep 22 13:14 enforce   -rwroot root 0 Sep 22 13:14 load   -r–r–r– 1 root root 0 Sep 22 13:14 mls   -r–r–r– 1 root root 0 Sep 22 13:14 policyvers   -rw-rw-rw- 1 root root 0 Sep 22 13:14 relabel   -rw-rw-rw- 1 root root 0 Sep 22 13:14 user   如cat enforce其值可能如下:   1: enforcing mode   0: permissive mode   4. SELinux配置文件   SELinux配置文件(configuration)或策略文件(policy)位于/etc/目录下。   4.1 /etc/sysconfig/selinux配置文件   /etc/sysconfig/selinux是一个符号链接,真正的配置文件为:/etc/selinux/config   配置SELinux有如下两种方式:   1) 使用配置工具:Security Level Configuration Tool (system-config-selinux)   2) 编辑配置文件 (/etc/sysconfig/selinux).   /etc/sysconfig/selinux中包含如下配置选项:   1) 打开或关闭SELinux   2) 设置系统执行哪一个策略(policy)   3) 设置系统如何执行策略(policy)   4.2 配置文件选项   4.2.1 SELINUX   SELINUX=enforcingpermissivedisabled —定义SELinux的高级状态   • enforcing — The SELinux security policy is enforced.   • permissive — The SELinux system prints warnings but does not enforce policy.   • disabled — SELinux is fully disabled. SELinux hooks are disengaged from the kernel and the pseudo-file system is unregistered.   4.2.2 SELINUXTYPE(安全策略)   SELINUXTYPE=targetedstrict — 指定SELinux执行哪一个策略   • targeted — 只有目标网络daemons保护。每个daemon是否执行策略,可通过system-config-selinux进行配置。保护常见的网络服务,为SELinux默认值。   可使用如下工具设置每个daemon的布尔值:   1) getsebool -a: 列出SELinux的所有布尔值   2) setsebool: 设置SELinux布尔值,如:setsebool -P dhcpd_disable_trans=0,-P表示即使用reboot之后,仍然有效。   • strict — 对SELinux执行完全的保护。为所有的subjects和objects定义安全环境,且每一个Action由策略执行服务器处理。提供符合Role-based-Access Control(RBAC)之policy,具备完整的保护功能,保护网络服务、一般指令及应用程序。   4.2.3 SETLOCALDEFS   SETLOCALDEFS=01 — 控制如何设置本地定义(users and booleans)。   • 1:这些定义由load_policy控制,load_policy来自于文件/etc/selinux/• 0:由semanage控制   4.3 /etc/selinux/目录   /etc/selinux/是存放所有策略文件和主要配置文件的目录。其例子如下:   代码如下:   -rw-r–r– 1 root root 448 Sep 22 17:34 config   drwxr-xr-x 5 root root 4096 Sep 22 17:27 strict   drwxr-xr-x 5 root root 4096 Sep 22 17:28 targeted   5. SELinux工具   1) /usr/in/setenforce — 修改SELinux运行模式,例子如下:   • setenforce 1 — SELinux以强制(enforcing)模式运行   • setenforce 0 — SELinux以警告(permissive)模式运行   为了关闭SELinux,你可以修改配置文件:/etc/selinux/config或/etc/sysconfig/selinux   2) /usr/in/sestatus -v — 显示系统的详细状态,例子如下:   SELinux status: enabled   SELinuxfs mount: /selinux   Current mode: enforcing   Mode from config file: enforcing   Policy version:Policy from config file: targeted   Process contexts:   Current context: user_u:system_r:unconfined_t:s0   Init context: system_u:system_r:init_t:s0   /in/mingetty system_u:system_r:getty_t:s) /usr/bin/newrole — 在一个新的context或role中运行一个新的shell   4) /in/restorecon — 通过为适当的文件或安全环境标记扩展属性,设置一个或多个文件的安全环境   5) /in/fixfiles — 检查或校正文件系统中的安全环境数据库   6) getsebool — getsebool -a:查看所有布尔值   7) setsebool — 参数-P,永久性设置   8) chcon 修改文件、目录的安全上下文   chcon –u   chcon –r   chcon –t   chcon –R 递归   6. 类型强制的安全上下文(Type Enforcement Security Context)   安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),”域”和”域类型”意思都一样,我们不必苛刻地去区分或避免使用术语域,通常,我们认为【域】、【域类型】、【主体类型】和【进程类型】都是同义的,即都是安全上下文中的“TYPE”。   SELinux对系统中的许多命令做了修改,通过添加一个-Z选项显示客体和主体的安全上下文。   1) 系统根据PAM子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文;   2) 文件的Security Contex规则如下:   • rpm包安装的:会根据rpm包内记录来生成安全上下文;   • 手动创建的文件:会根据policy中规定的来设置安全上下文;   • cp:会重新生成安全上下文;   • mv:安全上下文则不变。   3) id -Z   显示了你的shell的安全上下文;   4) ps -Z   检查进程的安全上下文;   5) ls -Z   检查文件、目录的安全上下文;   6.1 安全上下文格式   所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的。在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯通道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文:   USER:ROLE:TYPE>   安全上下文中的用户和角色标识符除了对强制有一点约束之外对类型强制访问控制策略没什么影响,对于进程,用户和角色标识符显得更有意义,因为它们是用于控制类型和用户标识符的联合体,这样就会与Linux用户账号关联起来;然而,对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么作用。   标准Linux安全中的用户ID和安全上下文中的用户标识符之间的区别,就技术而论,它们是正交标识符,分别用于标准的和安全增强的访问控制机制,这两者之间的任一相互关联都是通过登陆进程按照规范严格规定的,而不是通过SELinux策略直接强制实施的。   6.1.1 USER   1) user identity:类似Linux系统中的UID,提供身份识别,用来记录身份;安全上下文的一部分;   2) 三种常见的 user:   • user_u :普通用户登录系统后的预设;   • system_u :开机过程中系统进程的预设;   • root :root 登录后的预设;   3) 在 targeted policy 中 users 不是很重要;   4) 在strict policy 中比较重要,所有预设的 SELinux Users 都是以 “_u” 结尾的,root 除外。   6.1.2 ROLE   1) 文件、目录和设备的role:通常是 object_r;   2) 程序的role:通常是 system_r;   3) 用户的role:targeted policy为system_r; strict policy为sysadm_r、staff_r、user_r;用户的role,类似系统中的GID,不同角色具备不同的的权限;用户可以具备多个role;但是同一时间内只能使用一个role;   4) 使用基于RBAC(Roles Based Access Control) 的strict和mls策略中,用来存储角色信息   6.1.3 TYPE   1) type:用来将主体(subject)和客体(object)划分为不同的组,给每个主体和系统中的客体定义了一个类型;为进程运行提供更低的权限环境;   2) 当一个类型与执行中的进程相关联时,其type也称为domain;   3) type是SElinux security context 中最重要的部位,是 SELinux Type Enforcement 的心脏,预设值以_t结尾;   LEVEL和CATEGORY:定义层次和分类,只用于mls策略中   • LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高   • CATEGORY:代表分类,目前已经定义的分类为c0-c.2 对比SELinux和标准Linux的访问控制属性   在标准Linux中,主体的访问控制属性是与进程通过在内核中的进程结构关联的真实有效的用户和组ID,这些属性通过内核利用大量工具进行保护,包括登陆进程和setuid程序,对于客体(如文件),文件的inode包括一套访问模式位、文件用户和组ID。以前的访问控制基于读/写/执行这三个控制位,文件所有者、文件所有者所属组、其他人各一套。   在SELinux中,访问控制属性总是安全上下文三人组(用户:角色:类型)形式,所有客体和主体都有一个关联的安全上下文。需要特别指出的是,因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。   注意:SELinux是在标准Linux基础上增加了类型强制(TE: Type Enforcement),这就意味着标准Linux和SELinux访问控制都必须满足先要能访问一个客体,例如:如果我们对某个文件有SELinux写入权限,但我们没有该文件的w许可,那么我们也不能写该文件。下表总结了标准Linux和SELinux之间访问控制属性的对比: 标准LinuxSELInux 进程安全属性真实有效的用户和组ID安全上下文 客体安全属性访问模式、文件用户和组ID安全上下文 访问控制基础进程用户/组ID和文件的访问模式, 此访问模式基于文件的用户/组ID在进程类型和文件类型 之间允许的许可.3 小结   1) 系统中每个文件、目录、网络端口等都被指定一个安全上下文,policy 则给出各安全上下文之间的作用规则。   2) SELinux根据policy及security context规则来决定存取行为是否可执行;   3) Subject(主体):系统进程,比如/usr/in/httpd;   4) Object(客体):被存取的项目,比如File、Directory、IP、Socket等;   7. 类型强制(TE)访问控制   在SELinux中,所有访问都必须明确授权,SELinux默认不允许任何访问,不管Linux用户/组ID是什么。这就意味着在SELinux中,没有默认的超级用户了,与标准Linux中的root不一样,通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成:   • 源类型(Source type(s) ) 通常是尝试访问的进程的域类型   • 目标类型(Target type(s) ) 被进程访问的客体的类型   • 客体类别(Object class(es)) 指定允许访问的客体的类型   • 许可(Permission(s)) 象征目标类型允许源类型访问客体类型的访问种类   举例如下:   代码如下:   allow user_t bin_t : file {read execute getattr};   这个例子显示了TE allow规则的基础语法,这个规则包含了两个类型标识符:源类型(或主体类型或域)user_t,目标类型(或客体类型)bin_t。标识符file是定义在策略中的客体类别名称(在这里,表示一个普通的文件),大括号中包括的许可是文件客体类别有效许可的一个子集,这个规则解释如下:   拥有域类型user_t的进程可以读/执行或获取具有bin_t类型的文件客体的属性。   SELinux allow规则如之前的例子在SELinux中实际上都是授予访问权的,真正的挑战是如何保证数以万计的访问正确授权,只授予必须的权限,实现尽可能的安全。   7.1 标准Linux安全中的setuid程序   精通用户joe想安全地修改现有的密码问题,Linux解决这个问题的方法是通过给passwd赋一个setuid值,使其执行时具有root权限,如果你在一个普通Linux系统上列出密码文件,你看到的会是:   复制代码   代码如下:   # ls -l /usr/bin/passwd   -rwsr-xr-x. 1 root rootSep/usr/bin/passwd   这里注意两件事,之一个是在所有者权限的x位置被设置为s了,这就是所谓的setuid位,意思是任何执行这个文件的进程,它的有效UID(即用户ID)将会被改为文件所有者。这里,root是文件所有者,因此当执行密码程序时实际上将会以root用户的ID运行。其执行过程如下图所示:从上面的分析中可以看出,passwd以root权限的身份运行, 它可以访问系统的任何资源,这给系统带来了安全问题,其实它只需要访问shadow及其相关的文件就可以了。而且shadow只需要接受passwd的访问即可。这在标准Linux中是无法做到的,而TE(类型强制)可实现此功能。   8. 基于角色的访问控制   SELinux也提供了一种基于角色的访问控制(RBAC),SELinux的RBAC特性是依靠类型强制建立的,SELinux中的访问控制主要是通过类型实现的,角色基于进程安全上下文中的角色标识符限制进程可以转变的类型,如此,策略编写器可以创建一个角色,允许它转变为一套域类型(假设类型强制规则允许转变),从而定义角色的限制。   9. SELinux中的多级安全(Multi-Level Security)   类型强制(Type Enforcement)无疑是SELinux引入的最重要的强制访问控制(MAC)机制,然而,在某些情况下,主要是保密控制应用程序的一个子集,传统的多级安全(MLS)MAC与类型强制一起使用显得更有价值,在这些情况下,SELinux总是包括某种格式的MLS功能,MLS特性是可选的,在SELinux的两个MAC机制中,它通常不是最重要的那个,对大多数安全应用程序而言,包括许多非保密数据应用程序,类型强制是最适合的安全增强的机制,尽管如此,MLS对部分应用程序还是增强了安全性。   在大多数SELinux策略中,敏感度(s0,s1,…)和范畴(c0,c1,…)使用通配名,将它留给用户空间程序和程序库,以指定有意义的用户名。(例如:s0可能与UNCLASSIFIED 关联,s1可能与SECRET关联)   为了支持MLS,安全上下文被扩展了,包括了安全级别,如:   复制代码   代码如下:   user:role:type:sensitivity >   例子如下所示:   复制代码   代码如下:   root@luohj-virtual-machine:~# ps -aZ   LABEL PID TTY TIME CMD   unconfined_u:system_r:inod_t:s0-s0:c0.cpts/0 00:00:00 passwd   注意MLS安全上下文至少必须有一个安全级别(它由单个敏感度和0个或多个范畴组成),但可以包括两个安全级别,这两个安全级别分别被叫做低(或进程趋势)和高(或进程间隙),如果高安全级别丢失,它会被认为与低安全级别的值是相同的(最常见的情况),实际上,对于客体和进程而言,低和高安全级别通常都是相同的,通常用于进程的级别范围被认为是受信任的主体(即进程信任降级信息)或多层客体,如一个目录,它又包括了不同安全级别的客体。为了使描述简单,假设所有的进程和客体都只有一个安全级别。. 策略分析工具apol   apol(即yze policy【分析策略】)工具是一个成熟的SELinux策略分析工具,它位于setools工具包中。使用它打开policy.xx文件即可分析所有的相关策略。xx为策略编译器(checkpolicy)的版本号。. 小结   SELinux访问控制是基于与所有系统资源(包括进程)关联的安全上下文的,安全上下文包括三个组件:用户、角色和类型标识符。类型标识符是访问控制的主要基础。   在SELinux中,访问控制的主要特性是类型强制,在主体(即进程)与客体之间通过指定allow规则(主体的类型【也叫做域类型】是源,客体的类型是目标)进行访问授权,访问被授予特定的客体类别,为每个客体类别设置细粒度的许可。   类型强制的一个关键优势是它可以控制哪个程序可能运行在给定的域类型上,因此,它允许对单个程序进行访问控制(比起用户级的安全控制要安全得多了),使程序进入另一个域(即以一个给定的进程类型运行)叫做域转变,它是通过SELinux的allow规则紧密控制的,SELinux也允许通过type_transition 文件使域转变自动发生。   SELinux在访问控制安全上下文中不直接使用角色标识符,相反,所有的访问都是基于类型的,角色用于关联允许的域类型,这样可以设置类型强制允许的功能组合到一起,将用户作为一个角色进行认证。   SELinux提供了一个可选的MLS访问控制机制,它提供了更多的访问限制,MLS特性依靠TE机制建立起来的,MLS扩展了安全上下文的内容,包括了一个当前的(或低)安全级别和一个可选的高安全级别。selinux 文件保护的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于selinux 文件保护,SElinux安全加固:保护重要文件免遭攻击,详解 SEAndroid 以及 Hack 其规则(sepolicy),安卓文件访问控制的安全服务位于哪一层的信息别忘了在本站进行查找喔。


数据运维技术 » SElinux安全加固:保护重要文件免遭攻击 (selinux 文件保护)