1️⃣ selinux基础

    SELINUX 安全增强型linux 简称SElinux,它是一个linux内核模块,也是linux的一个安全子系统,selinux主要由美国国家安全局开发
    SElinux主要作用就是最大限度的减小系统中访问进程可访问的资源(最小权限原则)
    在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。只要访问这个资源的进程符合以上的条件就可以被访问。进程理论上所拥有的权限与执行它的用户的权限相同。比如,以root用户启动Browser,那么Browser就有root用户的权限,在Linux系统上能干任何事情。root 用户不受任何管制,系统上任何资源都可以无限制地访问。
    在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。
    这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。
    即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内,安全性大大增加。
  
SElinux 基本概念
    linux中一切皆为文件,而操作文件的为进程,进程可以发起动作,比如它可以打开文件并操作它。而文件只能被进程操作。
    1.主体(Subject):
        就是想要访问文件或目录资源的进程。想要得到资源,用户启用进程,进程去访问对应的文件和配置文件。在自主访问控制系统中,也就是linux默认权限,靠权限控制的主体是用户(DAC);而在强制访问控制系统中,SElinux,靠策略控制的主机则是进程(MAC)。
    3.对象(Object)
        为主体访问的资源,也被称为课题。可以是文件、目录、端口、设备等
    3. 政策和规则(Policy & Rule)
        Linux 系统中进程与文件的数量庞大,那么限制进程是否可以访问文件的 SELinux 规则数量就更加烦琐,如果每个规则都需要管理员手工设定,那么SELinux 的可用性就会极低。还好我们不用手工定义规则,SELinux 默认定义了两个策略,规则都已经在这两个策略中写好了,默认只要调用策略就可以正常使用了,selinux中又三个策略,它们都可以在/etc/selinux/conf中配置:
            1. targeted:对大部分网络服务进程进行管制。这是系统默认使用的政策。
            2. minimum:以 targeted 为基础,仅对选定的网络服务进程进行管制。一般不用。
            3. mls:多级安全保护。对所有的进程进行管制。这是最严格的政策,配置难度非常大。一般不用,除非对安全性有极高的要求
        
安全上下文:
    1.安全上下文件是SElinux的核心,爱着你上下文件即标签
    2.安全上下文件分为 “进程安装上下文件” 和 "文件安全上下文"
    3.一个 “进程安全上下文件” 一般对应多个 “文件安全上下文”,进程安全上下文件和进程安全上下文件对应上,进程才能访问文件。进程安全上下文件由文件创建的位置和创建文件的进程所决定,而且系统又一套默认值,用户也可以对默认值进行设定。
    4.如果是但寻的移动文件并不会改变文件的安全上下文

安全上下文件又四个字段分别用冒号隔开列如u:object_r:init_exec:s0()
    •u为user的意思。SEAndroid中定义了一个SELinux用户,值为u。
    •r为role的意思。role是角色之意,它是SELinux中一种比较高层次,更方便的权限管理思路,即Role Based Access Control(基于角色的访问控制,简称为RBAC)。简单点说,一个u可以属于多个role,不同的role具有不同的权限。
    •init_exec,代表该文件所属的type为init_exec。如果是进程,该字段通常称为domain。MAC的基础管理思路其实不是针对上面的RBAC,而是所谓的Type Enforcement Accesc Control(简称TEAC,一般用TE表示)。对进程来说,Type就是Domain。Domain有什么权限,都需要政策和规则说明。
    •S0和SELinux为了满足军用和教育行业而设计的Multi-Level Security(MLS)机制有关。简单点说,MLS将系统的进程和文件进行了分级,不同级别的资源需要对应级别的进程才能访问。

image-20240919221015857

image-20240919221021753

image-20240919221024572

当主体想要访问目标时,如果系统中启动了 SELinux,则主体的访问请求首先需要和 SELinux 中定义好的策略进行匹配。如果进程符合策略中定义好的规则,则允许访问,这时进程的安全上下文就可以和目标的安全上下文进行匹配;如果比较失败,则拒绝访问,并通过 AVC(Access Vector Cache,访问向量缓存,主要用于记录所有和 SELinux 相关的访问统计信息)生成拒绝访问信息。如果安全上下文匹配,则可以正常访问目标文件。当然,最终是否可以真正地访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的读、写、执行权限。

我们在进行 SELinux 管理的时候,一般只会修改文件或目录的安全上下文,使其和访问进程的安全上下文匹配或不匹配,用来控制进程是否可以访问文件或目录资源;而很少会去修改策略中的具体规则,因为规则实在太多了,修改起来过于复杂。不过,我们是可以人为定义规则是否生效,用以控制规则的启用与关闭的。

2️⃣ selinux工作模式

Disable工作模式(关闭模式)

在 Disable 模式中,SELinux 被关闭,默认的 DAC 访问控制方式被使用。对于那些不需要增强安全性的环境来说,该模式是非常有用的。

例如,若从你的角度看正在运行的应用程序工作正常,但是却产生了大量的 SELinux AVC 拒绝消息,最终可能会填满日志文件,从而导致系统无法使用。在这种情况下,最直接的解决方法就是禁用 SELinux,当然,你也可以在应用程序所访问的文件上设置正确的安全上下文。

需要注意的是,在禁用 SELinux 之前,需要考虑一下是否可能会在系统上再次使用 SELinux,如果决定以后将其设置为 Enforcing 或 Permissive,那么当下次重启系统时,系统将会通过一个自动 SELinux 文件重新进程标记。

关闭 SELinux 的方式也很简单,只需编辑配置文件 /etc/selinux/config,并将文本中 SELINUX= 更改为 SELINUX=disabled 即可,重启系统后,SELinux 就被禁用了。

Permissive工作模式(宽容模式)

在 Permissive 模式中,SELinux 被启用,但安全策略规则并没有被强制执行。当安全策略规则应该拒绝访问时,访问仍然被允许。然而,此时会向日志文件发送一条消息,表示该访问应该被拒绝。

SELinux Permissive 模式主要用于以下几种情况:
审核当前的 SELinux 策略规则;
测试新应用程序,看看将 SELinux 策略规则应用到这些程序时会有什么效果;
解决某一特定服务或应用程序在 SELinux 下不再正常工作的故障。

某些情况下,可使用 audit2allow 命令来读取 SELinux 审核日志并生成新的 SELinux 规则,从而有选择性地允许被拒绝的行为,而这也是一种在不禁用 SELinux 的情况下,让应用程序在 Linux 系统上工作的快速方法。

Enforcing工作模式(强制模式)

从此模式的名称就可以看出,在 Enforcing 模式中, SELinux 被启动,并强制执行所有的安全策略规则

三种模式切换:
    geteforce 查看当前SElinux模式
    seteforce 0 | 1  关闭 | 开启 selinux
    disable关闭和其他两种模式无法互相切换
    在启动内核传递参数类设置启动后的SElinux模式

3️⃣ 管理文件的上下文

ls -Z 查看文件、目录的安全上下文
chcon -t [type] [目录/文件] 重启不会失效,但是系统在重新打标签的时候,才会修改为默认的
    -t     指定文件上下文类型
安全上下文目录都在/etc/selinux/targeted/contexts/files目录下的file_contexts 
semanage fcontext -a -t  [type] [目录/文件格式(/目录名(/.*)?)]
restorecon -v [目录/文件]    还原文件的默认上下文
    -v 查看详细信息
    -R 递归修改目录

4️⃣ SElinux的布尔值

SElinux布尔值是可以更改Selinux策略行为的参数,SElinux布尔值可以启用和警用规则来有效的调整策略

    也就是说selinux 布尔值是用来管控应用的行为,就是一个开关,但是这个开关决定这个应用有什么行为

使用 semanage boolean -l 查看所有的布尔值,只有root可以执行这条命令

如果想要设置具体某个应用的boolean值就需要去搜索查找相对应的值的开关作用
列如:

httpd_selinux(8) - Linux man page (die.net) 查看httpd selinux的作用

5️⃣ 实验1

端口:
    1. 查看seliunx配置文件查看是否打开selinux
        [root@abc ~]# cat /etc/selinux/config  | grep -v "^#"

        SELINUX=enforcing
        SELINUXTYPE=targeted
    2. 配置好yum源,下载nginx或者httpd服务
        yum install -y nginx 
    3. 查看selinux策略允许设置的端口值,查看时不允许设置为82的
        [root@abc ~]# semanage port -l | grep http
        http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
    4. 修改配置文件,将监听端口设置为82
    [root@abc ~]# cat /etc/nginx/nginx.conf | grep listen
        listen       82 default_server;
        listen       [::]:82 default_server;
    5. 启动nginx服务看看是否会被seliunx拦截,查看日志,显示监听端口82,权限拒绝
        Sep 17 03:31:29 abc.com nginx[13008]: nginx: [emerg] bind() to 0.0.0.0:82 failed (13: Permission denied)
    6. 修改策略添加82端口再次重启,就可以重启成功
        [root@abc ~]# semanage port -a -t http_port_t -p tcp 82

                                                     

6️⃣ 实验2

配置yum源(rhel8自带nginx)下载nginx
yum install -t nginx
下载启动nginx
systemctl restart nginx
启动完成后,使用宿主机查看是否可以访问,如果不可以放行防火墙或者关系防火墙
    1.systemctl stop firewalld
    2. firewall-cmd --permanent --add-port=80
关闭防火墙查看nginx的/usr/share/nginx/html目录下的安全上下文,此目录是默认访问目录
    [root@abc html]# ls -Z
    system_u:object_r:httpd_sys_content_t:s0 404.html
    system_u:object_r:httpd_sys_content_t:s0 50x.html
    system_u:object_r:httpd_sys_content_t:s0 index.html
    system_u:object_r:httpd_sys_content_t:s0 nginx-logo.png
    system_u:object_r:httpd_sys_content_t:s0 poweredby.png
修改index.html的上下文件
    chcon -t default_context_t index.html
修改完成后再次打开浏览器访问会报错403