PHPとPDOライブラリを使用してCentOS7ボックス上のSQLiteファイルにアクセスしようとしています。この質問のように読み取り専用エラーが発生していました--- https:// stackoverflow .com/questions/3319112/sqlite-read-only-database
そしてその質問によると、答えはSELinuxを無効にすることでした。開発には問題ありませんが、本番システムではSELinuxを有効にしておく必要があります。
SQLiteファイルで読み取り専用エラーが発生しないようにSELinuxを有効のままにするにはどうすればよいですか?
(注:それに関連するその質問の回答は、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
ドメインで実行)は、一時ディレクトリ以外のシステム上のほとんどの場所にファイルを書き込むことを許可されていません。
コンテキストを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
解決策はこれらの2行です(ファイルが_/var/www/html
_にあると仮定します)
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?" restorecon -v /var/www/html
注意点があります:
最初の行[〜#〜] must [〜#〜]のパスは引用符で囲んでください。そうしないと、_bash: syntax error near unexpected token ('
_になります。
あなたmustは、ファイルだけでなく、ディレクトリ全体に対してもそれを行う必要があります。これは、括弧内の奇妙なビットが行うことです。
(残念ながら、上記のリンクされた質問でこれについて役立つコメントをするための担当者が不足しています。あるいは、正しい/間違った答えに賛成/反対票を投じることさえできません。)