SELinux 权限问题导致 GreatSQL 运行不了的坑

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: SELinux 权限问题导致 GreatSQL 运行不了的坑

前言

SELinux 是什么

安全增强型 Linux(SELinux)是一种采用安全架构的 Linux® 系统,它能够让管理员更好地管控哪些人可以访问系统。它最初是作为 Linux 内核的一系列补丁,由美国国家安全局(NSA)利用 Linux 安全模块(LSM)开发而成。

SELinux 工作原理

SELinux 定义了每个人对系统上的应用、进程和文件的访问控制。利用安全策略(一组告知 SELinux 哪些能访问,哪些不能访问的规则)来强制执行策略所允许的访问。当应用或进程(称为主体)发出访问对象(如文件)的请求时,SELinux 会检查访问向量缓存(AVC),其中缓存有主体和对象的访问权限。


开启 SELinux 可以提升系统的安全性,但同时也会带来一些问题。在特定场景有的人会选择关闭 SELinux 以换取更好的兼容性。

在GreatSQL的安装手册里,就有关闭 SELinux 这一步。

#关闭selinux
$ setenforce 0
$ sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config

不禁让人好奇,这个 SELinux 安全模块,如果不关闭会产生什么问题,在使用时有哪些需要注意的地方。于是我特意尝试了一下,开启 SELinux 安装 GreatSQL 数据库,看看会出现哪些问题。

问题产生

为了发现问题,我特意选择在用户目录(/root)下载解压  GreatSQL 二进制压缩包,然后再移动到指定目录使用。

cd /root
wegt https://***.***/greatsql.tar.gz
tar -xvf greatsql.tar.gz
mv /root/greatsql /usr/local/

安装过程一切顺利,数据库正常启动了,但是在配置 systemd 进程守护的时候出现了问题。

greatsql.service文件:

vim /usr/lib/systemd/system/greatsql.service
[Unit]
Description=GreatSQL Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=greatsql
Group=greatsql
# Have mysqld write its state to the systemd notify socket
Type=notify
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS 
# Use this to switch malloc implementation
#EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 10000
Restart=on-failure
RestartPreventExitStatus=1
# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false

用  systemctl start greatsql 启动数据库的时候报以下错误。

[root@Linux ~]# systemctl restart greatsql
Job for greatsql.service failed because the control process exited with error code.
See "systemctl status greatsql.service" and "journalctl -xe" for details.

直接运行mysqld没问题但是使用systemctl 就启动不了。

根据上面的报错,查看一下 greatsql systemd的状态和相关日志

[root@gip Linux]# systemctl status greatsql.service
● greatsql.service
   Loaded: loaded (/usr/lib/systemd/system/greatsql.service; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2023-01-10 16:00:06 CST; 17s ago
  Process: 147226 ExecStart=/usr/local/greatsql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS (code=exited, status=203/EXEC)
 Main PID: 147226 (code=exited, status=203/EXEC)
Jan 10 16:00:06 gip systemd[1]: greatsql.service: Service RestartSec=100ms expired, scheduling restart.
Jan 10 16:00:06 gip systemd[1]: greatsql.service: Scheduled restart job, restart counter is at 5.
Jan 10 16:00:06 gip systemd[1]: Stopped greatsql.service.
Jan 10 16:00:06 gip systemd[1]: greatsql.service: Start request repeated too quickly.
Jan 10 16:00:06 gip systemd[1]: greatsql.service: Failed with result 'exit-code'.
Jan 10 16:00:06 gip systemd[1]: Failed to start greatsql.service.
Jan 10 16:00:23 gip systemd[1]: /usr/lib/systemd/system/greatsql.service:1: Missing '='.

通过查看上述信息,可以得知 程序启动的时候抛出了报错。

Main PID: 147226 (code=exited, status=203/EXEC)

通过上网搜索可以得知,status=203/EXEC 报错可能和权限不足有关,记一下这里的PID。

我们继续查看一下相关日志证实一下。

[root@Linux ~]# journalctl _PID=13386
-- Logs begin at Tue 2023-01-10 16:54:11 CST, end at Tue 2023-01-10 17:09:15 CST. --
Jan 10 17:00:36 gip systemd[13386]: greatsqld.service: Failed to execute command: Permission denied
Jan 10 17:00:36 gip systemd[13386]: greatsqld.service: Failed at step EXEC spawning /usr/local/greatsql/bin/mysqld: Permission denied

可以看到确实是权限不足。

但是奇怪的事情来了,通过查看文件权限发现权限并没有问题。

[root@GreatSQL bin]# ls -lah |grep mysql
-rwxr-xr-x.   1 root root    6.9M 4月  29 2022 mysql
-rwxr-xr-x.   1 root root    6.8M 4月  29 2022 mysqladmin
-rwxr-xr-x.   1 root root    7.1M 4月  29 2022 mysqlbinlog
-rwxr-xr-x.   1 root root    6.8M 4月  29 2022 mysqlcheck
-rwxr-xr-x.   1 root root    6.3K 4月  29 2022 mysqld_pre_systemd
-rwxr-xr-x.   1 root root     34K 4月  29 2022 mysqld_safe
-rwxr-xr-x.   1 root root    6.9M 4月  29 2022 mysqldump
-rwxr-xr-x.   1 root root    1.7K 4月  29 2022 mysqldumpslow
 ***后省略***

即便把权限改成755,甚至777 也还是会报一样的错误。

chown -R mysql:mysql /usr/local/mysql
chmod 755 -R /usr/local/mysql


问题原因

后面我有检查了所有相关文件的权限,都没问题,但是程序还是会报权限不足。

在网上翻阅了资料,发现了问题产生原因。

SELinux 的问题, 因为我的二进制文件是先下载到 /root 目录,然后才移到 /usr/local/greatsql目录,从/root目录移动到/usr/local/目录时它们的 SELinux 上下文不会自动变更,依然是用户主目录。所以出现了权限问题。

解决方法:

#恢复文件的安全上下文
restorecon -rv /usr/local/greatsql


总结

可执行文件是先存放在用户目录,然后移动到别的目录,文件的 SELinux 上下文不会自动变更,依然是用户目录。

这就导致了,能直接运行,但是通过 systemd 启动时仍然报 Permission denied权限不足的问题。

解决方法就是用restorecon命令用来恢复SELinux文件属性

restorecon -rv 目标目录

相关链接:

解决文件权限正确,但 systemd 服务仍然提示没有权限,启动失败。(https://blog.csdn.net/kunyus/article/details/106592236)

一文带你看懂 SELinux 是什么?  (redhat.com(https://www.redhat.com/zh/topics/linux/what-is-selinux)


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
监控 关系型数据库 MySQL
如何安装和配置Monit
如何安装和配置Monit
67 0
|
6月前
|
Linux
Linux【上手 02】rc.local和init.d(chkconfig)实现服务器重启服务自启动
Linux【上手 02】rc.local和init.d(chkconfig)实现服务器重启服务自启动
223 0
|
Linux
CentOS7下配置Supervisor自启动的两种方法
很多网友留言问如何配置Supervisor 自启动,本文介绍了CentOS7下配置Supervisor自启动的两种方法,推荐使用第二种方式。
646 0
|
Shell Linux
Linux 利用systemd开机自启shell脚本
Linux 利用systemd开机自启shell脚本
|
Unix Linux Shell
Linux之sudo及其配置文件/etc/sudoers
一、sudo介绍 sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。这样不仅减少了root用户的登陆 和管理时间,同样也提高了安全性。Sudo不是对shell的一个代替,它是面向每个命令的。 它的特性主要有这样几点: § sudo能够限制用户只在某台主机上运行某些命令。 § sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。 § sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为
842 0
|
应用服务中间件 Apache nginx
记selinux的权限问题
Nginx提示403 尝试用chmod,chown设置各种权限无果 尝试暂时关闭selinux后访问正常 setenforce 0 问题确定是selinux造成的 在不想关闭selinux的情况下处理权限问题 首先查看一下selinux中的目录权限 ls -Z /data/webroot/ drwxr-xr-x.
1411 0