CentOS 7系统下SELinux阻止MongoDB启动的问题详解

  • A+
所属分类:MongoDB

问题描写:

比来发现了一个问题,在新装的CentOS7上,安装了MongoDB3.4,挂载了一个年夜的数据盘后,改动/etc/mongo.conf,将设置装备摆设文件中的log和data目次放在新的数据盘下,并改动文件的拜访权限。

改完后的mongo.conf:

# mongod.conf

# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
 destination: file
 logAppend: true
 path: /data/mongodb/log/mongod.log

# Where and how to store data.
storage:
 dbPath: /data/mongodb/data
.....

文件权限:

# ls -alh
drwxr-xr-x. 5 mongod mongod 4.0K 11月 1 14:53 mongodb

# cd mongodb
# ls -alh
drwxr-xr-x. 3 mongod mongod 4.0K 11月 9 19:08 data
drwxr-xr-x. 2 mongod mongod 4.0K 11月 9 19:06 log
drwxr-xr-x. 2 mongod mongod 4.0K 11月 1 14:54 run

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

Nov 9 06:06:44 [localhost] setroubleshoot: failed to retrieve rpm info for /data/mongodb/run/mongod.pid
Nov 9 06:06:44 [localhost] setroubleshoot: SELinux is preventing /usr/bin/mongod from write access on the file /data/mongodb/run/mongod.pid. For complete SELinux messages run: sealert -l f7148e11-b126-401e-ba9f-a9a87c1e54ae
Nov 9 06:06:44 [localhost] python: SELinux is preventing /usr/bin/mongod from write access on the file /data/mongodb/run/mongod.pid.#012#012淫乱** Plugin restorecon (94.8 confidence) suggests 淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱#012#012If you want to fix the label. #012/data/mongodb/run/mongod.pid default label should be default_t.#012Then you can run restorecon.#012Do#012# /sbin/restorecon -v /data/mongodb/run/mongod.pid#012#012淫乱** Plugin catchall_labels (5.21 confidence) suggests 淫乱淫乱淫乱淫乱淫乱淫乱*#012#012If you want to allow mongod to have write access on the mongod.pid file#012Then you need to change the label on /data/mongodb/run/mongod.pid#012Do#012# semanage fcontext -a -t FILE_TYPE '/data/mongodb/run/mongod.pid'#012where FILE_TYPE is one of the following: 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.#012Then execute:#012restorecon -v '/data/mongodb/run/mongod.pid'#012#012#012淫乱** Plugin catchall (1.44 confidence) suggests 淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱**#012#012If you believe that mongod should be allowed write access on the mongod.pid file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'mongod' --raw | audit2allow -M my-mongod#012# semodule -i my-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中的信息看起来比拟费劲,里面有一句提醒:

For complete SELinux messages run: sealert -l e73ba9e8-f74d-4835-9b53-85667546b28c

依据提醒执行:

# sealert -l e73ba9e8-f74d-4835-9b53-85667546b28c
SELinux is preventing /usr/bin/mongod from write access on the directory /data/mongodb/log.

淫乱** Plugin catchall_labels (83.8 confidence) suggests 淫乱淫乱淫乱淫乱淫乱淫乱*

If you want to allow mongod to have write access on the log directory
Then 必需变动 /data/mongodb/log 中的标签
Do
# semanage fcontext -a -t FILE_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'


淫乱** Plugin catchall (17.1 confidence) suggests 淫乱淫乱淫乱淫乱淫乱淫乱淫乱淫乱**
......

上面提醒输出中已经包括了,办理办法:

# semanage fcontext -a -t mongo_log_t '/data/mongodb/log'
# restorecon -v '/data/mongodb/log'
restorecon reset /data/mongodb/log context unconfined_u:object_r:unlabeled_t:s0->unconfined_u:object_r:mongod_log_t:s0

上面敕令执行完毕后,就办理了/data/mongodb/log目次的文件权限问题。

同样的办法,再办理/data/mongodb/data和/data/mongodb/run目次的问题。

启动mongod,问题办理。

Nov 9 06:08:51 [localhost] systemd: Starting High-performance, schema-free document-oriented database...
Nov 9 06:08:51 [localhost] systemd: Started High-performance, schema-free document-oriented database.
Nov 9 06:08:51 [localhost] mongod: about to fork child process, waiting until server is ready for connections.
Nov 9 06:08:51 [localhost] mongod: forked process: 18218
Nov 9 06:08:51 [localhost] mongod: child process started successfully, parent exiting

P.S. 除了上面经由过程提醒信息办理问题外,还有一个比拟暴力的办法,直接封闭SELinux,然则不太建议。

# setenforce 0
# getenforce
Permissive

上面是暂时封闭,假如是永远封闭,就必要编纂/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled,然则只有重启后才会施展作用。

总结

以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。

您可能感兴致的文章:

Centos 7下Mongodb开机无法自启动的办理办法

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: