当前位置: 首页 > news >正文

SELinux

一、selinux技术详解

SELinux 概述

SELinux,即 Security-Enhanced Linux,意为安全强化的 Linux,由美国国家安全局(NSA)主导开发。开发初衷是防止系统资源被误用。在 Linux 系统中,系统资源的访问均通过程序进行。例如,当/var/www/html/目录的权限被设置为 777 时,所有程序都能访问该目录。若此时 Web 服务器软件已启动,其触发的进程便可以写入该目录,而该进程面向整个互联网提供服务,存在安全风险。为解决这类权限与进程管控问题,NSA 以 Linux 为研究对象,最终将研究成果整合到 Linux 内核中,SELinux 由此诞生。

SELinux 的作用机制

SELinux 本质是一个内核模块,用于设置程序、文件等的访问权限。由于网络服务同样由程序启动,SELinux 能够有效控制网络服务对系统资源的访问,从而为系统安全提供保障。

传统访问控制机制:自主访问控制(DAC)

在传统的 Linux 系统中,文件权限与账号的关系基于自主访问控制(DAC,Discretionary Access Control)模型。当一个进程试图访问文件时,系统会依据进程的所有者或用户组,对比文件的权限设置。若权限检查通过,进程便能访问该文件。但需要注意的是,各种权限设置对 root 用户无效,root 用户可绕过权限限制进行访问。

SELinux 的访问控制机制:强制访问控制(MAC)

SELinux 引入了强制访问控制(MAC,Mandatory Access Control)模型。该模型可以针对特定的进程和文件资源进行精确的权限控制。在 MAC 模型下,即使用户以 root 身份运行,不同进程所获得的权限并非固定为 root 权限,而是取决于进程的具体设置。这使得系统能够基于进程而非用户来控制文件访问,大大增强了系统的安全性。此外,进程不能随意访问系统文件资源,因为每个文件资源都针对不同进程设置了相应的访问权限。

鉴于系统中进程和文件数量庞大,SELinux 提供了一些默认策略(policy)。这些策略包含多个规则,用户可根据实际需求选择是否启用特定的控制规则,灵活配置系统的访问控制策略 。

二、SELinux 的工作原理

SELinux 采用强制访问控制(MAC)机制管理进程,将进程作为控制主体,把进程能否读取的文件资源作为控制目标。

(1)关键概念

  1. 主体(subject):即进程,是发起资源访问请求的一方。
  2. 目标(object):指被主体访问的资源,涵盖文件、目录、端口等。
  3. 策略(policy):鉴于系统中进程和文件数量众多,SELinux 依据不同服务制定基础的访问安全策略。这些策略包含详细的规则(rule),用以规定不同服务对特定资源的访问权限。当前,主要策略类型如下:
    • targeted:对网络服务限制较多,对本地服务限制相对较少,为默认策略。
    • strict:提供全面且严格的 SELinux 限制。
  4. 安全上下文(security context):主体能否访问目标,不仅取决于策略设定,主体与目标的安全上下文也必须匹配。

(2)安全上下文详解

通过ls -Z命令可查看文件的安全上下文。例如:

[root@localhost ~]# ls -Z
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 home

安全上下文由冒号分隔为四个字段:Identify:role:type:

  1. 身份标识(Identify):类似账号身份标识,常见类型有:
    • root:代表 root 账号身份。
    • system_u:表示程序标识,通常用于进程。
    • unconfined_u:与普通用户账号相关。
  2. 角色(role):通过该字段可判断数据属于程序、文件资源还是用户。常见角色有:
    • object_r:代表文件或目录等文件资源。
    • system_r:代表进程。
  3. 类型(type):在默认的 targeted 策略中,身份标识和角色字段重要性相对较低,类型字段才是关键。文件和进程对类型的定义有所不同:
    • type:用于文件资源。
    • domain:用于主体程序。只有当 domain 与 type 相互匹配,程序才能顺利读取文件资源。
  4. 灵敏度分级:最后一个字段与 MLS 和 MCS 相关,代表灵敏度,常用 s0、s1、s2 等命名,数字越大,灵敏度越高。

(3)访问过程示例

以 httpd 服务为例,使用ll -Zd命令查看相关文件:

[root@localhost ~]# ll -Zd /usr/sbin/httpd /var/www/html/
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
  1. 触发/usr/sbin/httpd可执行文件,其类型为httpd_exec_t
  2. 该文件使进程具有httpd域,SELinux 策略针对此域制定了众多规则,包括可读取的目标资源类型。
  3. 由于httpd域被设定为可读取httpd_sys_content_t类型的目标文件,因此 httpd 进程能够读取/var/www/html/目录下的文件。
  4. 最终能否成功读取/var/www/html/目录下的数据,还需符合 Linux 传统权限(rwx)的规定。

三、SELinux 的启动、关闭与查看

(1)SELinux 的三种模式

  1. enforcing:强制模式,SELinux 正常运行,对 domain/type 进行严格限制。
  2. permissive:宽容模式,SELinux 运行,但仅产生警告信息,不实际限制 domain/type 的访问。
  3. disabled:关闭模式,SELinux 未实际运行。

(2)模式与策略查看

  1. 查看当前模式:使用getenforce命令,示例如下:
[root@localhost ~]# getenforce
Enforcing
  1. 查看当前 SELinux 使用的策略:使用sestatus命令,示例如下:
[root@localhost ~]# sestatus
SELinux status: enabled     # 是否启用selinux
SELinuxfs mount: /sys/fs/selinux     # selinux的相关文件数据挂载点
SELinux root directory: /etc/selinux
Loaded policy name: targeted     # 目前的策略
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
  1. 查看 SELinux 的策略配置文件:使用vim /etc/selinux/config命令。

(3)模式切换方法

在 enforcing 和 permissive 之间切换,可使用以下命令:

setenforce 0     # 转换成permissive宽容模式
setenforce 1    # 转换成enforcing强制模式

(4)修改安全上下文

  1. chcon 命令
    • 基本格式chcon [-R] [-t type] [-u user] [-r role] 文件
      • -R:递归修改目录及其子目录的安全上下文。
      • -t:指定安全上下文的类型字段。
      • -u:指定身份识别。
      • -r:指定角色。
    • 参考范例文件修改chcon [-R] --reference=范例文件 文件
  2. restorecon 命令restorecon [-Rv] 文件或目录
    • -R:递归修改子目录。
    • -v:显示修改过程。
      系统将每个目录的默认 SELinux type 类型记录在/etc/selinux/targeted/contexts/目录内。可使用semanage命令查询和修改,基本格式如下:
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec

其中,-l用于查询,-a用于添加目录的默认安全上下文设置,-m用于修改,-d用于删除。

四、SELinux 对 Linux 服务的影响

实验一:httpd 服务安全上下文值设定

1. 服务端配置:服务端 IP 地址为 192.168.121.131,执行以下操作:

[root@localhost ~]# systemctl disable  firewalld --now
[root@localhost ~]# getenforce 
Enforcing
[root@localhost ~]# vim /etc/httpd/conf.d/host.conf
    <directory /www>
        allowoverride none
        require all granted
    </directory>
    <virtualhost 192.168.121.131:80>
        documentroot /www/80
        servername 192.168.121.131
    </virtualhost>
[root@localhost ~]# mkdir -pv  /www/80 
[root@localhost ~]# echo this is 80 > /www/80/index.html
[root@localhost ~]# systemctl restart httpd

通过客户端测试,只能访问到 http 服务的测试界面。
2. 修改自定义目录的安全上下文

[root@localhost ~]# chcon -t httpd_sys_content_t /www/ -R
[root@localhost ~]# chcon -R --reference=/var/www/html /www

修改后即可成功访问。

实验二:web 服务端口改变时的端口设定

1. 修改配置文件

[root@localhost ~]# vim /etc/httpd/conf.d/host.conf 
    <directory /www>
        allowoverride none
        require all granted
    </directory>
    listen 8888
    <virtualhost 192.168.121.131:8888>
        documentroot /www/8888
        servername 192.168.121.131
    </virtualhost>
[root@localhost ~]# mkdir /www/8888
[root@localhost ~]# echo this is 8888 > /www/8888/index.html
[root@localhost ~]# systemctl restart httpd

服务重启失败,通过tail -f /var/log/messages查看日志。
2. 添加 8888 端口为服务端口:

[root@localhost ~]# semanage port -a -t http_port_t -p tcp 8888
[root@localhost ~]# systemctl restart httpd 

测试可访问成功。

http://www.dtcms.com/a/108620.html

相关文章:

  • Leetcode-100 二分查找常见操作总结
  • 数据点燃创新引擎:数据驱动的产品开发如何重塑未来?
  • Airflow量化入门系列:第一章 Apache Airflow 基础
  • 红宝书第二十五讲:客户端存储(Cookie、localStorage、IndexedDB):浏览器里的“记忆盒子”
  • Leetcode 6233 -- DFS序列 | 两遍DFS
  • Vue中JSEncrypt 数据加密和解密处理
  • Firefox账号同步书签不一致(火狐浏览器书签同步不一致)
  • wireshak抓手机包 wifi手机抓包工具
  • linux 时钟
  • 【爬虫】网页抓包工具--Fiddler
  • 【Audio开发二】Android原生音量曲线调整说明
  • LInux基础指令(二)
  • 【VS+Qt】vs2022打开 vs2015项目
  • FastAPI中Pydantic异步分布式唯一性校验
  • 机器视觉调试——现场链接相机(解决各种相机链接问题)
  • 自然语言处理(22:(第六章2.)​seq2seq模型的实现​)
  • 图片懒加载、无限滚动加载、监听元素进入视口加载数据。「IntersectionObserver」
  • scala编程语言
  • 服务器数据恢复—Raid6阵列硬盘故障掉线,上层虚拟机数据如何恢复?
  • linux-firewalld防火墙允许端口
  • 【SLAM经典算法详解】Ubuntu 20.04部署LeGO-LOAM:从环境配置到KITTI适配,解决常见编译错误
  • 从零开发美颜SDK:美颜滤镜API的核心技术与实现
  • 多视图几何--立体校正--Fusiello方法
  • CMake学习--如何在CMake中编译静态库、动态库并在主程序中调用
  • rag精细化测试
  • 论坛系统的测试
  • win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目1
  • Docker in Docker(Dind)
  • 深入解析 Git Submodule:从基础到高级操作指南
  • 电子电气架构 --- 控制器级架构