Использование SQLite через PHP без полного отключения SELinux

Я пытаюсь получить доступ к файлу SQLite на коробке CentOS7, используя PHP и библиотеку PDO. Я получал ошибки только для чтения, как этот вопрос - 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

2 ответа

По умолчанию 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

Итак, из сочетания проб и ошибок, а также из ответа Михаила + комментарии и эти:

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 ('

  • Вы также должны сделать это для всего каталога, а не только для файла. Что и делает странный бит в скобках.

(К сожалению, мне не хватает представителя, чтобы делать полезные комментарии по этому поводу в приведенных выше связанных вопросах. Или даже голосовать за / против правильных / неправильных ответов.)

Другие вопросы по тегам