SSLによるSecureWWWサーバの構築(Windows編)
Windows環境でのいろいろなサーバソフトの動作確認をするため、クライアントにApacheを入れていますが、SSL対応ができておらず不便なので対応させてみました。Apache+SSLのWindows版に関してはインターネット上にいろいろ情報はあったのですが、1.3系が主体で情報が古く、2.0系ではうまく動作しませんでした。いろいろ調査した結果、何とか動作するようになったのでここにまとめておきます。
なお、Apacheでは、SSLの運用形態の一つとして単に情報の暗号化を行うだけでなく、認証局(ここではプライベートCAを利用)で認証したクライアント証明書を使用することにより、その証明書を持ったクライアント以外からのアクセスを制限することができます。運用は煩雑になりますので、特別なケースでの運用形態と思われますが、より強力なセキュリティアクセスが可能となります。自宅サーバでも、ローカルな運用に使用したりできますので、その設定方法も簡単に解説しておきます。
動作確認はWindows2000 SP3 / XP Pro SP2で行っています。
■Apache+SSL for Win32のインストール
ApacheのサイトにあるファイルはSSLに対応していません。そこで、
こちらにSSL対応のオールインワンのバイナリがありますので、これを使うことにしました。ダウンロードしたのは、Apache_2.0.53-Openssl_0.9.72-Win32.zipです。
最近(2005.12.03)、上記のHunterのサイトがDNSも牽けずアクセスできなくなっています。以前も同様のことがあったのですが、今回は少し長い気がしますので、Apache2+SSL対応のWindows版が置いてあるサイトを紹介して置きます。
- http://brandleadershipmarketing.com/apache/
元々、HunterのArchiveが置いてあったサイト。Hunterの状況から更新されるかは不明だが、とりあえず Apache_2.0.55-Openssl_0.9.8a-Win32.zip
は存在する。
- http://www.gknw.com/development/apache/
"Unofficial CVS Apache webserver binaries and module binaries"というサイト名をどう思うかがあるが、SSL対応のバイナリが置かれている。httpd-2.0.55-w32.zipの動作はおやじは確認済み。ディレクトリが
"Apache2" になっているので、そこだけ注意すればおやじのコンテンツが適用できる。
- http://www.apachefriends.org/en/xampp.html
こちらは少し毛色が違い、SSL対応のApache2のほか、MySQLやPHP、Perl、phpMyAdmin、Webalizer、Mercury
Mail、FileZilla FTP Server 等が組み込まれた"XAMPP"というオールインワンバイナリである。下手にバラバラにインストールするより整合がとられているので、これを使用してしまうほうがよいかもしれない。XAMPPでググレば情報があるので、参考にするとよい。
|
- ダウンロードしたファイルをディレクトリ付きで適当な場所に解凍する。(おやじは、D:\work配下に解凍)
- 現在、Apacheがインストールされているなら、アンインストールする。なお、Apache.0系がインストールされていたなら、httpd.confがほとんど流用できるので、インストールされていたディレクトリ名を変更し、バックアップしておくとよい。(ex.
C:\Apache -> C:\Apache_bak) なお、新規インストールの場合は、この項の作業は不要。
- 新規インストールの場合は、Apacheのインストールディレクトリをシステムがインストールされているパーティションに作成する。(ex.
C:\Apache) インストール済みの場合は、バックアップ前のディレクトリ名でインストールディレクトリを作成する。
- 作成したディレクトリ配下に、1項で展開した中身を全てコピーする。
- コピーした、binディレクトリ内にある、libeay32.dllとssleay32.dllを C:\WINNT\system32内にコピーする。
- この後、インストールするが、httpd.confやssl.confの設定及びSSLの鍵や証明書の準備ができていないと蹴られるので、そちらの準備を先にする。
■Apache+SSL for Win32の設定
Apache+SSL for Win32を動かすため、httpd.confやssl.confの設定及びSSLの鍵や証明書の準備を行います。SSL用証明書等の作成については、こちらを参考に必要なものを作成してください。
◆httpd.confの設定
今までApache.0系を使用していた場合は、SSLモジュールの組み込み以外は、バックアップしてあったhttpd.confと同じでよいので作業は簡単です。新規インストールの場合は、下記により設定していきます。
設定情報は、Apacheディレクトリ中のconfディレクトリにあるhttpd.confにあるので、テキストエディタで編集していきます。
設定を変更した項目は以下のとおりです。変更する場合は、失敗に備えて変更行を下の行にコピーし、元の行の先頭に「#」を付加することにより、コメント行として保存しながら作業しました。 どうにもならなくなったら、httpd.default.confやssl.default.confが初期のhttpd.confやssl.confと同一なので、いじくりすぎたhttpd.confやssl.confを削除して、httpd.default.confやssl.default.confをコピーしてファイル名を変更すれば初期状態に戻るので頭を整理しながらやり直したほうが早い場合もあります。(青字は削除、赤字は追加、緑字は変更したものです。)
- サーバルートの変更
Apacheをコピーしたディレクトリを指定する。デフォルトはC:\apacheなので、異なるディレクトリにインストールしたならサーバルートをApacheをコピーしたディレクトリ(ex.
C:\Apache2)に変更する。但し、ここを変更、即ちデフォルト以外にすると他の設定にも影響がでるので、見落とさないように修正が必要である。
ServerRoot "c:/apache"
↓追加
ServerRoot "c:/apache2"
- SSLモジュールの組み込み
SSLを動かすため、DSOでSSLモジュールを組み込むよう指定する。(行頭の「#」を削除)
#LoadModule ssl_module modules/mod_ssl.so
↓削除
LoadModule ssl_module modules/mod_ssl.so
- サーバ管理者のメールアドレスの設定
#ServerAdmin @@ServerAdmin@@
↓追加
#ServerAdmin @@ServerAdmin@@
ServerAdmin oyaji@mail.aconus.com
- サーバ名称の設定
#ServerName localhost:80
↓追加
#ServerName localhost:80
ServerName www.aconus.com:80
- コンテンツ用ディレクトリ(ドキュメントルート)の構成
今回は、おやじだけでなく、あっこやリナもホームページを作りたいとのことなので、以下のようなディレクトリ構成で、プロバイダと同じように”http://www.aconus.com/~oyaji/といった形式でアクセスできるようにしてみました。ルート(http://www.aconus.com/)は将来使うこととして、空けてあります。
なお、ディクトリは、管理面とセキュリティ面から独立したドライブ(Eドライブ)に作成しました。おやじがドキュメントを異なるディレクトリにした最大の理由は、システムが不安定になったときにCドライブをバックアップから復元するが、そのときに焦っていて最新のコンテンツ(BBS等)のバックアップを忘れて戻してしまうと、コンテンツがパーになってしまうといった事故防止のためである。
web [ ルートディレクトリ ]
|
├ oyaji [ おやじのユーザディレクトリ ]
| |
| └ public_html [ ドキュメントルート ]
| |
| ├ index.htm [トップページ ]
| ├ bbs [ CGI設置用 ]
| └ count [ CGI設置用 ]
|
├ akirin [ あっこのユーザディレクトリ ]
| |
| └ public_html [ ドキュメントルート ]
| |
| ├ index.html [トップページ ]
| └ cgi [ CGI設置用 ]
|
└ rina [ リナのユーザディレクトリ ]
|
└ public_html [ ドキュメントルート ]
|
├ index.html [トップページ ]
└ keijiban [ CGI設置用 ]
|
- ドキュメントルートの変更
ドキュメントルートでは、http://www.aconus.com/やhttpd://192.168.1.100/のようにホスト名やサーバのIPアドレスでアクセスしたときにApacheがアクセスするディレクトリを指定する。デフォルトはC:/Apache/htdocsであり、最初にApacheにうまくアクセスできたときにご対面するApacheのテストページは、C:/Apache/htdocs配下にある、index.html.varファイルからジェネレートされたものである。おやじは、上記のようにEドライブ下にコンテンツ用ディレクトリを作成したので下記のように変更する。
DocumentRoot "C:/Apache/htdocs"
↓追加
#DocumentRoot "C:/Apache/htdocs"
DocumentRoot "E:/Web"
- ドキュメントルートの変更
上記のドキュメントルートの変更に伴い、Directoryディレクティブでドキュメントルートの振る舞いを指定しているので、これも合わせて変更する。
<Directory "C:/Apache/htdocs">
↓追加
#<Directory "C:/Apache/htdocs">
<Directory "E:/Web">
- CGI/SSIの実行権 (ドキュメントルートのDirectoryディレクティブ内)
Indexesがあると、ディレクトリ指定でアクセスされた場合(http://www.aconus.com/のように「/」で終わるか最後がディレクトリだった場合)に、Apacheはそのディレクトリ内に後述のDirectoryIndexディレクティブで指定したHTMLファイルが無いか左側から探し、対象ファイルが見つからないとインデックスリストが表示されてしまうので削除しました。
ExecCGI/Includesはこのディレクトリ配下でCGI/SSIの実行を許可する場合に指定する。cgii-binディレクトリでしか動作させない場合は、指定しないこと。(Optionsの意味はユーザディレクトリでも同様。詳しくは、こちらを参照のこと。)
Options Indexes FollowSymLinks MultiViews
↓削除、追加
Options FollowSymLinks MultiViews ExecCGI Includes
- ユーザディレクトリの変更
UserDirでは、http://www.aconus.com/~oyaji/といった形式でアクセスさせる場合のディレクトリを指定する。下記の
*はワイルドカードで、http://www.aconus.com/~oyaji/のように[~aaa]で指定したディレクトリ名と同等になり、[~oyaji]ならE:/web/oyaji/public_html配下のファイルが表示される。
UserDir "My Documents/My Website"
↓追加
# UserDir "My Documents/My Website"
UserDir "E:/Web/*/public_html/"
- ユーザディレクトリ配下でのCGI/SSIの実行権付与とインデックスリストの非表示
<Limit> ディレクティブは、アクセス制御の範囲を指定された HTTP メソッドに限定するもので、それ以外のメソッドは、影響を受けない。つまり、下記では、GET
POST OPTIONS PROPFIND のメソッドに対してのみアクセスの制御を行ない(ここではアクセス許可)、
それ以外のメソッドについてはアクセス制御がかからない。
<LimitExcept> は、<Limit> セクションの反対の動作をし、 標準のメソッドと標準外や未認識のメソッドの場合の両方を設定できる。下記では、GET
POST OPTIONS PROPFIND のメソッド以外のアクセス制御が行われ、ここでの設定では不許可になる。<LimitExcept>は未設定のメソッド全てに制御がかかるので、こちらで設定したほうが確実である。
#<Directory "My Documents/My Website">
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS PROPFIND>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>
↓削除/追加
<Directory "E:/Web/*/public_html">
AllowOverride FileInfo AuthConfig Limit
Options MultiViews SymLinksIfOwnerMatch ExecCGI IncludesNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
- HTMLファイル名の追加
ディレクトリ指定でアクセスされた場合(http://www.aconus.com/のように「/」で終わるか最後がディレクトリだった場合)に、Apacheはそのディレクトリ内にここで指定したファイルが無いか左側から探し、見つかればそのファイルを転送する。見つからない場合は、そのディレクトリでのOptions指定でIndexesが有効ならインデックリストを表示し、未指定なら404エラーとなる。おやじは、index.htmというファイル名をデフォルトとしているのでそれを追加している。下記の例ではSSI用のindex.shtmlも追加してある。
DirectoryIndex index.html index.html.var
↓追加
DirectoryIndex index.html index.htm index.shtml index.html.var
- ホストネームでのログ収集
デフォルトではログのアドレスはIPアドレスで行われるが、この機能を使うとDNSで逆牽きしてホスト名で記録できる。DNSの逆牽きをすると負荷が重くなるが、アクセスがまだまだ少ないのとホストネームのほうが常連さんならすぐにわかること、動的IPの場合は後で逆引きしても牽けないことが多々あるため、あえて使用しています。ただ、逆牽き設定をしていないDNSや設定が誤っているDNSが多く、エラーログがかなり出てしまいます。(BINDの設定でログらないようにしています。)
#HostnameLookups Off
HostnameLookups On
- 家庭内からのアクセス、worm等のlog分離
#CustomLog logs/access.log common
SetEnvIf Remote_Addr 192.168.1. homelog nolog
SetEnvIf Request_URI "~akirin" akirinlog nolog
SetEnvIf Request_URI "default.ida" wormlog nolog
SetEnvIf Request_URI "root.exe" wormlog nolog
SetEnvIf Request_URI "cmd.exe" wormlog nolog
SetEnvIf Request_URI "Admin.dll" wormlog nolog
CustomLog logs/home.log common env=homelog
CustomLog logs/akirin.log combined env=akirinlog
CustomLog logs/worm.log common env=wormlog
CustomLog logs/access.log combined env=!nolog
・上のほうでLoadModule setenvif_module modules/mod_setenvif.soがアンコメントアウトされていることを確認。
・1行目のCustomLog logs/access.log common をコメントアウトし、以下を記述。
・2/8行目で、家庭内からのアクセスをhome.logに採取。ログ不要ならコメントアウト。
・3/9行目で、娘のサイトへのアクセスをakirin.logに採取。common -> combinedとしてreferrerを採取。
・4行目でCodeRed、5〜7行目でNimudaからアタックを識別し、10行目でworm.logに採取。ログ不要ならコメントアウト。
・11行目で残りのアクセスをaccess.logに採取。common -> combinedとしてreferrerを採取。おやじのサイトへのアクセスは、ここに含まれる。
- 日本語表示の設定(ブラウザのエンコード自動選択時の文字化け対策: 1個所。詳細は、こちらを参照のこと。)
LanguagePriority は、MultiViews 環境でブラウザが言語の優先順位を提供してない場合の優先度を指定するもので、通常はコンテンツも対応していないので変更不要。
まず、LanguagePriority は ja を先頭(左)に持ってくること。また、AddDefaultCharset で下記の設定をした場合は、ドキュメントで必ずcharsetを指定しないと文字化けする。おやじのコンテンツには、EUC-JP
と shift-jis の両方があるためこのようにして(AddDefaultCharset Offとしても良い)、ドキュメントに依存して表示させている。そのため、一部の
CGI 等も改造しているので注意が必要である。
shift-jis のコンテンツしかないなら、 AddDefaultCharset shift_jis とすれば良い。
LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw
↓移動
LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw
AddDefaultCharset ISO-8859-1
↓追加(コメントアウト)
#AddDefaultCharset ISO-8859-1
- CGIファイル拡張子の定義
CGI として動作させたい拡張子を記述する。
#AddHandler cgi-script .cgi
↓削除、追加
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
◆SSLを動かすための設定 (ssl.confの設定)
-
こちらで作成したサーバ用の鍵 (server.key) と証明書 (server.crt) を、Apacheのディレクトリ配下にコピーする。
C:\etc>mkdir C:\Apache\certs
C:\etc>copy server.key C:\Apache\certs
C:\etc>copy server.crt C:\Apache\certs |
- ssl.confの設定を行う。
- Windowsでは未サポート
SSLMutex file:logs/ssl_mutex
↓追加
#SSLMutex file:logs/ssl_mutex
- サーバ名の変更
ServerName new.host.name:443
↓追加
#ServerName new.host.name:443
ServerName www.aconus.com:443
- サーバ管理者のメールアドレスの設定
ServerAdmin you@your.address
↓追加
#ServerAdmin you@your.address
ServerAdmin oyaji@mail.aconus.com
- ドキュメントルートの変更
DocumentRoot "C:/Apache/htdocs"
↓追加
#DocumentRoot "C:/Apache/htdocs"
DocumentRoot "E:/Web"
- 証明書のパスの変更
SSLCertificateFile c:/Apache/conf/ssl.crt/server.crt
↓変更、追加
SSLCertificateFile c:/Apache/certs/server.crt
- 鍵のパスの変更
SSLCertificateKeyFile c:/Apache/conf/ssl.key/server.key
↓変更、追加
SSLCertificateKeyFile c:/Apache/certs/server.key
◆クライアント認証を動かすための設定
クライアント認証関係の設定は、単に通信を暗号化(httpsでのアクセス)するだけなら不要です。
このクライアント用証明書によるクライアント認証を導入すると、予め認証局で署名されたクライアント用証明書を持たない端末がアクセスしても、接続そのものが拒否されるのでセキュリティ的にかなり強固になります。反面、クライアント毎に証明書を発行することになるので、運用はかなり面倒になりますが、セキュリティとのバータなので止むを得ません。
このようなクライアント認証は、一般的に企業などで導入されており、具体例としてはwebを使用して外勤の営業マンが社外から社内システムにアクセスできるシステムや株取引のシステムなどに導入されています。このようなシステムの場合、不特定多数にアクセスされるとApacheの認証やアプリ認証だけではセキュリティが甘くなるため、アクセスレベルでセキュリティを強化するためにクライアント認証を導入します。
- 作成したCA用証明書を、Apacheのディレクトリ配下にコピーする。
C:\etc>copy demoCA\cacert.pem C:\Apache\certs |
- 証明書失効リストを、Apacheのディレクトリ配下にコピーする。
C:\etc>copy demoCA\crl\crl.pem C:\Apache\certs |
なお、失効が発生するたびにこの作業は必要になるので、ssl.confでcrl.pem作成ディレクトリを直接指定したほうが良いかもしれない。Windowsの場合は、リストを有効にするためApacheの再起動が必要である。
- ssl.confの設定を行う。
- CA証明書へのパスとファイル名の設定を行う
#SSLCACertificatePath c:/Apache/conf/ssl.crt
#SSLCACertificateFile c:/Apache/conf/ssl.crt/ca-bundle.crt
↓追加
#SSLCACertificatePath c:/Apache/conf/ssl.crt
#SSLCACertificateFile c:/Apache/conf/ssl.crt/ca-bundle.crt
SSLCACertificatePath c:/Apache/certs
SSLCACertificateFile c:/Apache/certs/cacert.pem
- クライント認証の指定とルート認証局までの階層設定
CA によって直接署名された証明書だけを信用するので、SSLVerifyDepth は 1
に設定する。
#SSLVerifyClient require
#SSLVerifyDepth 10
↓追加
#SSLVerifyClient require
#SSLVerifyDepth 10
SSLVerifyClient require
SSLVerifyDepth 1
- 証明書失効リストの指定
#SSLCARevocationPath c:/Apache/conf/ssl.crl
#SSLCARevocationFile c:/Apache/conf/ssl.crl/ca-bundle.crl
↓追加
#SSLCARevocationPath c:/Apache/conf/ssl.crl
#SSLCARevocationFile c:/Apache/conf/ssl.crl/ca-bundle.crl
SSLCARevocationFile c:/Apache/certs/crl.pem
◆サービス起動の設定と起動
ここで、サービス起動できるように設定します。但し、一部レジストリを触るので注意が必要です。
- サービスへの登録
コマンドプロンプトで下記のようにして、サービスに登録する。
C:\>cd apache\bin
C:\apache\bin>apache -k install
|
- サービス起動時にSSL起動するようにするための変更
上記でサービス起動できるようになるが、SSLでは起動できない。実行ファイルのパスのオプションを書き換えるため、レジストリエディタでパラメータを追加する。
1. [スタート]->[ファイル名を指定して実行]で、名前欄に「regedit」と入力し[OK]を押す。
2.レジストリエディタが起動されるので、左の欄で[マイコンピュータ]を選択する。
3.[Ctrl]+[f]で検索を起動し、検索する値に「-k runservice」と入力し検索する。
4.[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Apache\ImagePath](下段に枠内に表示)で停止するので、名前欄のImagePath上で右クリックし、「変更」を選択する。
5.値のデータ欄が「"c:\Apache\bin\Apache.exe" -k runservice」とインストールパスと同じであることを確認し、-kの前に「-D
SSL」とSSL起動用のパラメータを追加し、「"c:\Apache\bin\Apache.exe"
-D SSL -k runservice」となるようにする。後は[OK]を押してウインドウを閉じればおしまいである。
- Apache Monitorの自動起動の設定
スタートアップに登録するだけである。
1.[スタート]->[設定]->[タスクバーとスタートメニュー]で、プロパティを開く。
2.[詳細タブ]->[追加]で、ショートカットの作成が開くので、[参照]でApacheをインストールしたディレクトリにある「ApacheMonitor.exe」(c:\Apache\bin\ApacheMonitor.exe)を
選択し、[OK]を押す。
3.[次へ]を押し、ショートカットを保存するフォルダとして[スタートアップ]を選択し、[次へ]を押し、判りやすい名前を付けて[完了]を押せばおしまい。
- Apacheの起動と確認
スタートアップに登録したメニューからApache Monitorを起動し、Apacheを起動する。(タスクトレイのアイコンを左クリックして「start」)
正常に起動しているか、コマンドプロンプトを起動し、「netstat -an」と入力すると、アクティブはコネクションが表示されるので、[80]と[443]が存在するか確認する。
■Active Perlのインストール
さて、このままでは、CGIが動きません。CGIを動かすため、Perlをインストールします。
Active Perlを
こちらからダウンロードします。おやじがダウンロードしたのは、以下のファイルです。
・ ActivePerl-5.8.6.811-MSWin32-x86-122208.msi
- ダウンロードしたファイルをインストールする。(Windows95/98/NTでは、Windows
Installer 2.0が必要)
- 途中で、インストール先をC:\perlからC:\usr\localに変更してインストール。(おやじはこれで苦労した)
これは、一般に提供されているCGIスクリプトの多くが、下記のようにPerlへのパスを指定しているからです。
・ #!/usr/local/bin/perl
- 次の画面で PPM3 を有効にするか聞いてくるので、「Enable PPM3 to send profile
info to ASPN」にチェックを入れインストールを続行する。PPMを有効にしておくと後でいろいろなperlモジュールが必要になったとき簡単にインストールできる。
- インストールが完了したら、Windowsを再起動する。
ここで、Perlが正常にインストールできたか確認します。
- スタートメニューからMSDOSプロンプトを起動。
- c:\>perl -vと入力して、
C:\>perl -v
This is perl, v5.8.6 built for MSWin32-x86-multi-thread
(with 3 registered patches, see perl -V for more detail)
Copyright 1987-2004, Larry Wall
Binary build 811 provided by ActiveState Corp. http://www.ActiveState.com
ActiveState is a division of Sophos.
Built Dec 13 2004 09:52:01
Perl may be copied only under the terms of either the Artistic License
or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'. If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page. |
と表示されれば、成功。
これで、CGIも動かせます。 早速カウンタを動作させて見ましたが、うまく動作しているようです。
Top Pageへ