<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>TOMOYO Linux の世界　第１０回：「 Apache の権限を分割してみよう」</title>
<link rel="stylesheet" href="http://tomoyo.sourceforge.jp/tomoyo.css" media="all" type="text/css">
</head>
<body>
<p style="text-align:right;"><a href="tutorial-10.html.en">English Page</a></p>
<p style="text-align:right;">Last modified: $Date: 2013-03-09 12:24:36 +0900 (Sat, 09 Mar 2013) $</p>

<h1>TOMOYO Linux の世界<br>第１０回：「 Apache の権限を分割してみよう」</h1>

<h2>今回の内容</h2>

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

<h3>mod_ccs のインストール</h3>

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

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

<table border="1" summary="fig">
<tr><td>
■図１　Apache モジュールをコンパイルするためのパッケージをインストール
<pre>
# yum install httpd-devel
</pre>
</td></tr>
</table>

<p>次に，ソースコードをダウンロードします．図２のコマンドを実行してください．</p>

<table border="1" summary="fig">
<tr><td>
■図２　mod_ccs のソースをダウンロード
<pre>
# wget -O mod_ccs.c 'http://sourceforge.jp/projects/tomoyo/svn/view/branches/mod_ccs.c?revision=4393&amp;root=tomoyo'
</pre>
</td></tr>
</table>

<p>コンパイル／インストール／有効化を行います．図３のコマンドを実行してください． RedHat 系の場合は apxs コマンドを， Debian 系の場合は apxs2 コマンドを使います．</p>

<table border="1" summary="fig">
<tr><td>
■図３　mod_ccs のコンパイル
<pre>
# apxs -i -a -c mod_ccs.c
</pre>
</td></tr>
</table>

<p>正常に終了した場合， Apache の設定ファイルの中に図４のような指定が見つかるはずです．</p>

<table border="1" summary="fig">
<tr><td>
■図４　mod_ccs をロードするための指定
<pre>
LoadModule ccs_module /usr/lib/httpd/modules/mod_ccs.so
</pre>
</td></tr>
</table>

<h3>mod_ccs の設定</h3>

<p>図５のように Apache の設定ファイルの中で CCS_TransitionMap キーワードを用いてパス名とドメイン名の対応表を定義することにより， mod_ccs は要求されたファイルのパス名に基づくドメイン遷移を行います．図５では /etc/hosts で www.tomoyo00.com www.tomoyo01.com www.tomoyo02.com www.tomoyo03.com のＩＰアドレスが登録されているものと仮定します．</p>

<table border="1" summary="fig">
<tr><td>
■図５　CCS_TransitionMap キーワードの指定例
<pre>
&lt;VirtualHost *:80&gt;
    DocumentRoot /var/www/html-00
    ServerName www.tomoyo00.com
    CCS_TransitionMap /etc/ccs/httpd-tomoyo00.conf
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
    DocumentRoot /var/www/html-01
    ServerName www.tomoyo01.com
    CCS_TransitionMap /etc/ccs/httpd-tomoyo01.conf
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
    DocumentRoot /var/www/html-02
    ServerName www.tomoyo02.com
    CCS_TransitionMap /etc/ccs/httpd-tomoyo02.conf
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
    DocumentRoot /var/www/html-03
    ServerName www.tomoyo03.com
    CCS_TransitionMap /etc/ccs/httpd-tomoyo03.conf
&lt;/VirtualHost&gt;
</pre>
</td></tr>
</table>

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

<table border="1" summary="fig">
<tr><td>
■図６　パス名とドメイン名の対応表の記述例
<pre>
/var/www/cgi-bin/\*         &lt;kernel&gt; //apache /www.tomoyo00.com /cgi-programs
/usr/share/horde/\{\*\}/\*  &lt;kernel&gt; //apache /www.tomoyo00.com /horde
/var/www/html/\{\*\}/\*     &lt;kernel&gt; //apache /www.tomoyo00.com /static-files
/\{\*\}/\*                  &lt;kernel&gt; //apache /www.tomoyo00.com /default
</pre>
</td></tr>
</table>

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

<p>ドメイン遷移を行う許可を図７のように Apache のドメインに対して指定しておきます．これを忘れると Internal Server Error になるので注意してください．</p>

<table border="1" summary="fig">
<tr><td>
■図７　ドメイン遷移許可の例
<pre>
&lt;kernel&gt; /usr/sbin/httpd

task manual_domain_transition &lt;kernel&gt; //apache /www.tomoyo00.com /cgi-programs
task manual_domain_transition &lt;kernel&gt; //apache /www.tomoyo00.com /horde
task manual_domain_transition &lt;kernel&gt; //apache /www.tomoyo00.com /static-files
task manual_domain_transition &lt;kernel&gt; //apache /www.tomoyo00.com /default
</pre>
</td></tr>
</table>

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

<table border="1" summary="fig">
<tr><td>
■図８　Apache に対して /proc/ccs/self_domain への書き込みを認める
<pre>
# 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
</pre>
</td></tr>
</table>

<p>図９を実行して Apache を再起動してください．</p>

<table border="1" summary="fig">
<tr><td>
■図９　Apache の起動
<pre>
# service httpd restart
</pre>
</td></tr>
</table>

<p>/proc/ccs/self_domain への書き込みができなかった場合，図１０（ CCS_TransitionMap キーワードを指定した場合）または図１１（ CCS_TransitionMap キーワードを指定しない場合）のようなメッセージが表示されます．</p>

<table border="1" summary="fig">
<tr><td>
■図１０　Apache の起動時のエラーメッセージ
<pre>
mod_ccs: Unable to open /proc/ccs/self_domain for writing. (errno = 13)
</pre>
</td></tr>
</table>

<table border="1" summary="fig">
<tr><td>
■図１１　Apache のエラーログ（ /var/log/httpd/error_log ）
<pre>
[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.
</pre>
</td></tr>
</table>

<p>CCS_TransitionMap キーワードで指定されたファイルに問題があった場合，図９の実行時にエラーメッセージが表示されます．</p>

<p>ドメイン遷移が行われていることを確認するために，簡単なＣＧＩプログラムを作成します．（図１２）</p>

<table border="1" summary="fig">
<tr><td>
■図１２　ドメイン遷移が行われていることを確認するためのＣＧＩプログラム
<pre>
# cat &gt; /var/www/cgi-bin/test.cgi &lt;&lt; "EOF"
#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print "&lt;HTML&gt;\n";
print "&lt;HEAD&gt;\n";
print "&lt;TITLE&gt;test&lt;/TITLE&gt;\n";
print "&lt;/HEAD&gt;\n";
print "&lt;BODY&gt;\n";

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

print "&lt;/BODY&gt;\n";
print "&lt;/HTML&gt;\n";
EOF
# chmod 755 /var/www/cgi-bin/test.cgi
</pre>
</td></tr>
</table>

<p>curl コマンド（またはＷｅｂブラウザ）を使ってサンプルプログラムを表示し，ドメイン遷移が行われていることを確認します．（図１３）</p>

<table border="1" summary="fig">
<tr><td>
■図１３　ドメイン遷移が行われていることを確認する
<pre>
[root@tomoyo ~]# curl http://www.tomoyo00.com/cgi-bin/test.cgi
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;test&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&amp;lt;kernel&amp;gt; //apache /www.tomoyo00.com /cgi-programs /var/www/cgi-bin/test.cgi
&lt;/BODY&gt;
&lt;/HTML&gt;
[root@tomoyo ~]# curl http://www.tomoyo01.com/cgi-bin/test.cgi
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;test&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&amp;lt;kernel&amp;gt; //apache /www.tomoyo01.com /cgi-programs /var/www/cgi-bin/test.cgi
&lt;/BODY&gt;
&lt;/HTML&gt;
[root@tomoyo ~]# curl http://www.tomoyo02.com/cgi-bin/test.cgi
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;test&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&amp;lt;kernel&amp;gt; //apache /www.tomoyo02.com /cgi-programs /var/www/cgi-bin/test.cgi
&lt;/BODY&gt;
&lt;/HTML&gt;
[root@tomoyo ~]# curl http://www.tomoyo03.com/cgi-bin/test.cgi
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;test&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&amp;lt;kernel&amp;gt; //apache /www.tomoyo03.com /cgi-programs /var/www/cgi-bin/test.cgi
&lt;/BODY&gt;
&lt;/HTML&gt;
[root@tomoyo ~]#
</pre>
</td></tr>
</table>

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

<p><a href="tutorial-9.html.ja">第９回へ戻る</a></p>

<hr>

<p><a href="index.html.ja#tutorial">目次へ戻る</a></p>
<p><a href="http://sourceforge.jp/"><img src="http://sourceforge.jp/sflogo.php?group_id=1973" width="96" height="31" alt="sflogo.php" title="SourceForge.jp"></a></p>
</body>
</html>
