[Nature's Linux Tech Portal]  
 
Google
WWW を検索 tech.n-linux.com を検索 Wiki検索

SSLを利用するApacheウェブサーバーの構築方法 †


テクニカルライター Matthew/秋元 憲一
matthew.szulik(at)gmail.com
2006/05/29
テクニカルノートコード:tcn00054

↑

SSLを利用しよう †

 フィッシングサイトやフィッシングメール、個人情報の漏洩など、インターネットを中心に様々な手段で信頼性やプライバシーが脅威に曝されることが多くなってきました。2006年はP2P技術が利用された情報の漏洩事件が目立っていますが、まだまだウェブやメールでの被害は増加の一途です。インターネット上で買い物や金融取引、重要情報の送受信などを行っている利用者の立場からすれば、ますます便利になっていく反面、漠然とした不安がつきまとうことがあります。

 一方、インターネット上でサービスを提供する立場から考えてみると、利用者の不安を解消するために、少なくとも、部外者に知られては困る情報を盗聴されたりすること、本物になりすました偽者に情報を送ること、情報を送る途中で何者かに改竄をされることを防いで利用者からの信頼を得たいのではないかと思います。こうした脅威から守るためにPKI(公開鍵基盤)の一つの実装であるSSL*1が利用できます。

 そうしたサービス提供者のために、Nature's LinuxにはSSLが直ぐに利用できるパッケージがいくつか用意されています。インターネットといえばやはりメールかウェブありきでしょうから、今回はSSLを利用するApacheウェブサーバーを取り上げ、その構築方法を説明します。しかしSSLに関係する情報は膨大なので、Nature's Linuxを中心としたあらゆる知識を皆さんと共有したいところですが、記事の都合上、ここではSSLの仕組みそのものはとりあえず皆さんの知識に頼るとして、Nature's LinuxにおけるSSLを利用したウェブサーバーの扱い方を中心に説明します。

 構築の流れだけをコマンドやファイルを中心に簡単に表にまとめています>こちら。


↑

Apache、mod_ssl、OpenSSLについて †

 SSLを利用したウェブサーバーを構築するということで、利用するパッケージの紹介をします。

 Nature's Linuxが最初にリリースされた当初からApacheウェブサーバーパッケージであるapache13-modsslがmod_ssl付きでリリースされていました。このパッケージはApache 1.3系のHTTP サーバーと幾つかのユーティリティプログラムとライブラリだけでなくmod_sslという外部モジュールを含んでいます。mod_sslというのは、apache上でHTTPSによる通信を行うためのモジュールで、OpenSSLのライブラリを利用しています。既に秘密鍵とサイト証明書が用意できていたら、apache13-modsslパッケージだけでSSLを利用するウェブサーバーが構築可能です。

 OpenSSLもNatures's Linuxのリリース当初からVFS*2にopensslというパッケージ名でインストールされいます*3。SSLに利用される鍵や証明書の作成、暗号化された鍵や証明書の解読、ウェブサーバーにSSLで接続してリクエストを投げるといったことまでできる優れたツールキットが含まれています。Nature's Linux上で秘密鍵の生成から証明書の要求も行う場合は必須のパッケージです。最新のセキュリティーパッチが当てられているOpenSSLをつかうことで、SSL(SSL 2.0/3.0、TLS 1.0)を安心して利用できます。SSLで通信を行う際に必要な公開鍵暗号RSAの暗号の強度については、殆どのクライアントで利用されていて且つ必要最低限のビット数である1024ビット以上を扱え、SSLの通信を高速に処理するために利用される共通鍵暗号もクライアントにあわせて、Triple DES、RC 4*4、AES*5などが用意されています。処理速度が気になる場合は暗号のスピードテストまで行えます。比較検討ツールとしても重宝するでしょう。

 ライセンスに関して言及しておきます。Apache、OpensSSL、そのほか依存するライブラリでライセンスがそれぞれ異っています(下表参照)。どのライセンスでも利用や有償サービスについてはライセンスに適合範囲内で行えますが、特許は輸出規制に関しては注意してください*6。

 パッケージのバージョンと更新に関しては、Nature's Linuxのパッケージ全てを自動で常に最新に保っている場合は、環境や扱うコンテンツによってより多くのパッケージについて気をつけなければなりませんが、htmlファイルを表示させるだけのようなサイトですと最低限apache13-modsslとopensslパッケージの二つに気をつけていれば、あと自動で依存するパッケージを更新してくれるので安心です*7。手動でパッケージのアップデートを行っている場合は依存するパッケージの更新情報もチェックすべきです。

表1:利用するパッケージ(2006年5月23日)
パッケージ名最新バージョンライセンスパッケージ内容依存パッケージ
apache13-modssl1.3.36+2.8.27-nl1Apache License, Version 2.0、OpenSSL LicenseとSSLeay LicenseApache 1.3系 HTTP Server一式とmod_ssllibc6, libdb42, libexpat, libopenssl
openssl0.9.7i-nl2OpenSSL LicenseとSSLeay LicensのデュアルライセンスOpenSSLユーティリティーパッケージ、opensslコマンドなどがはいっている。libc, libopenssl
libdb424.2.52-nl8open source licenseバークレー v4.2 DBライブラリパッケージlibc6, libgcc, libstdc++6
libexpat1.95.8-nl5MIT/X Consortium LicenseXMLパーザーライブラリパッケージlibc6
libopenssl0.9.7i-nl2OpenSSL LicenseとSSLeay LicensのデュアルライセンスOpenSSLライブラリパッケージlibc6
libc62.3.6-nl1GPL 2GNU C ライブラリパッケージ

 ライセンスのリンク先は原文(英語)を掲載している開発者達のサイトを優先し、ライセンスページがないものは代替のページをリンクしています。apache13-modsslのライセンスの表記は<Apacheのバージョン>+<mod_sslのバージョン>-<セキュリティーパッチを当てたバージョン>となっています。


↑

構築 †

 SSL利用するウェブサーバーの構築に入る前に、想定した環境の説明をします。

 Nature's Linuxとapache13-modsslパッケージがインストール済みであることを想定しています。opensslパッケージは開発版であれば既にインストールされているはずです*8。

 ネットワーク環境として、インターネット、LAN/WAN内のみ、イントラネット内など、適用範囲が様々考えられますが、どのネットワーク上でもSSLは適切に利用されるべきだと思います。特にサイト証明書に関してはサイト証明を要求したホストで署名したいわゆるオレオレ証明書はSSLを脆弱なものにする要素となるので、ここではオレオレ証明書かどうかに関わらず証明書の発行作業自体を取り扱わず、厳格な審査に合格したルート証明書を持つ認証局から発行されたサイト証明書を得ることを想定します。

 SSLを使ってアクセスさせるサイトは一つを想定しています。またそのサイトのためのサイト証明書を一つ取得することを想定します。因みに仮想ホスト機能をつかってSSL対応サイトを一つのホストに幾つも構築する際にはサイト証明書の扱いや運用について少し注意が必要です。


↑

バージョン確認 †

 Nature's Linux にはインストール時からOpenSSLのライブラリパッケージとコマンドインターフェースなどを含んだパッケージがインストールされています。秘密鍵と公開鍵または証明書要求(CSR)のペアを作成するコマンドopensslがどのユーザーでも直ぐに利用できるようになっています。まずは、opensslコマンドのバージョンの確認をしましょう。apt-getやdpkgコマンドなど、パッケージを管理するコマンドでパッケージを知ることもできますが、実行されるプログラム自体が出力するバージョンも確かめましょう。

 次の例はversionオプションを与えてバージョン情報とそのバージョンがリリースされた日を出力しています。

[VFS-matthew@unidon ~]$ openssl version
OpenSSL 0.9.7i 14 Oct 2005
[VFS-matthew@unidon ~]$ 

 因みにopensslパッケージのバージョンを調べると数字のバージョンの他にアルファベットが追加されています。同じバージョン番号でも追加されているアルファベットが後ろものほどバージョンが新しいことを表しています。0.9.7fパッケージよりも0.9.7iパッケージのほうが新しいバージョンです。これはOpenSSLが頒布しているバージョン形式を継承しているからです。

 さらに詳しい情報が欲しいときは-aオプションを指定してください($ openssl version -a)。opensslがビルドされた時間やコンパイル時のオプションなどの情報が表示されます。

 Apacheのバージョンも同様に調べることがきます。

[VFS-matthew@unidon ~]$ httpd -V
Server version: Apache/1.3.36 (Unix)
Server built:   May 23 2006 15:50:35
Server's Module Magic Number: 19990320:18
Server compiled with....
 -D EAPI
 -D HAVE_MMAP
 -D HAVE_SHMGET
 -D USE_SHMGET_SCOREBOARD
 -D USE_MMAP_FILES
 -D HAVE_FCNTL_SERIALIZED_ACCEPT
 -D HAVE_SYSVSEM_SERIALIZED_ACCEPT
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D DYNAMIC_MODULE_LIMIT=64
 -D HARD_SERVER_LIMIT=256
 -D HTTPD_ROOT="/opt/package/apache13-modssl"
 -D SUEXEC_BIN="/opt/package/apache13-modssl/bin/suexec"
 -D DEFAULT_PIDLOG="/var/run/httpd.pid"
 -D DEFAULT_SCOREBOARD="/var/run/httpd.scoreboard"
 -D DEFAULT_LOCKFILE="/var/run/httpd.lock"
 -D DEFAULT_ERRORLOG="/var/log/apache13-modssl/error_log"
 -D TYPES_CONFIG_FILE="/opt/etc/apache13-modssl/mime.types"
 -D SERVER_CONFIG_FILE="/opt/etc/apache13-modssl/httpd.conf"
 -D ACCESS_CONFIG_FILE="/opt/etc/apache13-modssl/access.conf"
 -D RESOURCE_CONFIG_FILE="/opt/etc/apache13-modssl/srm.conf"
[VFS-matthew@unidon ~]$  


↑

秘密鍵とCSRの作成 †

 秘密鍵とCSR(証明書要求)を作成します。CSRは、秘密鍵と対を成す公開鍵と証明書に登録したいサイトの情報から作成されます。

 パスフレーズを使って秘密鍵を暗号化する場合としない場合で以降の設定内容が若干 異なります。

 因みに秘密鍵とCSRの作成は構築するホスト以外で作成しても構いません。


↑

秘密鍵を暗号化する場合 †

 下記のコマンドを実行すると新しい秘密鍵とCSRの作成までを一括して行えます。最初に秘密鍵を作成し、続けてCSRの作成に入ります。保存先のファイル名を指定しなければCSRは標準出力に出力されます。デフォルトでは秘密鍵はprivkey.pemというファイル名で保存され、DES-EDE3-CBC(いわゆるトリプルDES)で暗号化されます。RSA鍵の長さは1024ビットです。

openssl req -new -out <保存先ファイル名>

実行後に対話形式で入力しなければならないのは次の表のとおりです。順番に質問されるのでそのつど入力してください。最後から二つの質問はEnterを入力して無視してかまいません。企業の実在証明を売りにした証明書(GeoTrustのトゥルービジネスID for グローバルIPなど)を発行している認証局では、Common Nameに証明書を設置するホストのグローバルIPアドレスを記述したCSRが必要になる場合があります。そのようなサービスを利用する場合はCommon Nameに証明書を設置するホストのグローバルIPアドレスを指定してください。

表2:秘密鍵とCSRの入力項目
入力項目用途入力内容入力例
pass phrase秘密鍵秘密鍵の暗号化に利用されるフレーズ(空白をいれて文章にしてもよい)。最低4文字から最大8191文字を入力bahun uni to kita murasaki uni
Country NameCSRISO 3166 alpha-2で規定された国名をあらわす二桁のアルファベットJP
State or Province NameCSR都道府県名Hokkaido
Locality NameCSR市区町村名Sapporo
Organization NameCSR組織名Unidon-ya, Inc.
Organizatoin Unit NameCSR部署名Information section
Common NameCSRサーバー名(FQDN)www.unidon-ya.com
Email AddressCSR管理者のメールアドレス、入力しなくてもよいwebmaster@unidon-ya.com
challenge passwordCSR無視Enterを入力
optional company nameCSR無視Enterを入力

 秘密鍵を作成すると、作成したユーザーのホームディレクトリに、鍵を作成するときに必要な乱数の種を自動的に作成してくれます。.rndというバイナリファイルが出来ていたらそれが乱数の種です。乱数の種となるファイルは「必要なバイト数以上」ででたらめなバイトの並びであればばなんでもよく、opensslコマンドからもその乱数ファイルを指定できます。

 秘密鍵の暗号強度や保存先のファイル名などを省略できるのはopensslの設定ファイル/usr/share/ssl/openssl.cnfにデフォルトの値や動作が記述してあるからです。例えばRSA鍵の長さを8192ビットにするには次の"rsa:"に続けてビット数で指定します*9。

openssl req -new -out <CSR保存先ファイル名> -newkey rsa:<RSA暗号鍵の長さ>

 既存の秘密鍵を利用する場合は次のようにして既存の秘密鍵を指定してCSRを作成します。同じ秘密鍵から証明書を再度発行してもらうのにCSRを再度作成するときにこのように実行するとよいでしょう。

openssl req -new -key <秘密鍵ファイル名> -out <CSR保存先ファイル名>

 次の実行例は、秘密鍵とCSRの作成を連続して行っているところです。パスフレーズは間違えて登録しないように同じパスフレーズが入力されるまで繰り替えし質問されます。途中でやめたいときはctrl+dを押してください。

[VFS-matthew@unidon ~]% openssl req -new -out server.csr
openssl req -new -out serve.csr
Generating a 1024 bit RSA private key
................++++++
.........++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:                            ←パスフレーズを入力
Verifying - Enter PEM pass phrase:                ←パスフレーズ確認
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP                     ←国名
State or Province Name (full name) [Some-State]:Hokkaido ←都道府県名
Locality Name (eg, city) []:Sapporo                      ←市区町村名
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Unidon-ya, Inc. ←組織名
Organizational Unit Name (eg, section) []:Information section ←部署名
Common Name (eg, YOUR name) []:www.unidon-ya.com              ←FQDN
Email Address []:webmaster@unidon-ya.com ←管理者のメールアドレス(入力しなくてもよい)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                                      ←Enter
An optional company name []:                                  ←Enter
[VFS-matthew@unidon ~]% 

 パスフレーズを設定した場合は復号して利用しない限りは、パスフレーズを入力しなければApacheが起動できなかったり、パスフレーズを平文でどこかのファイルに置いておく必要がでてきます。


↑

秘密鍵を暗号化しない場合 †

 起動時にパスフレーズを入力したくない場合、秘密鍵の管理が確りしているのであれば、秘密鍵を暗号化せずに作成し、CSRを作成しても良いでしょう*10。次のように先に秘密鍵を作成し、つぎに既存の秘密鍵からCSRを作成します。genrsaを指定した場合はRSAの鍵強度がデフォルトで512ビットなので1024ビットを指定しておいてください。

まず秘密鍵の作成:

openssl genrsa -out <秘密鍵保存先ファイル名> <RSA鍵の長さ>

続いてCSRの作成(CSRをserver.csrに出力):

openssl req -new -key <秘密鍵ファイル名> -out <CSR保存先ファイル名>

 既にパスフレーズを設定している秘密鍵をパスフレーズなしの秘密鍵にするには次のように実行します。実行するとパスフレーズを尋ねるのでパスフレーズを入力してください。

openssl rsa -in <パスフレーズ付き秘密鍵ファイル名> -out <パスフレーズなし秘密鍵保存先ファイル名>


↑

秘密鍵を暗号化するがトリプルDES以外で暗号化したい †

 デフォルトのトリプルDES以外で秘密鍵を暗号化してパスフレーズを設定したい場合は次のように暗号化アルゴリズムを指定します。

openssl genrsa -<暗号化アルゴリズム> -out <秘密鍵保存先ファイル名>

指定できる暗号化アルゴリズムは次のとおりです。

  • des:DES
  • des3:トリプルDES
  • aes128:128ビットAES
  • aes192:192ビットAES
  • aes256:256ビットAES


↑

サイト証明書の取得 †

 秘密鍵とCSR(証明書要求)を作成したらサイト証明書を取得します。証明書を置くサーバー自身が認証局となるいわゆる「オレオレ証明書」の発行をここでは考えません*11。厳格な審査に合格したルート証明書を持つ商用認証局やそれに準じる認証局から発行されたサイト証明書を利用することを想定します*12。

 商用認証局といえば、VeriSign、GeoTrust、Comodo、Cybertrustやそのグループ会社が提供している認証局があります。こうした認証局から証明書を得るには、CSRの他に実在を証明する書類の提出が必要です。一般法人であれば登記簿謄本や印鑑証明書などが必要になります。詳しくはそれぞれの認証局の申し込み方法を調べてください。ここでは申し込みをしてサイトの証明書を得てファイルとして持っていることを想定します。

 ところで、今回は例を示すためにGeoTrust Japanのテスト用サーバー証明書サービスを利用しました。また、テスト用の証明書でもクライアントでの挙動やログの違いを除けばテストをするには十分です。


↑

秘密鍵とサイト証明書の設置 †

 サイト証明書を何らかの形で取得できたら、ファイルとしてApacheウェブサーバーが読み出し可能なディレクトリに置きます。Nature's LinuxのApacheパッケージはインストールすると、秘密鍵やサイト証明書、CSR(証明書要求)を専門に置くためのディレクトリが用意されます。/opt/etc/apache13-modsslディレクトリのsslで始まるディレクトリがそれです。秘密鍵はssl.keyディレクトリへ、CSRはssl.csrディレクトリへ、サイト証明書はssl.crtディレクトリへ格納するとよいでしょう。既に各ディレクトリには参考としてファイルがいくつかありますが、全て削除してもかまいません。取得したファイルをおきましょう。

 運用方法によっては、任意のディレクトリに置きたい場合やrootユーザー以外の所有者にしたい場合もあるでしょう。そういう時でもセキュリティーを意識して次の点に注意して秘密鍵とサイト証明書を置きましょう。

  • ファイルを置くディレクトリは所有者とrootユーザー以外書き込み権限がない(パーミッション:755)
  • ファイルは所有者とrootユーザー以外は読むことができない(パーミッション:400または600)

パーミッションの設定を誤ったままにしておくと、例えば、秘密鍵が盗まれるなどして成りすましなどの悪用が可能となってしまいます。厳重に扱いましょう。


↑

証明書の内容を確認 †

 取得した証明書の内容をopensslコマンドを使って確認しましょう。最初にどんなCSR(証明書要求)を出したのかを確認してから実際に受け取ったサイト証明書の内容と照らし合わせてみましょう。

CSR(証明書要求)を確認する場合のopensslの実行(証明書要求ファイル名はserver.csrとした場合)

openssl req -text -noout -in server.csr

実行例:

fileex_openssl_req_text_noout_csr.html



サイト証明書の確認(サイト証明書のファイル名をserver.crtとした場合)

openssl x509 -text -noout -in server.crt

実行例:

fileex_openssl_x509_text_noout_crt.html


↑

Apacheの設定と起動 †


↑

httpd.confの編集 †

 2006年5月23日時点ではNature's Linux用に用意されているApacheウェブサーバーパッケージはバージョン1.3系だけですので、SSLに関する設定は、最新の2.X系のように別ファイルに書くのではなく、httpd.conf内に記述します。

 必ず指定しなければならないのが証明書と秘密鍵の格納先で、次のディレクティブで指定します。

  • SSLCertificateFile :証明書の格納先を指定
  • SSLCertificateKeyFile : 秘密鍵の格納先を指定

 上記のSSLCertificateKeyFileで指定した秘密鍵にパスフレーズを設定していた場合は、起動時にパスフレーズを入力しなければなりませんが、SSLPassPhraseDialogディレクティブでパスフレーズを標準出力に出力できるプログラムを指定しておくとそのプログラムを実行してパスフレーズを自動的に入力してくれます。たとえば次のようなシェルスクリプトで十分です。実行権限をつけるのを忘れないことと、パーミッションや所有者などの管理は厳重にしましょう。"unidon"以降がパスフレーズです。SSLPassPhraseDialogディレクティブはapache13-modsslパッケージがインストールされた直後ではbuiltinが指定されています。

シェルスクリプト(ファイル名:abura-kadabura):

#!/bin/bash
echo -n unidon ni ha wasabi to shouyu

SSLPassPhraseDialog指定例:

SSLPassPhraseDialog exec:/opt/etc/apache13-modssl/abura-kadabura

 上記以外にも沢山のSSLに関するディレクティブがありそれらを適切に指定すればよいのですが、運用方針や扱うサイトによって様々なので、インストール直後のhttpd.confをうまく利用しながら一つのFQDNに対してSSL有りでも無しでも同じコンテンツを提供する設定を参考例として挙げておきます。因みに後述する/etc/sysconfig/apacheの一行を変更するだけで、インストール直後のhttpd.confでもDocumentRootディレクティブで指定されているファイル/var/data/apache13-modssl/index.htmlに対してHTTPでもHTTPSでもアクセスできる設定になっています。是非参考にしてください。また各ディレクティブを調べるにはmod_ssl.orgのReferenceかmod_ssl.jpのReferenceを参照すると良いでしょう。

#既に証明書と証明書執行リストのMIME-types
<IfDefine SSL>
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl
</IfDefine>
#起動時にパスフレーズを入力
SSLPassPhraseDialog builtin
#各サーバープロセスで利用するOpenSSLメモリキャッシュを同期して速度向上
SSLSessionCache dbm:/var/run/ssl_scache
#上記のキャッシュの有効時間
SSLSessionCacheTimeout 300
#SSL利用時のセッションキャッシュにおける排他制御用のファイルを指定
SSLMutex file:/var/run/ssl_mutex
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
#SSLの処理全体のログ
SSLLog /var/log/apache13-modssl/ssl_engine_log
#SSLの処理全体のログレベル
SSLLogLevel debug

<IfDefine SSL>
    #IPアドレスは架空のwww.xxx.yyy.zzz
    <VirtualHost www.xxx.yyy.zzz:80>
        DocumentRoot /gfs/unidon-ya/html_document
        ServerName www.unidon-ya.com
	 # SSLを無効にする
        SSLEngine off
    </VirtualHost>
    <VirtualHost www.xxx.yyy.zzz:443>
        DocumentRoot /gfs/unidon-ya/html_document
        # ServerNameはCSRのCommon Nameと同一にします
        ServerName www.unidon-ya.com
        ErrorLog /var/log/apache13-modssl/error_log
        TransferLog /var/log/apache13-modssl/access_log combined
        # SSLを有効にする
        SSLEngine on
        # EXPORT56はIE用に無効になっている
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        # サーバ証明書と秘密鍵のパス
        SSLCertificateFile /opt/etc/apache13-modssl/ssl.crt/server.crt
        SSLCertificateKeyFile /opt/etc/apache13-modss/ssl.key/server.key
        <Files ~ "\.(cgi|shtml|php)$">
            SSLOptions +StdEnvVars
        </Files>
        <Directory /Library/WebServer/CGI-Executables>
            SSLOptions +StdEnvVars
        </Directory>
        SetEnvIf User-Agent ".*MSIE.*" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
        # カスタムSSLログファイル
        # SSLのコンパクトなエラーでないログファイルなら
        CustomLog /var/log/apache13-modssl/ssl_request_log \
        "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    </VirtualHost>
</IfModule>


↑

httpd.confのチェック †

 設定ファイルの編集が終了したら、構文のチェックと仮想ホストの解釈を調べてみましょう。まず最初に構文のチェックを行いましょう。三つの実行方法がありますが、実行内容はどれも同じです。ここではhttpd -tを利用しています。"apachectl configtest"や"service apache configtest"も利用できます。実行して構文が正しいと"Syntax OK"と表示されます。

[VFS-root@unidon ~]# service apache configtest
Syntax OK
[VFS-root@unidon ~]# 

 次に仮想ホストの設定を確かめてみましょう、httpdコマンドで"-S"と"-DSSL"を指定すると、Apacheウェブサーバーが解釈する予定の仮想ホストの設定を表示してくれます。リストには順に、IPアドレス、ポート番号、FQDN、設定ファイル、設定行が示されています。

[VFS-root@unidon ~]# httpd -S -DSSL
20w.17x.y41.2z3:80     www.unidon-ya.com (/opt/etc/apache13-modssl/httpd.conf:1049)
20w.17x.y41.2z3:443    www.unidon-ya.com (/opt/etc/apache13-modssl/httpd.conf:1131)
[VFS-root@unidon ~]# 


↑

/etc/sysconfig/apacheの編集 †

 apache13-modsslパッケージの初期インストール状態ではSSLを有効にして起動するようにはなっていません。SSLを利用する場合にはデーモンプログラムに専用の引数(-DSSL)を与える必要があります。デーモンプログラムに渡す引数は/etc/sysconfig/apacheに定義することで起動スクリプト(/etc/rc.d/init.d/apache)が起動時に読み込んで実行するようになっています。

 インストール直後の/etc/sysconfig/apacheは次のようになっています。

OPTIONS=
# https support option
#OPTIONS=-DSSL
NICELEVEL=
SIGNAL=

これの上から三行目のコメントをviエディタ等を使って外して次のようにして保存してください。

OPTIONS=
# https support option
OPTIONS=-DSSL
NICELEVEL=
SIGNAL=


↑

起動 †

 Apacheウェブサーバーの設定ファイルを編集し終えたら、あとは起動するだけです。起動・停止などの方法はSSLを利用しないときと変わりありませんが、秘密鍵にパスフレーズを設定しSSLPassPhraseDialogでパスフレーズを出力するプログラムを指定しなかった場合は次の実行例のように起動直後に秘密鍵のパスフレーズが要求されます。

[VFS-root@unidon ~]# service apache start
Starting apache: Apache/1.3.36 mod_ssl/2.8.27 (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 www.n-linux.org:443 (RSA)
Enter pass phrase:                                 ←ここでパスフレーズを入力

Ok: Pass Phrase Dialog successful.

Ok: Pass Phrase Dialog successful.
                                                           [  OK  ]
[VFS-root@unidon ~]# 

 秘密鍵のパスフレーズを設定しなかった場合、またはパスフレーズを出力するプログラムを指定しておいた場合にはSSLを利用しない場合と同じように起動できます。

[VFS-root@unidon ~]# service apache start
Starting apache:                                           [  OK  ]
[VFS-root@unidon ~]# 


↑

動作確認 †

 無事起動できればまずは一安心なのですが、サービスを確実に提供するためには動作の確認や各種のテストが必要でしょう。


↑

localhost上で動作確認 †

 Apacheサーバーを起動してウェブサービスが開始できたら、Apacheサーバーが起動しているローカルホストからSSLが利用できるかをopensslコマンドをつかって確認してみます。opensslコマンドが利用できる一般ユーザーでも確認が可能です。次の構文で任意のFQDNを指定してopensslコマンドを実行した後に、HTTPと同じようにGETまたはPOSTを使ってファイルの取得をこころみてみましょう。サイトからデータを予想通りに取得できたらローカルホスト内にはおそらく問題がないでしょう。

openssl s_client -connect [接続するサイトのFQDNまたはIPアドレス]:443

実行例(長いので別ページで表示してください):

fileex_openssl_s_client.html

 最初から三分の二まではサイト証明書に関する情報が出力されています。サイト証明書(BEGIN CERTIFICATとEND CERTIFICATEで囲まれた文字列)がCA(認証機関)から取得したサイト証明書と同じであるか、エラーは無いかなど確認しましょう。因みに上記の出力結果は商用認証機関で発行しているテスト用証明書を利用したものです(httpd.confやサイト証明書の内容とは違っています)。よく見てみるとサイトの認証ができていないことがわかります。ここでは各行の解説を割愛します。

 出力がとまったところで次のように手入力でGETメソッドを使ってファイルを転送させることを指定し、次の行で空行を入力してサーバーにリクエストを返すと、ヘッダー情報と共にファイルの内容(<html>から</html>まで)が転送されています。

実行例抜粋:

[VFS-matthew@unidon ~]$ openssl s_client -connect www.unidon-ya.com:443 
・・・
中略
・・・
    Key-Arg   : None
    Start Time: 1148289996
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
GET /unidon.html HTTP/1.0                                         ←ここで入力
                                                                  ←改行
HTTP/1.1 200 OK
Date: Mon, 22 May 2006 09:26:45 GMT
Server: Apache/1.3.36 (Unix) mod_ssl/2.8.27 OpenSSL/0.9.7i
Last-Modified: Mon, 22 May 2006 00:35:41 GMT
ETag: "15006c-14f-4471075d"
Accept-Ranges: bytes
Content-Length: 335
Connection: close
Content-Type: text/html

<html>
        <head>
                <title>北海道日本海ウニ丼の旅計画</title>
        </head>
        <body>
                北海道日本海側のウニの旬は5月中旬から始まるところがある。<br/>
                早いところでは4月から。<br/>
                5/28 積丹の中村屋でウニ丼<br/>
                6/11 増毛のまつくらでウニのフルコース<br/>
                7/02 稚内の樺太食堂で二段式ウニ丼(前日は枝幸けがに祭へ)<br/>
        </body>
</html>

closed
[VFS-matthew@unidon ~]$ 


↑

ログを確認 †

 これまでの設定に基づいて動作させた場合の各種ログを見てみます。

 SSLに関するログはhttpd.confでSSLLogディレクティブに指定したファイルに出力されます。出力されるログの情報量はSSLLogLevelディレクティブで指定できます。

 

 次はログの出力例です。ログは長くなりがちなため、先ほどopensslでアクセスしてみた時のログをとりあげました。ログレベルはdebugレベルで記録しています。

/var/log/apache13-modssl/ssl_engine_log (SSLLogLevel debug):

起動時のログ(長いので別ページで表示してください):

fileex_ssl_engine_log_boot.html

接続時のログ(長いので別ページで表示してください):

fileex_ssl_engine_log_access.html

 debugレベルが一番詳細に出力されますが、debugレベルのログを見るとサーバーとクライアントのIPアドレスまたはドメイン名、利用されたプロトコル、暗号の強度、暗号化されたデータ、などが記録されサイト内の遷移や送受信しているデータの内容は一切わからないことが理解できると思います。長いので別ファイルにしています。実はログ内容は上記のhttpd.confとサイト証明書の設定とは関係ありませんが、雰囲気だけ感じ取ってもらえればと思います。たった一行の文章を転送するのに沢山の暗号化データを送受信していることがわかるでしょう。

 因みにログレベルは詳細な順にdebug、info、notice、warn、error、crit、alert、emergがありその順に情報のレベルが簡素になります。通常はinfoまたはwarnでよいでしょう。運用に合わせて設定しましょう。

 同様に同じテキストファイルをアクセスしたときのアクセスログは次のようになるでしょう。長いので80桁で改行しています。設定例ではCustomlogディレクティブを利用してhttpでアクセスしたときのログと同じアクセスログファイルに記録し、そのフォーマットもデフォルトで用意されているcombinedを指定しています。このように指定すればhttpからでもhttpsからでも同時に同じファイルに同じフォーマットで集計できることが理解できるでしょう。ログの一行は長いのでこの記事では80文字後で改行しています。

access_log (combinedフォーマット):

22w.x57.y08.z75 - - [22/May/2006:01:20:41 +0900] "GET /unidon.html HTTP/1.1" 20
0 9 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

 上記のhttpd.confではSSL通信だけの特殊なログを取得するように設定しています。ssl_request_logというファイルに記録されるように設定していました。SSLLogで指定したログファイルにはサーバー全体の処理が記録されますが、上記のhttpd.confのように指定のドメインに関するログだけをまとめたい場合にはこのような形式を利用するとよいでしょう。ログの一行は長いのでこの記事では80文字後で改行しています。

/home/virtual/host/www.n-linux.org/log/ssl_request_log:

[22/May/2006:00:46:23 +0900] 21w.xx7.yyy.zz5 TLSv1 RC4-MD5 "GET /karahuto_shoku
dou_unidon.jpg HTTP/1.1" 22980

上記のログの例では、220.157.208.175からRootDocumentディレクトリにあるkarahuto_shokudou_unidon.jpgというファイルを転送するのに、ネゴシエーション時にはTLS ver. 1が使われていて、データ転送の共通鍵にRC4-MD5(128bit)を利用していることがわかります。


↑

ウェブブラウザから確認 †

 サーバー上では確認できましたが、外部のクライアントからはどうでしょうか。最終的な試験として外部からウェブブラウザで確認してみましょう。確認するための詳細な手順はブラウザごとに異なりますが基本は同じです。ブラウザのオプションメニュー等から証明書に関するメニューを開き内容を確認します。このとき、その証明書を発行した認証局のルート証明書のフィンガープリントも確認すると完璧です。

 右の図はFirefoxで証明書を表示させた一例です。tech.n-linux.comというCommon Nameに対するサイト証明書で、発行元と証明書のフィンガープリントが表示されています。フィンガープリントは同一です。

   


↑

Tips and Knowledge †


↑

サイト証明書の更新 †

 サイト証明書には期限があります。期限前に新しいサイト証明書を取得しておき、円滑に更新したいものです。テスト用の証明書から本番用の証明書へ移行するときも同様です。ウェブサーバーの一時停止が出来るのであれば、停止している間にサイト証明書ファイルやそのファイルがあるディレクトリを変更すればよいので難しいことではありません。またApacheウェブサーバーは秘密鍵とサイト証明書を起動時に読み込むので、実行中にhttpd.confで読み込み先のフルパスを変更したり、読み込みファイルを変更しておき再起動(service apache restart)を行うことができます。

 取得したサイト証明書には有効期限があります。有効期限が切れるとサイトの信頼性が失われます。期限が切れる前に新しいサイト証明書を取得し再設置してください。既存証明書と同じ秘密鍵からCSRを生成しサイト証明書を更新した場合は、サイト証明書ファイルのみを入れ替えるだけでよいですが、秘密鍵も新たに作り直して更新した場合は秘密鍵ファイルも一緒に入れ替える必要があります。ファイルを入れ替えた後は、apacheを再起動(# service apache restart)することで新しい証明書が使用されます。


↑

アクセスできない場合 †

 ファイアウォールを設定している場合は稼動しているホスト或いは上流のルータ等でHTTPSに指定したポートが開いているか確認してください。接続はされるけれども期待した表示がされない場合は、ログファイルを確認し該当する設定を再度見直してください。


↑

フィンガープリントの形式が異なっているとき †

 ルート証明書の確認は認証局とウェブブラウザの間の問題としたほうがよいのですが、ブラウザの中には証明書の要約(メッセージダイジェスト)として利用されるフィンガープリントが一つのハッシュ関数でしか計算されていなかったり、利用している認証局のルート証明書のフィンガープリントが一つのハッシュ関数でしか計算されておらずブラウザのハッシュ関数とは異なる関数であったりすることがあります。例えば、あるブラウザが出力するフィンガープリントはハッシュ関数SHA1で要約されたものしかなく、認証局が公開しているルート証明書のフィンガープリントがハッシュ関数MD5で要約されたものしかない場合があるでしょう*13。

 ブラウザが表示するフィンガープリントを計算するのに使われたハッシュ関数と証明書を発行した認証局のルート証明書のフィンガープリントを計算するのに使われた関数が異なる場合は、ルート証明書をブラウザからPEMファイル形式(Base64形式)で保存して、opensslが利用できる環境にそのファイルを移しましょう。そして次のコマンドでフィンガープリントを計算させ、一致するかどうか確認しましょう*14。

MD5フィンガープリント出力例(cacert.pemがルート証明書ファイル):

[VFS-matthew@unidon ~]$ openssl x509 -fingerprint -md5 -noout -in cacert.pem
MD5 Fingerprint=8F:5D:77:06:27:C4:98:3C:5B:93:78:E7:D7:7D:9B:CC
[VFS-matthew@unidon ~]$ 

SHA1フィンガープリント出力例(cacert.pemがルート証明書ファイル):

[VFS-matthew@unidon ~]$ openssl x509 -fingerprint -md5 -noout -in cacert.pem
SHA1 Fingerprint=7E:78:4A:10:1C:82:65:CC:2D:E1:F1:6D:47:B4:40:CA:D9:0A:19:45
[VFS-matthew@unidon ~]$ 


↑

パッケージ更新時 †

 Nature's Linuxのパッケージ管理システムを使ってApacheウェブサーバーの起動中にパッケージの更新が可能ですが、停止と起動を行うので、秘密鍵のパスフレーズを設定していた場合には、パッケージ更新中のApacheウェブサーバーの起動時にパスフレーズの入力が催促されます。パスフレーズの入力はタイムアウトして他の処理に移行しないので、必ずパスフレーズを入力するようにしてパッケージの更新が終了するまで見届けましょう。


↑

まとめ †

 Nature's Linux上でApache、mod_ssl、そしてOpenSSLを使うことにより、ウェブサイトのアクセスに関して、SSL/TLS技術で通信経路上のデータ暗号化やサイトの存在証明が行えるサーバーの基本的な構築方法を解説しました。OpenSSLがインストール時から組み込まれ*15、またApacheとmod_sslを含んだapache13-modsslパッケージも簡単にインストール出来ることから、目的に合わせて設定ファイルを編集したりウェブコンテンツを配置したりすればよいだけだというのを理解できたのではないかと思います。

 今回説明したことをまとめてみました。それぞれ必要最低限ですが、どこから見始めたらよいのかが理解できたのではないかと思います。コマンドの実行方法をサーバー構築の流れに沿って抽出しておきました。

  • Nature's Linuxおよびmod_sslパッケージとOpenSSLパッケージについて
  • SSL通信に必要な秘密鍵、証明書要求、サイト証明書の作成や取得、配置や確認について
  • ApacheウェブサーバーでSSLに対応した設定ファイルhttpd.confの書き方
  • ApacheウェブサーバーをSSL対応で起動させる方法
  • Apacheウェブサーバーのログについて

 SSL/TLSは今日では安全性や安心を向上させ、脅威を低減させるサイトを構築するのに欠かせない必須な技術ですが、セキュアなサイト構築にはSSLだけでなく、他のソフトウェアやOSのセキュリティ、運用方針、毎日、毎アクセスの管理も重要です。特にOSの状態やアクセスを監視をすることも重要です*16。また、侵入や改竄といった攻撃から防御することも大切ですが、万が一そうなった場合の対処も考えておかなくてはなりません。Nature's Linuxはその特徴から、インストール直後から防御だけでなく万が一の対処に柔軟に対応できるような拡張性や機能を有しています(VFSバックアップ&リカバリ機能やJail機能など)。


↑

構築の流れ †

 VFSでのインストールを想定しています。

No.作業コマンド・ファイル
1Nature's Linuxのインストール
2パッケージデータベースの更新# apt-get update
3opensslを含めたパッケージ全体の更新# apt-get dist-upgrade
4Aapche1.3系ウェブサーバーのインストール# apt-get install apache13-modssl
5opensslのバージョン確認$ openssl version
6秘密鍵とCSR(証明書要求)の作成$ openssl req -new -out server.csr
7サイト証明書の取得
8秘密鍵とサイト証明書の設置パーミッション400または600を忘れずに
9証明書の内容を確認$ openssl x509 -text -noout -in server.csr
10httpd.confの編集
11httpd.confのチェック$ httpd -S -DSSL
12/etc/sysconfig/apacheOPTIONS=-DSSLを記述
13Apacheの起動# service apache start
14localhost上でopensslで動作確認$ openssl s_client -connect FQDN:443
15ログを確認SSL処理のログ、アクセスログ、エラーログなど
16ウェブブラウザから確認


↑

次回の企画 †

 Nature's LinuxとSSL/TLSの組み合わせで、セキュアなウェブサーバーだけでなく、メールサーバーやFTPサーバー、さらにはSSLリバースプロキシーやSSL-VPNなどが構築可能でしょう。またウェブサーバーだけ取り上げてみても今回割愛した情報が多く、その中でも仮想ホスト機能を使って複数IPと複数証明書の組み合わせを持つサーバーを構築したりなど、まだまだ取り上げることがあると思っています。そうした応用がNature's Linux上で比較的簡単にきることを解説する記事を企画中です。また、昨年ぐらいからいわゆるオレオレ証明書で象徴されるようなPKIに対する取り組み姿勢が問題にされセキュリティーに関する正確な知識を啓蒙するサイトやブログが数多くみられるようになりました。Nature's Linuxと提供されているパッケージで如何にセキュリティー問題に取り組むか取り組めるのかも企画したいと思います。

↑

参考サイト †

 この文書の情報だけでは複雑な要求に応じたサイト構築に対応できないことが多いでしょう。この文書の執筆のみならず、普段よく利用しているサイトのリンクを掲載しておきます。

  • The Apache Software Foundation
  • JAPAN APACHE USERS GROUP
  • OpenSSL
  • mod_ssl
  • IPA セキュリティーセンター 情報セキュリティ技術ラボラトリーの『PKI 関連技術解説』


↑

テクニカルライター紹介 †

robo1-3-10.gif



テクニカルライター Matthew/秋元 憲一
matthew.szulik(at)gmail.com



 OSS関連なお仕事のお手伝いをさせていただいております。 元々は制御理論関係でMATLABやMapleでグレブナ基底やなどを基本に、 例えば多項式を要素に持つ伝達関数行列などの既約判定などを計算する制御系CAD開発などを行っておりました。今はその頃の記憶もすっかり消えて、OSSという大海を浮き輪をつけながら泳いでおります。

 元々ロボットに興味がありましたので、関連のOSSに参加したいと思っております。 また、オートノミックなサーバや、仮想化技術に興味がありますので、 機会があればそういったものに参加したいと思っております。最近は TOMOYO Linux など、セキュリティ関連の OSS に大変興味があり微力ながら活動をしております。

 実家で小さな釣り船を所持しております。カレイや秋鮭が釣れますので、北海道で釣りがしたい方は連絡ください。また、この季節はエゾバフンウニが美味しいので、大好きな方に有料でお分けしております。よろしくお願いします。


↑

この文章について †

本文書に関する著作権の保有について

Nature's Linux関連の記事は、著作権者であるジグソー株式会社がすべての権利を保有しています。

Copyright (C) 2003-2009 JIG-SAW, Inc. All rights reserved.

本書に記載されている会社名、製品名は、各社の登録商標または商標です。

記載の内容は予告無く変更される可能性があります。

また、この文書は、 クリエイティブ・コモンズ・ライセンス の下でライセンスされています。



*1 本来はTLSだが一般的にはSSLと呼ばれる
*2 注意:仮想ファイルシステムのことではなくNature's Linux独自のjail機能によるファイルシステムのこと。
*3 開発版だけ。
*4 Internet Explorer Ver.6で利用されていますね。
*5 Firefoxでは256ビットで利用できますね。
*6 次の企画でもう少し詳しくお伝えしたいと思います
*7 パッケージのバージョン更新を止める設定をしていた場合はこの限りではありません。
*8 商用版ではapt-get update; apt-get install opensslを実行してください。
*9 デフォルトの1024bitで十分です。1bit増えると鍵の強度が2倍になりますが対応している一般的に利用されているクライアントは殆どが1024bitまでのの対応のようです。
*10 お奨めしませんが
*11 またの機会に考察してみたいと思っています。
*12 無料認証機関についてもまたの機会に考察してみたいと思います。
*13 Internet ExplorerのあるバージョンはSHA1しか出力しませんね。
*14 ウェブブラウザを操るだけの環境の場合はどうしたらよいのでしょうね?
*15 前のバージョンでもapt-get installすれば簡単にインストールできます。
*16 Nature's Linux Management Service Kitを購入すれば監視してくれますね。
 
 
 
 
 |  会社概要  |  企業ポリシー  |  お問い合わせ  |
Copyright (C) 2003-2009 JIG-SAW, Inc. All rights reserved.