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

打印 上一主题 下一主题

主题 743|帖子 743|积分 2229

前言

SELinux是什么

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

SELinux 定义了每个人对系统上的应用、进程和文件的访问控制。利用安全策略(一组告知 SELinux 哪些能访问,哪些不能访问的规则)来强制执行策略所允许的访问。
当应用或进程(称为主体)发出访问对象(如文件)的请求时,SELinux 会检查访问向量缓存(AVC),其中缓存有主体和对象的访问权限。
开启 SELinux 可以提升系统的安全性,但同时也会带来一些问题。在特定场景有的人会选择关闭 SELinux 以换取更好的兼容性。
在GreatSQL的安装手册里,就有关闭 SELinux 这一步。
  1. #关闭selinux
  2. $ setenforce 0
  3. $ sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config
复制代码
不禁让人好奇,这个 SELinux 安全模块,如果不关闭会产生什么问题,在使用时有哪些需要注意的地方。于是我特意尝试了一下,看看会出现哪些问题。
问题发现

为了发现问题,我特意选择在用户目录(/root)下载、加压  GreatSQL 二进制压缩包,然后再移动到指定目录使用。
  1. cd /root
  2. wegt https://***.***/greatsql.tar.gz
  3. tar -xvf greatsql.tar.gz
  4. mv /root/greatsql /usr/local/
复制代码
安装过程一切顺利,数据库正常启动了,但是在配置 systemd 进程守护的时候出现了问题。
greatsql.service文件:
  1. vim /usr/lib/systemd/system/greatsql.service
  2. [Unit]
  3. Description=GreatSQL Server
  4. After=network.target
  5. After=syslog.target
  6. [Install]
  7. WantedBy=multi-user.target
  8. [Service]
  9. User=greatsql
  10. Group=greatsql
  11. # Have mysqld write its state to the systemd notify socket
  12. Type=notify
  13. # Disable service start and stop timeout logic of systemd for mysqld service.
  14. TimeoutSec=0
  15. # Start main service
  16. ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS
  17. # Use this to switch malloc implementation
  18. #EnvironmentFile=-/etc/sysconfig/mysql
  19. # Sets open_files_limit
  20. LimitNOFILE = 10000
  21. Restart=on-failure
  22. RestartPreventExitStatus=1
  23. # Set environment variable MYSQLD_PARENT_PID. This is required for restart.
  24. Environment=MYSQLD_PARENT_PID=1
  25. PrivateTmp=false
复制代码
用  systemctl start greatsql 启动数据库的时候报错以下错误。
  1. [root@Linux ~]# systemctl restart greatsql
  2. Job for greatsql.service failed because the control process exited with error code.
  3. See "systemctl status greatsql.service" and "journalctl -xe" for details.
复制代码
直接运行mysqld没问题但是使用systemctl 就启动不了。
根据上面的报错,查看一下 greatsql systemd的状态和相关日志
  1. [root@gip Linux]# systemctl status greatsql.service
  2. ● greatsql.service
  3.    Loaded: loaded (/usr/lib/systemd/system/greatsql.service; bad; vendor preset: disabled)
  4.    Active: failed (Result: exit-code) since Tue 2023-01-10 16:00:06 CST; 17s ago
  5.   Process: 147226 ExecStart=/usr/local/greatsql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS (code=exited, status=203/EXEC)
  6. Main PID: 147226 (code=exited, status=203/EXEC)
  7. Jan 10 16:00:06 gip systemd[1]: greatsql.service: Service RestartSec=100ms expired, scheduling restart.
  8. Jan 10 16:00:06 gip systemd[1]: greatsql.service: Scheduled restart job, restart counter is at 5.
  9. Jan 10 16:00:06 gip systemd[1]: Stopped greatsql.service.
  10. Jan 10 16:00:06 gip systemd[1]: greatsql.service: Start request repeated too quickly.
  11. Jan 10 16:00:06 gip systemd[1]: greatsql.service: Failed with result 'exit-code'.
  12. Jan 10 16:00:06 gip systemd[1]: Failed to start greatsql.service.
复制代码
通过查看上述信息,可以得知 程序启动的时候抛出了报错。
  1. Main PID: 147226 (code=exited, status=203/EXEC)
复制代码
通过上网收索可以得知,status=203/EXEC 报错可能和权限不足有关,记一下这里的PID。
我们继续查看一下相关日志证实一下。
  1. [root@Linux ~]# journalctl _PID=13386
  2. -- Logs begin at Tue 2023-01-10 16:54:11 CST, end at Tue 2023-01-10 17:09:15 CST. --
  3. Jan 10 17:00:36 gip systemd[13386]: greatsql.service: Failed to execute command: Permission denied
  4. Jan 10 17:00:36 gip systemd[13386]: greatsql.service: Failed at step EXEC spawning /usr/local/greatsql/bin/mysqld: Permission denied
复制代码
可以看到确实是权限不足。
但是奇怪的事情来了,通过查看文件权限发现权限并没有问题。
  1. [root@GreatSQL bin]# ls -lah |grep mysql
  2. -rwxr-xr-x.   1 root root    6.9M 4月  29 2022 mysql
  3. -rwxr-xr-x.   1 root root    6.8M 4月  29 2022 mysqladmin
  4. -rwxr-xr-x.   1 root root    7.1M 4月  29 2022 mysqlbinlog
  5. -rwxr-xr-x.   1 root root    6.8M 4月  29 2022 mysqlcheck
  6. -rwxr-xr-x.   1 root root    6.3K 4月  29 2022 mysqld_pre_systemd
  7. -rwxr-xr-x.   1 root root     34K 4月  29 2022 mysqld_safe
  8. -rwxr-xr-x.   1 root root    6.9M 4月  29 2022 mysqldump
  9. -rwxr-xr-x.   1 root root    1.7K 4月  29 2022 mysqldumpslow
  10. ***后省略***
复制代码
即便把权限改成755,甚至777 也还是会报一样的错误。
  1. chown -R mysql:mysql /usr/local/mysql
  2. chmod 755 -R /usr/local/mysql
复制代码
问题原因

后面我有检查了所有相关文件的权限,都没问题,但是程序还是会报权限不足。
在网上翻阅了资料,发现了问题产生原因。
SELinux 的问题, 因为我的二进制文件是先下载到 /root 目录,然后才移到 /usr/local/greatsql目录,从/root目录移动到/usr/local/目录时它们的 SELinux 上下文不会自动变更,依然是用户主目录。所以出现了权限问题。
解决方法:
  1. #恢复文件的安全上下文
  2. restorecon -rv /usr/local/greatsql
复制代码
总结

可执行文件是先存放在用户目录,然后移动到别的目录。文件的 SELinux 上下文不会自动变更,依然是用户目录。
这就导致了,能直接运行,但是通过 systemd 启动时仍然报 Permission denied权限不足的问题。
解决方法就是用restorecon命令用来恢复SELinux文件属性
  1. restorecon -rv 目标目录
复制代码
相关链接:
解决文件权限正确,但 systemd 服务仍然提示没有权限,启动失败。
一文带你看懂 SELinux 是什么?  (redhat.com)

Enjoy GreatSQL
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表