Linux SELinux 核心概念与管理

在这里插入图片描述

一、SELinux 基本概念

SELinux 即安全增强型 Linux(Security-Enhanced Linux),由美国国家安全局(NSA)开发,是一套基于强制访问控制(MAC)的安全机制,旨在解决传统 Linux 权限管理的安全隐患。

1. 与传统权限模型的区别

  • DAC(自主访问控制)
    传统 Linux 的权限管理方式,主体(用户)对目标文件的访问仅由文件的 rwx 权限决定。存在安全隐患:通过 suid/sgid 特殊权限可能被滥用,错误配置易引发漏洞。
  • MAC(强制访问控制)
    SELinux 采用的权限模型,主体(程序)访问目标文件时,必须同时满足 DAC 权限和 SELinux 安全策略,否则访问被拒绝。

2. DAC 与 MAC 的核心差异

特性DAC(自主访问控制)MAC(强制访问控制)
主体用户程序(进程)
决策依据仅文件本身的 rwx 权限文件权限 + SELinux 安全策略
灵活性高(用户可自主修改权限)严格(策略由系统管理员统一配置)
安全级别较低(易因配置错误导致漏洞)较高(强制限制所有访问行为)

二、SELinux 原理与特点

1. 核心原理

基于强制访问控制机制,在传统权限基础上,通过定义 “安全上下文标签” 和 “类型规则”,限制程序对文件 / 资源的访问:只有当程序的类型与目标文件的类型匹配(符合策略规则)时,访问才被允许。

2. 主要特点

  • 安全上下文标签(Context):所有文件、进程、端口等都被分配唯一的标签,用于标识其安全属性。
  • 双重权限检查:访问行为需同时通过传统 Unix 权限(DAC)和 SELinux 策略(MAC)检查。
  • 细粒度控制:可针对单个程序、文件或端口制定访问规则,而非仅依赖用户身份。

三、SELinux 安全策略与模式

1. 安全策略(Policy)

SELinux 通过预定义的策略文件控制访问规则,常见策略:

  • targeted(默认):仅对关键服务(如 httpd、sshd)施加严格限制,普通程序不受特殊限制,适用于 RHEL/CentOS 等发行版。
  • mls(多级安全):最高级别的安全策略,对所有进程和文件实施严格的多级访问控制,配置复杂,适用于高安全需求场景(如军事、金融)。

2. 运行模式

SELinux 的配置文件为 /etc/selinux/config(与 /etc/sysconfig/selinux 软链接一致),支持三种运行模式:

  1. enforcing(强制模式)
    启用 SELinux,严格执行策略,不符合规则的访问被拒绝并记录日志。
  2. permissive(警告模式)
    不拒绝访问,但会记录违反策略的行为(用于调试:判断问题是服务配置错误还是 SELinux 阻挡)。
  3. disabled(禁用模式)
    完全关闭 SELinux,需重启系统生效。

3. 模式管理命令

  • 查看当前模式:

    getenforce  # 输出:Enforcing / Permissive / Disabled
    
    [root@zhang3 /]# getenforce 
    Enforcing
  • 临时切换模式(无需重启,重启后失效):

    setenforce 0  # 切换为 Permissive 模式
    setenforce 1  # 切换为 Enforcing 模式
    
  • 永久切换模式:

    编辑 /etc/selinux/config ,修改 SELINUX 字段后重启:

    SELINUX=enforcing  # 或 permissive / disabled
    

四、安全上下文(Context)详解

安全上下文是 SELinux 的核心标识,由用户(u)、角色(r)、类型(t) 三部分组成,格式为:user:role:type
例如:unconfined_u:object_r:httpd_sys_content_t:s0

1. 查看安全上下文

  • 查看文件 / 目录的上下文:p

    ll -Z /abc/aa        # 查看文件 aa 的上下文
    ll -ldZ /abc/        # 查看目录 /abc 的上下文
    
[root@zhang3 /]# ll -Z
lrwxrwxrwx. root root system_u:object_r:bin_t:s0       bin -> usr/bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0      boot
drwxr-xr-x. root root system_u:object_r:device_t:s0    dev
drwxr-xr-x. root root system_u:object_r:etc_t:s0       etc
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
lrwxrwxrwx. root root system_u:object_r:lib_t:s0       lib -> usr/lib***************************
输出格式解析(以第一行为例)lrwxrwxrwx. root root system_u:object_r:bin_t:s0       bin -> usr/bin从左到右依次为:文件权限与类型:lrwxrwxrwx.
l 表示这是一个符号链接(软链接);
后续 rwxrwxrwx 是权限位;
末尾 . 表示该文件受 SELinux 控制。
所有者:root(文件的拥有者用户)。
所属组:root(文件所属的用户组)。SELinux 安全上下文:system_u:object_r:bin_t:s0
这是核心信息,由 4 部分组成,用冒号分隔:
system_u:用户(User),表示 SELinux 上下文的用户(system_u 是系统用户)。object_r:角色(Role),表示访问该对象的角色(object_r 是文件 / 目录等对象的默认角色)。bin_t:类型(Type),最关键的部分,决定了进程能否访问该文件。例如 bin_t 表示这是二进制程序目录的类型。s0:级别(Level),用于 MLS(多级安全)策略,默认 s0 表示最低级别。文件名 / 链接目标:bin -> usr/bin(表示 bin 是指向 usr/bin 的软链接)。
其他行说明
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot
d 表示 boot 是目录;
boot_t 是 /boot 目录的 SELinux 类型(用于系统启动相关文件)。
drwxr-xr-x. root root system_u:object_r:device_t:s0 dev
d 表示 dev 是目录;
device_t 是 /dev 目录的 SELinux 类型(用于设备文件,如 /dev/sda 等)。
  • 查看进程的上下文:

    ps -Z | grep httpd   # 查看 httpd 进程的上下文
    

2. 修改安全上下文

  • 临时修改(重启或 relabel 后失效)

    chcon -t tmp_t /abc/aa  # 将 /abc/aa 的类型改为 tmp_t
    
    • -t:指定类型(最常用的上下文部分)。
  • 恢复默认上下文
    当手动修改后需还原时,使用 restorecon

    restorecon -v /abc/aa  # 恢复 /abc/aa 的默认上下文(-v 显示详细信息)
    
  • 永久修改上下文
    通过 semanage 工具添加规则(需安装 policycoreutils-python 包):

    # 永久将 /abc 及其子目录的类型设为 tmp_t
    semanage fcontext -a -t tmp_t "/abc(/.*)?"
    restorecon -RFv /abc/  # 应用规则(-R 递归,-F 强制)
    

3. 标签混乱的修复

当系统上下文标签错乱时,可重打所有标签:

touch /.autorelabel  # 创建触发文件
reboot  # 重启后自动重新标记所有文件(耗时较长)

五、布尔开关(Boolean)管理

布尔开关是 SELinux 中用于动态调整策略的开关,可临时或永久开启 / 关闭特定规则(如允许 httpd 访问用户家目录)。

1. 查看布尔开关

getsebool -a  # 列出所有布尔开关及其状态
getsebool -a | grep http  # 筛选与 http 相关的开关

2. 修改布尔开关

  • 临时修改

    (重启后失效):

    setsebool ftpd_full_access on  # 允许 ftp 服务的完全访问权限
    
  • 永久修改(需 -P 参数):

    setsebool -P ftpd_full_access on  # 永久生效
    

六、端口标签管理

SELinux 对端口也有标签限制,只有当端口标签与服务类型匹配时,服务才能正常监听该端口(如 httpd 默认仅允许监听 http_port_t 类型的端口)。

1. 常用端口标签操作

  • 添加端口标签:

    # 允许 httpd 监听 8910/tcp 端口(将 8910 标记为 http_port_t)
    semanage port -a -t http_port_t -p tcp 8910
    
  • 查询端口标签:

    semanage port -l | grep 8910  # 查看 8910 端口的标签
    semanage port -l | grep http  # 查看 http 服务允许的端口
    
  • 修改端口标签:

    semanage port -m -t pegasus_http_port_t -p tcp 8910  # 改为 pegasus 类型
    
  • 删除端口标签:

    semanage port -d -t pegasus_http_port_t -p tcp 8910
    

总结

SELinux 通过强制访问控制(MAC)机制为 Linux 系统提供了额外的安全保障,其核心要素包括:

  • 安全上下文(Context):标识文件、进程的安全属性;
  • 布尔开关:动态调整策略规则;
  • 端口标签:限制服务可监听的端口。

在实际使用中,建议保持 enforcing 模式,通过 setenforce 0 临时排查问题,再通过 semanage 或布尔开关调整策略,而非直接禁用 SELinux。掌握 SELinux 管理是保障 Linux 系统安全的重要技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917907.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917907.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917907.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 中**未暂存**和**未跟踪**的区别:

文件状态分类 Git 中的文件有以下几种状态: 工作区文件状态: ├── 未跟踪 (Untracked) ├── 已跟踪 (Tracked)├── 未修改 (Unmodified) ├── 已修改未暂存 (Modified/Unstaged)└── 已暂存 (Staged)1. 未跟踪 (Untracked) 定义:Gi…

前端1.0

目录 一、 什么是前端 二、 HTML 1.0 概述 2.0 注释 三、开发环境的搭建 1.0 插件 2.0 笔记 四、 常见标签(重点) 四、案例展示(图片代码) 五、CSS引入 一、 什么是前端 web前端 用来直接给用户呈现一个一个的网页 …

Flutter镜像替换

一、核心镜像替换(针对 Maven 仓库) Flutter 依赖的 Google Maven 仓库(https://maven.google.com 或 https://dl.google.com/dl/android/maven2)可替换为国内镜像,常见的有:阿里云镜像(推荐&am…

MATLAB实现的改进遗传算法用于有约束优化问题

基于MATLAB实现的改进遗传算法(GA)用于有约束优化问题的代码,包括处理非线性约束。此代码通过引入惩罚函数和修复机制,有效处理约束条件,提高算法的鲁棒性和收敛速度。 1. 定义优化问题 % 定义目标函数 function f ob…

Qt子类化QWidget后,使用setStyleSheet设置样式无效的解决方案

关键代码&#xff1a; #include <QPainter> #include <QStyleOption>void paintEvent(QPaintEvent *e) {QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(e); }定义…

【python中级】关于Flask服务在同一系统里如何只被运行一次

【python中级】关于Flask服务在同一系统里如何只被运行一次 1.背景 2.方案1 2.方案2 1.背景 python Flask实现的一个http服务,打包成应用程序exe后在windows10系统运行; 由于我会不断的更新这个http服务,我希望运行这个http服务的时候之前的http服务被停掉; 即实现 Pytho…

git配置公钥/密钥

遇到 “gitgithub.com: Permission denied (publickey)” 错误通常意味着你尝试通过 SSH 连接到 GitHub 时&#xff0c;SSH 密钥没有被正确设置或者 GitHub 无法识别你的公钥。这里有几个步骤可以帮助你解决这个问题&#xff1a; 检查 SSH 密钥 首先&#xff0c;确保你已经在本…

【机器学习】“回归“算法模型的三个评估指标:MAE(衡量预测准确性)、MSE(放大大误差)、R²(说明模型解释能力)

文章目录一、MAE、MSE、r概念说明二、MAE&#xff08;平均绝对误差&#xff09;&#xff1a;用"房价预测"理解误差测量三、MSE&#xff08;均方误差&#xff09;&#xff1a;误差的"放大镜"1、概念说明2、 sklearn代码实践3、流程总结四、R&#xff1a;理解…

智慧城市SaaS平台|市容环卫管理系统

【生活垃圾中转设施监管】1) 设施信息管理a) 设施基本信息支持记录中转设施的名称、位置、类型、容量、负责人等基本信息。b) 设施分布地图支持通过GIS地图展示中转设施的分布情况&#xff0c;支持地图查询和导航。2) 垃圾收运监控a) 垃圾收运记录支持记录垃圾收运的时间、车辆…

JAVA-13常用类(2025.08.02学习记录)

String类String类equals方法String类compareTo方法String类valueOf方法boolean参数内存分析_字符串拼接只会在内存中开辟一个对象内存分析_字符串new创建对象内存分析_变量和字符串拼接字节码执行过程String类内存分析package com.cn;public class test01 {public static void …

QT----简单的htttp服务器与客户端

HTTP协议学习 协议的相关学习可以参考这篇 csdn学习连接 总体流程如下 HTTP服务器 监听ip和端口,有连接时接收请求,发送回复 server.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_httpServer.h" #include <QTcpServer> #include &l…

飞 算 JavaAI 解 析:有 了 它,麻 麻 再 也 不 用 担 心 我 不 会 写 代 码 了!

声 明&#xff1a;本 篇 博 客 为 测 评 体 验 非 广 告。 文 章 目 录一、产 品 简 介二、注 册 与 上 手方 法 一 - - - 从 IDEA 插 件 市 场 安 装方 法 二产 品 使 用三、产 品 体 验智 能 引 导 功 能理 解 需 求设 计 接 口表 结 构 设 计处 理 逻 辑生 成 源 码Java ch…

iOS混淆工具有哪些?在集成第三方 SDK 时的混淆策略与工具建议

许多 iOS 项目中&#xff0c;不可避免地会集成各种第三方 SDK&#xff0c;比如支付、统计、广告、社交登录等。这些 SDK 常常存在逆向被 Hook 或提取业务逻辑的风险&#xff0c;尤其是在流程敏感或要求合规的行业中。 当你无法对第三方源码进行控制或重新编译时&#xff0c;混淆…

【学习笔记之redis】删除缓存

有一串这个代码&#xff0c;staffEmailList这个key值里面的数据是错误的我需要删除它&#xff0c;把数据新的数据加载到redis缓存中。 public EmailAddressRespDTO getAllEmailAddress() { List<EmailAddressRespDTO> staffEmailList redisCache.getCacheList("s…

Redis 持久化机制浅析

1. 持久化机制的作用 Redis 是基于内存的数据结构数据库&#xff0c;虽然读写性能非常高&#xff0c;但所有数据默认保存在内存中。一旦服务器宕机、进程意外崩溃或容器重启&#xff0c;内存中的数据将全部丢失。这对于生产环境的可用性与可靠性是极其危险的。因此&#xff0c;…

使用MatterJs物理2D引擎实现重力和鼠标交互等功能,有点击事件(盒子堆叠效果)

使用MatterJs物理2D引擎实现重力和鼠标交互等功能&#xff0c;有点击事件&#xff08;盒子堆叠效果&#xff09; 效果图&#xff1a;直接上代码&#xff0c;我是用的是html&#xff0c;使用了MatterJs的cdn&#xff0c;直接复制到html文件中然后在浏览器打开即可 <!DOCTYPE …

如何玩转 Kubernetes K8S

在容器化时代&#xff0c;虽然Docker已经很强大了&#xff0c;但是在实际使用上还是有诸多不便&#xff0c;比如集群管理、资源调度、文件管理等等。 不过目前也涌现了很多解决方案&#xff0c;比如 Mesos、Swarm、Kubernetes 等等&#xff0c;其中谷歌开源的 Kubernetes就是其…

论文阅读笔记:Dataset Condensation with Gradient Matching

论文阅读笔记&#xff1a;Dataset Condensation with Gradient Matching1. 解决了什么问题&#xff1f;(Motivation)2. 关键方法与创新点 (Key Method & Innovation)2.1 核心思路的演进&#xff1a;从参数匹配到梯度匹配2.2 算法实现细节 (Implementation Details)3. 实验结…

网安学习no.22

一、基础系统信息命令&#xff08;简单入门&#xff09;uname作用&#xff1a;查看系统内核信息示例&#xff1a;uname -a&#xff08;显示完整内核版本、主机名、硬件架构等&#xff09;hostname作用&#xff1a;查看或设置主机名示例&#xff1a;hostname&#xff08;显示当前…

AJAX的引入

是的&#xff0c;AJAX 的一个主要特点就是通过 局部刷新 来实现与服务器的交互&#xff0c;而不需要重新加载整个页面。通过 AJAX&#xff0c;JavaScript 可以发送异步的 HTTP 请求&#xff0c;接收到响应数据后&#xff0c;更新页面的某个部分&#xff08;DOM&#xff09;。这…