|
Contributed at: 2004/11/15 (Mon) 20:34
|
■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 ]
固定リンク
|