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:file logAppend:true path:/data/mongodb/log/mongod.log #Whereandhowtostoredata. storage: dbPath:/data/mongodb/data .....
文件权限:
#ls-alh drwxr-xr-x.5mongodmongod4.0K11月114:53mongodb #cdmongodb #ls-alh drwxr-xr-x.3mongodmongod4.0K11月919:08data drwxr-xr-x.2mongodmongod4.0K11月919:06log drwxr-xr-x.2mongodmongod4.0K11月114:54run
执行systemctlstartmongod命令后,查看状态发现并没有启动,查看/var/log/message,发现以下错误
Nov906:06:44[localhost]setroubleshoot:failedtoretrieverpminfofor/data/mongodb/run/mongod.pid Nov906:06:44[localhost]setroubleshoot:SELinuxispreventing/usr/bin/mongodfromwriteaccessonthefile/data/mongodb/run/mongod.pid.ForcompleteSELinuxmessagesrun:sealert-lf7148e11-b126-401e-ba9f-a9a87c1e54ae Nov906: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的全称是SecurityEnhancedLinux,就是安全加强的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-85667546b28c SELinuxispreventing/usr/bin/mongodfromwriteaccessonthedirectory/data/mongodb/log. *****Plugincatchall_labels(83.8confidence)suggests******************* Ifyouwanttoallowmongodtohavewriteaccessonthelogdirectory Then必须更改/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:18218 Nov906:08:51[localhost]mongod:childprocessstartedsuccessfully,parentexiting
P.S.除了上面通过提示信息解决问题外,还有一个比较暴力的方法,直接关闭SELinux,但是不太建议。
#setenforce0 #getenforce Permissive
上面是临时关闭,如果是永久关闭,就需要编辑/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled,但是只有重启后才会发挥作用。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。