[译]漫画SELinux概念
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:Greyhound和dog_chow:Chihuahua。

但是不允许dog:Chihuahua吃dog_chow:Greyhound。

当然,dog:Greyhound和dog:Chiahuahua吃cat_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概念的更多相关文章
- 【译】Linux概念架构的理解
声明:本文转载,原路径地址:http://www.jianshu.com/p/c5ae8f061cfe 摘要 Linux kernel成功的两个原因:(1)灵活的架构设计使得大量的志愿开发者能够很容易 ...
- SELinux介绍
SELinux概念 安全加强的Linux,早期的Linux系统安全由系统管理员控制.SELinux就是一些安全规则的集合,类似于人类生活中的法律. DAC: 自由访问控制(以前的linux版本) ...
- Linux 命令大全提供 500 多个 Linux 命令搜索
Linux Command 在这里维持一个持续更新的地方 516 个 Linux 命令大全,内容包含 Linux 命令手册.详解.学习,值得收藏的 Linux 命令速查手册.请原谅我写了个爬虫,爬了他 ...
- Java并发面试问题之volatile到底是什么?
本文转载自公众号:石杉的架构笔记,阅读大约需要7分钟. 一.写在前面 前段时间把几年前带过的一个项目架构演进的过程整理了一个系列出来,参见(<亿级流量架构系列专栏总结>). 不过很多同学看 ...
- selinux基本概念
TE模型 主体划分为若干组,称为域 客体划分为若干组,每个组称为一个类型 DDT(Domain Definition Table,域定义表,二维),表示域和类型的对应访问权限,权限包括读写执行 一 ...
- IP概念盛行的背后:资本在狂欢,电影想哭泣 IP,英文“Intellectual Property”的缩写,直译为“知识产权”。它的存在方式很多元,可以是一个故事,也可以是某一个形象,运营成功的IP可以在漫画、小说、电影、玩具、手游等不同的媒介形式中转换。
IP概念盛行的背后:资本在狂欢,电影想哭泣 IP容易拉投资.谈合作,甚至还能简化宣发途径,越来越多的人涌入了电影这个产业,争抢IP成为他们进入行业的最快捷的方法.IP盛行暴露出的另一个问题是国产电影原 ...
- [转帖]【译】RAID的概念和RAID对于SQL性能的影响
[译]RAID的概念和RAID对于SQL性能的影响 https://www.cnblogs.com/VicLiu/p/11479427.html 简介 我们都听说过RAID,也经常作为SQL DBA. ...
- 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱
为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...
- [原][译][physX]phsyX3.3.4官方文档物理引擎基本概念和例子介绍
世界和物体: 物理世界包括集合的场景,每个包含的物体称为演员(Actors) 每个场景(Scene)都定义了自己的参考框架包含了所有的时间和空间 在不同的场景,演员不互相影响 演员通常有三种类型:刚体 ...
随机推荐
- appium python ios 自动化
mac下搭建appium python selenium来针对ios应用进行自动化测试,并不是官网上的例子,自己程序调试成功. 前言:因为appium的安装前要先确定nodejs的安装.python的 ...
- WebApi系列~HttpClient的性能隐患
回到目录 最近在进行开发过程中,基于都是接口开发,A站接口访问B接口接口来请求数据,而在这个过程中我们使用的是HttpClient这个框架,当然也是微软自己的框架,性能当前没有问题,但如果你直接使用官 ...
- Windows下使用nginx搭建反向代理服务器
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...
- Java 中冷门的 synthetic 关键字原理解读
看JAVA的反射时,看到有个synthetic ,还有一个方法isSynthetic() 很好奇,就了解了一下: 1.定义 Any constructs introduced by a Java co ...
- Quart.Net分布式任务管理平台
无关主题:一段时间没有更新文章了,与自己心里的坚持还是背驰,虽然这期间在公司做了统计分析,由于资源分配问题,自己或多或少的原因,确实拖得有点久了,自己这段时间也有点松懈,借口就不说那么多 ...
- C#中判断语句 if、if-else if、switch-case
1.if一般用于一个条件的判断: 2.if-else if 一般用于多个条件的判断: 3.switch-case一般用于多个条件的判断. 注:if-else if与switch-case的区别在于:一 ...
- trait与policy模板技术
trait与policy模板技术 我们知道,类有属性(即数据)和操作两个方面.同样模板也有自己的属性(特别是模板参数类型的一些具体特征,即trait)和算法策略(policy,即模板内部的操作逻辑). ...
- js input输入事件兼容性问题
if(navigator.userAgent.indexOf('Android') > -1){ $("#sign").on("input", funct ...
- Problem C: 是否回文数?
Description 定义Data类,有一个int类型的属性.定义其构造函数.setValue函数和isPalindrome函数,其中setValue函数用于设置属性值,isPalindrome用于 ...
- Android打开/data/目录以及导出文件
打开logcat和和file Explorer Tools-->Android-->Android Device Monitor 如果右侧没有出现,Windows-->Show Vi ...