<code id='jgdue'><strong id='jgdue'></strong></code>

  • <dl id='jgdue'></dl>
  • <i id='jgdue'><div id='jgdue'><ins id='jgdue'></ins></div></i>

    <span id='jgdue'></span>
    <acronym id='jgdue'><em id='jgdue'></em><td id='jgdue'><div id='jgdue'></div></td></acronym><address id='jgdue'><big id='jgdue'><big id='jgdue'></big><legend id='jgdue'></legend></big></address>
  • <tr id='jgdue'><strong id='jgdue'></strong><small id='jgdue'></small><button id='jgdue'></button><li id='jgdue'><noscript id='jgdue'><big id='jgdue'></big><dt id='jgdue'></dt></noscript></li></tr><ol id='jgdue'><table id='jgdue'><blockquote id='jgdue'><tbody id='jgdue'></tbody></blockquote></table></ol><u id='jgdue'></u><kbd id='jgdue'><kbd id='jgdue'></kbd></kbd>
  • <ins id='jgdue'></ins>

          <fieldset id='jgdue'></fieldset>

            <i id='jgdue'></i>

            深入解析Linux系统中的SELinux访问控制功能

            • 时间:
            • 浏览:6
            • 来源:124软件资讯网

                SELinux(Security-Enhanced Linux) 是美国国家宁静局(NSA)对于强制会见控制的实现  ,是 Linux历史上最良好的新宁静子系统  。NSA是在Linux社区的资助下开发了一种会见控制系统  ,在这种会见控制系统的限制下  ,历程只能会见那些在他的使命中所需要文件  。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上 ,也可以作为其他刊行版上容易安装的包获得  。

                SELinux 是 2.6 版本的 Linux 内核中提供的强制会见控制(MAC)系统  。对于现在可用的 Linux宁静模块来说  ,SELinux 是功效最周全  ,而且测试最充实的  ,它是在 20 年的 MAC 研究基础上建设的 。SELinux 在类型强制服务器中合并了多级宁静性或一种可选的多类计谋 ,并接纳了基于角色的会见控制观点  。[1]

                大部门使用 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是一个宁静系统结构  ,它通过LSM(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 booleans

                --w------- 1 root 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 create

                --w------- 1 root root 0 Sep 22 13:14 disable

                -rw-r--r-- 1 root root 0 Sep 22 13:14 enforce

                -rw------- 1 root 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=enforcing|permissive|disabled —界说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=targeted|strict — 指定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=0|1 — 控制怎样设置当地界说(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/sbin/setenforce — 修改SELinux运行模式  ,例子如下:

                • setenforce 1 — SELinux以强制(enforcing)模式运行

                • setenforce 0 — SELinux以忠告(permissive)模式运行

                为了关闭SELinux ,你可以修改设置文件:/etc/selinux/config或/etc/sysconfig/selinux

                2) /usr/sbin/sestatus -v — 显示系统的详细状态  ,例子如下:

                SELinux status: enabled

                SELinuxfs mount: /selinux

                Current mode: enforcing

                Mode from config file: enforcing

                Policy version: 21

                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

                /sbin/mingetty system_u:system_r:getty_t:s0

                3) /usr/bin/newrole — 在一个新的context或role中运行一个新的shell

                4) /sbin/restorecon — 通过为适当的文件或宁静情况标志扩展属性  ,设置一个或多个文件的宁静情况

                5) /sbin/fixfiles — 检查或校正文件系统中的宁静情况数据库

                6) getsebool — getsebool -a:检察所有布尔值

                7) setsebool — 参数-P  ,永世性设置

                8) chcon 修改文件、目录的宁静上下文

                chcon –u[user]

                chcon –r[role]

                chcon –t[type]

                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[LEVEL[:CATEGORY]]

                宁静上下文中的用户和角色标识符除了对强制有一点约束之外对类型强制会见控制计谋没什么影响  ,对于历程 ,用户和角色标识符显得更有意义 ,由于它们是用于控制类型和用户标识符的团结体  ,这样就会与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-c1023

                6.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
              在历程类型和文件类型
              之间允许的允许

                6.3 小结

                1) 系统中每个文件、目录、网络端口等都被指定一个宁静上下文 ,policy 则给出各宁静上下文之间的作用规则  。

                2) SELinux凭据policy及security context规则来决议存取行为是否可执行;

                3) Subject(主体):系统历程  ,好比/usr/sbin/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 root 41292 Sep 7 2012 /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[:category,...] [-sensitivity[:category,...]]

                例子如下所示:

                复制代码

                代码如下:

                root@luohj-virtual-machine:~# ps -aZ

                LABEL PID TTY TIME CMD

                unconfined_u:system_r:insmod_t:s0-s0:c0.c255 4940 pts/0 00:00:00 passwd

                注重MLS宁静上下文至少必须有一个宁静级别(它由单个敏感度和0个或多个领域组成)  ,但可以包罗两个宁静级别 ,这两个宁静级别划分被叫做低(或历程趋势)和高(或历程间隙) ,若是高宁静级别丢失  ,它会被以为与低宁静级此外值是相同的(最常见的情形)  ,现实上  ,对于客体和历程而言 ,低和高宁静级别通常都是相同的  ,通常用于历程的级别规模被以为是受信托的主体(即历程信托降级信息)或多层客体  ,如一个目录  ,它又包罗了差别宁静级此外客体  。为了使形貌简朴  ,假设所有的历程和客体都只有一个宁静级别  。

                10. 计谋剖析工具apol

                apol(即analyze policy【剖析计谋】)工具是一个成熟的SELinux计谋剖析工具 ,它位于setools工具包中 。使用它打开policy.xx文件即可剖析所有的相关计谋  。xx为计谋编译器(checkpolicy)的版本号  。

                11. 小结

                SELinux会见控制是基于与所有系统资源(包罗历程)关联的宁静上下文的  ,宁静上下文包罗三个组件:用户、角色和类型标识符  。类型标识符是会见控制的主要基础  。

                在SELinux中  ,会见控制的主要特征是类型强制  ,在主体(即历程)与客体之间通过指定allow规则(主体的类型【也叫做域类型】是源  ,客体的类型是目的)举行会见授权  ,会见被授予特定的客体种别 ,为每个客体种别设置细粒度的允许 。

                类型强制的一个要害优势是它可以控制哪个法式可能运行在给定的域类型上 ,因此 ,它允许对单个法式举行会见控制(比起用户级的宁静控制要宁静得多了)  ,使法式进入另一个域(即以一个给定的历程类型运行)叫做域转变  ,它是通过SELinux的allow规则精密控制的  ,SELinux也允许通过type_transition 文件使域转变自动发生  。

                SELinux在会见控制宁静上下文中不直接使用角色标识符  ,相反  ,所有的会见都是基于类型的  ,角色用于关联允许的域类型  ,这样可以设置类型强制允许的功效组合到一起  ,将用户作为一个角色举行认证  。

                SELinux提供了一个可选的MLS会见控制机制  ,它提供了更多的会见限制 ,MLS特征依赖TE机制建设起来的 ,MLS扩展了宁静上下文的内容  ,包罗了一个当前的(或低)宁静级别和一个可选的高宁静级别  。