ファイルサーバに格納されたデータのセキュリティが、昨今大変重要 になっています。データに障害が起きれば、企業は数千ドルを失う 可能性もあります。この前のセクションにおいて、 我々は認証機構を提供するために、Apache をビルドする際に LDAP 認証モジュールを組みこみました。しかし、HTTP トラフィックは非常に 安全性が低く、データはすべて平文で転送されます - つまり、LDAP 認証を行うユーザ ID やパスワードも同様に平文で転送されてしまうのです。 これが問題を引き起こします。誰もがユーザ ID/パスワードを覗き見て、 DAV 格納所へのアクセス権を取得できます。これを防ぐには、 基本的には HTTP + SSL もしくは HTTPS により HTTP トラフィックを 暗号化しなくてはなりません。HTTPS 上で転送されるものはすべて暗号化 されますので、LDAP のユーザ ID/パスワードは覗き見できません。 HTTPS は443番ポート上で動作します。この前のセクションにおいて コンパイルをした結果、Apache はポート80番(通常の HTTP)と443番 (HTTPS)の両方をリッスンするようになっています。 もしあなたがこのサーバを DAV のためだけに使うつもりならば、 その場合ポート80番を閉じることを強くお勧めします。このセクションでは、 SSL に関する情報と、WebDAV サーバ上で SSL を管理するための情報を提供します。 しかし、その情報は DAV サーバに限定されるものではなく、 どんなウェブサーバでも利用可能です。
SSL (Secure Socket Layer)は、ネットワーク層とアプリケーション層の間に 位置するプロトコル層です。名前が示す通り、SSL はあらゆる種類の トラフィック--LDAP, POP, IMAP そして最も重要なのが HTTP-- を暗号化するメカニズムを提供します。
以下に SSL に含まれる層を非常に簡易化した構造を示します。
+-------------------------------------------+ | LDAP | HTTP | POP | IMAP | +-------------------------------------------+ | SSL | +-------------------------------------------+ | Network Layer | +-------------------------------------------+ |
SSL で利用される暗号化アルゴリズムには、二種類があります。
公開・秘密鍵暗号方式 - SSL コネクションの開始:このアルゴリズムは、SSL セッションを開始するために利用されます。 このアルゴリズムの場合、暗号化は公開鍵により行われなければならず、 復号化は秘密鍵によってのみ可能です。ウェブサーバは秘密鍵を保持し、 クライアントに公開鍵を送ります。公開鍵は、認証書の中に入れられて、 クライアントに送られます。
クライアントが、HTTPS を使いウェブサーバにコンテンツを要求する。
ウェブサーバは、サーバの公開鍵を含む証明書を付けて応答する。
クライアントは、証明書の期限が切れていないか調べる。
それからクライアントは、証明書を署名した認証局が、ブラウザの信頼できる 認証局のリストの中にあるか調べる。これは、我々が信頼できる CA から証明書 を得る必要があるためです。
その後でクライアントは、ウェブサーバのドメイン名が、証明書にある Common Name (CN) と一致するか調べる。
すべて条件を満たせば、SSL コネクションが開始される。
対称鍵暗号方式 - 実際に転送するデータの暗号化を行う: SSL コネクションの確立後、データの暗号化には対称鍵暗号方式が 利用されます。公開・秘密鍵暗号方式は CPU に対する負荷が重いので、 対称鍵暗号方式が利用されます。対称鍵暗号方式では、データの暗号化 も復号化も同一の鍵で行われます。対称鍵暗号方式で利用される鍵は、 SSL セッションを始動する過程で交換されています。
Apache をコンパイルする間に、我々はテスト用証明書を作成しました。 我々はこの独自の証明書を作成するのに、mod_ssl により提供される makefile を使用しました。我々は以下のコマンドを用いました。
# make certificate TYPE=custom |
テスト目的にはこの証明書が利用できます。
実運用を行うには、CA から証明書を取得する必要があります。 CA、認証局 (Certificate Authorities) は認証ベンダであり、 ユーザのブラウザクライアントに信頼できる CA としてリストアップされています。暗号アルゴリズムについて解説したセクション で述べたように、もし CA が信頼できる認証局のリストに入っていないと、 ユーザは保護されているサイトに接続しようとした際に警告メッセージを もらうことになります。
同様に、テスト用の認証書では、ユーザのブラウザに警告メッセージ が表示されることになります。
CSR、証明書署名要求を、署名してもらうために信頼できる CA に送る必要があります。このセクションは、CSR を作成し、それを自分で選んだ CA に送る方法について議論します。
cd /usr/local/apache/conf/ /usr/local/ssl/bin/openssl req -new -nodes -keyout private.key -out public.csr |
この時点で、証明書署名要求を生成するために、 サーバの位置について何度か尋ねられます。
注記:あなたの Common Name は、dav.server.com といったウェブサーバの DNS 名になります。あなたが何か他のものを入力してしまうと、正しく動作しません。 将来必要になりますので、ここで使用するパスワードは忘れないでください。
このプロセスが完了すると、あなたは private.key と public.csr を取得します。この段階では、public.key はまだ暗号化されていません。 暗号化するには以下のコマンドを実行してください。
mv private.key private.key.unecrpyted /usr/local/ssl/bin/openssl rsa -in private.key.unecrpyted -des3 -out private.key |
ウェブサーバに格納される RSA 秘密鍵は、通常暗号化されており、 そのファイルを解読するにはパスフレーズを必要とします。そのため、 mod_ssl 付きで Apache を起動する際にパスフレーズを要求されるのです。
# apachectl startssl Apache/1.3.23 mod_ssl/2.8.6 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide us with the pass phrases. Server your.server.dom:443 (RSA) Enter pass phrase: |
RSA 秘密鍵を暗号化するのはとても重要なことです。もし誰かがあなたの 「暗号化されていない RSA 秘密鍵」を手に入れれば、彼/彼女は容易にあなたの ウェブサーバを偽装できます。秘密鍵が暗号化されていれば、 ハッカーはパスフレーズなしには何もできません。
しかし、ウェブサーバを起動する度にパスフレーズを要求されるわけですから、 鍵を暗号化するのが悩ましい場合もあります。特にブート時の ウェブサーバの起動に rc スクリプトを利用していると、 パスフレーズの要求が問題になります。
秘密鍵の(パスフレースによる)暗号化をやめれば、パスフレーズの要求は 簡単に止められます。ただし、誰もこの鍵を手に入れられないようにしてください。 私としては、ウェブサーバ上で秘密鍵を復号化する前に、セキュリティの ガイドラインを厳しくし、安全化することをお勧めします。
鍵を復号化するには:
まず暗号化された鍵の複製を作成します。
# cp server.key server.key.cryp |
その後で暗号化されている鍵を書き換えてください。元の暗号化された鍵の パスフレーズを要求されます。
# /usr/local/ssl/bin/openssl rsa -in server.key.cryp -out server.key read RSA key Enter PEM pass phrase: writing RSA key |
復号化された秘密鍵を安全化する一つの手法として、それを root からしか見えなくするというのがあります。
# chmod 400 server.key |