ゼロから始めるインターネットセキュリティ講座


3時間目● Apache-SSL&OpenLDAPインストール実習         講師:宮川祥子


「株式会社アスキーのご厚意により、掲載しております」

3時間目は、ApacheをSSL対応にするためのパッケージであるApa che-SSLのインストールと、証明書リポジトリの構築を行ないます。ここまで来ればPKI環境構築はもうすぐですのでがんばりましょう。

はじめに

 連載の第1回目ではPKIの現状について簡単に説明しましたが、ここ数カ月の間に(特に日本国内で)PKI関連の大きな動きがいくつかありました。まず第1は、4月14日に電子署名・認証法案が国会に提出されたことです。電子署名・認証法案とは、国が認めた認証機関から証明書が発行されている鍵ペアによる電子署名に対して、これまで一般に使われてきた押印や署名と同じ効力を推定することを規定した法案で、通産/郵政/法務省によって提案されました。この法案がとおれば、電子的に証明された電子文書が法的に正しいことが保証されることになります。法案では、国の認可を受けた認証機関に対して虚偽の申請をして不正な証明書の発行を受けた場合には、3年以下の懲役刑または200万円以下の罰則を設けています。

また同じ日に、サイバートラストや日本ベリサインなど、全15社により電子証明書の仕様を統一についてのガイドラインが発表されました。第1回でもお話したとおり電子証明書はX.509と呼ばれる規格に基づいていますが、文字コードの扱いや証明書の利用ポリシーなどについては標準化が行なわれていません。今回の合意では、これらの点について各社が証明書の相互流通もにらんだ共通化を行なうための第一歩ということのようです。一方政府では、ミレニアムプロジェクトのかなめとして電子政府の実現に向けて政府認証機関(GPKI)の構築を進めています。PKIが日常生活であたりまえのように使われる日は意外と近いのかもしれません。

さて今回は、Apache-SSLとOpenLDAPのインストールについて解説します。動作環境は、前回と同じくSolaris 2.5.1を利用しています。

Apache-SSL

パッケージの入手

 Apache-SSLは、WWWサーバであるApa cheをSSL対応にするためのパッケージです。このパッケージには、ApacheからOpen SSLのライブラリを呼び出すためのモジュール群が含まれています。Apache-SSLのインストールには、以下の3つのパッケージが必要ですが、このうちOpenSSLは先月インストールしたものを用います。

これらのパッケージは、すべて“http://www.apache-ssl.org/”からダウンロードできます。日本では“http://www.infoscience.co.jp/” がミラーサイトとなっています。まずは apache_1.3.12.tar.gzとapache_1.3.12+ssl_ 1.39.tar.gzを展開します。apache_1.3.12+ ssl_1.39.tar.gzは、apache_1.3.12のソースツリーのトップで展開しなくてはいけないので注意が必要です。

% tar -zxvf apache_1.3.12.tar.gz
% cd apache_1.3.12
% tar -zxvf ../apache_1.3.12+ssl_1.39.tar.gz

FixPatchの実行

 次に、apache_1.3.12のソースツリーのトップにあるFixPatchを実行します。FixPatchを実行すると、ApacheのソースにSSLパッチを当てるか聞いてくるので“y”と入力するとパッチが当てられ(デフォルトはn)、openSSLのソースディレクトリが探索されます。もしFixPatchがopenSSLを見つけることができない場合には、

% FixPatch /usr/local/src/openssl-0.9.4
のように、前回インストールしたopenSSLのソースディレクトリを指定して実行します。

makeとインストール

 インストール前にconfigureとmakeを実行したあと、インストールを行ないます*1。

% ./configure
% make |& tee make.log
% su
# make install |& tee install.log
各種ファイルはデフォルトで/usr/local/apache以下にインストールされます。インストールするディレクトリを変えたい場合には、con figureを行なう際にprefixで指定することができます。

サーバ証明書の作成

 次にこのWWWサーバで使うサーバ証明書を作成します。サーバ証明書はApache-SSLのソースツリーのsrcディレクトリで

% make certificate
を実行することで作成できます。ここで作成する証明書は今回はあくまでもサーバのテスト用として使います。サーバが正しく動作することを確認したら、次回は前回作成したサーバ/クライアント証明書を使って認証を行なうサーバを構築します。

 できあがった証明書は、httpsd.pemという名前でSSLconf/confに作成されます。このhttpsd.pemとそのハッシュのシンボリックリンクは、次の項で説明するSSL CertificateFileで設定する場所にコピーしておきます。

httpsd.confの設定

 次に/usr/local/apache/conf/httpsd.confの設定を行ないます。httpsd.confはapacheのデフォルト設定がコピーされているだけなので、SSLに関する設定を追加します。SSLの設定サンプルは、apacheのソースツリーのSSLconf/conf/httpd.confにあるので、それをhttpsd.confにマージして必要な部分を変更すればOKです(リスト1)。各項目の説明に関しては、apache-SSLの日本語によるサイト(http://japache.infoscience.co.jp/ Apache-SSL/)やUNIX MAGAZINE1月号(アスキー)のUNIX Communication Notesが参考になりますが、ここでは設定の中で環境に応じて変更する必要のあるものについてのみ説明します。

リスト1●httpsd.confの設定例(SSLに関する部分のみ)

LogLevel debug
SSLNoCAList
ServerType standalone
DocumentRoot /usr/local/apacheSSL/htdocs


SSLRequireSSL


TransferLog logs/transfer_log

SSLEnable
SSLCacheServerPath bin/gcache
SSLCacheServerPort logs/gcache_port
SSLCacheServerRunDir /tmp
SSLSessionCacheTimeout 15
SSLCACertificatePath /usr/local/apacheSSL/conf
SSLCertificateFile /usr/local/apacheSSL/conf/httpsd.pem
#SSLCertificateKeyFile /some/place/with/your.key
SSLVerifyClient 3
SSLVerifyDepth 10
#SSLFakeBasicAuth
SSLBanCipher NULL-MD5:NULL-SHA
CustomLog       logs/ssl_log "%t %{version}c %{cipher}c %{clientcert}c"
SSLCACertificatePath
 クライアント認証をする際に、受け入れるクライアント証明書を発行する認証局の証明書を格納するディレクトリ。この項目の代わりにSSLCACertificateFileで証明書ファイルを指定することで、特定の認証局によって発行されたクライアント証明書のみを受け入れることも可能です。
SSLCertificateFile
 このサーバの証明書のファイル名。
SSLCertificateKeyFile
 このサーバの秘密鍵のファイル。SSL CertificateFileで示したファイルに秘密鍵が含まれている場合には、この指定は必要ありません。make certificateコマンドで証明書を作成した場合には、秘密鍵は証明書に含まれています。
SSLVerifyClient
 クライアントに対してどのような認証を要求するかを設定します。この項目は0〜3の数字となり、それぞれ以下のような認証を意味します。 0:認証を必要としません。
1:クライアントは、証明書を提示して認証を受けることができます。ただし、この場合の証明書は、サーバに信頼されているCA(SSLCACertificatePathに証明書が格納されているCA)でなければなりません。
2:クライアントは、サーバに信頼されているCAによる証明書を提出しなければなりません。
3:クライアントは証明書を提示して認証を受けることができます。この場合の証明書は、サーバに信頼されているCAでなくても問題ありません。
SLFakeBasicAuth
 通常のパスワード認証のかわりに、証明書のクライアント識別子(DN:Distinguished Name)を用いた認証をないます。クライアント証明書によるアクセスコントロールを行なう場合にこれを指定します。

httpsdの起動

 設定が終わったらhttpsdを起動します。

# /usr/local/apache/bin/httpsdctl start
サーバを再起動/停止させるときはstartのかわりにrestart/stopと入力します。Net scapeやIEなどSSLに対応しているブラウザを用いて起動したサーバにアクセスすると(http://ではなくhttps://であることに注意)ダイアログボックスが表示されて証明書の組み込みが終わります。最後にapacheのテスト用ページが表示されたら成功です。

OpenLDAP

 ここでは、LDAPと呼ばれるディレクトリサーバを使って、第1回で説明した証明書リポジトリを構築します(図1)。ディレクトリサーバとは、さまざまな情報をUNIXやWindowsのファイルシステムと同じ、ディレクトリと呼ばれる階層型の構造で管理するシステムのことです。ディレクトリサーバは、証明書を管理するのにたいへん向いています。たとえば、ある認証局の証明書をディレクトリサーバに登録し、その認証局から発行した証明書を認証局のエントリの下に登録すれば、直観的に分かりやすい形で証明書が整理できます。また、社内でPKIを構築する際には、部や課といった階層組織をそのままディレクトリの形で表現することができます。


図1 証明書リポジトリ

 今回は、OpenLDAPと呼ばれるオープンソースのディレクトリサーバを使って証明書リポジトリを構築します。OpenLDAPも、ほかのオープンソースソフトウェアと同様、速いテンポでバージョンアップが進んでいます。今回は、執筆時の最新版である1.2. 10を使いました。

パッケージの入手とインストール

 OpenLDAPは“http://www.openldap.org/”から入手できます。まずは、入手したパッケージを適当なディレクトリに展開しmakeします*2。

% tar -zxfv openldap-1.2.10.tgz
% cd openldap-1.2.10
% ./configure
% make depend
% make |& tee make.log
 makeに成功したら、うまくいっているかどうかテストします。テストはtestsディレクトリでmakeを実行することで行ないますが、どこかで失敗する場合はdoc/install/ hintsに各プラットフォームごとの注意事項が記載されているので、それらを参考にします。
% cd tests
% make |& tee make.log
全テストがうまくいったら、ソースツリーのトップに戻ってインストールします。
% cd ..
% su
# make install |& tee install.log

slapdの起動

 インストールが終了したら、LDAPのサーバプログラムであるslapdを起動します。まず/usr/local/etc/openldap/slapd.confの設定を行ないます(リスト2)。suffixには証明書リポジトリの頂点(ルート)となるべきエントリを記述します。今回の例では、商店街の証明書リポジトリを想定しているので、suffixを

o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=JP
とします。“c”は国名、“st”は県(州)名、“l”は地域名を示します。stやlは何でも構いませんが、管理の都合上CAやクライアントの証明書と同じものにしておきましょう。  次のrootdnは、証明書リポジトリ管理者のdnです。この“dn”は、エントリの登録や削除の際に必要なもので、必ずしもこのdnに該当するエントリがディレクトリに登録されている必要はありません。ここでは、
cn=admin, o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=JP
としています。

 rootpwは、rootdnと同じくエントリの変更の際に聞かれるパスワードです。また、directoryは登録されたエントリなどの情報が保存されるディレクトリを指し、デフォルトは/usr/tmpです。今回は/usr/local/ldapとしています。  slapd.confの設定が終わったら、slapdを起動します。slapdは、/usr/local/libexecにインストールされています。

# /usr/local/libexec/slapd -f /usr/local/etc/openldap/slapd.conf
でslapdが起動します。マシンの起動時に、自動的にslapdが起動するようrcファイルなどを適切に編集するとよいでしょう。
リスト2●slapd.confの設定例

include         /usr/local/etc/openldap/slapd.at.conf
include         /usr/local/etc/openldap/slapd.oc.conf
schemacheck     off

pidfile         /usr/local/var/slapd.pid
argsfile        /usr/local/var/slapd.args

#######################################################################
# ldbm database definitions
#######################################################################

database        ldbm
suffix          "o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=jp"
rootdn          "cn=admin, o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=jp"
rootpw          sEcrET
directory       /usr/local/ldap

証明書エントリの作成

 次に、ディレクトリに登録する証明書 エントリを作成します。証明書エントリはLDIF(Ldap Data Interexchange Format)と呼ばれる形式で作成します。LDIFで書かれたエントリの例をリスト3に示します。1つのファイルには空行をセパレータとして複数のエントリを記述することができます。各エントリの間に空行がなかったり、複数行の空行が入っていると、うまく登録できないので注意が必要です。

リスト3●LDIFファイルの例

dn: o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=JP
cn: NSC CA
o: nikoniko shopping center
l: fujisawa
st: kanagawa
mail: ca@nsc.org
objectclass: organizatin
userCertificate;binary:: MIIDyjCCAzOgAwIBAgIBADANBgkqhkiG9w0B
(にこにこ商店街のCA証明書:以下省略)

dn: cn=hanamaru-bento, o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=JP
cn: hanamaru-bento
o: nikoniko shopping center
l: fujisawa
st: kanagawa
mail: hanamaru@nsc.org
objectclass: organization
userCertificate;binary:: MIIEBjCCA2+gAwIBAgIBAzANBgkqhkiG9w0B
(はなまる弁当のサーバ証明書:以下省略)
 先ほどのslapd.confで、rootdnを“o=niko niko shopping center, l=fujisawa, st=kana gawa, c=JP”としたので、このエントリからLDIFファイルを作成します。これ以下のエントリ(cn=hanamaru-bento, o=nikoniko shopping center, c=JPなど)は、rootdnにあたるエントリを先に登録しないと登録できないので注意します。

 LDIFの各エントリは、

から構成されます。DNはルートからエントリまでのディレクトリのパスで表現されます。オブジェクトクラスにはperson/organi zation/certificationAuthorityなどがあり、オブジェクトクラスによって必須となる属性が異なります。今回は、商店街認証局の証明書を登録するので、CertificationAuthoriyを利用します。LDIFファイルの詳細を知りたい人は“http://mozinfo.netscape.co.jp/ visit/slapd/ag/viframe.html”のLDAP Data Interchange Format(LDAPデータ交換形式)を参照してください。

 リスト3では2つのエントリを作成しています。1つ目はルートエントリである“o= nikoniko shopping center, l=fujisawa, st= kanagawa, c=JP”で、2つ目は商店街の「はなまる弁当」のエントリです。このエントリには、前回作成したはなまる弁当の公開鍵証明書が“userCertificate;binary”という属性名で登録されています。LDIFファイルの作成ができたら、ldapaddコマンドでエントリを登録します。

% ldapadd -D "cn=admin, o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=JP" -W < entry.ldif
“-D”にはslapd.confで指定したrootdnを指定します。“-W”を指定するとパスワードを聞いてくるので、slapd.confで指定したパスワードを入力します。最後にエントリが正しく登録できたかを確認するために検索を行ないます。
% ldapsearch -L -b "o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=JP" "(objectclass=*)"
 ここでの“-L”は、検索結果をLDIFフォーマットで表示するオプションで、“-b”は検索のルートとなるDNを指定します。検索は、このDN以下のエントリに対して行なわれます。次の“(objectclass=*)”は検索フィルタであり、ここではすべてのオブジェクトクラスのエントリを表示させています。この“属性=値”を適切に変更することにより、より高度な検索を行なうことができます。エントリを削除する際には、
% ldapdelete -D "cn=admin, o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=JP" -W "cn=hanamaru-bento, o=nikoniko shopping center, l=fujisawa, st=kanagawa, c=JP"
で、先ほど登録したはなまる弁当のエントリが削除できます。

 次回は、今回インストールしたソフトウェアと、前回作成したサーバ/クライアント証明書を使って、いよいよ実際にPKIを用いたお弁当屋さんの注文サーバの構築と運用を行ないます。

<<用語解説>>

make |& tee make.log
 UNIX系OSにはリダイレクト(>)やパイプ(|)を組み合わせて、複数のコマンドを同時に利用することができる。通常の利用法であれば、結果が標準出力に出力されるものをリダイレクトしてファイルに出力するなどといった使い方をする。しかし、UNIXにはもう1つ「標準エラー出力」と呼ばれるものがある。これは通常のリダイレクトではファイルに保存することができない。これをファイルなどにリダイレクトするのに必要なのが“&”(アンパサンド)である。今回の例では“make >& make.log”でmake.logにログを記録することは可能だ。ただその場合、標準出力への出力は行なわれない。標準出力に出力させ、かつファイルへもログを記録したい場合があるだろう。その際のコマンドが“tee”である。teeは標準出力を複数出力するためのコマンドで、これをパイプと、先程の&を組み合わせて利用することにより、標準出力へ出力されるのと同時に、teeによりもう1つ出力されたログがmake.logに格納されることになる。
make depend
 dependを追加することにより、makeの対象となるファイルの依存関係をチェックする。ソースファイルがある別のファイルをincludeしている場合に、includeされているファイルが存在しているか、正しいファイルかどうかを調べる。
この記事は、Ascii Network Pro 2000年7月号に掲載された記事を、株式会社アスキーのご好意によって掲載許可をいただいたものに、若干の加筆訂正を行ったものです。この場を借りて、株式会社アスキーに御礼申し上げます。