[译]漫画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)都定义了自己的参考框架包含了所有的时间和空间 在不同的场景,演员不互相影响 演员通常有三种类型:刚体 ...
随机推荐
- 博客发在oschina
国内git.oschina做的很好,看到oschina还有博客 直接导入csdn博客 http://my.oschina.net/lindexi/blog
- 用git上传代码到新浪云
新浪云空间是国内免费的一个空间,不过有限制很多. 申请新浪云需要新浪账号,注册略. 使用新浪账号去http://sae.sina.com.cn申请一个空间 选择新建应用 可以选择使用php项目 管理应 ...
- Java IO流 思维导图
- C基本类型
C基本类型有: char:8位,可添加修改符signed或是unsigned short:16位,同有singed和unsigned int:32位,同有singed和unsigned long:在3 ...
- PhiloGL学习(4)——三维对象、加载皮肤
前言 上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤. 一. 原理分析 我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了 ...
- 微软Tech Summit 2017,等你来打Call
2017年10月31至11月3日,由微软举办的Tech Summit 2017技术暨生态大会将在北京盛大举办,要在北京连开四天.今年的技术大会看头十足,不仅有大咖级人物带来十二大主题课程,更有三天四场 ...
- 《mysql必知必会》读书笔记--存储过程的使用
以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...
- code force 424 A - Office Keys
There are n people and k keys on a straight line. Every person wants to get to the office which is l ...
- T9
T9 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission ...
- two.js之实现动画效果
一.什么是two.js? Two.js 是面向现代 Web 浏览器的一个二维绘图 API.Two.js 可以用于多个场合:SVG,Canvas 和 WebGL,旨在使平面形状和动画的创建更方便,更简洁 ...