这是linux开启了SELinux,这是linux的一个安全子系统
SELinux有三种状态:
- Enforcing (1) 强制模式:此模式情况下,任何违反SElinux策略的行为都被禁止,并被作为内核信息记录下来,图形界面下会跳出来一个黄色五角星提醒你,并提供解决办法,命令行下运行tail /var/log/messages |grep run命令,将过滤出来的内容复制run后面的内容运行。(有拒绝操作,有日志的记录)
- Permissive (0) 警告模式:此模式情况下,任何违反SElinux策略的行为都不会被阻挡,只是会提醒警告用户,这个模式可以排错用。(调试环境,只做日志记录,不会有拒绝的操作)。
- Disabled 关闭模式
getenforce 查看状态
/usr/sbin/sestatus 查看详情
setenforce 0 临时关闭(重启恢复开启状态)
//永久关闭,修改配置后,重启服务器才会生效
vim /etc/sysconfig/selinux
将"SELINUX=enforcing"改为"SELINUX=disabled"
查看SELinux的状态,如果是Enforcing,使用 setenforce 0 将SELinux临时关闭,然后再次访问,如果mkdir()执行成功,那么说明是SELinux的问题,这时有两种解决方法;
方法1:
永久关闭SELinux
方法2:
使用命令:chcon -R -t httpd_sys_content_rw_t <文件路径>
对目录进行设置后,mkdir()就不会报错没有权限了
方法二的解决方法分析:
首先查看文件的标记:ls -Z a.txt
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.txt
查看进程的标签:ps -auxZ 或 ps -lAZ | grep httpd(以apache为例,nginx输出的内容也是一样的)
不管是对于文件还是进程还是端口都有selinux的标签,叫做安全上下文。上面有四列,我们关心的是第三列httpd_t,这个就是进程的安全上下文。
所以当文件或目录并没有 httpd_t的标记时就会访问或创建报错。
针对SELinux对文件标记的一些命令
修改文件的标签值为 httpd_sys_content_t:对文件或目录可访问 httpd_sys_content_rw_t:对文件或目录可读可写
chcon -R -t httpd_sys_content_t <目录/文件>
查看文件或目录的标签
ls -Z a.txt
ll -Z /var/www/html/index.html
查看进程的标签
ps -auxZ
ps -lAZ | grep httpd
恢复到初始值
restorecon -R <目录/文件>
SQLSTATE[HY000] [2002] Permission denied
发生这种情况是因为selinux避免了从httpd服务器到远程数据库服务器的数据库连接;需要如下解决方法
方法1:关闭selinux
方法2:
// 在Selinux中添加网站的端口
semanage port -a -t http_port_t -p tcp 80
// 查询已经添加的端口
semanage port -l | grep http_port_t
// 通知SELinux您要允许从httpd服务器到db远程服务器的网络连接,-P直接将设置值写入配置文件,该设置数据将来会生效的
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db 1
文章来源于:https://blog.csdn.net/qq_34556414/article/details/82846552
https://blog.csdn.net/qq_32372113/article/details/80688759