🔖

SELinux のファイルアクセス制限でハマったメモ

2021/04/07に公開

パーミッションを変えてもうまく 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