selinux原理和影响

selinux原理

Posted by XT on June 24, 2019

selinux

Selinux安全

1. 前言

公司的一个项目,要求使用centos作为代理服务器,连接windows server 2008 的mysql

但是centos使用php5或者php7在使用

mysqli_connect("localhost","user","password","db");

的语句的时候,是可以运行成功的,但是

将localhost改成127.0.0.1或者192.168.x.x时候,就会报错

信息如下

SQLSTATE[HY000] [2002] Permission denied 

网上的答案各种各样,但是kali中却可以使用php连接远程的sql服务器,只有centos有问题,跟php的版本都没有关系。

开始思考这个错误信息,

最终发现是selinux在搞鬼。今天来讲一下什么是selinux!

2. selinux简介

  • SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。
  • NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。
  • SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。
  • SELinux 是 2.6 版本的 Linux内核提供的强制访问控制MAC系统。对于目前可用的Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。
  • 大部分使用 SELinux 的人使用的都是 SELinux 就绪的发行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian或 Centos。它们都是在内核中启用 SELinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 SELinux 的功能。
  • SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。任何程序对其资源享有完全的控制权。
  • 假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他。SELinux提供了比传统的UNIX权限更好的访问控制。
外文名 Security-Enhanced Linux 制造单位 美国国家安全局
简称 SELinux 地位 Linux历史上最杰出的新安全系统
  性质 强制访问控制(MAC)安全系统

3、SELinux 的作用及权限管理机制

3.1 SELinux 的作用

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

3.2 DAC

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

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

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

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

3.3 MAC

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

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

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

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

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

    下文中的操作均为 MCS 模式。

3.4 DAC 和 MAC 的对比

  • 在 DAC 模式下,只要相应目录有相应用户的权限,就可以被访问。而在 MAC 模式下,还要受进程允许访问目录范围的限制。

4、SELinux 基本概念

4.1 主体(Subject)

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

4.2 对象(Object)

被主体访问的资源。可以是文件、目录、端口、设备等。

4.3 政策和规则(Policy & Rule)

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

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

1. targeted:对大部分网络服务进程进行管制。这是系统默认使用的政策(下文均使用此政策)。
2. minimum:以 targeted 为基础,仅对选定的网络服务进程进行管制。一般不用。
3. mls:多级安全保护。对所有的进程进行管制。这是最严格的政策,配置难度非常大。一般不用,除非对安全性有极高的要求。

政策可以在 /etc/selinux/config 中设定。

4.4 安全上下文(Security Context)

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

  • 安全上下文的结构及含义

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

4.5 SELinux 的工作模式

SELinux 有三种工作模式,分别是:
1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
3. disabled:关闭 SELinux。
SELinux 工作模式可以在 /etc/selinux/config 中设定。

如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。

需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约 10 分钟,还以为是死机了……)。

SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。

5、SELinux 基本操作

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

ls -Z

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

ls -Z /etc/hosts

执行结果

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

5.2 查询进程的安全上下文

命令基本用法

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

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

这个是网上的,我没有试过

命令基本用法

chcon [...]

选项功能

-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

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

命令基本用法

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(/.*)?"

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

命令基本用法

semanage port -a -t -p

注:各种服务类型所允许的端口号可以通过 semanage port -l 命令配合 grep 过滤查看。

用法举例 为 Nginx 需要使用 10080 的端口用于 HTTP 服务。

semanage port -a -t http_port_t -p tcp 10080

6.selinux关闭方法

一、查看SELinux状态命令:
/usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态
SELinux status:                 enabled
getenforce                 ##也可以用这个命令检查

二、关闭SELinux方法:
1、临时关闭(不用重启机器):
setenforce 0  #设置SELinux 成为permissive模式
#setenforce 1 #设置SELinux 成为enforcing模式

2、一劳永逸的方法
修改/etc/selinux/config 文件
将 SELINUX=enforcing 改为 SELINUX=disabled
重启机器即可