Apache2でSSIを有効にする

公開:2021/01/02
更新:2021/02/05
3 min読了の目安(約2700字TECH技術記事

概要

Linux環境のApache2で、SSI (Server Side Includes)を有効にする手順。SSIディレクティブの書き方については触れない。

SSIが必要となる機会は昔と比べて減っていると思われるが、諸事情で検証環境を作ることになった。Apache HTTP Server Projectでは、公式に「Apache チュートリアル: Server Side Includes 入門」というコンテンツを提供してくれているが、このページの情報だけでは構築完了に至らないので、作業の記録。

この手順通りに環境設定し、何の対策も無く入力フォームなどを設けると、サイト訪問者の操作によってサーバ上の任意のファイルを参照したり、コマンドの実行が可能な大変危険な状態となる。くれぐれもこのままの設定でサイトを公開することの無いよう。

環境

  • Debian 9.13 (WSL2)
  • Apache 2.4.25
  • PHP 7.0.33 (.phpを検証対象にしただけで、SSI有効化とは無関係)

手順

Apache2のインストール

ここでは明示的にバージョン指定せずに、Apache2をインストールする。Debian系以外の場合は、コマンドを読み替えてください。

Terminal
# apt install apache2
# apache2 -version
Server version: Apache/2.4.25 (Debian)
Server built:   2019-10-13T15:43:54

モジュールの有効化

SSIを動作させるのに必要なモジュールを有効にする。mod_includeを有効にすればSSIは動作するが、#execによりOSコマンドも動かす場合は追加でmod_cgiモジュールも必要となる。

公式のチュートリアルでは「httpd.confへの設定が必要」と書かれているが、先ほどの方法でApacheをインストールすると、そのようなファイルは存在しない。主な設定は/etc/apache2/apache2.confに記述されており、標準設定では、以下の通りmods-enabled配下のモジュールをIncludeしている。

apache2.conf
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

mods-enabled配下の*.load*.confmods-available配下へのシンボリックリンクである。また、mods-available配下のファイルもモジュールそのものではなく、/usr/lib/apache2/modules/配下のモジュールをそれぞれIncludeする作りとなっている。

そのため、自分でシンボリックリンクを作っても動くが、モジュールを有効化するコマンドa2enmodを使用して、設定を書き換える。

Terminal
# a2enmod include
Considering dependency mime for include:
Module mime already enabled
Enabling module include.
To activate the new configuration, you need to run:
  service apache2 restart
# a2enmod cgi
Your MPM seems to be threaded. Selecting cgid instead of cgi.
Enabling module cgid.
To activate the new configuration, you need to run:
  service apache2 restart

これにより次回以降の起動時はモジュールmod_includemod_cgiが読み込まれる。

設定を戻す場合はa2dismodコマンドを使用する。

SSIを許可するディレクトリの設定

今回は、http://localhost/ssi/の下でだけSSIが動けばよいと仮定。サーバ上のディレクトリでいうと、/var/www/html/ssi/が相当する。また、サーバサイドはPHPを使い、拡張子.phpでSSIを動作させたいと仮定する。

/etc/apache2/sites-available/配下の000-default.confをエディタで開き、<VirtualHost>タグ内に下記の記述を追加する。

000-default.conf
<Directory /var/www/html/ssi/>
  Options Includes
  AddType text/html .php
  AddOutputFilter INCLUDES .php
</Directory>

許可する拡張子が複数ある場合は、半角スペースを空けて列挙する。
.php .php5 .phtml

SSIを動作させるための拡張子.shtmlがあり、サーバ製品の多くは初期設定で.shtmlのみSSIの動作を許可している。PHPなどを用いた動的なコンテンツでSSIを動作させる場合、適切に対策しないとSSIインジェクション脆弱性が混入するため要注意。

SSIを含むファイルの配置

/var/www/html/ssi/に新しいphpファイルを作成する。

new.php
<!-- #printenv -->
<?php
phpinfo();

Apacheを起動または再起動後にURLhttp://localhost/ssi/new.phpへアクセスすると、printenvにより環境変数の一覧が表示され、また、PHPも問題なく動作しているはずだ。