Pocketstudio.jp :: Logbook :: Linux :: Fedora Core 3のメモ
 Contributed at:   2004/11/15 (Mon) 20:34

■ /linux/FedoraCore3/ CGI の Permission denied


■Internal Server Error

 テスト用に次のような test.cgi を設置

#!/usr/bin/perl

print "Content-type:text/html\n\n";
print "<H1>CGI test</h1>";
open (OUT,"$gt;"."hello.txt") or print "error:$!";
print OUT "hello!\n";
close (OUT);
 パーミッションは 755(rwxr-xr-x) と一般的なもの。/var/www/html を 757(rwxr-xrwx)として hello.txt を作成するテスト。
# ls -l /var/www/html/test.cgi
-rwxr-xr-x  1 root root 164 11月 15 16:48 /var/www/html/test.cgi
 画面に『 CGI test 』は表示されるものの、ファイルの書込がされない。
 『 error:Permission denied 』の表示。
 こんな時はエラーログを見てみる。。
# tail -f  /var/log/httpd/error_log
 error_log にはエラー無し。。。

 そういえば、SELinux(エス・イー・リナックス)のセキュリティ機能をセットアップ時にアクティブにしていたのを思い出す。
 設定状況の確認。

$ cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted
 色々知らない言葉が出てきている。
 6 行目『 SELINUX=enforcing 』は SELinux の機能を有効にしている(強制している)ようだ。permissive の場合は障害原因追及用に、ポリシーを有効にしつつメッセージを出すだけで、実際には適用されないみたい。
 10 行目『 SELINUXTYPE=targeted 』はポリシーの適用方法らしい。
 日本語訳するとこんな感じかな。  
# SELinux がシステム上でどのような働きをするか制御します。
# SELINUX= 次の3つのうち1つのポリシーを選べます。
#       enforcing - SELinux セキュリティ・ポリシーが強制されます。
#       permissive - SELinux ポリシーによる警告は出しますが、実際には制限されません。
#       disabled - SELinux は完全に無効です。
SELINUX=enforcing
# SELINUXTYPE= ポリシーの適用方法です。適用種類:
#       targeted - ネットワーク関連デーモンを防衛。
#       strict - 完全な SELinux 防衛。
SELINUXTYPE=targeted
 本当に有効になっているかどうかは、次のコマンドで確認可能。
# cat /selinux/enforce
1
 この値が 1 の時は有効、0 は無効。
 手っ取り早く無効にするには config ファイルを書き換えるより、次のコマンド実行。
# echo 0 > /selinux/enforce
 逆に有効にしたい場合は 1 を与えると良い。
# echo 1 > /selinux/enforce
 さて、CGI でファイルの書込が出来ない件、よく見ると /var/log/messages にログが出力されている事が分かります。
# tail /var/log/messages

Nov 15 17:40:30 sion kernel: audit(1100508030.197:0): avc:  denied  { write } for pid=18414 
exe=/usr/bin/perl name=hello.txt dev=dm-0 ino=12944628 scontext=root:system_r:httpd_sys_script_t
tcontext=root:object_r:httpd_sys_content_t tclass=file
 CGI としては /var/www/html に “hello.txt” の出力をしてあげたいけど、/etc/selinux/targeted/contexts/files/file_contexts のポリシー適用を受けているようです。
 『 { write } 』はアクセス・ベクター=アクセス制御可能な操作の種類の事。write とか read とかがある。
 『 exe=/usr/bin/perl 』は実行しようとしているプロセス(perlですね)
 『 scontext=root:system_r:httpd_sys_script_t 』は「httpd_sys_script_t」という名前のプロセスのドメイン。
 『 tcontext=root:object_r:httpd_sys_content_t 』は「httpd_sys_content_t」というリソースの種類。
 『 tclass=file 』はオブジェクト・クラス。要はアクセス対象が file (ファイル) ですという意味。
/var/www(/.*)?                  system_u:object_r:httpd_sys_content_t
 つまり、現状では SELinux の得体の知れない(httpd_sys_content_t と出てますが…)なんらかのポリシーで制限を受けている事がわかります。

 さて、やりたい事はユーザ apache (httpd の実行ユーザ権限=httpd.conf の User で定義) で /usr/bin/perl のファイルの書込を許可したい訳ですから、そういうポリシーを追加したら良いわけですよね。

 ls コマンドに —context の引数をつけると、現状の /var/www/html が確認できます。

# ls -al --context /var/www/html/
drwxr-xrwx  root     root     system_u:object_r:httpd_sys_content_t .
drwxr-xr-x  root     root     system_u:object_r:httpd_sys_content_t ..
-rw-r--r--  root     root     root:object_r:httpd_sys_content_t index.html
-rwxr-xr-x  root     root     root:object_r:httpd_sys_content_t test.cgi
 確かに『 /var/www/html 』には『 httpd_sys_content_t 』というリソースが指定されていました。
 『 chcon 』コマンドを使って変更ができるようです(selinux-users-MLで流れていました)。
# chcon system_u:object_r:httpd_sys_script_rw_t /var/www/html/
 もう一度 ls で見てみると変更されている事がわかります。
# ls -al --context /var/www/html/
drwxr-xrwx  root     root     system_u:object_r:httpd_sys_script_rw_t .
drwxr-xr-x  root     root     system_u:object_r:httpd_sys_content_t ..
-rw-r--r--  apache   apache   root:object_r:httpd_sys_script_rw_t hello.txt
-rw-r--r--  root     root     root:object_r:httpd_sys_content_t index.html
-rwxr-xr-x  root     root     root:object_r:httpd_sys_content_t test.cgi


[11/17追記]

chcon で変えても恒久的な対策になりません。
「FedoraCore3 ドキュメント・ルートでの CGI 書込許可 」に対策をまとめました。


参考資料

SELinux徹底ガイド
http://www.amazon.co.jp/exec/obidos/ASIN/4822221113/

[分類 /linux/FedoraCore3 ] 固定リンク