返回介绍

SELinux

发布于 2024-10-03 16:34:01 字数 5960 浏览 0 评论 0 收藏 0

安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。

SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。

SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。SELinux 比普通的 Linux 内核提供了更高的安全性,理论上说,在系统因为未知漏洞溢出的时候,普通用户是不可能得到超级用户的权限了。

Fedora Core 3 在安装时默认激活 SELinux。

# 获取 selinux 状态: enable/Enforcing 为开启,disabled/Permissive 为关闭
$ getenforce
Enforcing

# 临时开启,关闭: 0 时关闭,其它值开启,重启失效。 永久生效要修改/etc/selinux/config,并且重启机器 reboot
$ setenforce 0

# Current mode 是当前防火墙工作模式
$ /usr/sbin/sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          disabled
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31

SELinux 概念:

  • 主体(Subject):等同于进程。
  • 对象(Object):被主体访问的资源。可以是文件、目录、端口、设备等。
  • 政策和规则(Policy & Rule):一套政策里面有多个规则。部分规则可以按照需求启用或禁用。规则是模块化、可扩展的。政策可以在 /etc/selinux/config ​ 中设定。

SELinux 有三种 工作模式 ,分别是:

  1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
  2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
  3. disabled:关闭 SELinux。

违规日志/var/log/audit/audit.log

配置文件/etc/selinux/config ​ ( 软链接指向 /etc/sysconfig/selinux ​ ,可设置工作模式 SELINUX,政策 SELINUXTYPE)

[root@ecs-a5e2 ~]# cat /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=disabled    # 永久关闭
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

相关命令

# 查看 selinux 的某类进程允许的端口。似乎与 firewalld 的功能有点雷同,但又不太一样。
semanage port -l

# 分析违规日志
sealert -a /var/log/audit/audit.log

SELinux 中的 Apache 和 MySQL 设定

因为 SELinux 安全性的提高,导致我们在使用时,会发生一些我们以前从没遇到的问题。

前两天我在使用 Fedora Core 3 搭建 PHP+MySQL 的 WebServer 时就遇到了一些问题。现在整理一下,如果您也遇到同样的问题,那么,看过这篇文章,就应该可以轻而易举的解决了。

1、Apache - Document root must be a directory 问题。

有可能和这个问题并发的问题还有 403 Forbidden 禁止访问的问题。

现象描述:

不使用系统默认的 /var/www/html ​作为系统的 Document Root,自己新建一个目录后修改 /etc/httpd/conf/httpd.conf ​ 中的配置,然后重起 Apache 的 Daemon,发现 Apache 无法起动,系统报错:

Document root must be a directory

但是,我们设置的 DocumentRoot 的确是一个目录,而且 apache 用户具有可读权限。

另一种情况:新建一个虚拟目录或文件后,无法访问,显示 Forbidden, 403 Error,但文件或目录有可读权限。

问题产生的原因:一开始我想来想去想不出为什么,但是给我感觉是权限的问题,用传统的 Linux 的思维方式来看,权限绝对没有问题。但是仔细一想,SELinux 是不是会有其他安全的设定?

查看 /var/log/messages 文件,发现有类似以下内容的这样一段:

Dec 24 17:54:59 hostname kernel: audit(1098222899.827:0): avc: \
denied { getattr } for pid=19029 exe=/usr/sbin/httpd \
path=/var/www/html/about.html dev=dm-0 ino=373900 \
scontext=root:system_r:httpd_t tcontext=user_ubject_r:user_home_t \
tclass=file

嘿嘿,问题找到了,果然是 SELinux 的新特性搞的鬼。我把目录或文件设成了 user_home_t 类型,因此 apache 的进程没有权限,无法访问。针对 Apache 的进程所使用的 SELinux target policy 规定了 apache 的进程只能访问 httpd_sys_content_t 类型的目录或文件。

解决办法:

很简单,把目录或文件的策略类型改成 httpd_sys_content_t 就可以了

使用 root 用户

$ chcon -t httpd_sys_content_t 目录名或文件名

然后可以用 ls -laZ 命令查看文件目录的策略类型。

2、Mysql - Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)

刚搞定 Apache,mySQL 又出问题了。

问题现象:

本机用 mysql 命令可以正常登录数据库并正常操作。但是在 php 写的页面中,不管怎样,连接 mySQL 数据库时,都会报如下错误:

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)

问题原因:

查看 mysql.sock ​ 文件,存在并且任何人都可读可写。发现 avc message (/var/log/messages) ​ 中同样有策略错误的记录。

ps -efZ|grep mysql 命令检查 mysql 的进程,发现 mySQL 使用了 unconfined_t 这个未定义策略类型在运行,而 mysql.sock 以及 mysqld 文件的策 略类型都是 var_lib_t。很明显,这应该是个 Fedora Core 3 的 BUG,SELinux target policy 的 BUG,redhat 并没有为 mySQL 制定正确的 target policy。

解决办法:到 redhat 的 bugzilla 系统上搜索,果然找到了这个 BUG。

Bug #:  138421
https://bugzilla.redhat.com/bugzill...g.cgi?id=138421

在这个页面找到新的 target policy 的补丁安装即可

补丁下载页面: ftp://people.redhat.com/dwalsh/SELinux/FC3 ,你也可以从本文的附件中下载

只要下载 selinux-policy-targeted-1.17.30-2.23 以上的版本就能正常使用 mySQL 了。

如果你原来的系统安装了 selinux-policy-targeted-source (源代码),那么你也必需下载 source 的 rpm 文件,并首先升级这个包,因为两个包有依赖关系。

补丁安装办法:

#step1:  使用 root 用户
#step2: 先升级新的 target-policy-source (如果你之前安装了这个包的话)
rpm -Uvh selinux-policy-targeted-sources-1.17.30-2.61.noarch.rpm

step3: 升级新的 target-policy

rpm -Uvh selinux-policy-targeted-1.17.30-2.61.noarch.rpm

step4: 更新 mysql 相关的 target policy

rpm -q -l mysql-server | restorecon -R -v -f -
rpm -q -l mysql | restorecon -R -v -f -

step5 重起 mysql 的服务

service mysqld restart

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文