Linux系统:selinux规则配置详解

十七拾 2024-08-20 10:37:01 阅读 75

目录

一、SELinux(Security-Enhanced Linux)

1、SELinux概述和作用

2、 SELinux的优缺点

3、SELinux的权限管理机制

3.1 DAC(Discretionary Access Control,自主访问控制)

3.2 MAC(Mandatory Access Control,强制访问控制)

3.3 DAC和MAC的区别

4、SELinux中几个名词概念

4.1 主体(Subject)

4.2 对象(Object)

4.3 政策和规则(Policy & Rule) 

5、SELinux的三种工作模式

5.1 临时修改工作模式

5.2 永久修改工作模式

6、安全上下文(Security Context)

6.1 查询安全上下文 

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

6.1.2 查询进程的安全上下文

6.2 chcon命令(修改文件或目录的安全上下文)

6.3 restorecon命令(恢复文件或目录的安全上下文)

7、semanage命令(管理SELinux策略)

8、SELinux的布尔型规则

8.1 getsebool命令(获取SELinux布尔值的当前状态)

8.2 setsebool命令(设置SELinux布尔值的状态)

9、SELinux相关操作


一、SELinux(Security-Enhanced Linux)

1、SELinux概述和作用

SELinux(Security-Enhanced Linux)是一个Linux内核模块,它实现了强制访问控制(MAC)机制,可以对系统中的各种资源(文件、进程、网络端口等)进行细粒度的访问控制,从而提高了系统的安全性

主要作用是强化系统的安全性,通过访问控制来防止恶意程序对系统进行攻击。它可以限制程序的权限,防止它们对系统资源进行未经授权的访问和操作,从而有效地保护系统免受攻击

2、 SELinux的优缺点

优点

可以提高系统的安全性,通过访问控制来限制程序的权限,从而有效地防止恶意程序对系统进行攻击

缺点

使用SELinux需要一定的学习成本,因为它的配置比较复杂,需要了解一些SELinux的基本概念和命令

3、SELinux的权限管理机制

SELinux是一种强制访问控制(MAC)安全机制,用于Linux操作系统中。它的作用是通过强制规则限制进程的权限,从而保护系统免受未经授权的访问和攻击。

相比于传统的自由访问控制(DAC)机制,SELinux的优点在于可以更加细粒度地控制进程的访问权限,从而提高系统的安全性。但是,由于SELinux的规则非常复杂,配置和管理也比较困难,因此在使用时需要投入更多的精力和时间

3.1 DAC(Discretionary Access Control,自主访问控制)

一种基于用户身份和权限的安全机制。在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。只要访问这个资源的进程符合以上的条件就可以被访问。而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。这种权限管理机制的主体是用户,也称为自主访问控制(DAC)

DAC的优点在于使用简单,容易理解和配置。但是,DAC的缺点也比较明显,主要包括以下几个方面:

安全性较低:由于DAC是基于用户身份和权限的,因此用户可以自由地控制自己的资源访问权限。这就意味着如果用户的帐户被攻击或者被恶意程序利用,攻击者可以通过该用户的权限访问该用户的所有资源权限管理困难:由于DAC是基于用户身份和权限的,因此在管理大量用户和资源时,权限管理变得非常困难。管理员需要花费大量时间和精力来管理和维护用户和资源之间的权限关系缺乏细粒度控制:由于DAC是基于用户身份和权限的,因此无法对不同用户对同一资源的访问进行细粒度控制。例如,无法对同一文件的不同部分进行不同的访问控制

3.2 MAC(Mandatory Access Control,强制访问控制)

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

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

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

这种权限管理机制的主体是进程,也称为强制访问控制(MAC),它是由系统管理员预先定义的一组规则来控制系统中的访问权限,而不是由用户自己控制。MAC机制在系统内部强制执行这些规则,从而保证系统的安全性。

MAC机制的核心思想是将系统资源和进程分配到不同的安全级别,并定义了一些规则来控制不同级别之间的访问。在MAC机制中,每个资源都有一个安全级别,每个进程也有一个安全级别。当进程访问某个资源时,系统会检查该进程的安全级别是否高于该资源的安全级别,如果不高于,则拒绝访问。

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

3.3 DAC和MAC的区别

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

4、SELinux中几个名词概念

4.1 主体(Subject)

主体是指进程或用户,它们需要访问系统资源。在SELinux中,每个主体都有自己的安全上下文,其中包含了主体的身份信息、角色和安全级别等。

4.2 对象(Object)

对象是指系统中的资源,包括文件、目录、网络、设备等。在SELinux中,每个对象都有自己的安全上下文,其中包含了对象的类型信息、安全级别等。

4.3 政策和规则(Policy & Rule) 

系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。而哪些进程需要管制、要怎么管制是由政策决定的。一套政策里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。

规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。

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

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

<code>#政策可在这个配置文件中设置

/etc/selinux/config

5、SELinux的三种工作模式

enforcing模式

enforcing模式是SELinux的默认工作模式,也是最常用的工作模式。在enforcing模式下,SELinux会强制执行安全策略,阻止未经授权的访问。如果进程试图访问未授权的资源,SELinux会禁止该进程的访问,并且在系统日志中记录相关信息

permissive模式

permissive模式是SELinux的一种辅助模式,它不会阻止任何访问,但会记录下未经授权的访问行为。在permissive模式下,SELinux只是记录违规行为,而不会强制执行安全策略。这种模式通常用于测试和调试,以便管理员了解哪些访问是被禁止的

disabled模式

disabled模式是指完全禁用SELinux。在disabled模式下,SELinux不会执行任何安全策略,所有访问都会被允许。这种模式通常用于解决一些特殊的问题,但不建议在生产环境中使用

5.1 临时修改工作模式

getenforce #查看当前系统的selinux工作模式

setenforce命令: 

可以在 enforcing 模式和 permissive 模式之间进行切换,但reboot重启后会失效

<code>usage: setenforce [ Enforcing | Permissive | 1 | 0 ]

setenforce 0 #设置为permissive宽容模式

<code>setenforce 1 #设置为enforcing强制模式

5.2 永久修改工作模式

修改/etc/sysconfig/selinux配置文件

<code>SELINUX=enforcing | permissive | disabled

#可以修改成三种模式中的其中一个,修改完配置文件后,reboot重启后才能生效

6、安全上下文(Security Context)

安全上下文是 SELinux 的核心。安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。一个「进程安全上下文」一般对应多个「文件安全上下文」。只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。

文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。

<code>#安全上下文有四个字段,分别用冒号隔开,如

system_u:object_r:admin_home_t:s0

6.1 查询安全上下文 

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

ls -Z 文件/目录

6.1.2 查询进程的安全上下文

<code>#查询 Nginx 相关进程的安全上下文

ps auxZ | grep -v grep | grep nginx

6.2 chcon命令(修改文件或目录的安全上下文)

用于更改文件或目录的安全上下文。这对于 SELinux 非常重要,因为它允许你修改文件或目录的安全上下文,以便它们能够在特定的 SELinux 策略下正常工作

<code>格式:chcon [OPTION]... CONTEXT FILE...

#CONTEXT 是要分配给文件或目录的新安全上下文

#FILE 是要修改安全上下文的文件或目录

选项 说明
-u 设置文件的用户部分安全上下文
-r 设置文件的角色部分安全上下文
-l 设置文件的范围部分安全上下文
-t 设置文件的类型部分安全上下文
<code>-h 不要跟随符号链接,直接修改符号链接本身的安全上下文
-R 递归地应用于目录和它们的内容
--reference=RFILE 使用参考文件的安全上下文来设置指定文件的安全上下文

如:将文件 myfile.txt 的安全上下文更改为 system_u:object_r:httpd_sys_content_t

chcon system_u:object_r:httpd_sys_content_t myfile.txt

6.3 restorecon命令(恢复文件或目录的安全上下文)

restorecon 命令用于恢复文件或目录的安全上下文。在Linux系统中,每个文件和目录都有一个安全上下文,用于控制对其的访问权限。restorecon 命令可以用于恢复这些安全上下文,以确保文件或目录的安全性

格式:restorecon -v /path/to/file

如:想要恢复 /var/www/html 目录的安全上下文

restorecon -v /var/www/html

7、semanage命令(管理SELinux策略)

semanage 命令用于管理SELinux策略。SELinux(Security-Enhanced Linux)是一个Linux内核安全模块,提供了强大的安全策略,可以限制进程的权限,以防止恶意软件的传播

格式:semanage [options] [command] [arguments]

#options 是命令的选项,command 是要执行的命令,arguments 是命令的参数

以下是一些常用的 semanage 命令:

semanage login -l:列出所有的登录名semanage login -a -s user_u:为用户添加一个新的登录名semanage login -d -s user_u:删除用户的登录名semanage user -l:列出所有的用户semanage user -a -r s0-s0:c0.c1023:为用户添加一个新的角色semanage user -d -r s0-s0:c0.c1023:删除用户的角色semanage port -l:列出所有的端口semanage port -a -t http_port_t -p tcp 8080:为端口添加一个新的类型semanage port -d -t http_port_t -p tcp 8080:删除端口的类型

注:

semanage 命令可能需要root权限才能执行

[root@localhost html]#vim /etc/httpd/conf/httpd.conf

Listen 9527

<code>[root@localhost html]#systemctl restart httpd

<code>[root@localhost html]#journalctl -xe --no-pager

#查看错误信息,其中有解决方法

使用: semanage port -a -t PORT_TYPE -p tcp 9527 来解决,然后将 其中的 PORT_TYPE 改为http_port_t 即可

<code>[root@localhost html]#semanage port -a -t http_port_t -p tcp 9527

[root@localhost html]#systemctl restart httpd

8、SELinux的布尔型规则

用于控制系统中的特定功能或行为。这些规则定义了哪些进程可以执行哪些操作,以及在哪些条件下可以执行这些操作

<code>格式:<module>_<type>_<attribute>

#<module>:这是一个可选的模块名称,用于将布尔型规则分组。如果没有指定模块名称,那么布尔型规则将被分配给默认模块

#<type>:这是一个必需的类型名称,用于指定布尔型规则应用的对象类型

#<attribute>:这是一个必需的属性名称,用于指定布尔型规则应用的属性

如:

httpd_can_network_connect 是一个布尔型规则,它允许HTTP服务器进程(httpd)建立网络连接。在这个规则中,httpd 是模块名称,can_network_connect 是属性名称

8.1 getsebool命令(获取SELinux布尔值的当前状态)

getsebool 命令用于获取SELinux布尔值的当前状态,可能需要root权限才能执行

getsebool -a

#-a 选项用于显示所有的SELinux布尔值的当前状态

getsebool -a | grep httpd

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

<code>getsebool httpd_can_network_connect

#获取 httpd_can_network_connect 布尔值的当前状态

8.2 <code>setsebool命令(设置SELinux布尔值的状态)

格式:setsebool -P <boolean_name> <value>

#-P 选项用于永久性地设置布尔值的状态。如果省略 -P 选项,那么设置的状态只在当前会话中有效。

#<boolean_name> 是要设置的布尔值的名称。

#<value> 是要设置的布尔值的状态。可以是 1(启用)或 0(禁用)

setsebool -P httpd_can_network_connect 1

#启用 httpd_can_network_connect 布尔值

9、SELinux相关操作

 <code>seinfo命令:SELinux)的一个工具,用于查询和显示 SELinux 策略的信息

[root@localhost ~]#yum provides seinfo

#查询seinfo命令来源于哪个安装包

<code>[root@localhost ~]#yum install setools-console.x86_64 -y

#安装seinfo命令

seinfo -a #查看selinux控制的文件类型

<code>[root@localhost ~]#cd /var/www/html/

[root@localhost html]#echo "welcome to my world" > index.html

[root@localhost html]#ls -Z

此时服务器虽开启了selinux,但客户端能够访问网页,是因为服务器有模块:httpd_sys_content_t

现在,服务器修改网页文件的类型

<code>[root@localhost html]#chcon -t var_t /var/www/html/index.html

[root@localhost html]#ls -Z

那么,现在客户端就无法访问到服务器的页面



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。