akarititle.png

Chapter 14: Apache で mod_ccs モジュールを使用する

14.1. mod_ccs モジュールについて

mod_ccs は Apache に対してより詳細なアクセス制御を行うための Apache 2.x 向けのモジュールです。このモジュールはバーチャルホスト名や要求されたファイルのパス名などに応じて(外部のプログラムを実行することなく)ドメイン遷移を行います。そのため、バーチャルホストやCGIプログラムに対して権限を分割することができるようになります。

14.2. モジュールのインストール

14.2.1. 依存するパッケージのインストール

このモジュールは Linux 2.6 カーネル専用です。 Linux 2.4 カーネルでは動作しません。

Apache モジュールをコンパイルするのに必要なパッケージをインストールします:

RedHat 系の場合

# yum -y install httpd-devel

Debian 系の場合

# apt-get -y install apache2-threaded-dev apache2-prefork-dev

14.2.2. モジュールのダウンロード

mod_ccs モジュールのソースコードをダウンロードします:

# wget -O mod_ccs.c 'https://osdn.jp/projects/tomoyo/svn/view/branches/mod_ccs.c?revision=5673&root=tomoyo'

mod_ccs モジュールをコンパイル/インストール/有効化します:

14.2.3. モジュールのコンパイルとインストール

RedHat 系の場合

# apxs -i -a -c mod_ccs.c

Debian 系の場合

# apxs2 -i -a -c mod_ccs.c

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

LoadModule ccs_module /usr/lib/httpd/modules/mod_ccs.so

14.3. 設定

Apache の設定ファイルの中で CCS_TransitionMap ディレクティブを用いてパス名とドメイン名の対応表を指定することにより, mod_ccs モジュールは要求されたファイルのパス名に基づくドメイン遷移を行います。以下の例では /etc/hosts で www.tomoyo00.com 等のIPアドレスが登録されているものと仮定します:

<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 キーワードで指定されたファイルには,リクエストされたファイルのパス名と遷移先のドメイン名との対応表を定義しておきます。例えば、 /etc/ccs/httpd-tomoyo00.com には以下のように指定することができます:

/var/www/cgi-bin/\*         <kernel> //apache /www.tomoyo00.com /cgi-programs
/usr/share/horde/\{\*\}/\*  <kernel> //apache /www.tomoyo00.com /horde
/var/www/html/\{\*\}/\*     <kernel> //apache /www.tomoyo00.com /static-files
/\{\*\}/\*                  <kernel> //apache /www.tomoyo00.com /default

ドメイン遷移を行う許可を Apache のドメインに対して予め与えておく必要があります。これを忘れると Internal Server Error になるので注意してください:

<kernel> /usr/sbin/httpd

task manual_domain_transition <kernel> //apache /www.tomoyo00.com /cgi-programs
task manual_domain_transition <kernel> //apache /www.tomoyo00.com /horde
task manual_domain_transition <kernel> //apache /www.tomoyo00.com /static-files
task manual_domain_transition <kernel> //apache /www.tomoyo00.com /default

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

# cd /etc/selinux/
# echo 'type=AVC msg=audit(1277948886.369:106): avc:  denied  { write } for pid=32078 comm="httpd" name="self_domain" 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

Apache を再起動してください。 Apache の起動時に /proc/ccs/self_domain への書き込みができなかった場合、以下のようなエラーメッセージが表示されます:

mod_ccs: Unable to open /proc/ccs/self_domain for writing. (errno = 13)

また、 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/self_domain for writing.

CCS_TransitionMap キーワードで指定されたファイルに問題があった場合、その他のエラーメッセージが表示されるかもしれません。

ドメイン遷移が行われていることを確認するために、簡単な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

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

# curl http://www.tomoyo00.com/cgi-bin/test.cgi
<HTML>
<HEAD>
<TITLE>test</TITLE>
</HEAD>
<BODY>
&lt;kernel&gt; //apache /www.tomoyo00.com /cgi-programs /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; //apache /www.tomoyo01.com /cgi-programs /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; //apache /www.tomoyo02.com /cgi-programs /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; //apache /www.tomoyo03.com /cgi-programs /var/www/cgi-bin/test.cgi
</BODY>
</HTML>

ここから先は、基本編で説明している手順に従ってポリシーを作成してください。