Назад | Перейти на главную страницу

Использование 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

По умолчанию PHP (который работает под httpd_t domain) не может записывать файлы в большинстве мест в системе, кроме временных каталогов.

Вы можете сделать конкретный файл доступным для записи, изменив его контекст на 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 ('

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

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