第4回 ApacheのSSL対応化と環境設定

ApacheでSSLを利用するには、モジュールを組み込むかパッチを適用する必要がある。そのため、Apacheのインストール時にSSL化を行わなければならない。今回は、OpenSSLを使う方法と、Apacheインストール後に最小限やっておくべき環境設定について紹介する。

一志 達也<ichishi@pochi.tis.co.jp>
TIS株式会社
2001/4/17

 前回はApacheの基本的なインストール方法を紹介して終わったが、今回はその続きとして、SSL(Secure Sockets Layer)とApacheを連携させる場合のインストールや、インストール後に行っておくべき便利な設定について紹介する。

ApacheでSSLを使うには

 クレジットカード番号に限らず、プライベートな情報の入力を求めるWebサイトでは、通信を暗号化する技術が欠かせない。それを実現するのがSSLだ(SSLについては携帯通信技術トレンド第2回を参照していただきたい)。本稿では、ApacheとSSLを組み合わせる場合のインストールについて解説する。

 ApacheでSSLを利用する場合、Apache本体に加えてmod_sslApache-SSLのどちらかをインストールする必要がある。mod_sslとApache-SSLは似たような機能を持つが、どちらも単体で動作するプログラムではなく、SSLを実装したベース・プログラムとApacheをつなぎ合わせるものである。

 ややこしいことに、SSLのベース・プログラムも以下の2種類が存在するので、どちらかを選択しなければならない。

 OpenSSLは、SSLeayをベースに開発されているからさらにややこしい。こうなると同じことを実現するのに4種類の選択肢があることになるが、mod_sslとSSLeayの組み合わせは存在しないから、実際の選択肢は3種類となる。

ApacheにSSLを組み込む場合、このように3つの選択肢が存在する

 本来なら、ここでそれぞれの組み合わせにおけるメリット/デメリットを明らかにしなくてはならないのだが、残念なことにコレといったポイントを挙げることができない。もちろん、細かな点での差異はあるのだが、ほとんど好みの問題といたレベルになってしまう。違いがあるとすれば、mod_sslがApacheのモジュールであるのに対し、Apache-SSLはパッチとして提供されている点だろう。

 また、筆者の調査では、SSLeayはインストールの段階でうまくいかない例が多くあるようだ。決してSSLeayを否定するわけではないが、Apache-SSLはOpenSSLでも動作するから、本稿ではこちらの組み合わせを紹介する。SSLの設定については、次回以降の設定編で紹介する予定だ。


第4回 ApacheのSSL対応化と環境設定

Apache-SSL+OpenSSLのインストール

 Apache-SSLは、前記のとおりApacheに対するパッチの形で提供されている。なお、Apache-SSLはApache本体のバージョンごとに提供されているから、入手する際はApache本体のバージョンに合わせたものを入手しなければならない。

必要なファイル(ソース)の入手

 では、Apache-SSL+OpenSSLの場合に必要となるファイルとその入手先を紹介しよう。2001年4月11日時点におけるApacheの最新バージョンは1.3.19だ。各ファイルはこのバージョンに合わせることにする。

関連サイト:
http://www.apache.org/(Apacheオフィシャルサイト)
http://www.apache-ssl.org/ (Apache-SSLオフィシャルサイト)
http://www.openssl.org/ (OpenSSLオフィシャルサイト)

 なお、これ以外にも以下のプログラムが必要となる。

  • Perl5(perl -vで確認可能)
  • patchコマンド(patch -vで確認可能)

インストール手順

 はじめに、OpenSSLのコンパイルを行う。これは一般ユーザーでも行える。tarで圧縮ファイルを展開し、作成されたディレクトリでconfig以下のコマンドを実行する。configコマンドを実行する前に、INSTALLおよびREADMEファイルを参照しておいてほしい。

$ tar -zxvf openssl-0.9.6.tar.gz
$ cd openssl-0.9.6
$ ./config
$ make
$ make test

 準備ができたらsuでrootになり、make installでインストールする。

$ su
# make install

 次にApache本体を展開して、Apache-SSLを適用する。Apache-SSLは、apache_1.3.19.tar.gzを展開した際に作成されたディレクトリに移動してから展開しよう。Apache-SSLは展開してもディレクトリを作成しないので注意すること。

$ tar -zxvf apache_1.3.19.tar.gz
$ mv apache_1.3.19+ssl_1.42.tar.gz ./apache_1.3.19/
$ cd apache_1.3.19
$ tar -zxvf apache_1.3.19+ssl_1.42.tar.gz

 展開できたら、patchコマンドでApache-SSLを適用する。

$ patch -p1 < SSLpatch

 OpenSSLのインストール時にパスの変更などを行った場合は、src/Configuration.tmplの以下の部分をOpenSSLのパスに合わせて編集する。

#
# SSL Related stuff. N.B. This is set up to use the SSLeay source, NOT an
# installed version.
#
SSL_BASE=/usr/local/ssl
SSL_INCLUDE= -I$(SSL_BASE)/include
SSL_CFLAGS= -DAPACHE_SSL
SSL_LIB_DIR= $(SSL_BASE)/lib
SSL_LIBS= -L$(SSL_LIB_DIR) -lssl -lcrypto
SSL_APP_DIR= $(SSL_BASE)/bin
SSL_APP=$(SSL_APP_DIR=)/openssl

 ここまできたら、後はApacheのコンパイルとインストールだけだ。通常どおり、

$ ./configure --enable-rule=SHARED_CORE --with-layout=Apache --enable-module=so --enable-module=status --enable-module=info --enable-module=rewrite --enable-module=usertrack
$ make

でコンパイルを行い、rootになってmake installする。

$ su
# make install

 以下のメッセージが表示されれば成功だ。

+--------------------------------------------------------+
| You now have successfully built and installed the      |
| Apache 1.3 HTTP server. To verify that Apache actually |
| works correctly you now should first check the         |
| (initially created or preserved) configuration files   |
|                                                        |
|   /usr/local/apache/conf/httpsd.conf
|                                                        |
| and then you should be able to immediately fire up     |
| Apache the first time by running:                      |
|                                                        |
|   /usr/local/apache/bin/httpsdctl start
|                                                        |
| Thanks for using Apache.       The Apache Group        |
|                                http://www.apache.org/  |
+--------------------------------------------------------+

第4回 ApacheのSSL対応化と環境設定

mod_ssl+OpenSSLのインストール

 mod_sslもApache-SSLと同じく、mod_sslとOpenSSLを別途入手しなくてはならない。また、mod_sslもバージョンごとに対応するApacheのバージョンが限定されるから、入手する際はバージョンの整合性に注意してほしい。

必要なファイル(ソース)の入手

関連サイト:
http://www.apache.org/(Apacheオフィシャルサイト)
http://www.modssl.org/ (mod_sslオフィシャルサイト)
http://www.openssl.org/ (OpenSSLオフィシャルサイト)

 Apache-SSLと同様、インストールには

  • Perl5(perl -vで確認可能)

が必要だ。

インストール手順

 はじめに、OpenSSLのコンパイルを行う。これは一般ユーザーでも行える。tarで圧縮ファイルを展開し、作成されたディレクトリでconfig以下のコマンドを実行する。configコマンドを実行する前に、INSTALLおよびREADMEファイルを参照しておいてほしい。

$ tar -zxvf openssl-0.9.6.tar.gz
$ cd openssl-0.9.6
$ ./config
$ make
$ make test

 準備ができたらsuでrootになり、make installでインストールする。

$ su
# make install

 次にApacheの展開とmod_sslのコンパイルを行う。

$ tar -zxvf apache_1.3.19.tar.gz
$ tar -zxvf mod_ssl-2.8.2-1.3.19.tar.gz
$ cd mod_ssl-2.8.2-1.3.19

 configureを行う際は、Apache本体が展開されたディレクトリと、OpenSSLのインストールディレクトリを以下のように指定する。

$ ./configure --with-apache=../apache_1.3.19 --with-ssl=/usr/local/ssl --enable-rule=SHARED_CORE --with-layout=Apache --enable-module=so --enable-module=status --enable-module=info --enable-module=rewrite --enable-module=usertrack

 mod_sslとApache本体のコンパイル設定は上記のconfigureで完了するので、次はmakeだ。configureが行われていることは、config.statusファイルで確認できる。

$ cd ../apache_1.3.19
$ make

 makeが終わったら、rootになってmake installする。

$ su
# make install

 以下のメッセージが表示されれば成功である。

+--------------------------------------------------------+
| You now have successfully built and installed the      |
| Apache 1.3 HTTP server. To verify that Apache actually |
| works correctly you now should first check the         |
| (initially created or preserved) configuration files   |
|                                                        |
|   /usr/local/apache/conf/httpd.conf
|                                                        |
| and then you should be able to immediately fire up     |
| Apache the first time by running:                      |
|                                                        |
|   /usr/local/apache/bin/apachectl start
|                                                        |
| Or when you want to run it with SSL enabled use:       |
|                                                        |
|   /usr/local/apache/bin/apachectl startssl
|                                                        |
| Thanks for using Apache.       The Apache Group        |
|                                http://www.apache.org/  |
+--------------------------------------------------------+

第4回 ApacheのSSL対応化と環境設定

インストール後の諸設定

 Apacheをインストールしても、各種の設定を行わなければ何の役にも立たない。Webサーバとしての本格的な設定については次回から詳しく解説するが、今回は最低限やっておくべき設定を幾つか紹介する。

パス(環境変数)の設定

 インストール後に行っておくべき作業について、2つのポイントを紹介しておこう。

 まず行っておくと便利なのが、環境変数「PATH」の設定である。前回の最後にも紹介したように、Apacheを起動するには

# /usr/local/apache/bin/apachectl start

と入力する(補足)。これは、Apacheに含まれるコマンド「apachectl」を呼び出しているのだが、そのファイルが存在するディレクトリ「/usr/local/apache/bin」を指定しているので長くなっている。環境変数PATHに「/usr/local/apache/bin」ディレクトリを指定しておけば、いちいちディレクトリを指定しなくても「apachectl」だけでコマンドを実行できるようになる。

補足 Apache-SSLをインストールすると、「apachectl」ではなく「httpsdctl」にスクリプトが変更される。

 実際にPATHを設定するには、コマンドを使って一時的に設定する方法(ログアウトすると無効になってしまう)と、ログインするたびに自動設定させる方法の2つが考えられる。

1.PATHを一時的に追加する方法

 PATHを一時的に追加するには、プロンプトで

# export PATH=$PATH:/usr/local/apache/bin

のようにexportコマンドを使う(bashの場合。cshは「set env」コマンド)。ただし、「export PATH=/usr/local/apache/bin」とすると既存のPATHが上書きされてしまい、基本的なコマンドさえも実行できなくなってしまう。「$PATH:」は、既存のPATHに「/usr/local/apache/bin」を追加する、という意味である。コマンドを実行したらenvコマンドで環境変数を呼び出し、PATHが追加されたことを確認しておく。

 また、この方法ではログアウトすると追加したPATHは無効になってしまう。ログインするたびにPATHを自動設定させるには、次の方法を使う。

2.ログインするたびに自動設定させる方法

 bashは、ログイン時にユーザーのホームディレクトリにある「.bash_profile」というファイルを読み込み、そこに書かれている設定を実行するようになっている(cshの場合は.cshrc)。

 viなどを使って.bash_profileを開き、PATHを設定している行に設定したいディレクトリを追記するか、

export PATH=$PATH:/usr/local/apache/bin

を最終行に追加する(リスト1)。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/bin:/usr/local/apache/bin
BASH_ENV=$HOME/.bashrc
USERNAME=""

export USERNAME BASH_ENV PATH
リスト1

 .bash_profileの設定をすぐに有効にするには、

$ source .bash_profile

と入力し、.bash_profileの内容を再読み込みする。

■コラム 環境変数の活用例
 PATHを設定すればコマンドの実行は楽になる。しかし次回からは、設定のためにApacheをインストールしたディレクトリ内のファイルに頻繁にアクセスすることになる。この場合、PATH設定だけではうまくいかない。そこで、下のリストのように新しい環境変数として「APACHE_HOME」を設定し、Apacheをインストールしたディレクトリを指定する。そうすれば、「cd $APACHE_HOME」とするだけでApacheをインストールしたディレクトリに移動できるようになる。
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi


# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/bin
BASH_ENV=$HOME/.bashrc
USERNAME=""


export USERNAME BASH_ENV PATH

# Apache setting

export APACHE_HOME=/usr/local/apache
export PATH=$PATH:$APACHE_HOME/bin

 1つのテクニックとして、ぜひとも覚えておいていただきたい。

自動起動と自動停止の設定

 次はApacheの自動起動、および自動停止の設定である。Windows NTやWindows 2000でいうところのサービスの自動起動、あるいはスタートアップやautoexec.batに該当する設定を行い、いちいち起動する手間を省こうというわけだ。

 LinuxがOSの起動時に行う処理については、/etc/rc.d/init.d/の中に記述されている。ファイルの内容は、そのスクリプトで起動/停止されるアプリケーションによってまちまちだが、共通点があることに気付くはずだ。どのスクリプトも引数を受け取るようになっていて、「start」や「stop」を渡されるとアプリケーションを起動/停止する。このことから、OSが起動/停止するときに「start」や「stop」を引数にしてこれらのスクリプトを実行していることが分かるだろう。もちろん、rootユーザーがこれらのシェルスクリプトを実行すれば、手動でアプリケーションを起動/停止することも可能である。

 Apacheを起動/停止するためのシェルスクリプトを作ると、おおむねリスト2のようになる。

#!/bin/sh

# Apacheのファイルが存在することを確認
[ -f /usr/local/apache/bin/httpd ] || exit 0

# 渡された引数に応じて処理を振り分け
case "$1" in
  start)
        echo -n "Starting httpd: "
        /usr/local/apache/bin/httpd
        echo
        touch /var/lock/subsys/httpd
        ;;
  stop)
        echo -n "Shutting down http: "
        kill -TERM `cat /usr/local/apache/logs/httpd.pid`
        echo
        rm -f /var/lock/subsys/httpd
        rm -f /usr/local/apache/logs/httpd.pid
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  reload)
        echo -n "Reloading httpd: "
        kill -HUP `cat /usr/local/apache/logs/httpd.pid`
        echo
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|reload}"
        exit 1
esac

exit 0
リスト2

 シェルスクリプトに詳しくない方でも大体の内容は分かると思うが、Apacheは「httpd」というプログラムを呼び出して起動する。要するに、このhttpdこそがApacheの本体ということなのだが、これまでの解説ではapachectlによってApacheを起動していた。

 ここでapachectlではなくhttpdを呼び出すのは、apachectlも実はシェルスクリプトであり、その中でhttpdを呼び出しているからである。つまり、リスト2のようなスクリプトを自分で作らなくとも、apachectlを使えばよいというわけだ。そこで、まずは

cd /etc/rc.d/init.d
ln -sf /usr/local/apache/bin/apachectl httpd

のようにして、apachectlに対するシンボリックリンクhttpdを/etc/rc.d/init.dに作成する(名前はhttpdでなくても構わない)。

 しかし、これだけではOSの起動/停止とApacheの起動/停止を連動できない。なぜなら、スクリプトを実行するランレベルに合わせて、それぞれのディレクトリにファイルを配布しなければならないからである。

 ランレベルをご存じない方のために補足しておくと、LinuxやUNIXはOSの起動状態に応じて7種類のレベルが設定されている(表1)。

0 システムの停止
1 シングルユーザーモード(管理者モード)
2 NFSを使わないマルチユーザーモード
3 マルチユーザーモード
4 未使用
5 GUIログインを行えるマルチユーザーモード
6 システムの再起動
表1 ランレベル

 普段あまり利用しないと思うが、rootユーザーのプロンプトで「init 6」とすればOSが再起動するし、「init 1」とすればシングルユーザーモードでOSが起動する。もちろん、それぞれのレベルに応じて起動すべきアプリケーションも異なるから、ランレベルごとに起動スクリプトを格納するディレクトリも用意されている。

 Linuxの場合、これらのディレクトリは、/etc/rc.dの中にrc0.dからrc6.dまで用意される。このうち、システムの再起動(レベル6)と停止(レベル0)を除くレベルがシステムの起動状態を定義することになる。しかし、管理者モード(レベル1やレベル2)はメンテナンス時に使うレベルとされているし、レベル4は未使用だからApacheを起動するランレベルは、残るレベル3とレベル5である。

 従って、/etc/rc.d/init.dにスクリプトを用意したら、

# cd ../rc3.d
# ln -sf ../init.d/httpd S83httpd
# cd ../rc5.d
# ln -sf ../init.d/httpd S83httpd

のようにして、rc3.dとrc5.dにシンボリックリンクを作成する。これで、ランレベル3およびランレベル5でOSが起動する際は、それに連動してApacheが起動するようになる。

 apachectlは、「start」や「stop」を引数に受け取ってApacheを起動/停止するから、何の修正も加えずにOSの起動や停止と連動できてしまう。それ以外にも、Apacheを再起動する「restart」、起動の有無を確認する「fullstatus」「status」、サービスを停止せずに再起動するための「graceful」、設定の妥当性を確認する「configtest」などのオプションが用意されている。これらは起動/停止に限らず、手動でapachectlを呼び出す際に活用すると有益なオプションばかりだ。

Apacheのアンインストール

 最後に、インストールしたApacheを削除する方法を紹介しておくとしよう。LinuxやUNIXのソフトウェアは、Windowsと違って非常にシンプルな方法でアンインストールできる。なぜなら、インストールしたファイルを削除するだけでよいからである。

 この方法はMacintoshに似ているが、ある意味ではWindowsの方が特殊ともいえる。Windowsの場合、レジストリと呼ばれる環境記憶領域にアプリケーションの情報が大量に書き込まれ、OS全体に影響を与えていることもある。従って削除が困難になるのだが、LinuxやUNIXでは、コンパイルしたファイルをコピーするだけでインストールが完了する。

 Apacheの場合、デフォルトのディレクトリは/usr/local/apacheだから、このディレクトリを削除すればアンインストールが完了する。ただし、自分で作成したファイルは別だから、今回紹介したパスの設定や自動起動/停止の設定は別途削除しなくてはならない。もっと厳密にいえば、オンライン・マニュアルも削除しなくてはならないところだが、そうしたファイルが悪さをする可能性はないから放置しても問題ない。気になるようであれば削除すればいいだろう。

 次回からは、いよいよ設定編へと突入する。いまは、とりあえずインストールして起動だけはできている、という状態だろうから、これからが正念場というところだ。もちろん、今回インストールだけで終わってしまったSSLの設定についてもそのうち詳しく紹介するつもりだ。