今天遇到一个访问ftp失败的问题, 场景大致是: 在/var/ftp下面新建一个目录/pxeboot ,然后将其挂载到一个iso上,结果ftp无法访问。
最后定位到是selinux 的问题。 之前对selinux只知道怎么开关,没什么理解,现在就学习一下吧。
基本概念
seLinux的目的是对程序读取文件进行权限的控制,即便你chmod 777,如果不符合seLinux的规则,那么程序同样无法访问目标文件。
selinux控制访问的规则定义在策略中,程序和目标资源都有各自的安全上下文(security context),只有双方的安全上下文符合策略中的规定时才能够成功访问。
seLinux安全上下文 由冒号分隔的四个字段组成,其中最重要的是第三个, 称为 类型字段 。
下面图例说明了httpd是怎么读取到/var/www/html目录中的文件的。
实践:
修改seLinux规则需要用到的主要命令有 chcon restorecon setsebool。
关于chcon更详细的用法:
chcon 的作用是更改相应的安全上下文,其实在seLinux规则中可以定义目录文件的默认安全上下文,我们可以通过restorecon来恢复默认设置。上例中,我们只需要 执行 restorecon -Rv /var/www/html 就可以还原 /var/www/html 目录的默认设置,从而使httpd可以访问a.html。
关于restorecon的详细用法:
既然我们说了restorecon可以恢复默认设置,那么默认设置定义在哪里拿?在目录/etc/selinux/targeted/contexts中定义着这些默认设置。我们可以使用semanage方便管理他们。
我们现在知道了如果seLinux的规则不允许的话,程序就无法访问到目标文件,而这些规则是通过一个个 规则布尔值 来表示的,我们可以通过更改这些规则布尔值来放开部分限制。
我们下面就通过这种方式来解决在开头提到的那个问题。
如果程序因为seLinux的原因导致了访问目标资源失败,往往会在下面两个日志中有所体现。
/var/log/messages /var/log/audit/audit.log
按照相应提示定位修改即可。
总结: seLinux的初步认识就是这样了,我的最直白的理解就是seLinux通过对比程序和目标资源的安全上下文来决定是否可以成功访问。