読者です 読者をやめる 読者になる 読者になる

SELinuxを有効にしているときにありがちなpermission denied

Redhat系のディストリビューションでは、もう普通にSELinuxがenableというかenforcingの状態になってるケースが多いと思うのですけれども、そういう環境で、一般ユーザのホームディレクトリ以下でpublic_html以外のところにコンテンツを置いて参照させようとすると、403(Forbidden)になることがあります。
デバッグしようとしてapache httpdを /usr/sbin/httpd -X とかで起動すると、今度はOK。こうなったら、SELinuxの設定が抜けていることが多いです。
こういうことは自分はしょっちゅうですけど、そうなると対処にも慣れます。というか、設定手順の一部とすべきなんでしょう。
以下:参考

手順としては
1)httpdの設定ファイルを修正して、Aliasディレクティブを設定したり、当該ディレクトリについてのアクセス権などのオプションをDirectoryディレクティブで設定したりします。例えば、

Alias /special/ "/home/user/web/"

    AllowOverride All
    Options ExecCGI
    Order allow,deny
    Allow from all

2)/usr/sbin/httpd -Sなどとして、設定の文法的誤りがないかどうかを確認します。(最後のSyntax OKだけがチェックポイント)

# /usr/sbin/httpd -S
VirtualHost configuration:
192.168.0.1:80        is a NameVirtualHost
         default server some.example.com (/etc/httpd/conf/httpd.conf:14)
         port 80 namevhost some.example.com (/etc/httpd/conf/httpd.conf:14)

wildcard NameVirtualHosts and _default_ servers:
_default_:443          some.example.com (/etc/httpd/conf.d/httpd.conf:81)
Syntax OK

3)SELinuxで、コンテンツを置くディレクトリ以下はhttpdがアクセス可能なタイプだという定義を追加します。

# semanage fcontext -a -t httpd_sys_content_t '/home/user/web(/.*)?'

4)コンテンツを置いたディレクトリに対して、先ほど定義したルールを適用して、実際にhttpdからアクセス可能になります。このステップを忘れるとダメです。

# restorecon -R /home/user/web

5)念の為、SELinuxが有効になっているか確認しておくと良いでしょう。大抵はPolicy from config fileはtargetedになっていると思います。

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

なんだかうっとおしいとお思いのあなたへ。

確かにそうですが、httpdを乗っ取られて、root権限になったとしても、コンテンツのあるディレクトリ以外にはそうそう手を触れられない、というのが味噌なわけです。アタックは、私のところのようなマイナーなサーバでも、分け隔てなくやってきます。パッチを適宜当てるのは、なかなか大変なのと、zero day attackに備えるにはこれ以上有効な手段はあまり無いと思います。
それでも、インジェクションによるコンテンツの改竄とかを防ぐのは難しいのがつらいところ。そうなると、TripwireやTOMOYO Linuxとか、Web Application Firewallになりますかね。あくまでも、セキュリティ向上の一手段ということでご了承下さい(ぉぃ。どっちかというと、手間としては楽な部類じゃないかと思います。