tomoyotitle.png

Chapter 13: Apache で mod_tomoyo モジュールを使用する

13.1. mod_tomoyo モジュールについて

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

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

13.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

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

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

# wget -O mod_tomoyo.c 'https://sourceforge.net/p/tomoyo/svn/5673/tree/branches/mod_tomoyo.c?format=raw'

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

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

RedHat 系の場合

# apxs -i -a -c mod_tomoyo.c

Debian 系の場合

# apxs2 -i -a -c mod_tomoyo.c

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

LoadModule tomoyo_module /usr/lib/httpd/modules/mod_tomoyo.so

13.3. 設定

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

<VirtualHost *:80>
    DocumentRoot /var/www/html-00
    ServerName www.tomoyo00.com
    TOMOYO_TransitionMap /etc/tomoyo/httpd-tomoyo00.conf
</VirtualHost>

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

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

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

TOMOYO_TransitionMap キーワードで指定されたファイルには,リクエストされたファイルのパス名と遷移先のドメイン名との対応表を定義しておきます。例えば、 /etc/tomoyo/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

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

mod_tomoyo: Unable to open /sys/kernel/security/tomoyo/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_tomoyo: Unable to open /sys/kernel/security/tomoyo/self_domain for writing.

TOMOYO_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, "/sys/kernel/security/tomoyo/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>

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