Apache+mod_ssl

OpenSSLを利用して、Unix上でSSL(Secure Sockets Layer)やsuexecをApacheに組み込む例を以下に示す。 SSLを組み込むと、セキュリティの高いWebサーバを構築することができる。ブラウザからは「https://〜」等でアクセスすることができ、この間(ブラウザの鍵マークが有効になっている間)はクライアント側から送信する情報はすべて暗号化される。通常はSSLをインストールした後、Verisignへ証明書を提出して署名してもらわないといけないのだが、閉じたネットワーク内で使う分にはテスト用に自分で署名するとよい。
suexecはセキュリティの高いCGIであり、ファイルの所有者をCGIスクリプトに設定することができ、「その他ユーザに書き込み権限が設定されていると動作しない」というものである。通常スクリプトのパーミッションは700に設定しておくのがよい。
Apacheに関しては、RPM系LinuxならOSのインストール時にWebサーバを選択すればインストールされるが、たいていはSSLに対応していないため、すでにインストールされているものをアンインストールしてからソースをコンパイルすることになる。mod_sslのRPM版も存在するが、できるだけ自分でビルドしてインストールするようにしたい。

APACHE
DefaultPort : 80(HTTP) / 443(SECURE)

1)mod_sslとApacheの両方のアーカイブを「/usr/local/src/」以下に解凍する。その後mod_sslのディレクトリへ移動し、apacheのconfigureオプションをつけてconfigureを実行する。なおApacheのインストール先は「/usr/local/apache/」とした。

# cd /usr/local/src/
# tar zxvf mod_ssl-2.8.9-1.3.26.tar.gz
# tar zxvf apache_1.3.26.tar.gz
# cd mod_ssl-2.8.9-1.3.26/
# LIBS="-lpthread" ./configure --with-apache=/usr/local/src/apache_1.3.26 \
--with-ssl=/usr/local/openssl --prefix=/usr/local/apache --enable-shared=max \
--enable-module=so --enable-suexec --suexec-caller=nobody \
--suexec-docroot=/home --suexec-logfile=/usr/local/apache/logs/suexec_log \
--suexec-userdir=public_html

(注:--enable-module=soは必ずつけること。追加モジュールがインストールできるようになる。suexecのCGIを使用する場合は--enable-suexecと、少なくとも1つの--suexec-xxxオプションが必要。--suexec-callerは、httpd.confで設定するUserの値。--suexec-docrootは/homeを指定する。こうしないとApacheでVirtualHost設定をした場合、「command not in docroot」というエラーがログに出てCGIが正常に実行できない。)


2)Apacheを展開したディレクトリへ移り、ソースをコンパイルする。上の(2)の作業によってすでにこちらのconfigureは終わっている状態であるので、ここでconfigureをする必要はない。またmake後に「make certificate」を行うよう指示が出るが、証明書の作成はApacheのインストール後でも行うことができるため、ここでは行わないことにする。

# cd ../apache_1.3.26/
# make
# make install

3)SSLの証明書の作成を行う前に、秘密鍵の作成を行う。なお秘密鍵を作成した場合、SSLつきApacheの起動ごとに毎回キーフレーズを聞いてくるため、これを自動化するためにhttpd.confファイル内でキーフレーズの設定も行う。

# cd /usr/local/apache/conf/
# openssl genrsa -des3 -rand httpd.conf.default -out ssl.key/server.key 1024

(秘密鍵の作成。-randオプションは、暗号化にhttpd.conf.defaultというテキストファイルを利用するという意味であるが、実際テキストファイルなら何を指定してもよい。このコマンドを打った後、設定したいキーフレーズを2回入力する。)

# vi ssl.key/server.pem
#!/bin/sh
echo "hogehoge"

# chmod 500 ssl.key/server.pem

(Apache+。上でキーフレーズをhogehogeとした場合は上記のように記述して保存する。)mod_ssl自動起動のためのパス入力を省くためのファイルを作成する

# openssl rsa -in ssl.key/server.key -out ssl.key/server.key

(秘密鍵を無効にするには、上のコマンドを入力した後、設定されているパスフレーズを入力する。通常はこれを行う必要はない)

4)証明書の作成を行う。このコマンド後に「国別コード(日本ならJP)」「都道府県」「市区郡町村」「会社名」「部門名」「サーバ名(httpd.confのServerNameで指定しているのと同じ名前)」「管理者のメールアドレス(ServerAdmin)」を設定する。なお、その後に聞いてくる「A challenge password」と「An optional company name」は何も入力せずにそのままReturnキーを押す。

# openssl req -new -days 365 -key ssl.key/server.key -out ssl.csr/server.csr

5)外部に公開する場合はこの証明書をVerisignへ送って署名してもらうが、今回はテスト用に自己署名を行う。以下のコマンドで署名された証明書が生成される。-daysオプションをつけることで有効期間(日単位)を設定できる。下の例では1年間。

# openssl req -x509 -days 365 -key ssl.key/server.key -in ssl.csr/server.csr \
-out ssl.crt/server.crt

6)必要に応じてhttpd.confの修正を行う。今回はSSLとCGI関係の修正を行う。

# vi httpd.conf

AddHandler cgi-script .cgi .pl
SSLPassPhraseDialog exec:/usr/local/apache/conf/ssl.key/server.pem

下の行は(4)で設定した自動起動のパス入力を省くための設定。
上の行は拡張子.cgiと.plをCGIスクリプトとみなすための設定であるが、これだけではCGIを利用することができない。CGIを使用可能にするにはOptions指示子で+ExecCGIを指定する必要がある。たとえば各ユーザのホームディレクトリ下の「cgi-bin」ディレクトリ以下のみCGIを利用可能にさせるには、以下の設定を加える。(ディレクトリ表示を禁止)

<Directory "/home/*/public_html/cgi-bin">
Options +ExecCGI -Indexes
</Directory>

なお、ScriptAlias指示子で指定されたディレクトリでは、AddHandlerやOptionsでCGIを使用不可にしていてもCGIとして実行することができる。ただしこのディレクトリ以下のファイルはすべて(.htmlや.jpg等も)CGIスクリプトとしてみなしてしまうため、この指示子を使うことは避けたい。デフォルトでは「/cgi-bin/」に設定されているが、特に仮想ホストの設定をする必要がある場合はこの行を無効にしておいたほうがよい。

#ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

7)Apacheを起動する。起動スクリプトは「/usr/local/apache/bin/apachectl」で、これにオプションをつけることで起動することができる。

# ../bin/apachectl configtest (起動チェック)
# ../bin/apachectl start (Apacheの起動、SSLなし)
# ../bin/apachectl restart (Apacheの再起動、SSLなし)
# ../bin/apachectl stop (Apacheの停止)
# ../bin/apachectl startssl (Apacheの起動、SSLあり)

(注:設定ファイルにおかしなところがある場合でも、httpdを起動してたまに「httpd started」と正常に出ることがある。そのときは当然Apacheは起動していないので、httpdを起動した後は必ずpsコマンドでプロセスをチェックする。)

8)Apacheを自動起動させるために、起動スクリプトを作成する。Linuxでは「/etc/rc.d/init.d/httpd」に、FreeBSDでは「/usr/local/etc/rc.d/apache.sh」に作成するとよい。なお(8)の方法で起動すると、Apache起動時の環境変数がphpinfo()等で公開されてしまうために、PATH以外を公開させないようにスクリプトを書くとよい。

#!/bin/sh
exec env - PATH="/bin:/usr/bin:/usr/local/bin" \
/usr/local/apache/bin/apachectl start

suexec/perl CGIのテスト
(適切なパーミッションを与える。perlのパスは必要に応じて書き換える。)
SSIのテスト

TOP OF PAGE