比别人多一点志气,你就会多一份出息 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

关于SeLinux相关的知识整理

环境配置 memory 发布于January 14, 2018 标签: Linux

最近同事大飞同学被seLinux坑了两次,以往我安装完CentOS后都是直接将SeLinux关闭了,但默认是开启的,开启想必有它的作用。SO,今天来扒一扒这货...

SELinux的作用

SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。

设想一下,如果一个以root身份运行的网络服务存在0day漏洞,黑客就可以利用这个漏洞,以root的身份在您的服务器上为所欲为了。是不是很可怕?

SELinux 就是来解决这个问题的。

在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。

只要访问这个资源的进程符合以上的条件就可以被访问。

而最致命问题是,root用户不受任何管制,系统上任何资源都可以无限制地访问。

这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。

那在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。

这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。

即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。

这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。

而 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。

模式

SELinux 有三个模式(可以由用户设置)。这些模式将规定 SELinux 在主体请求时如何应对。这些模式是:

你要如何知道你的系统当前是什么模式?你可以使用一条简单的命令来查看,这条命令就是getenforce

策略类型

SELinux策略有两种:

SELINUXTYPE=targeted

修改这个选项为targeted或strict以满足你的需求。

SELinux 基本概念

主体(Subject)

可以完全等同于进程。
注:为了方便理解,如无特别说明,以下均把进程视为主体。

对象(Object)

被主体访问的资源。可以是文件、目录、端口、设备等。
注:为了方便理解,如无特别说明,以下均把文件或者目录视为对象。

政策和规则(Policy & Rule)

系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。
而哪些进程需要管制、要怎么管制是由政策决定的。
一套政策里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。
规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。

在 CentOS 7 系统中,有三套政策,分别是:

安全上下文(Security Context)

安全上下文是 SELinux 的核心。
安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。
一个「进程安全上下文」一般对应多个「文件安全上下文」。
只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。
文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。
需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。
安全上下文的结构及含义

安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0

基本使用

查询文件或目录的安全上下文

ls -Z <文件或目录>

用法举例
查询/etc/hosts的安全上下文。

ls -Z /etc/hosts

执行结果

-rw-r--r--. root root system_u:object_r:net_conf_t:s0  /etc/hosts

查询进程的安全上下文

命令基本用法

ps auxZ | grep -v grep | grep <进程名>

用法举例

查询Nginx相关进程的安全上下文。

ps auxZ | grep -v grep | grep nginx

执行结果

system_u:system_r:httpd_t:s0    root  7997  0.0  0.0 122784  2156 ?        Ss   14:31   0:00 nginx: master process /usr/sbin/nginx
system_u:system_r:httpd_t:s0    nginx 7998  0.0  0.0 125332  7560 ?        S    14:31   0:00 nginx: worker process

手动修改文件或目录的安全上下文

命令基本用法

chcon <选项> <文件或目录 1> [<文件或目录 2>...]

选项 功能

-u <值>    修改安全上下文的用户字段
-r <值>    修改安全上下文的角色字段
-t <值>    修改安全上下文的类型字段
-l <值>    修改安全上下文的级别字段
--reference <文件或目录>    修改与指定文件或目录相一致的安全上下文
-R    递归操作
-h    修改软链接的安全上下文(不加此选项则修改软链接对应文件)

用法举例

修改test的安全上下文为aaa_u:bbb_r:ccc_t:s0

chcon -u aaa_u -r bbb_r -t ccc_t test

把文件或目录的安全上下文恢复到默认值

命令基本用法

restorecon [选项] <文件或目录 1> [<文件或目录 2>...]

用法举例

添加一些网页文件到Nginx服务器的目录之后,为这些新文件设置正确的安全上下文。

restorecon -R /usr/share/nginx/html/

查询系统中的布尔型规则及其状态

命令基本用法

getsebool -a

由于该命令要么查询所有规则,要么只查询一个规则,所以一般都是先查询所有规则然后用grep筛选。

用法举例

查询与httpd有关的布尔型规则。

getsebool -a | grep httpd

执行结果

httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
#以下省略

开关一个布尔型规则

命令基本用法

setsebool [选项] <规则名称> <on|off>

用法举例

开启httpd_anon_write规则。

setsebool -P httpd_anon_write on

添加目录的默认安全上下文

命令基本用法

semanage fcontext -a -t <文件安全上下文中的类型字段> "<目录(后面不加斜杠)>(/.*)?"

注:目录或文件的默认安全上下文可以通过semanage fcontext -l命令配合grep过滤查看。
用法举例

Nginx新增一个网站目录/usr/share/nginx/html2之后,需要为其设置与原目录相同的默认安全上下文。

semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"

添加某类进程允许访问的端口

命令基本用法

semanage port -a -t <服务类型> -p <协议> <端口号>

注:各种服务类型所允许的端口号可以通过semanage port -l命令配合grep过滤查看。
用法举例
`Nginx需要使用10080的端口用于 HTTP 服务。

semanage port -a -t http_port_t -p tcp 10080

具体可以参考关于CentOS/RHEL中SELinux的相关学习记录整理

反正我到现在也还是没搞懂。。。哈哈哈

相关推荐

添加新评论

网站状态

  • 栏目分类:49个
  • 发布文章:1560篇
  • 用户评论:853条
  • 开博至今:4435天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字母
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或1个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • chen: 感谢大师,搞定
  • memory: 你把采集和文章相关content的字段text类型改为bigte...
  • chen: 请教大师,phpcms采集超过1万2字就无法采集,哪里可以修改?
  • 11: 很棒
  • s站: 学习了
  • 基地小组: 好文章,非常详细,博主辛苦了
  • memory: 没事儿,这个插件有些问题。我现在已经不使用了。。。
  • 小白: 还有会缓存用户状态给下一位用户!我评论留个记录而已,,,,,
  • 小白: 再次留个记录,不知道为什么缓存页面点击文章或者分类会跳转自己解析...
  • weich: 用数据库那个缓存就正常了!有得用不错了!作者也幸苦了!
  • weich: 有点奇怪,,,哈哈哈哈!原来是那个模板登陆标签被我注释了,所以不...
  • weich: 很强大,就是有个问题登陆了可用看见网页底部模板,不登陆就看不到,...
  • J Zhiguang: valued article for a new learnner.
  • VPS234: 写得不错啊,支持一下,证书现在很多免费的吧
  • 游客: 感谢,我终于明白了markdown原来就是快捷键啊。
  • 楚狂人博客: 感谢博主分享干货
  • 天津网站建设: 写的很棒,感谢博主