当前位置: 首页 > 科技观察

SELinux权限问题导致GreatSQL无法运行

时间:2023-03-14 15:35:48 科技观察

系统版本:Linux版本4.18.0-348.el8.x86_64更好地控制谁可以访问系统。它最初是由美国国家安全局(NSA)使用Linux安全模块(LSM)作为Linux内核的一系列补丁开发的。SELinux的工作原理SELinux定义了每个人对系统上的应用程序、进程和文件的访问控制。使用安全策略(一组告诉SELinux什么可以访问什么不能访问的规则)来强制执行该策略允许的访问。当应用程序或进程(称为主体)发出访问对象(例如文件)的请求时,SELinux会检查缓存主体和对象访问权限的访问向量缓存(AVC)。启用S??ELinux可以提高系统的安全性,但也会带来一些问题。在某些场景下,有些人会选择关闭SELinux来换取更好的兼容性。在GreatSQL安装手册中,有关闭SELinux的步骤。#Closeselinux$setenforce0$sed-i'/^SELINUX=/c'SELINUX=disabled/etc/selinux/config不禁让人想如果不关闭这个SELinux安全模块会出现什么问题,什么是使用时的问题需要注意的地方。于是试了一下,打开SELinux,安装GreatSQL数据库,看看会出现什么问题。问题发生了。为了找到问题所在,特意选择在用户目录(/root)下下载并解压GreatSQL二进制包,然后移动到指定目录下使用。cd/rootwegthttps://***.***/greatsql.tar.gztar-xvfgreatsql.tar.gzmv/root/greatsql/usr/local/安装过程很顺利,数据库正常启动,但是配置的时候systemd进程守护进程有问题。greatsql.service文件:vim/usr/lib/systemd/system/greatsql.service[Unit]Description=GreatSQLServerAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-user.target[Service]User=greatsqlGroup=User=greatsql#让mysqld将其状态写入systemdnotifysocketType=notify#为mysqld服务禁用systemd的服务启动和停止超时逻辑。TimeoutSec=0#StartmainserviceExecStart=/usr/local/mysql/bin/mysqld--defaults-file=/etc/my.cnf$MYSQLD_OPTS#使用它来切换malloc实现#EnvironmentFile=-/etc/sysconfig/mysql#设置open_files_limitLimitNOFILE=10000Restart=on-failureRestartPreventExitStatus=1#设置环境变量MYSQLD_PARENT_PID。这个是restart需要的。Environment=MYSQLD_PARENT_PID=1PrivateTmp=false用systemctlstartgreatsql启动数据库的时候报以下错误。[root@Linux~]#systemctlrestartgreatsqlJobforgreatsql.service失败,因为控制进程以错误代码退出。有关详细信息,请参见“systemctlstatusgreatsql.service”和“journalctl-xe”。直接运行mysqld是没有问题的,但是用systemctl是启动不了的。根据上面的报错,查看一下greatsqlsystemd的状态和相关日志[root@gipLinux]#systemctlstatusgreatsql.service●greatsql.serviceLoaded:loaded(/usr/lib/systemd/system/greatsql.service;bad;vendor预设:禁用)活动:自2023年1月10日星期二16:00:06CST以来失败(结果:退出代码);17s前进程:147226ExecStart=/usr/local/greatsql/bin/mysqld--defaults-file=/etc/my.cnf$MYSQLD_OPTS(code=exited,status=203/EXEC)MainPID:147226(code=exited,status=203/EXEC)Jan1016:00:06gipsystemd[1]:greatsql.service:ServiceRestartSec=100msexpired,schedulingrestart.Jan1016:00:06gipsystemd[1]:greatsql.service:预定的重启作业,重启计数器为5.Jan1016:00:06gipsystemd[1]:Stoppedgreatsql.service.Jan1016:00:06gipsystemd[1]:greatsql.service:Startrequestrepeatedtooquastly.Jan1016:00:06gipsystemd[1]:greatsql.service:失败,结果为“退出代码”。Jan1016:00:06gipsystemd[1]:无法启动greatsql.service.Jan1016:00:23胃肠psystemd[1]:/usr/lib/systemd/system/greatsql.service:1:缺少“=”。通过查看以上信息,可以知道程序启动的时候报错了。MainPID:147226(code=exited,status=203/EXEC)在网上搜索发现status=203/EXEC报错可能与权限不足有关。记住这里的PID。我们继续查看相关日志来确认。[root@Linux~]#journalctl_PID=13386--日志从CST2023-01-10星期二16:54:11开始,在CST2023-01-10星期二17:09:15结束。--Jan1017:00:36gipsystemd[13386]:greatsqld.service:执行命令失败:权限被拒绝Jan1017:00:36gipsystemd[13386]:greatsqld.service:在步骤EXEC生成/usr/时失败local/greatsql/bin/mysqld:Permissiondenied可以看到权限确实不够。但是奇怪的事情来了,通过检查文件权限,发现权限没有问题。[root@GreatSQLbin]#ls-lah|grepmysql-rwxr-xr-x。1rootroot6.9M2022年4月29日mysql-rwxr-xr-x。1rootroot6.8M2022年4月29日mysqladmin-rwxr-xr-x。1rootroot7.1M2022年4月29日mysqlbinlog-rwxr-xr-x。1rootroot6.8M2022年4月29日mysqlcheck-rwxr-xr-x。1rootroot6.3K2022年4月29日mysqld_pre_systemd-rwxr-xr-x。1rootroot34K2022年4月29日mysqld_safe-rwxr-xr-x。1rootroot6.9M2022年4月29日mysqldump-rwxr-xr-x。1rootroot1.7KApr292022mysqldumpslow***最后省略***即使权限改成755甚至777,还是会报同样的错误。chown-Rmysql:mysql/usr/local/mysqlchmod755-R/usr/local/mysql问题原因我后面检查了所有相关文件的权限,没有问题,但是程序还是会报权限不足.看了网上的资料,找到了问题的原因。这是一个SELinux问题,因为我的二进制文件先下载到/root目录,然后移动到/usr/local/greatsql目录,从/root目录移动到/usr/local时它们的SELinux上下文/directory不会自动改变,仍然是用户的home目录。所以存在权限问题。解决方法:#恢复文件的安全上下文restorecon-rv/usr/local/greatsql总结可执行文件先存放在用户目录下,然后移动到其他目录下。该文件的SELinux上下文不会自动改变,仍然是用户目录。这样就导致了问题,可以直接运行,但是通过systemd启动还是报insufficientPermissiondeniedpermissions。解决方法是使用restorecon命令恢复SELinux文件属性。restorecon-rvtargetdirectory相关链接:解决文件权限正确,但systemd服务仍然提示没有权限,启动失败。(https://blog.csdn.net/kunyus/article/details/106592236)本文带你了解什么是SELinux?(redhat.com(https://www.redhat.com/zh/topics/linux/what-is-selinux)