1. SELinux介绍
SELinux(Security-Enhanced Linux)是Linux内核的一个安全模块,它通过强制访问控制(Mandatory Access Control,MAC)来对系统资源进行访问控制。相对于Linux传统的自由访问控制(Discretionary Access Control,DAC),SELinux具有更加强大的安全能力。但是,由于SELinux本身的复杂性,它在一定程度上给用户带来了使用上的困难。
2. MongoDB启动失败的原因
MongoDB是当前最流行的NoSQL数据库之一,在Linux系统上安装MongoDB时,在默认情况下就会启用SELinux。但是,在CentOS 7系统下,如果没有适当地配置SELinux策略,MongoDB将无法正常启动。
当我们通过系统日志来查看MongoDB启动失败原因时,可能会看到类似如下的日志记录:
type=AVC msg=audit(1520491888.531:613): avc: denied { write } for pid=778 comm="mongod" name="mongod.lock" dev="sda1" ino=550012054 scontext=system_u:system_r:mongod_t:s0 tcontext=unconfined_u:object_r:var_lib_t:s0 tclass=file
从日志中可以看出,SELinux阻止了MongoDB对一个文件的写入。
3. 解决MongoDB启动失败的问题
3.1 查看SELinux状态
为了了解SELinux是否处于启用状态,以及所采用的策略是何种类型,我们可以通过下面的命令来查看SELinux状态:
$ getenforce
如果该命令返回的结果是Enforcing,则说明SELinux处于启用状态,并且它是在强制执行安全策略。如果返回的是Permissive,则说明SELinux启用但是不强制执行安全策略。
3.2 查看SELinux策略
在CentOS 7系统中,SELinux采用了名为polkit的新的策略文件格式来管理安全策略。这种格式虽然相对于传统的策略文件格式更加易于管理,但是其语法要求也更加严格。
我们可以通过下面的命令来查看SELinux当前采用的策略是何种类型:
$ sestatus
该命令的输出结果应该包含有类似如下的信息:
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
其中,Mode from config file提示当前SELinux启用的策略类型是enforcing,即强制执行。Policy from config file提示当前收到影响的策略文件是targeted,这是SELinux默认采用的策略。
3.3 为MongoDB创建SELinux策略模块
当SELinux阻止MongoDB成功启动时,我们可以通过创建一个自定义的SELinux策略模块来解决问题。
下面是创建SELinux策略模块的步骤:
- 启用SELinux调试信息:
$ sudo setsebool -P allow_execheap 1
在执行以上命令之后,我们就可以打开SELinux的调试信息功能,以便于我们准确地分析可能存在的安全问题。
- 让MongoDB执行需要的操作
现在,我们需要让MongoDB能够执行之前SELinux阻止的那个操作,即写入mongod.lock文件。我们可以通过下面的命令来执行这个操作:
$ echo 0 | sudo tee /sys/fs/selinux/logins
- 导出SELinux策略模块
在获取了SELinux调试信息以后,我们就可以使用audit2allow命令来生成一个自定义的SELinux策略模块了。具体的命令如下所示:
$ sudo grep mongod /var/log/audit/audit.log | audit2allow -M mypol
在这个命令中,我们首先使用grep命令来检索当前系统日志中与MongoDB启动有关的信息。然后,我们将这些信息传递给audit2allow命令,该命令会根据当前的SELinux策略文件来生成一个名为mypol的策略模块。
- 将SELinux策略模块加载到系统中
最后,我们需要将刚刚生成的策略模块mypol加载到系统中,使得MongoDB可以顺利启动。具体的命令如下所示:
$ sudo semodule -i mypol.pp
在执行以上命令之后,我们就可以尝试再次启动MongoDB了。如果一切正常,您应该可以看到MongoDB成功启动的日志信息了。
4. 总结
作为一种强制访问控制机制,SELinux确实能够提供更为可靠的安全保障。但是,由于其本身的复杂性,它常常会为系统管理员带来不必要的困扰。有时候,为了避免由SELinux引起的相关问题,我们甚至需要将其完全关闭。
如果您在CentOS 7系统中安装MongoDB并且无法成功启动该程序,那么很可能是由于SELinux阻止了MongoDB访问系统资源的缘故。在这种情况下,为了解决问题,我们可以根据上述步骤创建一个自定义的SELinux策略模块,或者直接关闭SELinux来解决问题。