我正在尝试使用 PHP 和 PDO 库访问 CentOS7 机器上的 SQLite 文件。我得到了只读错误,就像这个问题一样 -https://stackoverflow.com/questions/3319112/sqlite-read-only-database
对于这个问题,答案是禁用 SELinux。这对于开发来说没问题,但对于生产系统,我希望保持 SELinux 处于启用状态。
如何保持 SELinux 处于启用状态,而不会在 SQLite 文件中出现只读错误?
(注意:该问题中与之相关的答案似乎与 CentOS 7 不兼容)。
编辑:tail -f /var/log/audit/audit.log
type=AVC msg=audit(1543600144.088:1845): avc: denied { write } for pid=13968 comm="httpd" name="html" dev="dm-0" ino=50632493 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=dir type=SYSCALL msg=audit(1543600144.088:1845): arch=c000003e syscall=2 success=no exit=-13 a0=5567d0b40859 a1=80042 a2=1ff a3=5567d0b40859 items=0 ppid=13674 pid=13968 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null) type=PROCTITLE msg=audit(1543600144.088:1845): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44
答案1
默认情况下,PHP(在域下运行httpd_t
)不允许在系统上的大多数位置(临时目录除外)写入文件。
您可以通过将特定文件的上下文更改为 来将其设置为可写httpd_sys_rw_content_t
。例如,要临时更改上下文:
chcon -t httpd_sys_rw_content_t /var/lib/myapp/database.sqlite
要使此操作永久生效,您需要设置与文件匹配的永久文件上下文,以便始终以这种方式标记文件。您可以使用 执行此操作semanage fcontext
。
semanage fcontext -a -t httpd_sys_rw_content_t /var/lib/myapp/database.sqlite
答案2
因此,通过反复试验,并参考迈克尔的回答和评论的帮助,以下是一些帮助:
https://stackoverflow.com/a/41132426
https://stackoverflow.com/questions/3319112/sqlite-read-only-database
解决方案是这两行(假设文件位于/var/www/html
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?" restorecon -v /var/www/html
有以下注意事项:
第一行必须将路径放在引号中,否则你会得到
bash: syntax error near unexpected token ('
你必须也对整个目录执行此操作,而不仅仅是文件。这就是括号中奇怪的部分的作用。
(不幸的是,我缺乏代表来对上述链接的问题做出有用的评论。甚至无法对正确/错误的答案投赞成/反对票。)