SELinux 与 permision denied 问题

最近同事遇到个奇怪的问题,于是让我一起排查下,折腾一番之后才发现问题根源。

事情是这样的,在linux服务器上部署了一个服务,服务里面会执行shell命令insmod一个lkm,在之前发布个各个版本的centos/rhel/oracle linux/ubuntu上都能正常加载,但是在最新测试的oracle linux7.7上却怎么也加载不起来内核模块。

然后在服务程序里打印日志,可以确定insmod是执行了的,然后在开机启动的服务脚本里加insmod也调不起来。我想肯定是insmod出错了,于是我把服务里system调shell方式改为用popen管道的方式指向,同时./test后面加上2>&1把错误输出重定向到标准输出,这样就打印出了出错信息:

insmod error! errcode:-13, permision denied.
复制代码

这就奇怪了,root账户下执行的service xxx start,竟然报无权限执行。

然后就检查了lkm及服务的执行权限,也lsattr查看了下,都没发现有啥问题,于是我就查看了系统启动日志,发现系统默认开启了selinux服务,于是我就试着关闭selinux,之后再加载确实正常了,所以断定就是selinux引起的问题。

那么selinux究竟是什么呢,下面简单介绍下。

SELinux,即Security Enhanced Linux的简写,它是许多linux服务器发行版中的一个安全模块,它是linux的安全增强模块,它可以用来配置,某一个对象是否可以操作另外一个对象(may one subject do action to another object),例如,某服务器程序是否能读写zyg用户的home目录下的文件。如下图示例:

然而,开启selinux的服务有时候会带来不少不可预知的权限访问被拒绝的问题,比如读写、执行等。如果你在一个开启selinux功能的linux server上,遇到这类问题,而且文件权限方面也不存在问题,那么这类问题大概率都是selinux引起的。通常,此问题是由分配给受影响的文件或文件夹的不正确的安全上下文(也称为安全标签)引起的,下面会详细讲到这些概念。

本文实验环境:

[root@localhost test]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@localhost test]# uname -r
3.10.0-693.el7.x86_64
复制代码

一、selinux的模式,selinux mode

selinux有三种mode:Enforcing、Permissive、Disabled。

enforing模式下, selinux会执行配置好的策略来进行权限控制,任何未经授权的程序或者用户试图访问文件都会被拒绝,同时也会把此事件记录在相关日志文件中。

permissive模式下,selinux不会应用配置的策略来进行权限控制,也即此模式下,配置的策略不会生效,只是会把该违反策略的访问事件记录在系统日志中。

disabled模式下,selinux完全不会起作用,也不会记录审计日志。

可通过getenforce或者sestatus查看selinux的模式:

[root@localhost test]# getenforce 
Enforcing
复制代码

[root@localhost test]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/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:      28
复制代码

如何关闭selinux呢?有两种方法:

1、 临时关闭selinux方法:

setenforce 0
复制代码

2、永久关闭 selinux,修改配置文件

vi /etc/selinux/config

将 SELINUX=enforcing 修改为:SELINUX=disabled,之后保存退出,然后 reboot 系统后生效。

二、selinux策略,selinux policy

selinux最核心的就是它的策略,策略也是selinux的引擎。策略就是一系列的规则,它定义了系统上所有对象的安全及访问权限。linux上一切皆文件,这里的所有对象包括用户、角色、进程、文件等等。策略定义了每个对象跟另一个对象之间如何关联。

为了理解策略,我们来看几个基本概念:

  • 用户,linux系统下的每一个常规用户都会被映射到selinux下一个或多个用户。在linux系统中,一个账户登录后,可以以此用户身份运行某一程序,例如,账户aaa用vi打开了一个test.txt的文件;或者一个服务账户运行一个httpd的守护进程,在selinux中,一个进程(守护进程或运行中的进程)被叫作主题。
  • 角色,角色就像用户跟进程之间的网关,角色定义了哪些用户可以访问(执行)某个进程。角色跟组不同,它更像是一个过滤器:一个用户可以参与或承担一个角色当这个角色被授权给此用户,selinux策略中的角色定义了用户组去访问某个角色,也定义了角色可以访问哪个进程域,角色概念的引入也是因为selinux实现了部分基于角色的访问控制机制(RBAC)。
  • 主题与对象,一个主题就是一个进程,它可以潜在的影响到一个对象。SELinux中的对象是可以活跃的任何东西。它可以是文件,目录,端口,tcp套接字,游标或X服务器。主题可以对对象执行的操作就是对象的权限
  • 域是可以在其中运行SELinux主题(进程)的上下文。该上下文就像围绕该主题的包装。它告诉进程它可以做什么和不能做什么。例如,域将定义主题可以访问哪些文件,目录,链接,设备或端口。
  • 类型是文件上下文的上下文,规定了文件的用途。例如,文件的上下文可能表明它是网页,或者该文件属于/ etc目录,或者文件的所有者是特定的SELinux用户。在SELinux术语中,文件的上下文称为其类型。

综上所述,策略就是一系列的规则,规定某个或某些用户只能承担某个或某些角色,而这些角色将仅被授权访问某个或某些域。这些域反过来只能访问某个或某些文件类型。下图显示了这几个概念之间的关系:

最后一点,即在特定域中运行的进程只能对某些特定类型的对象执行某些特定操作,称为类型强制(TE)。

三、安全上下文,security context

安全上下文有四个部分:用户,角色,域,sensitivity。

  • 用户,角色,sensitivity是相对于文件;
  • 域是相对于进程;
  • selinux用户是后缀’_u’,角色后缀为’_r’,类型或域后缀为’_t’。

可以使用secon命令可以查看当前用户、角色、类型及sensitivity:

[root@localhost test]# secon 
user: unconfined_u
role: unconfined_r
type: unconfined_t
sensitivity: s0
clearance: s0:c0.c1023
mls-range: s0-s0:c0.c1023
复制代码

可以使用id -z命令查看当前账户的安全上下文:

[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@localhost ~]# id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
复制代码

要查看SELinux已应用于文件或文件夹的安全上下文,可以尝试运行以下命令:

ls -Z 
ls --context
ls --lcontext
ls --scontext
复制代码

在启用 selinux 的系统中,可以在 ps命令中加-Z 参数,显示进程允许的安全上下文:

[root@localhost test]# ps -eZf|grep login
system_u:system_r:systemd_logind_t:s0 root 756     1  0 19:30 ?        00:00:00 /usr/lib/systemd/systemd-logind
system_u:system_r:local_login_t:s0-s0:c0.c1023 root 795 1  0 19:30 ?   00:00:04 login -- root
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 4489 1738  0 22:29 pts/0 00:00:00 grep --color=auto login
复制代码

可以使用chcon命令修改安全上下文:

四、selinux 优点

selinux具有以下优点:

  • 所有进程和文件都被标记,SELinux策略规则定义了进程与文件的交互方式以及进程之间的交互方式。除非策略允许,否则拒绝所有访问。 这将是一个非常安全的实现,但这也意味着开发人员必须预料到每个进程可能对每个可能的对象需要的每个可能的许可。 默认行为是SELinux仅与某些进程有关。
  • 细粒度的访问控制。SELinux访问决策超越了由用户自行决定并基于Linux用户和组ID控制的传统UNIX权限,它基于所有可用信息,例如SELinux用户,角色,类型以及(可选)安全级别。
  • SELinux策略是作用于整个系统范围内且只能由管理人员配置和管理。
  • 改进了缓解提权攻击的方法。进程在域中运行,因此彼此是隔离的。SELinux策略规则定义了进程如何访问文件和其他进程。如果某个进程受到威胁,则攻击者只能访问该进程的正常功能,也可以访问该进程已配置为有权访问的文件。例如,如果Apache HTTP Server受感染,除非添加或配置了特定的SELinux策略规则或允许这种访问,否则攻击者无法使用该进程读取用户主目录中的文件。
  • SELinux可用于保证数据机密性和完整性,并保护进程免受不可信输入的侵害。

但是,SELinux的设计是为了增强现有的安全机制而不是替代它。即使在运行SELinux时,也必须继续遵循良好的安全性惯例,例如使软件保持最新,使用难以猜测的密码或防火墙。 

五、selinux相关工具

1、semanage

可以使用semanage查看selinux相关配置,需安装policycoreutils-python.x86_64工具包:

例如可以semanage login -l命令,查看selinux name:

2、setroubleshoot 

默认系统可能没有安装,可以如下安装:

yum install setroubleshoot-server

service auditd restart

安装后,当你因为 SELinux 的原因出现问题后,你可以直接在 /var/log/messages 文件中查看到具体信息,日志中还有推荐的解决方法 !

3、audit2allow

让它产生一组规则,是它认为可用来允许被 SELinux 策略所封锁的行为。

如果您对selinux感兴趣,可以自行谷歌搜索更多相关资料。

参考资料:

access.redhat.com/documentati…

www.digitalocean.com/community/t…

感兴趣的话可以关注我的微信公众号【大胖聊编程】,我的公众号中有更多文章分享,也可以在公众号中联系到我,加好友一起交流学习。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享