Ubuntu 上使能 SELinux

news2024/11/25 22:29:38
  • 首发公号:Rand_cs

此文档说明如何在 ubuntu 上启用 SELinux,测试环境为虚拟机,开始前一定一定一定先来个快照,不要问我为什么有三个一定。

卸载 apparmor(可选)

ubuntu 默认安装的安全组件为 apparmor,网上文档说最好卸载掉 apparmor,可能冲突之类的问题,说法可能有点有误啊,apparmor 和 selinux 不兼容,当启用 selinux 后,apparmor 是不会生效的,所以应该是没有冲突这一说法,想卸载的可以执行以下命令。

sudo systemctl stop apparmor
sudo apt purge apparmor

安装 SELinux 相关包

sudo apt install selinux-basics

此命令会安装 SELinux default 策略,以及相关库、工具等等

sudo apt install auditd

auditd 用来收集 SELinux 相关日志,特别是访问拒绝日志

sudo apt install setools setoos-gui

包含了 SELinux 策略分析工具 apol

sudo apt install selinux-policy-dev

开发 selinux 相关程序需要用到此开发包

激活 SELinux

sudo selinux-activate

此命令做了两件事:

  1. 增加启动参数 security=selinux,意思是说系统的安全模块为 selinux,内核启动时,许多模块都需要传入相关参数,来开启或关闭某些功能。

    1. 启动参数位于 /boot/grub/grub.cfg 文件,sudo selinux-activate 之后我们可以看到如下字样:

    2. linux   /boot/vmlinuz-5.15.0-53-generic root=UUID=a1b7da65-54d8-415f-b4c0-6dc75fa37cf8 ro  security=selinux quiet splash $vt_handoff
      
    3. 当前系统的启动参数可以通过命令 cat /proc/cmdline 查看

  2. 在 / 根目录下创建 .autorelabel 文件,selinux 有一个开机自启动脚本,它会检查 .autorelabel 文件是否存在,如果存在,那么便会开始给整个文件系统上面的文件打上标签,可以理解为初始化客体安全上下文的操作,具体细节后面讲述。

    1. 这个开机自启动脚本为 /etc/init.d/selinux-autorelabel,但是 NOTE 开机的时候其实并不是直接执行此脚本,因为现在的 ubuntu 都是用 systemd,systemctl 这套服务启动,它兼容了老版 /etc/init.d/ 下面的启动脚本,会自动将这些脚本转换为 service 然后执行。

设置模式

SELinux 有三种模式:

  • disabled ,SELinux 处于禁止未启用的状态
  • permissive ,SELinux 对于白名单之外的所有访问只是记录日志,并不会真正的拒绝
  • enforcing ,SELinux 对于白名单之外的所有访问全部拒绝并记录日志

SELinux 的配置文件为 /etc/selinux/config,如下所示:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
# default - equivalent to the old strict and targeted policies
# mls     - Multi-Level Security (for military and educational use)
# src     - Custom policy built from source
SELINUXTYPE=default

# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

这是默认的配置,有两项重要的内容:

  • SELINUX=permissive,表示设置 SELinux 模式为 permissive,如果有变动,下次启动生效
  • SELINUXTYPE=default,此项的注释实在有点扰人,它其实表示当前 SELinux 策略为 default,在 /etc/selinux 目录下会有对应的目录 default,不同的策略在 /etc/selinux/ 下面都要有对应的目录,其内容为对应的策略文件,通过设置 SELINUXTYPE=xxx 可以切换不同的策略。

NOTE:第一次使能 SELinux 时,千万千万千万不要将设置 SELINUX=enforcing,千万千万千万不要执行 sudo selinux-config-enforcing命令,它会设置 SELINUX=enforcing。不要问我为什么有三个千万,网上有的教程就是让第一次使能 SELinux 的朋友执行 SELINUX=enforcing,这不是坑人吗

重启

重启 ubuntu,在启动时,应该会出现如下所示的界面:

请添加图片描述

这就是在为整个文件系统打标签,可能需要等待一会儿,因为给磁盘上文件打标签本质上是在设置文件的 xattr 属性,所以比较慢

SELinux 相关命令

按照上面的步骤,不出意外的话应该是可以正常启动的,不能正常启动的解决方法见后

sestatus 命令查看当前 SELinux 状态

rand@rand-virtual-machine:~$ sestatus 
SELinux status:                 enabled               //SELinux 处于使能状态
SELinuxfs mount:                /sys/fs/selinux       
SELinux root directory:         /etc/selinux
Loaded policy name:             default
Current mode:                   permissive           //SELinux 当前模式为 permissive,setenforce 命令可以修改
Mode from config file:          permissive           //config文件中记录的模式
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     requested (insecure)
Max kernel policy version:      33

其他项的含义后面再详述,这里看到状态为 enabled、模式为 permissive 就行

getenforce 可以查看当前的 SELinux 模式

rand@rand-virtual-machine:~$ getenforce
Permissive

setenforce 可以修改当前的模式,0 表示 permissive,1 表示 enforcing

SELinux 刚使能,不要去执行 setenforce 1开启 enforcing 模式,会死机的

ls -Z可以查看文件的安全上下文(标签)

rand@rand-virtual-machine:~$ ls -Z
system_u:object_r:user_home_t:s0 公共的
system_u:object_r:user_home_t:s0 模板
system_u:object_r:user_home_t:s0 视频
system_u:object_r:user_home_t:s0 图片

安全上下文总共由四部分组成,第三部分 user_home_t 则是前文说到的类型,这里表示 “视频” “图片” 这几个目录的类型为 user_home_t。其余部分后面再讲述

ps -Z 可以查看进程的安全上下文

rand@rand-virtual-machine:~$ ps -Z
LABEL                               PID TTY          TIME CMD
system_u:system_r:initrc_t:s0      2306 pts/0    00:00:00 bash
system_u:system_r:initrc_t:s0      2513 pts/0    00:00:00 ps

bash 这个进程的类型为 initrc_t

不能开机了?

不能正常开机,多半两个问题:

  1. SELinux 模式设置成了 enforcing 模式,前面一直强调不要设置为 enforcing 模式,是因为直接应用 default 默认策略会产生许多的拒绝访问,导致不能正常启动,所以需要设置为 permissive 模式
  2. 文件系统未正常标记,可能是 / 根目录下未正常创建 .autorelabel 文件导致的

如何解决呢?

修改启动参数

系统启动时按下 Esc 键,进入如下界面:

请添加图片描述

第一个选项中按下 e 键,进入如下界面:

请添加图片描述

找到 linux 这一行,这一行便是启动参数,这里添加 selinux=0,"="两边不要有空格,selinux=0 表示禁止 selinux

按下 ctrl+x 重启,不出意外的话可以正常重启,执行 sestatus 命令,发现 selinux 禁止了

rand@rand-virtual-machine:~$ sestatus 
SELinux status:                 disabled

NOTE,此种方式修改启动参数只当前启动有效,如果想要永久生效,可以自己手动修改 /boot/grub/grub.cfg 文件

如果出现意外了,还是不能重启?

recovery mode

同样的系统启动时 Esc 进入grub,然后选择 “Ubuntu 的高级选项”,英文应该是 “Advanced options for ubuntu”

请添加图片描述

然后选择一个 recovery mode 回车

请添加图片描述

选择 root

请添加图片描述

此时会拉起一个 shell,让你登录 root 账户,这里需要 root 的密码,root 密码可能需要进入系统进行初始设置但你又进不去系统,死锁?反正这里先假设你有 root 账户

获取到 root shell 之后,修改 /etc/selinux/config 文件中的 SELINUX=permissive,或者 SELINUX=disabled 直接禁掉

在 / 根目录下 touch .autorelabel创建文件,加一重保险,执行 echo -F > .autorelabel这是为了强制对文件系统按照当前策略配置文件打标签,具体原因后面篇章详述

设置完成后,reboot 重启,应该是能正常重启了

还不能重启?恢复快照吧,在初期不熟悉 SELinux 的时候,使能时可能会遇到各种感觉匪夷所思的问题,所以最好时备份一下。

好了,本文就先到这里,后面篇章再说明动态添加策略以开启 enforcing 模式的问题,有什么问题欢迎来讨论交流。

  • 首发公号:Rand_cs

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

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

相关文章

实时设计:带你0基础入门ComfyUI工作流#N3期AIGC训练营

想知道这个工作流是怎么实现的吗? 使用ComfyUI,一款基于Stable diffusion的节点式UI,低显存占用,完成SD使用流程的自动化。通过自定义的屏幕共享节点,调用实时LCM生成图像。 这个月还有 AI 训练营可以报名吗&#xff1…

第10关:基数排序

任务要求参考答案问答98 任务描述相关知识 基数排序算法编程要求测试说明 任务描述 本关任务:实现基数排序算法,并将乱序数列变成升序。 相关知识 为了完成本关任务,你需要掌握:1.基数排序算法。 基数排序算法 基数排序是按…

Android Studio 添加so无法打包进apk问题

1.开发环境: Android Studio 2022.3.1 Patch 2 jdk 17 gradle-7.4 2.build.grade配置检查 首先查看build.gradle中是否设置sourceSets ,如果设置的话,打包的时候so是被指导libs目录下的,所有就不能把jnilibs下。 sourceSets {mai…

MOSFET安全工作区域SOA

Safe Operating Area(SOA)即安全工作区:描述了当MOSFET工作在饱和区时可以处理的最大功率。超出安全工作区,则可能导致元件损坏。 SOA分为五个单独的界限,分别是RDS(on)限制 On Resistance(RDS(on)&#…

linux获得帮助_如何查看命令的用法、作用

Linux获得帮助 多层次的帮助: whatis command --help man and info /usr/share/doc/ Red Hat documentation 、Ubuntu documentation 软件项目网站 其它网站 搜索 whatis 使用数据库来显示命令的简短描述。 [rootlocalhost ~]# whatis rm rm (1) …

Android : SQLite 增删改查—简单应用

示例图: 学生实体类 Student.java package com.example.mysqlite.dto;public class Student {public Long id;public String name;public String sex;public int age;public String clazz;public String creatDate;//头像public byte[] logoHead;Overridepublic St…

JSP迭代标签之 forEach循环标签 基本使用讲解

好 之前我们讲完了 我们的条件动作标签 那么 我们来继续说 迭代标签 所谓迭代就是 将某个主体循环多次 也可以循环 集合 对象 map 这个标签叫 forEach items 就是 我们要循环的数据 注意 这里 操作的也是域对象中的值 begin 开始说 例如 i 0;i<x;i begin 就是开始数 当前…

COMSOL Multiphysics-软件功能详细介绍 COMSOL怎么创建3D模型

Comsol Multiphysics 是一款功能强大的多物理场建模和仿真软件&#xff0c;适用于 Mac 平台。它被广泛应用于工程、科学和研究领域&#xff0c;可以模拟和分析各种物理现象和工程问题。 使用 Comsol Multiphysics&#xff0c;用户可以建立复杂的物理模型&#xff0c;包括热传导…

如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

elementui的table合并列,三个一组

<el-table :span-method"objectSpanMethod" :cell-style"iCellStyle" :data"tableData" height"63vh" border style"width: 100%; margin-top: 6px"><el-table-column type"index" label"序号"…

RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取设备树中断信息实验

** 🚀返回专栏总目录 文章目录 一、获取中断资源API详解二、设备树三、驱动程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过OF函数获取设备树中断信息 。 一、获取中断资源API详解 ① irq_of_parse_and_map 函数 该函数的主要功能是解析设备节点…

Rust UI开发(四):iced中如何添加菜单栏(串口调试助手)

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第四篇&#xff0c;前三篇链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建UI时…

Doris_Doris导入常见问题

Doris数据导入错误 &#xff1a;the length of input is too larger than schema 可能原因&#xff1a;varchar长度设置过短 Doris表字段乱序 导入palo表中的csv本身无schema信息&#xff0c;csv与palo表字段顺序必须一致&#xff0c;否则会错乱 Doris数据文件中字段比表字段…

linux文件管理命令_切换创建复制移动删除查看修改

1.3 文件管理命令 1.3.1 cd&#xff1a;切换目录&#xff08;change directory&#xff09; cd 绝对路径/相对路径 # 根目录 [rootlocalhost ~]# cd / # 家目录 [rootlocalhost /]# cd [rootlocalhost /]# cd ~ # 父级目录 [rootlocalhost /]# cd .. # 返回上一次目录 [roo…

【vue】v-model在表单元素上的应用

表单元素&#xff1a; https://blog.csdn.net/m0_67930426/article/details/134655644 使用模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head><body>&l…

订单管理系统怎么用?有哪些好用的订单管理系统?

订单管理系统怎么用&#xff1f;有哪些好用的订单管理系统&#xff1f;阅读本文你将了解&#xff1a;1、订单管理系统的核心功能&#xff1b;2、订单管理系统的拓展功能&#xff1b;3、订单管理系统推荐。 订单管理系统在当今商业环境中扮演着至关重要的角色。它是企业内部运营…

Flink-执行拓扑图与作业调度

算子与作业提交 一、Flink执行模式1.流执行模式2.批执行模式 二、Flink拓扑图1.基本概念2.拓扑图生成过程 三、拓扑生成和优化1.应用程序2.逻辑视图3.算子链4.Task Slots 四、作业调度1.调度2.拓扑图数据结构3.Job状态转化4.Task状态转化 总结参考链接 一、Flink执行模式 Flin…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于深度强化学习的城市配电网多级动态重构优化运行方法》

这个标题涉及到城市配电网&#xff08;Urban Power Distribution Network&#xff09;的优化运行方法&#xff0c;其中使用了深度强化学习&#xff08;Deep Reinforcement Learning&#xff09;技术&#xff0c;并且特别强调了多级动态重构。 解读每个关键部分&#xff1a; 基…

Docker 概述与安装

文章目录 1. Docker简介2. 传统虚拟机和容器3. Docker运行速度快的原因4. Docker软件4.1 Docker镜像4.2 Docker容器4.3 Docker仓库 5. Docker架构6. CentOS安装Docker6.1 卸载旧版本6.2 配置yum资源库6.3 安装Docker引擎6.4 启动docker引擎6.5 设置开机自启 7. 卸载Docker8. 运…

【C++初阶】五、类和对象(日期类的完善、流运算符重载函数、const成员、“”取地址运算符重载)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】四、类和对象 &#xff08;构造函数、析构函数、拷贝构造函数、赋值运算符重载函数&#xff09;-CSDN博客 一 . 日期类的完善 此次日期类的成员函数&#xff0c;采用声明…