SELinux のファイルアクセス制限でハマったメモ
パーミッションを変えてもうまく nginx が動かなかったが、ログファイルの context が違うために permission denided でコケてた。ファイルを削除して再起動すればいいのだけど、それはそれでなんか違う気もするので、ちょっと調査メモ。
そもそも http の想定外のディレクトリに置いてるのが原因。SELinux を enforcing から permissive にするのがいいと思う。
以下、勉強がてらガサガサアサッたメモ
context
Ansible で環境構築をしているときに、virtualbox にインストールしては削除するを繰り返していて、nginxのインストールはできるが設定ファイルを敷いた後で必ずコケる。nginx: [emerg] open() "/srv/hoge/log/access.log" failed (13: Permission denied)
が原因なのはわかるんだが、パーミッションは合わしている。
それで SELinux の設定はいじっていないので、中を覗いたのがきっかけ。
Success Pattern
[root@localhost ~]# stat /srv/hoge/log/access.log
File: '/srv/hoge/log/access.log'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 67522172 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:httpd_cache_t:s0
Access: 2021-04-07 12:17:31.176670796 +0000
Modify: 2021-04-07 12:17:31.176670796 +0000
Change: 2021-04-07 12:17:31.176670796 +0000
Birth: -
Fail Pattern
[root@localhost ~]# stat /srv/hoge/log/access.log
File: '/srv/hoge/log/access.log'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 67522171 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:var_t:s0
Access: 2021-04-07 12:14:15.549764123 +0000
Modify: 2021-04-07 12:14:15.549764123 +0000
Change: 2021-04-07 12:14:15.549764123 +0000
Birth: -
Context
see : 5.7. SELINUX コンテキスト - ファイルのラベル付け -- redhat customer portal
fail pattern では unconfined_u:object_r:var_t:s0
とあるので、User:unconfined_u
Role:object_r
Type:var_t
Level:s0
となっている。一方で Success Pattern では User:system_u
Role:object_r
Type:httpd_cache_t
Level:s0
と、User,Type が違うために怒られる。
変更には chcon
,segmanage fcontext
がある。
chcon
一時的に Context を変更させる。 restorecon
コマンドが実行されると変更前に戻ります。変更には chcon system_u:object_r:httpd_cache_t:s0 <file>
みたいな使い方。
segmanage
see : 5.7.2. 永続的な変更: SEMANAGE FCONTEXT -- red hat customer Portal
当環境(CentOS7)には標準で入っていないので yum -y install policycoreutils-python
でインストールする必要があるみたいです。
User,Type を追加?(変更でもいいような気もするが)するには semanage fcontext -a -u system_u -r httpd_cache_t /srv/hoge/log
とかすればいい感じっぽい。
Discussion