Linux下public目录777权限下,目录无权限创建的问题

2020-04-11

这是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

{/if}