<!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>Info: Version <a href="../1.8/">1.8.x</a> is available.</p>
<p style="text-align:right;"><a href="tutorial-10.html.en">English Page</a></p>
<p style="text-align:right;">Last modified: $Date: 2013-01-17 23:04:43 +0900 (Thu, 17 Jan 2013) $</p>

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

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

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

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

<p>mod_ccs は Apache 2.x 向けのモジュールです． TOMOYO Linux 1.7.2 以降で利用可能な「プログラムの実行を伴わないドメイン遷移」機能を利用して，バーチャルホスト単位でドメインを分割したり， 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=3787&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>mod_ccs はデフォルトで ServerName に基づくドメイン遷移を行います．図５のように Apache の設定ファイルの中で CCS_TransitionMap キーワードを用いてパス名とドメイン名の対応表を定義してやれば，バーチャルホスト名に基づくドメイン遷移に加えて，要求されたファイルのパス名に基づくドメイン遷移も行います．図５では /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/\*         cgi-programs
/usr/share/horde/\{\*\}/\*  horde
/var/www/html/\{\*\}/\*     static-files
</pre>
</td></tr>
</table>

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

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

<table border="1" summary="fig">
<tr><td>
■図７　Apache に対して /proc/ccs/.transition への書き込みを認める
<pre>
# 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
</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/.transition への書き込みができなかった場合，図９（ CCS_TransitionMap キーワードを指定した場合）または図１０（ CCS_TransitionMap キーワードを指定しない場合）のようなメッセージが表示されます．</p>

<table border="1" summary="fig">
<tr><td>
■図９　Apache の起動時のエラーメッセージ
<pre>
mod_ccs: Unable to open /proc/ccs/.transition 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/.transition 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>/proc/ccs/self_domain はデフォルトでは root しかアクセスできないので，図１１のプログラムからアクセスできるようにするためにパーミッションを緩めます．（図１２）</p>

<table border="1" summary="fig">
<tr><td>
■図１２　ＣＧＩプログラムから /proc/ccs/self_domain へのアクセスを認める
<pre>
# chmod 444 /proc/ccs/self_domain
</pre>
</td></tr>
</table>

<p>システム起動時に自動的に緩めるようにするには図１３のようにします．</p>

<table border="1" summary="fig">
<tr><td>
■図１３　起動時にパーミッションを設定する
<pre>
# cat &gt; /etc/ccs/ccs-post-init &lt;&lt; EOF
#! /bin/sh
chmod 444 /proc/ccs/self_domain
exit 0
EOF
# chmod 700 /etc/ccs/ccs-post-init
</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; /usr/sbin/httpd //www.tomoyo00.com //default /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; /usr/sbin/httpd //www.tomoyo01.com //default /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; /usr/sbin/httpd //www.tomoyo02.com //default /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; /usr/sbin/httpd //www.tomoyo03.com //default /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>
