SELinux

news2025/7/29 14:12:40

一、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.coloradmin.cn/o/2327601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6对函数参数的新设计

ES6 对函数参数进行了新的设计&#xff0c;主要添加了默认参数、不定参数和扩展参数&#xff1a; 不定参数和扩展参数可以认为恰好是相反的两个模式&#xff0c;不定参数是使用数组来表示多个参数&#xff0c;扩展参数则是将多个参数映射到一个数组。 需要注意&#xff1a;不定…

LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版

LLaMA Factory微调后的大模型Chat对话效果&#xff0c;与该模型使用vLLM推理架构中的对话效果&#xff0c;可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定&#xff1a;有一半是对的&#xff0c;有一半是无关的。 1、未…

群体智能优化算法-鹈鹕优化算法(Pelican Optimization Algorithm, POA,含Matlab源代码)

摘要 鹈鹕优化算法&#xff08;Pelican Optimization Algorithm, POA&#xff09;是一种灵感来自自然界鹈鹕觅食行为的元启发式优化算法。POA 模拟鹈鹕捕食的两个主要阶段&#xff1a;探索阶段和开发阶段。通过模拟鹈鹕追捕猎物的动态行为&#xff0c;该算法在全局探索和局部开…

在 Blazor 中使用 Chart.js 快速创建数据可视化图表

前言 BlazorChartjs 是一个在 Blazor 中使用 Chart.js 的库&#xff08;支持Blazor WebAssembly和Blazor Server两种模式&#xff09;&#xff0c;它提供了简单易用的组件来帮助开发者快速集成数据可视化图表到他们的 Blazor 应用程序中。本文我们将一起来学习一下在 Blazor 中…

SQL server 2022和SSMS的使用案例1

一&#xff0c;案例讲解 二&#xff0c;实战讲解 实战环境 你需要确保你已经安装完成SQL Server 2022 和SSMS 20.2 管理面板。点此跳转至安装教程 SQL Server2022Windows11 专业工作站SSMS20.2 1&#xff0c;连接数据库 打开SSMS&#xff0c;连接数据库。 正常连接示意图&…

GO语言学习(14)GO并发编程

目录 &#x1f308;前言 1.goroutine&#x1f31f; 2.GMP模型&#x1f31f; 2.1 GMP的由来☀️ 2.2 什么是GMP☀️ 3.channel &#x1f31f; 3.1 通道声明与数据传输&#x1f4a5; 3.2 通道关闭 &#x1f4a5; 3.3 通道遍历 &#x1f4a5; 3.4 Select语句 &#x1f4…

【Audio开发二】Android原生音量曲线调整说明

一&#xff0c;客制化需求 客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。 二&#xff0c;音量曲线调试流程 Android根据不同的音频流类型定义不同的曲线&#xff0c;曲线文件存放在/vendor/etc/audio_policy_volumes.xml或者default_volu…

spring-security原理与应用系列:HttpSecurity.filters

目录 AnyRequestMatcher WebSecurityConfig HttpSecurity AbstractInterceptUrlConfigurer AbstractAuthenticationProcessingFilter 类图 在前面的文章《spring-security原理与应用系列&#xff1a;securityFilterChainBuilders》中&#xff0c;我们遗留了一个问题&…

JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略

本文已收录于《JVM生产环境问题定位与解决实战》专栏&#xff0c;完整系列见文末目录 引言 在前五篇文章中&#xff0c;我们深入探讨了JVM生产环境问题定位与解决的实战技巧&#xff0c;从基础的jps、jmap、jstat、jstack、jcmd等工具&#xff0c;到JConsole、VisualVM、MAT的…

并行治理机制对比:Polkadot、Ethereum 与 NEAR

治理是任何去中心化网络的基础。它塑造了社区如何发展、如何为创新提供资金、如何应对挑战以及如何随着时间的推移建立信任。随着 Web3 的不断发展&#xff0c;决定这些生态系统如何做出决策的治理模型也在不断发展。 在最近的一集的【The Decentralized Mic】中, Polkadot 汇…

TDengine tar.gz和docker两种方式安装和卸载

下载地址 3.1.1.0 Linux版本 安装包 下载地址 3.1.1.0 docker 镜像 下载地址 3.1.1.0 Window客户端 1. 将文件上传至服务器后解压 tar -zxvf TDengine-server-3.1.1.0-Linux-x64.tar.gz 2. tar.gz安装 解压文件后&#xff0c;进入相应子目录&#xff0c;执行其中的 install.…

【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)

本课题为基于单片机的智能门禁系统&#xff0c;整个系统由AS608指纹识别模块&#xff0c;矩阵键盘&#xff0c;STM32F103单片机&#xff0c;OLED液晶&#xff0c;RFID识别模块&#xff0c;继电器&#xff0c;蜂鸣器等构成&#xff0c;在使用时&#xff0c;用户可以录入新的指纹…

java知识梳理(二)

一.lambda表达式 作用&#xff1a;Lambda 表达式在 Java 8 引入&#xff0c;主要用于简化匿名内部类的写法&#xff0c;特别是在函数式编程场景中&#xff0c;比如 函数式接口、流式 API&#xff08;Streams&#xff09;、并发编程等。它让 Java 代码更简洁、可读性更强&#x…

鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染

本文以同层渲染为例&#xff0c;介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下&#xff0c;通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…

AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用

目前&#xff0c;流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型&#xff0c;能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

尚语翻译图册翻译|专业图册翻译|北京专业翻译公司推荐|专业文件翻译报价

内容概要 尚语翻译公司聚焦多语种产品图册翻译的竞价推广服务&#xff0c;通过行业垂直化运营构建差异化竞争力。其核心服务覆盖机械制造、医疗器械、电子元件三大领域&#xff0c;依托ISO 17100认证的翻译流程和Trados术语管理系统&#xff0c;实现技术文档的精准转化。为提升…

LeetCode 解题思路 30(Hot 100)

解题思路&#xff1a; 递归参数&#xff1a; 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。递归过程&#xff1a; 当当前路径 path 的长度等于 n * 2 时&#xff0c;说明已经生成有效括号&#xff0c;加入结果集。若左括号数小于 n&…

Java EE(18)——网络原理——应用层HTTP协议

一.初识HTTP协议 HTTP(HyperText Transfer Protocol&#xff0c;超文本传输协议)是用于在客户端&#xff08;如浏览器&#xff09;和服务器之间传输超媒体文档&#xff08;如HTML&#xff09;的应用层协议。 HTTP协议发展至今发布了多个版本&#xff0c;其中1.0&#xff0c;1.…

强大而易用的JSON在线处理工具

强大而易用的JSON在线处理工具&#xff1a;程序员的得力助手 在当今的软件开发世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已经成为了数据交换的通用语言。无论是前端还是后端开发&#xff0c;我们都经常需要处理、验证和转换JSON数据。今天&a…

Qt笔记----》不同环境程序打包

文章目录 概要1、windows环境下打包qt程序2、linux环境下打包qt程序2.1、程序目录2.2、创建一个空文件夹2.3、添加依赖脚本2.4、打包过程2.4.1、添加程序依赖库2.4.2、添加Qt相关依赖库 概要 qt不同运行环境下打包方式&#xff1a;windows/linux 1、windows环境下打包qt程序 …