このページではLinux上でApache/httpdを使ってWebサーバー構築するために必要なCGIの利用設定についてビギナー向けに解説します。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
Webサーバーの構築

Webサーバーについて

Apacheの構成と設定の準備

全般的な動作環境の設定

コンテナディレクティブの形式

コンテナディレクティブの設定

ドキュメントルートの設定等

ユーザーディレクトリの設定

バーチャルホストの設定

CGIの実行許可の設定

ユーザー認証機能の設定

httpdのコントロール

httpdの動作チェック

ポートフォワーディングの設定


CGIの実行を許可するときの注意

楽しい コンテンツ の運用には、 クライアント と対話的に動作させるための サーバーサイドアプリケーション の利用は欠かせません。

その代表格といえばやはり CGI ということになるでしょう。

SSI ではどうしても役不足の感は否めませんし、機能とセキュリティを両立させるのであれば、 PHP などの最初から Webサーバー 上で利用する目的で設計された スクリプト 言語を利用したいところです。

とはいえ、サーバーサイドアプリケーションの黎明期から利用されてきたCGIには、多くの「プログラムとノウハウの資産」があり、これからもしばらくはサーバーサイドアプリケーションの中心的な存在であり続けるでしょう。

CGIスクリプトの大部分は、 サーバー機 に普遍的に インストール されている Perl という インタープリタ を利用します。

PerlはもともとWebサーバー上で用いるために開発された言語というわけではないのですが、柔軟な テキスト 処理能力と、 UNIX OS には、昔から普通にインストールされていた。」 という理由から汎用されるようになり、現在に至っているわけです。

現在のWebサーバーはPerlでCGIを用いることが前提になっていますから、 サーバー に対しての セキュリティ は確保されていると思って構いません。

ただし、CGIには別の意味でのセキュリティホールが存在します。

例えばCGIの動作には、その本体である実行ファイルの他に、ライブラリやデータファイルなどが利用されるのが一般的ですが、これらに大事な情報(個人情報やパスワード情報など)が含まれている場合はアクセス拒否の設定を行う必要があります。

また、コンテンツスペースを貸し出すような場合は、貸した相手が不必要なCGIをたくさん設置して、サーバー機に過剰な動作負荷をかけてしまうようなこともあり得ます。

CGIの実行許可の設定を行う際は、こういう点に注意しながら慎重に行ってください。

AddHandler cgi-script〜CGI実行ファイルの指定

"/etc/httpd/conf/httpd.conf" 中に記述する、 CGI スクリプト を実行するための最低限の設定です。

WBEL3 及び CentOS3 では 831行目 、WBEL4及びCentOS4では 807行目 、CentOS5では 778行目 あたりに記述があります。

"AddHandler" は、ファイルの末尾( WindowsOS のいうところの拡張子)の種類によって、実行するプログラムの種類を決定する ディレクティブ です。

デフォルト では、

#AddHandler cgi-script .cgi

とコメントアウトされていますので、 ".cgi" で終わるファイルをCGIスクリプトとして実行させるには、 "#" をはずして設定を有効化する必要があります。

".cgi"以外にもCGIとして実行したいファイルがあれば、スペースで区切って追加します。

一般的には、ライブラリファイルを示す".pl"を追加して、

AddHandler cgi-script .cgi .pl

としておけば充分でしょう。

このページの先頭へ↑

スクリプトエイリアスでCGIを実行する

CGI の実行プログラムは、設定次第ではファイルシステムのどの場所でも動作させることができます。

しかしながら、 クライアント から直接 HTTP でアクセスできる場所、つまりドキュメントルート以下に設置してしまうと、プログラムの内容そのものが表示されてしまうことがあります。

しかしながら、HTTPでアクセスができない場所にCGIを設置してしまうと、CGIの実行そのものが難しくなってしまいます。

そこで httpd では通常、 スクリプトエイリアス という方法がとられます。

設定は "/etc/httpd/conf/httpd.conf" に記述して行います。

以下に、その設定方法を示します。

ScriptAlias〜実行用仮想ディレクトリの指定

WBEL3 及び CentOS3 では 573行目 、WBEL4及びCentOS4では 544行目 、CentOS5では 564行目 あたりに記述があります。

"Alias" ディレクティブ Aliasディレクティブの設定について と同様に、外部のディレクトリを仮想的にドキュメントルート内に配置するディレクティブです。

ただし "ScriptAlias" で指定されたディレクトリの中のファイルはすべて実行ファイルであると仮定され、実行可能ならば実行する、という振る舞いをする点が "Alias" ディレクティブと異なります。

デフォルト は、

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

となっていますから、例えば、 "/var/www/cgi-bin/test.cgi" という CGI の実行ファイルは、 Webブラウザ から、

"http://www.obenri.com/cgi-bin/test.cgi"

とリクエストすることで実行することができます。

この設定は、 httpd が管理するすべての "DocumentRoot" ディレクティブ DocumentRootディレクティブについて に対して有効になりますから、 バーチャルホスト の"DocumentRoot"ディレクティブ バーチャルホストのDocumentRootディレクティブについて に対しても有効です。つまり、

"http://info.obenri.com/cgi-bin/test.cgi"

でも同様に動作します。

この"ScriptAlias"ディレクティブを設定すると、"Alias"ディレクティブと同様に、"/var/www/html/cgi-bin/"というディレクトリは存在していても無視されます。

CGIを利用するときは、原則として"/var/www/cgi-bin/"以下に実行ファイルを配置して、この スクリプトエイリアス で実行するのが最も安全な方法といえるでしょう。

変更する必要がなければ、そのままの設定で利用します。

"/var/www/cgi-bin"のアクセス設定

WBEL3 及び CentOS3 では 579行目 、WBEL4及びCentOS4では 550行目 、CentOS5では 570行目 あたりに記述があります。

CGI の実行ファイルを格納する"/var/www/cgi-bin"に対して、ディレクトリ式コンテナ ディレクトリ式コンテナについて で適切なアクセス制御を行います。

デフォルト は、

<Directory "/var/www/cgi-bin">
  AllowOverride None AllowOverrideディレクティブについて
  Options None Optionsディレクティブについて
  Order allow,deny Orderディレクティブについて
  Allow from all
</Directory>

ですから、

「アクセスファイルの使用と、一切の特殊動作と参照を禁止し、すべての ノード からのアクセスを許可する。」

と、必要にして充分な設定が行われていることがお解かりと思います。

従って設定は変更せず、このまま利用します。

このページの先頭へ↑

任意のディレクトリでCGIを実行する

自分自身できちんと セキュリティ に注意して CGI を設置する場合、あるいは信頼できる コンテンツ 作成者にドキュメントルートの運用を任せるような場合には、 CGI の設置はスクリプトエイリアスにこだわらないほうが使い勝手は良くなります。

CGI スクリプト を直接任意の場所で実行できるようにするには、設定対象にしたいディレクトリ式コンテナの中で、 "Options" ディレクティブ "ExecCGI" オプションを記述します Optionsディレクティブについて

例えば、

<Directory /var/www/html>
  Options FollowSymLinks ExecCGI
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

と設定すると、 "/var/www/html" 以下の任意の位置にCGIスクリプトを配置して、実行することができます。

もう少しセキュリティに配慮するなら、例えば、

<Directory /var/www/html>
  Options FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>
<Directory /var/www/html/cgi-dir>
  Options FollowSymLinks ExecCGI
</Directory>

のように記述すると、CGIスクリプトの配置場所を "/var/www/html/cgi-dir" 以下に限定することができます。

バーチャルホスト でCGIを利用する場合も記述方法は変わりません。例えば、

#www.obenri.com
<VirtualHost 192.168.100.11>
  ServerAdmin tanaka@obenri.com
  DocumentRoot /var/www/html
  ServerName www.obenri.com
  ErrorLog logs/www.obenri.com-error_log
  CustomLog logs/www.obenri.com-access_log combined
</VirtualHost>
<Directory /var/www/html>
  Options FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>
<Directory /var/www/html/cgi-dir>
  Options FollowSymLinks ExecCGI
</Directory>

のように記述します。

このページの先頭へ↑

ユーザーディレクトリでCGIを実行する

このパートの冒頭でも説明したとおり、ユーザーディレクトリ ユーザーディレクトリの利用設定 に対して CGI の設置、使用を許可するのはあまりお勧めできません。

どうしても設置を許可しなければならない場合でも、ユーザーディレクトリ全体に実行許可を与えるような設定は避けてください。ディレクトリ構造の深い場所にこっそりとCGIを設置されたら、不正に設置されたCGI スクリプト を探すのが大変です。

ではどうしたらいいかというと、例えば、

「CGIを設置したいときは、必ず管理者に許可をとること。」

を条件に、

<Directory /home/*/public_html>
  AllowOverride None
  Options SymLinksIfOwnerMatch
  <Limit GET POST OPTIONS>
    Order allow,deny
    Allow from all
  </Limit>
  <LimitExcept GET POST OPTIONS>
    Order deny,allow
    Deny from all
  </LimitExcept>
</Directory>
<Directory /home/*/public_html/cgi-bin>
  Options +ExecCGI
</Directory>

のようにCGI スクリプト を設置するディレクトリを限定してしまいます。

そうすると、管理者(つまりあなた)は容易にCGIスクリプトの設置状態を調べることができますから、CGIの不正利用の抑制につながるというわけです。

ところで、 WBEL CentOS インストール される Apache では、 クライアント から HTTP でユーザーディレクトリにアクセスが行われるとき、実は "User,Group" ディレクティブ User,Groupディレクティブの設定 で設定されている システムアカウント "Apache" ではなく、そのユーザーディレクトリの ユーザーアカウント で行われるようになっています。

従って、例えば、 "/home/suzuki/public_html/cgi-bin" 以下のCGIスクリプトは、 "http://www.obenri.com/~suzuki/" 以外の URL からは実行できず、 「CGIの無断拝借」 はできないようになっています。

このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。
Powered by Apache
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。
www.centos.org - The Community ENTerprise Operating System