这篇文章主要为大家展示了“CentOS 7系统下SELinux怎么阻止MongoDB启动”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CentOS 7系统下SELinux怎么阻止MongoDB启动”这篇文章吧。

问题描述:

最近发现了一个问题,在新装的CentOS7上,安装了MongoDB3.4,挂载了一个大的数据盘后,修改/etc/mongo.conf,将配置文件中的log和data目录放在新的数据盘下,并修改文件的访问权限。

改完后的mongo.conf:

#mongod.conf#fordocumentationofalloptions,see:#http://docs.mongodb.org/manual/reference/configuration-options/#wheretowriteloggingdata.systemLog:destination:filelogAppend:truepath:/data/mongodb/log/mongod.log#Whereandhowtostoredata.storage:dbPath:/data/mongodb/data.....

文件权限:

#ls-alhdrwxr-xr-x.5mongodmongod4.0K11月114:53mongodb#cdmongodb#ls-alhdrwxr-xr-x.3mongodmongod4.0K11月919:08datadrwxr-xr-x.2mongodmongod4.0K11月919:06logdrwxr-xr-x.2mongodmongod4.0K11月114:54run

执行systemctl start mongod命令后,查看状态发现并没有启动,查看/var/log/message,发现以下错误

Nov906:06:44[localhost]setroubleshoot:failedtoretrieverpminfofor/data/mongodb/run/mongod.pidNov906:06:44[localhost]setroubleshoot:SELinuxispreventing/usr/bin/mongodfromwriteaccessonthefile/data/mongodb/run/mongod.pid.ForcompleteSELinuxmessagesrun:sealert-lf7148e11-b126-401e-ba9f-a9a87c1e54aeNov906:06:44[localhost]python:SELinuxispreventing/usr/bin/mongodfromwriteaccessonthefile/data/mongodb/run/mongod.pid.#012#012*****Pluginrestorecon(94.8confidence)suggests************************#012#012Ifyouwanttofixthelabel.#012/data/mongodb/run/mongod.piddefaultlabelshouldbedefault_t.#012Thenyoucanrunrestorecon.#012Do#012#/sbin/restorecon-v/data/mongodb/run/mongod.pid#012#012*****Plugincatchall_labels(5.21confidence)suggests*******************#012#012Ifyouwanttoallowmongodtohavewriteaccessonthemongod.pidfile#012Thenyouneedtochangethelabelon/data/mongodb/run/mongod.pid#012Do#012#semanagefcontext-a-tFILE_TYPE'/data/mongodb/run/mongod.pid'#012whereFILE_TYPEisoneofthefollowing:afs_cache_t,initrc_tmp_t,mongod_log_t,mongod_tmp_t,mongod_var_lib_t,mongod_var_run_t,puppet_tmp_t,user_cron_spool_t.#012Thenexecute:#012restorecon-v'/data/mongodb/run/mongod.pid'#012#012#012*****Plugincatchall(1.44confidence)suggests**************************#012#012Ifyoubelievethatmongodshouldbeallowedwriteaccessonthemongod.pidfilebydefault.#012Thenyoushouldreportthisasabug.#012Youcangeneratealocalpolicymoduletoallowthisaccess.#012Do#012allowthisaccessfornowbyexecuting:#012#ausearch-c'mongod'--raw|audit2allow-Mmy-mongod#012#semodule-imy-mongod.pp#012

从提示中可以看出是SELinux的防护功能,阻止了访问。

SELinux

SELinux的全称是Security Enhanced Linux, 就是安全加强的Linux。在SELinux之前,root账号能够任意的访问所有文档和服务;如果某个文件设为777,那么任何用户都可以访问甚至删除;这种方式称为DAC(主动访问机制),很不安全。

DAC 自主访问控制: 用户根据自己的文件权限来决定对文件的操作,也就是依据文件的own,group,other/r,w,x权限进行限制。Root有最高权限无法限制。r,w,x权限划分太粗糙。无法针对不同的进程实现限制。

SELinux则是基于MAC(强制访问机制),简单的说,就是程序和访问对象上都有一个安全标签(即selinux上下文)进行区分,只有对应的标签才能允许访问。否则即使权限是777,也是不能访问的。

在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯通道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户(u)、角色(r)和类型(t)标识符。但我们最关注的是第三个部分

当程序访问资源时,主体程序必须要通过selinux策略内的规则放行后,就可以与目标资源进行安全上下文的比对,若比对失败则无法存取目标,若比对成功则可以开始存取目标,最终能否存取目标还要与文件系统的rwx权限的设定有关。所以启用了selinux后出现权限不符的情况时,你就得一步一步的分析可能的问题了。

解决过程:

/var/log/message中的信息看起来比较费劲,里面有一句提示:

ForcompleteSELinuxmessagesrun:sealert-le73ba9e8-f74d-4835-9b53-85667546b28c

根据提示执行:

#sealert-le73ba9e8-f74d-4835-9b53-85667546b28cSELinuxispreventing/usr/bin/mongodfromwriteaccessonthedirectory/data/mongodb/log.*****Plugincatchall_labels(83.8confidence)suggests*******************IfyouwanttoallowmongodtohavewriteaccessonthelogdirectoryThen必须更改/data/mongodb/log中的标签Do#semanagefcontext-a-tFILE_TYPE'/data/mongodb/log'

其中 FILE_TYPE 为以下内容之一:mongod_log_t, mongod_tmp_t, mongod_var_lib_t, mongod_var_run_t, tmp_t, var_lib_t, var_log_t, var_run_t。

然后执行:

restorecon-v'/data/mongodb/log'*****Plugincatchall(17.1confidence)suggests**************************......

上面提示输出中已经包含了,解决方法:

#semanagefcontext-a-tmongo_log_t'/data/mongodb/log'#restorecon-v'/data/mongodb/log'restoreconreset/data/mongodb/logcontextunconfined_u:object_r:unlabeled_t:s0->unconfined_u:object_r:mongod_log_t:s0

上面命令执行完毕后,就解决了/data/mongodb/log目录的文件权限问题。

同样的方法,再解决/data/mongodb/data和/data/mongodb/run目录的问题。

启动mongod,问题解决。

Nov906:08:51[localhost]systemd:StartingHigh-performance,schema-freedocument-orienteddatabase...Nov906:08:51[localhost]systemd:StartedHigh-performance,schema-freedocument-orienteddatabase.Nov906:08:51[localhost]mongod:abouttoforkchildprocess,waitinguntilserverisreadyforconnections.Nov906:08:51[localhost]mongod:forkedprocess:18218Nov906:08:51[localhost]mongod:childprocessstartedsuccessfully,parentexiting

P.S. 除了上面通过提示信息解决问题外,还有一个比较暴力的方法,直接关闭SELinux,但是不太建议。

#setenforce0#getenforcePermissive

上面是临时关闭,如果是永久关闭,就需要编辑/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled,但是只有重启后才会发挥作用。

以上是“CentOS 7系统下SELinux怎么阻止MongoDB启动”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!