Info: Version 1.8.x is available.

English Page

Last modified: $Date: 2024-03-31 10:57:05 +0000 (Sun, 31 Mar 2024) $

TOMOYO Linux の世界
第10回:「 Apache の権限を分割してみよう」

今回の内容

今回は Apache の VirtualHost 毎にドメインを分割する手順について紹介しようと思います.環境としては, CentOS 5 を使用します.

mod_ccs のインストール

mod_ccs は Apache 2.x 向けのモジュールです. TOMOYO Linux 1.7.2 以降で利用可能な「プログラムの実行を伴わないドメイン遷移」機能を利用して,バーチャルホスト単位でドメインを分割したり, mod_perl などにより Apache プロセス内で動作するCGIプログラムを別のドメインで動作させたりすることができるようになります. mod_ccs はカーネル 2.4 では動作しませんのでご注意ください.

まず, Apache 向けのモジュールをコンパイルする準備を行います. RedHat 系の場合は httpd-devel パッケージを, Debian 系の場合は apache2-threaded-dev または apache2-prefork-dev パッケージをインストールします. root ユーザとしてログインし,図1のコマンドを実行してください.

■図1 Apache モジュールをコンパイルするためのパッケージをインストール
# yum install httpd-devel

次に,ソースコードをダウンロードします.図2のコマンドを実行してください.

■図2 mod_ccs のソースをダウンロード
# wget -O mod_ccs.c 'https://sourceforge.net/p/tomoyo/svn/5673/tree/branches/mod_ccs.c?format=raw'

コンパイル/インストール/有効化を行います.図3のコマンドを実行してください. RedHat 系の場合は apxs コマンドを, Debian 系の場合は apxs2 コマンドを使います.

■図3 mod_ccs のコンパイル
# apxs -i -a -c mod_ccs.c

正常に終了した場合, Apache の設定ファイルの中に図4のような指定が見つかるはずです.

■図4 mod_ccs をロードするための指定
LoadModule ccs_module /usr/lib/httpd/modules/mod_ccs.so

mod_ccs の設定

mod_ccs はデフォルトで ServerName に基づくドメイン遷移を行います.図5のように Apache の設定ファイルの中で CCS_TransitionMap キーワードを用いてパス名とドメイン名の対応表を定義してやれば,バーチャルホスト名に基づくドメイン遷移に加えて,要求されたファイルのパス名に基づくドメイン遷移も行います.図5では /etc/hosts で www.tomoyo00.com www.tomoyo01.com www.tomoyo02.com www.tomoyo03.com のIPアドレスが登録されているものと仮定します.

■図5 CCS_TransitionMap キーワードの指定例
<VirtualHost *:80>
    DocumentRoot /var/www/html-00
    ServerName www.tomoyo00.com
    CCS_TransitionMap /etc/ccs/httpd-tomoyo00.conf
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/html-01
    ServerName www.tomoyo01.com
    CCS_TransitionMap /etc/ccs/httpd-tomoyo01.conf
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/html-02
    ServerName www.tomoyo02.com
    CCS_TransitionMap /etc/ccs/httpd-tomoyo02.conf
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/html-03
    ServerName www.tomoyo03.com
    CCS_TransitionMap /etc/ccs/httpd-tomoyo03.conf
</VirtualHost>

CCS_TransitionMap キーワードで指定されたファイルには,図6のようにリクエストされたファイルのパス名とドメイン名の対応表を定義しておきます.

■図6 パス名とドメイン名の対応表の記述例
/var/www/cgi-bin/\*         cgi-programs
/usr/share/horde/\{\*\}/\*  horde
/var/www/html/\{\*\}/\*     static-files

ここから先は TOMOYO Linux カーネルで起動している必要があります.

TOMOYO Linux は SELinux と同時に使用することができますが, SELinux のデフォルトの設定では /proc/ccs/.transition への書き込みが拒否されてしまいます. SELinux が有効になっている場合, Apache に対して /proc/ccs/.transition への書き込みを認めるようにしてください.( SELinux の設定を変更する手順はディストリビューションやバージョンにより異なります.図7は CentOS 5 では使えますが,それより古いバージョンでは使えないことがあります.)

■図7 Apache に対して /proc/ccs/.transition への書き込みを認める
# cd /etc/selinux/
# echo 'type=AVC msg=audit(1277948886.369:106): avc:  denied  { write } for pid=32078 comm="httpd" name=".transition" dev=proc ino=-268435010 scontext=root:system_r:httpd_t:s0 tcontext=system_u:object_r:proc_t:s0 tclass=file' | audit2allow -M ccsecurity
# semodule -i ccsecurity.pp

図8を実行して Apache を再起動してください.

■図8 Apache の起動
# service httpd restart

/proc/ccs/.transition への書き込みができなかった場合,図9( CCS_TransitionMap キーワードを指定した場合)または図10( CCS_TransitionMap キーワードを指定しない場合)のようなメッセージが表示されます.

■図9 Apache の起動時のエラーメッセージ
mod_ccs: Unable to open /proc/ccs/.transition for writing. (errno = 13)
■図10 Apache のエラーログ( /var/log/httpd/error_log )
[Thu Jul 01 16:31:10 2010] [error] [client 127.0.0.1] (13)Permission denied: mod_ccs: Unable to open /proc/ccs/.transition for writing.

CCS_TransitionMap キーワードで指定されたファイルに問題があった場合,図8の実行時にエラーメッセージが表示されます.

ドメイン遷移が行われていることを確認するために,簡単なCGIプログラムを作成します.(図11)

■図11 ドメイン遷移が行われていることを確認するためのCGIプログラム
# cat > /var/www/cgi-bin/test.cgi << "EOF"
#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>test</TITLE>\n";
print "</HEAD>\n";
print "<BODY>\n";

open(IN, "/proc/ccs/self_domain") || print "error";
$domain = <IN>;
$domain =~ s/&/&amp;/g;
$domain =~ s/</&lt;/g;
$domain =~ s/>/&gt;/g;
close(IN);
print $domain;
print "\n";

print "</BODY>\n";
print "</HTML>\n";
EOF
# chmod 755 /var/www/cgi-bin/test.cgi

/proc/ccs/self_domain はデフォルトでは root しかアクセスできないので,図11のプログラムからアクセスできるようにするためにパーミッションを緩めます.(図12)

■図12 CGIプログラムから /proc/ccs/self_domain へのアクセスを認める
# chmod 444 /proc/ccs/self_domain

システム起動時に自動的に緩めるようにするには図13のようにします.

■図13 起動時にパーミッションを設定する
# cat > /etc/ccs/ccs-post-init << EOF
#! /bin/sh
chmod 444 /proc/ccs/self_domain
exit 0
EOF
# chmod 700 /etc/ccs/ccs-post-init

curl コマンド(またはWebブラウザ)を使ってサンプルプログラムを表示し,ドメイン遷移が行われていることを確認します.(図14)

■図14 ドメイン遷移が行われていることを確認する
[root@tomoyo ~]# curl http://www.tomoyo00.com/cgi-bin/test.cgi
<HTML>
<HEAD>
<TITLE>test</TITLE>
</HEAD>
<BODY>
&lt;kernel&gt; /usr/sbin/httpd //www.tomoyo00.com //default /var/www/cgi-bin/test.cgi
</BODY>
</HTML>
[root@tomoyo ~]# curl http://www.tomoyo01.com/cgi-bin/test.cgi
<HTML>
<HEAD>
<TITLE>test</TITLE>
</HEAD>
<BODY>
&lt;kernel&gt; /usr/sbin/httpd //www.tomoyo01.com //default /var/www/cgi-bin/test.cgi
</BODY>
</HTML>
[root@tomoyo ~]# curl http://www.tomoyo02.com/cgi-bin/test.cgi
<HTML>
<HEAD>
<TITLE>test</TITLE>
</HEAD>
<BODY>
&lt;kernel&gt; /usr/sbin/httpd //www.tomoyo02.com //default /var/www/cgi-bin/test.cgi
</BODY>
</HTML>
[root@tomoyo ~]# curl http://www.tomoyo03.com/cgi-bin/test.cgi
<HTML>
<HEAD>
<TITLE>test</TITLE>
</HEAD>
<BODY>
&lt;kernel&gt; /usr/sbin/httpd //www.tomoyo03.com //default /var/www/cgi-bin/test.cgi
</BODY>
</HTML>
[root@tomoyo ~]#

あとは通常の Apache 用のポリシーを作成するのと同様です.学習モードでアクセス許可を収集し,確認モードでチューニングを行ってアクセス許可に不足が無いことを確認し,強制モードにより保護してください.

第9回へ戻る


目次へ戻る

sflogo.php