• 首发公号: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

Ubuntu 上使能 SELinux的更多相关文章

  1. 在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

    这里,我们不会为真实的硬件设备编写内核驱动程序.为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写.想起我们第一次学习程序语 ...

  2. 在Ubuntu上使用离线方式快速安装K8S v1.11.1

    在Ubuntu上使用离线方式快速安装K8S v1.11.1 0.安装包文件下载 https://pan.baidu.com/s/1nmC94Uh-lIl0slLFeA1-qw v1.11.1 文件大小 ...

  3. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  4. Ubuntu 上搭建 Samba 服务器

    由于经常要接收同事发送的一些文件,U盘拷来拷去的很麻烦. 在本机Ubuntu上搭了各Samba服务器,过程中遇到点小问题,记录一下 sudo apt-get install samba 创建一个共享目 ...

  5. 微软KinectV2深度传感器在Ubuntu上的配置和使用

    最新博客地址已转到: http://blog.csdn.net/zzlyw?viewmode=contents   ------------------------------------------ ...

  6. .NET跨平台:在Linux Ubuntu上编译coreclr/corefx/dnx(20150617)

    编译时间:北京2015年6月17日上午 操作系统:Ubuntu 14.04.2 LTS Mono版本:Mono JIT compiler version 4.3.0 (master/3445ac5 T ...

  7. [异常解决] ubuntu上安装JLink驱动遇到的坑及给后来者的建议

    一.前言 最近将整个电脑格式化,改成了linux操作系统 希望这样能让自己在一个新的世界探索技术.提升自己吧- win上的工具用多了,就不想变化了- 继上一篇<ubuntu上安装虚拟机遇到的问题 ...

  8. Ubuntu上安装Robomongo及添加到启动器

    到目前为止,Robomongo仍是MongoDB最好的客户端管理工具,如需在Ubuntu上安装Robomongo,可直接从官网下载.tar.gz压缩包进行解压,然后直接运行bin目录下的robomon ...

  9. 介绍两个Ubuntu上的桌面小工具

    经常使用Windows10,Sticky Notes和壁纸自动切换功能挺好用的.我经常会使用Sticky Notes来记录一些信息,内容是实时保存的,而且启动的时候会自动显示在桌面上.其实Ubuntu ...

  10. 在 Ubuntu 上安装 Android Studio

    在 Ubuntu 上安装 Android Studio http://www.linuxidc.com/Linux/2013-05/84812.htm 打开terminal,输入以下命令 sudo a ...

随机推荐

  1. javascript现代编程系列教程之X——javascript人工智能

    JavaScript 在人工智能(AI)领域的应用主要体现在以下几个方面: 浏览器端的机器学习:TensorFlow.js 是一个在浏览器中运行的 JavaScript 机器学习库,它允许开发者训练和 ...

  2. SQL SERVER 数据库性能优化与管理从零基础到走两步系列(一)——性能计数器

    前辈大佬资料: 使用性能监视器找出SQLServer硬件瓶颈 在网络上苦苦流浪了近十几个小时,从百度到谷歌,从CSDN到博客园,从知乎到微信读书,看了无数本滥竽充数的书,读了无数篇夹生的技术文章,快下 ...

  3. 融合数据库生态:利用 EventBridge 构建 CDC 应用

    简介: 近期,EventBridge 事件流已经支持了基于阿里云 DTS服务的 CDC 能力.本文将从 CDC.CDC 在 EventBridge 上的应用以及若干最佳实践场景等方面,为大家介绍如何利 ...

  4. Flink 在有赞的实践和应用

    简介: 本文介绍了Flink 在有赞的实践和应用,内容包括:Flink 的容器化改造和实践.Flink SQL 的实践和应用.未来规划. 作者:沈磊 一.Flink 的容器化改造和实践 1. 有赞的集 ...

  5. LlamaIndex 高层次概念

    本篇内容为您快速介绍在构建基于大型语言模型(LLM)的应用程序时会频繁遇到的一些核心概念. 增强检索生成(RAG) LLM 是基于海量数据训练而成,但并未涵盖您的具体数据.增强检索生成(Retriev ...

  6. WPF 自定义控件入门 可重写的各个方法或属性的意义

    本文属于 WPF 自定义控件入门系列博客.本文整理在 WPF 里面,自定义控件,非用户控件时,可以重写基类的许多方法和属性,这些方法和属性的作用和含义.方便让大家了解到自定义控件时,有哪些方法或属性可 ...

  7. Fixing Missing Windows App Runtime Environment Prompt for Unpackaged WinUI 3 Applications

    This article will tell you how to fix the prompt for a missing Windows App Runtime environment when ...

  8. 2019-7-3-Roslyn-理解-msbuild-的清理过程

    title author date CreateTime categories Roslyn 理解 msbuild 的清理过程 lindexi 2019-07-03 18:21:25 +0800 20 ...

  9. 模型压缩与部署-书生浦语大模型实战营学习笔记5&大语言模型11

    大语言模型-11.模型压缩与部署 书生浦语大模型实战营学习笔记4-模型压缩与部署 本文包括第二期实战营的第5课内容,介绍关于模型压缩的相关内容,主要包括.模型量化和模型部署的相关内容. 模型部署 定义 ...

  10. Java中的多态、抽象类和接口简述

    1. 引言 本文对Java编程中的多态.抽象类和接口概念进行了简明扼要的讲解,并对extends和implements进行了辨析. 2. 多态 多态是指所调用的方法只有在运行的时候才可以明确,如下例所 ...