h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
margin-top: 0;
padding-top: 0;
}

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}

h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
margin-top: 10px;
}

/* LINKS
=============================================================================*/

a {
color: #4183C4;
text-decoration: none;
}

a:hover {
text-decoration: underline;
}

/* LISTS
=============================================================================*/

ul, ol {
padding-left: 30px;
}

ul li > :first-child,
ol li > :first-child,
ul li ul:first-of-type,
ol li ol:first-of-type,
ul li ol:first-of-type,
ol li ul:first-of-type {
margin-top: 0px;
}

ul ul, ul ol, ol ol, ol ul {
margin-bottom: 0;
}

dl {
padding: 0;
}

dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px;
}

dl dt:first-child {
padding: 0;
}

dl dt>:first-child {
margin-top: 0px;
}

dl dt>:last-child {
margin-bottom: 0px;
}

dl dd {
margin: 0 0 15px;
padding: 0 15px;
}

dl dd>:first-child {
margin-top: 0px;
}

dl dd>:last-child {
margin-bottom: 0px;
}

/* CODE
=============================================================================*/

pre, code, tt {
font-size: 12px;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}

code, tt {
margin: 0 0px;
padding: 0px 0px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}

pre>code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}

pre {
background-color: #f8f8f8;
border: 1px solid #ccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}

pre code, pre tt {
background-color: transparent;
border: none;
}

kbd {
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
background-color: #DDDDDD;
background-image: linear-gradient(#F1F1F1, #DDDDDD);
background-repeat: repeat-x;
border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
border-image: none;
border-radius: 2px 2px 2px 2px;
border-style: solid;
border-width: 1px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
line-height: 10px;
padding: 1px 4px;
}

/* QUOTES
=============================================================================*/

blockquote {
border-left: 4px solid #DDD;
padding: 0 15px;
color: #777;
}

blockquote>:first-child {
margin-top: 0px;
}

blockquote>:last-child {
margin-bottom: 0px;
}

/* HORIZONTAL RULES
=============================================================================*/

hr {
clear: both;
margin: 15px 0;
height: 0px;
overflow: hidden;
border: none;
background: transparent;
border-bottom: 4px solid #ddd;
padding: 0;
}

/* IMAGES
=============================================================================*/

img {
max-width: 100%
}
-->

译序

学习SELinux有一段时间了,阅读过一些文档,也进行过一些实际操作。但是对于一些概念理解的还是不太深刻,偶有机会得遇如此佳篇,顿有醍醐灌顶茅塞顿开之感。遂译之。

不曾读过SELinux相关的中文权威文档,所以对一些名词、术语的翻译可能有些生硬。领会精神吧。

在此表示对原作者Daniel J Walsh的感谢,原文地址:https://opensource.com/business/13/11/selinux-policy-guide

正文

SELinux是一个标签系统。每个进程都有一个标签。操作系统中的每个文件对象/目录对象也都有一个标签。甚至连网络端口,设备和潜在的主机名也都有标签分配给它们。我们编写规则来控制进程标签到对象标签(如文件)的访问权限。我们称之为策略。内核强制执行这些规则。有时这种强制执行被称为强制访问控制(MAC)。

对象的拥有者对于其安全属性没有决定权。标准的Linux访问控制,所有者/组+权限标志如rwx,通常称为自由访问控制(DAC)。SELinux没有UID或文件所有权的概念。一切都由标签控制。意味着SELinux并不需要一个全能的root进程来设置。

注:SELinux并不能让你绕过DAC。SELinux是一个并行执行模型。一个应用程序只有在SELinux和DAC都允许的情况下才能进行某些活动。这可能会因为进程权限被拒绝而给系统管理员造成困扰。一般在系统管理员的眼里,权限拒绝意味着DAC配置错误,而不是SELinux标签。

类型强制

让我们更加深入的看一看标签。SELinux的主要模型或者说执行被称为类型强制。基本含义就是,我们根据一个进程的类型为其定义标签,也基于一个文件系统对象的类型为其定义标签。

类比

想象在一个系统里,我们定义像猫和狗这样类型的对象。猫和狗都代表进程类型。

我们有一类对象叫做食物,这些进程想要与之交互。我们想要给这些食物加上类型,猫粮和狗粮。

作为一个策略的编写者,我认为狗有吃狗粮的权限,猫有吃猫粮的权限。在SELinux中,我们像下面这样编写规则。

allow cat cat_chow:food eat;
allow dog dog_chow:food eat;

有了这些规则,内核会允许猫进程吃标有cat_chow标签的食物,允许狗进程吃标有dog_chow标签的食物。

但是SELinux系统默认会阻止一切操作。也就是说,如果狗进程尝试去吃猫粮,内核将会阻止它。

同样,猫也不允许吃狗粮。

译者注:任何操作,如果SELinux规则集中找不到与之匹配的允许规则,就会被阻止。也就是空的规则集就会阻止一切,所以我们需要编写规则来允许特定的操作。

现实世界

我们将Apache服务器进程标上httpd_t标签,我们把Apache服务器需要访问的内容标上httpd_sys_content_t标签和httpd_sys_content_rw_t标签。想象我们把信用卡数据存储在MySQL数据库里,我们为它标上msyqld_data_t标签。如果一个Apache进程被黑客攻击了,黑客将会得到httpd_t进程的控制权,会被允许读取httpd_sys_content_t标签类型的文件和读写httpd_sys_content_rw_t标签类型的文件。但是黑客不会被允许读取信用卡数据(mysqld_data_t标签类型)即使进程是以root身份运行的。这种情况下SELinux减轻了入侵造成的危害。

MCS强制

类比

以上,我们把进程按猫和狗进行分类,但是当你有多个狗进程时将会发生什么:两只狗Fido和Spot。你想要阻止Fido去吃Spot的dog_chow。

一种解决方案是创建更多的新类型,像Fido_dog和Fido_dog_chow。但是,这将很快变得难以驾驭,因为所有的狗的权限几乎是相同的。

为了处理这种情况,我们开发了一种新的强制执行形式,称为多类别安全(MCS)。在MCS中,我们在狗进程和狗粮dog_chow的标签中添加了一个新的部分。现在,我们把狗进程标为dog:random1(Fido)和dog:random2(Spot)。

我们把狗粮标为dog_chow:random1(Fido)和dog_chow:random2(Spot)。

在MCS中,如果类型强制规则验证通过,并且随机的MCS标签也完全匹配,那么访问就会被允许,不然就会被拒绝。

  • Fido(dog:random1)尝试去吃cat_chow:food被类型强制拒绝。

  • Fido(dog:random1)允许吃dog_chow:random1

  • Fido(dog:random1)不允许吃Spot的食物(dog_chow:random2)。

现实世界

在计算机系统中,我们通常有很多的进程有着相同的访问权限,但是我们想要把它们彼此分开。我们有时称之为多租户环境。最好的例子就是虚拟机。如果我有一台运行大量虚拟机的服务器,而且其中一台遭到黑客攻击,我想要阻止它攻击其他的虚拟机和虚拟机映像。但是在类型强制系统中KVM虚拟机被标为svirt_t,而虚拟机映像被标为svirt_image_t。我们的规则允许svirt_t读、写和删除svirt_image_t类型的内容。在libvirt中我们不仅实现了类型强制,而且实现了MCS。当libvirt将要启动一个虚拟机时,它会选择一个随机的MCS标签,如s0:c1,c2,然后将标签svirt_image_t:s0:c1,c2分配给虚拟机接下来需要管理的所有内容。最终,它以svirt_t:s0:c1,c2类型启动虚拟机。然后,SELinux内核会控制svirt_t:s0:c1,c2不能写入svirt_image_t:s0:c3,c4,即使虚拟机被黑客完全控制了。即使它是以root身份运行的。

MLS强制

另一种SELinux强制执行形式,使用的频率相对较少,称为多级安全(MLS);它的开发是在上世纪60年代,主要应用在受信任的操作系统上,例如Trusted Solaris。

其主要思想是根据将要使用的数据的级别来控制进程。一个secret级进程不能读取top secret级数据。

MLS与MCS非常相似,但是它给强制执行增加了优势度的概念。MCS标签必须精确匹配,而一个MLS标签可以比另一个MLS标签更有优势,从而获得访问权限。

类比

现在我们来看看不同的品种,而不再谈论不同的狗。我们可能会有一只灰狗和一只吉娃娃。

我们可能会允许灰狗吃任何的狗粮,但如果吉娃娃吃灰狗的狗粮会有噎住窒息的危险。

我们把灰狗标上dog:Greyhound标签,把它的狗粮标上dog_chow:Greyhound,并且为吉娃娃标上dog:Chihuahua标签,也为它的狗粮标上dog_chow:Chihuahua

有了MLS策略,我们使MLS Greyhound标签更优势于Chihuahua标签。这意味着dog:Greyhound被允许吃dog_chow:Greyhounddog_chow:Chihuahua

但是不允许dog:Chihuahuadog_chow:Greyhound

当然,dog:Greyhounddog:Chiahuahuacat_chow:Siamese依然会被类型强制给阻止,即使MLS Greyhound优于Siamese。

现实世界

我可能会有两个Apache服务器,一个以httpd_t:TopSecret标签运行,另一个以httpd_t:Secret标签运行。如果有着httpd_t:Secret标签的Apache进程被黑客攻击了,黑客能够读取httpd_sys_content_t:Secret类型的数据,但是读取httpd_sys_content_t:TopSecret类型会被阻止。

然而,如果运行在httpd_t:TopSecret的Apache服务器被黑客攻击了,它既能够读取httpd_sys_content_t:Secret类型的数据,又能够读取httpd_sys_content_t:TopSecret类型的数据。

我们在军用环境里使用MLS,在那里某个用户只允许读取secret级数据,但是同一个系统里的另一个用户能够读取top secret级的数据。

结论

SELinux是一个强大的标签系统,控制着内核授予不同进程的访问权限。主要特性是类型强制,定义的规则根据进程的标签类型和受访问对象的标签类型来控制是否允许访问。还有两种附加的控制机制,MCS用于把同类型的进程完全的彼此分开,MLS允许按优势度控制进程的访问。

[译]漫画SELinux概念的更多相关文章

  1. 【译】Linux概念架构的理解

    声明:本文转载,原路径地址:http://www.jianshu.com/p/c5ae8f061cfe 摘要 Linux kernel成功的两个原因:(1)灵活的架构设计使得大量的志愿开发者能够很容易 ...

  2. SELinux介绍

    SELinux概念 安全加强的Linux,早期的Linux系统安全由系统管理员控制.SELinux就是一些安全规则的集合,类似于人类生活中的法律. DAC:   自由访问控制(以前的linux版本) ...

  3. Linux 命令大全提供 500 多个 Linux 命令搜索

    Linux Command 在这里维持一个持续更新的地方 516 个 Linux 命令大全,内容包含 Linux 命令手册.详解.学习,值得收藏的 Linux 命令速查手册.请原谅我写了个爬虫,爬了他 ...

  4. Java并发面试问题之volatile到底是什么?

    本文转载自公众号:石杉的架构笔记,阅读大约需要7分钟. 一.写在前面 前段时间把几年前带过的一个项目架构演进的过程整理了一个系列出来,参见(<亿级流量架构系列专栏总结>). 不过很多同学看 ...

  5. selinux基本概念

    TE模型 主体划分为若干组,称为域 客体划分为若干组,每个组称为一个类型   DDT(Domain Definition Table,域定义表,二维),表示域和类型的对应访问权限,权限包括读写执行 一 ...

  6. IP概念盛行的背后:资本在狂欢,电影想哭泣 IP,英文“Intellectual Property”的缩写,直译为“知识产权”。它的存在方式很多元,可以是一个故事,也可以是某一个形象,运营成功的IP可以在漫画、小说、电影、玩具、手游等不同的媒介形式中转换。

    IP概念盛行的背后:资本在狂欢,电影想哭泣 IP容易拉投资.谈合作,甚至还能简化宣发途径,越来越多的人涌入了电影这个产业,争抢IP成为他们进入行业的最快捷的方法.IP盛行暴露出的另一个问题是国产电影原 ...

  7. [转帖]【译】RAID的概念和RAID对于SQL性能的影响

    [译]RAID的概念和RAID对于SQL性能的影响 https://www.cnblogs.com/VicLiu/p/11479427.html 简介 我们都听说过RAID,也经常作为SQL DBA. ...

  8. 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  9. [原][译][physX]phsyX3.3.4官方文档物理引擎基本概念和例子介绍

    世界和物体: 物理世界包括集合的场景,每个包含的物体称为演员(Actors) 每个场景(Scene)都定义了自己的参考框架包含了所有的时间和空间 在不同的场景,演员不互相影响 演员通常有三种类型:刚体 ...

随机推荐

  1. Golang:使用 httprouter 构建 API 服务器

    https://medium.com/@gauravsingharoy/build-your-first-api-server-with-httprouter-in-golang-732b7b01f6 ...

  2. vs2012建一个空解决方案添加以前老版本的Web项目调试弹出window安全

    解决方法:NTLM身份验证去掉就行.

  3. Vue.js2.0中的变化(持续更新中)

    最近自己在学习Vue.js,在看一些课程的时候可能Vue更新太块了导致课程所讲知识和现在Vue的版本不符,从而报错,我会在以后的帖子持续更新Vue的变化与更新,大家也可以一起交流,共同监督学习! 1. ...

  4. fio2.1.10--HOWTO

    1.0 Overview and history    ------------------------ fio was originally written to save me the hassl ...

  5. 【前端】Require.js使用方法总结

    一.为什么要使用require.js 首先一个页面如果在加载多个js文件的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长:其次,由于js文件之间存在依赖关系,因此必须严格保证加载 ...

  6. viewpager的滑动

    在一个已经是月黑风高快下班的时刻了,我们产品突然通知我们开会,要添加一个功能,他闲来无聊随便戳了戳facebook,说点开联系人的那个横向滑动的卡片式的效果不错,让我们在我们的app里添加这个效果,我 ...

  7. LeetCode 121. Best Time to Buy and Sell Stock (买卖股票的最好时机)

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  8. 在Javaava中stringBuilder的用法

    String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的  ...

  9. PyCharm 如何安装python第三方库及插件

    一.如何安装python第三方库: 1.有一个专门可下载安装第三方库的网址: http://www.lfd.uci.edu/~gohlke/pythonlibs/ Ctrl+f 搜索要下载的第三方库, ...

  10. 借助csv用PHP生成excel文件

    当你将xml文件改为csv后缀会发现原先的表格结构都变成用逗号隔开的一行一行数据,就像这样 编号,姓名,年龄 001,王宇,28 002,刘三,20 由此看来,如果能将PHP数据输出为这样的格式,然后 ...