モジュールでOpenIDを簡単に実現!

2008年8月29日(金)
Shin.鶴長

シングルサインオンとOpenID

 オンラインバンキング、ネットオークション、ブログなど、現在では多くのサービスがWebアプリケーションで提供されています。個人を認証するには、各Webサイトで発行された、ユーザーIDとパスワードを使用するのが一般的です。当然、使用するWebサイトが異なれば、ユーザーIDとパスワードも異なり、管理が煩雑になります。またそれぞれのWebサイトにアクセスする度に、毎回ユーザー認証を行う必要があるなど、操作に不便と不満を感じる人は少なくありません。

 それを受け、認証システムを一元化するなど、以前から認証手続きを簡素化するための試みは行われており、その成果はSSO(Single Sign-On:シングルサインオン)などの技術に還元されています。

 SSOを利用すればユーザー認証を一度行うだけだけで、許可されているすべてのサービスを利用できるようになります。現在SSOを実現する規格やサービスは、ベンダー依存のものからオープンなものまで、さまざまなものが有償または無償で提供されています。Webシステムとの相性がよく、オープンな標準規格で、日本国内においても普及の兆しを見せているものに「OpenID」があります。

 OpenIDはユーザーの識別にURLを使った認証システムです。ドメインや事業主体が異なるWebサイトにおいてもシングルサインオンを可能にします。「○○サイトでOpenIDに対応」などの見出しを、技術系Webサイトのトピックに見かることも、ここ数ヶ月で多くなっています。国内に限っても、OpenID URLの発行を実施しているWebサイトをいくつか見つけることができます。OpenID URLの発行を実施している主なWebサイトは以下の通りです。

・Yahoo! Japan(http://openid.yahoo.co.jp/
・OpenID.ne.jp(http://www.openid.ne.jp/
・はてなでOpenID(http://www.hatena.ne.jp/info/openid
・livedoor Auth(http://auth.livedoor.com/openid/
・mixi OpenID(http://mixi.jp/openid.pl

OpenID URLの登録と利用

 ここで実際にOpenID URLを取得し、OpenID対応サービスサイトにログインしてみましょう。今回はOpenID URLの払い出しに「OpenID.ne.jp(http://www.openid.ne.jp/)」を利用します。

 Webサイト中央の「OpenID アカウント作成」をクリックし、登録画面に移動します。ユーザーID、パスワード、Security Codeを入力し、約款の内容を確認し、同意できる場合はチェックボックスにチェックし「会員登録完了」をクリックします。

 登録が完了すると、OpenIDにログインした状態でOpenIDのトップページが表示されます。登録したOpenID URLは、ヘッダー部分に表示されています。このOpenID URLで、さまざまなサービスサイトへのシングルサインオンが可能になります。

 次にサービスサイトにログインします。ここでは@niftyの「アバウトミー(https://aboutme.jp/account/login)」へのログインを試します。ログイン画面右中央の「OpenIDでログイン」に、先ほどOpenID.ne.jpで払い出されたOpenID URLを入力し、ログインをクリックします。

 すると突如OpenID.ne.jpの確認画面が表示され、アバウトミーの認証要求に応えるかどうかの確認が行われます(OpenID.ne.jpへのログインが完了していない場合には、確認の前にログイン画面が表示されます)。認証要求に応じることで、アバウトミーへのログインに成功し、会員サービスを受けることができるようになります。

 次はこのような認証を実現するOpenIDの仕組みを解説しましょう。

OpenIDの仕組み

 ユーザー識別にURLを使用するなど、ユーザーIDとパスワードを使った方式との違いに違和感を覚える方も少なくないでしょう。ApacheにOpenIDを実装する前に、簡単にOpenIDの仕組みを解説します。

 OpenIDで使用する主なシステムと手続きは図2の通りです。認証サーバー(IdP:Identity Provider)とサービスを提供するサーバー(Consumer)、さらにサービスを受けるユーザーの三者間で、次のように認証情報が交換されます。

 (1)ユーザーは、事前に認証サーバーでユーザー登録を行い、認証で使用するOpenID URLを受けとります。

 (2)サービスを提供するサーバー(以降、サービスサーバー)にアクセスする際、認証画面で(1)で払い出されたOpenID URLを入力します。

 (3)サービスサーバーは、入力されたOpenID URLから認証サーバーを特定し、認証を依頼します。

 (4)認証を依頼された認証サーバーは、ユーザーに対し、ユーザーIDとパスワードによる認証を行います。また「○○サービスサーバーから認証要求が行われている」ことを通知し、対応を確認します。

 (5)認証サーバーは認証結果を、サービスサーバーに返信します。

 (6)認証にパスした場合、サービスサーバーはユーザーにサービスを提供します。

 通常のWeb認証と比べた場合、サービスサーバーにログインするかわりに、認証サーバーにログインしているだけのようにも見えますが、サービスサーバーにアクセスする前に、認証サーバーにログインし、ログイン状態を継続しておけば、シングルサインオンでユーザーIDやパスワードを入力する必要が無くなります。

 また認証サーバーにはユーザー自身が信頼するサーバーを指定することができます。さらにサービスサーバーには、認証サーバーで使用しているユーザーIDとパスワードを知られることはありません。メールアドレスやユーザーのフルネームなどのプロファイルを、認証サーバーとサービスサーバーで交換することもできますが、その際はOpenID Simple Registration Extensionプロトコルを使用します。

 以上のようにOpenIDでは、ユーザー認証は認証サーバーが行い、サービスへのアクセス承認はサービスサーバーが行います。

ApacheでOpenID認証を可能にする「mod_auth_openid」

 WebコンテンツでOpenIDによる認証を可能にする方法の1つに、フレームワークやアプリケーションを使った方法があります。例えばPHPではZend FrameworkやCakePHPといったフレームワークでOpenID認証を利用することができます。Java、Perl、Rubyといった開発言語でも、それぞれに用意されたフレームワークやライブラリで、OpenIDを実装することができます。これらのOpenIDのためのライブラリは、OpenIDコミュニティの運営するWiki(http://wiki.openid.net/Libraries)にまとめられています。

 既にサービスサーバーがPHPやJavaなどを使ったWebアプリケーションでサービスを提供しているなら、こうしたOpenIDのライブラリをインストールして、WebサイトをOpenID対応することができます。しかし一切Webアプリケーションを使用していないサーバーで、わざわざOpenIDのためだけにWebアプリケーションを作成するのは、大変非効率的です。

 そうしたケースでは、Apacheモジュール「mod_auth_openid」を利用します。Basic認証を導入するような手軽さでOpenIDを導入することができます。

 mod_auth_openidはApacheに対し、以下の機能や特徴を追加します。

・OpenIDに対応したサービスサーバー(Consumer)を構築できる
・OpenID Authentication 2.0に準拠している
・既定のOpenID認証画面が用意されている、また独自にOpenID認証画面を作成し利用することもできる
・信頼するOpenID URL、信頼しないOpenID URLを設定できる
・信頼する/しないの条件付けで、正規表現を使用できる

 mod_auth_openidは、OSS in Butterfat Tracのmod_auth_openidのページ(http://trac.butterfat.net/public/mod_auth_openid)よりダウンロードできます。

 次のページではCentOS 5.2を例に、Apacheにmod_auth_openidを組み込む作業を解説します。

mod_auth_openidインストール準備、libopkeleインストール

 Apache 2.2にmod_auth_openidをインストールする方法を解説します。ここではLinuxディストリビューション「CentOS 5.2」での作業を例に解説をすすめます。

 mod_auth_openidのバイナリパッケージは提供されていないため、ソースファイルからインストールする必要があります。

 CentOS 5.2でmod_auth_openidをインストールするには、gccなどの開発環境以外に以下のパッケージが必要になります。

・PCRE(Perl Compatible Regular Expre)のヘッダーファイル
・HTML TIDY関連パッケージ
・Apache開発関連パッケージ
・libopkele

 とりわけlibopkeleはOpenIDを実装するための重要なライブラリです。libopkele-2.0からOpenID Authentication 2.0に準拠しています。

 順々にインストールを実行します。パッケージが提供されている場合には、積極的に利用し、ソースからインストールするものを最小限にとどめます。CentOSではyumコマンドを使ってパッケージのオンラインインストールができます。

 以降のコマンド実行例では、「$」プロンプトは一般ユーザーによる作業、「#」プロンプトはrootユーザーによる作業を表します。rootユーザーが直接使用できない場合には、sudoコマンドで代用します。また紹介しているインストール方法や設定ではセキュリティーに対する考慮が不十分ですので十分注意してください。

 以下のコマンドを実行してPCREヘッダーファイルをインストールします。

# yum install pcre-devel

 次にtidy関連パッケージをインストールします。

# yum install tidy
# yum install libtidy
# yum install libtidy-devel

 次にApache開発関連パッケージをインストールします。

# yum install httpd-devel

 libopkeleはソースからインストールしますが、そのままではconfigure実行の際に、「tidy/tidy.h」が見つけられないというエラーが表示されます。ここまでの作業で、tidy.hは「/usr/include」にインストールされていますが、libopele-2.0では「/usr/include/tidy」にあることを期待しているため、手動で対応します。

 まず、「/usr/include」の中に/tidyディレクトリを作成します。

# cd /usr/include/
# mkdir tidy
# cd tidy

 シンボリックリンクを作成します。

# ln -s ../tidy.h .

 以下を実行してファイルの詳細を確認します。

# ls -l
合計 0
lrwxrwxrwx 1 root root 9 8月 16 03:25 tidy.h -> ../tidy.h

 libopkeleのソースアーカイブをwgetでダウンロードし、tarコマンドで展開します。

# wget http://kin.klever.net/dist/libopkele-2.0.tar.gz
# tar xvfz libopkele-2.0.tar.gz

 作業ディレクトリを移動しconfigureを実行します。その際インストール先を、デフォルトの「/usr/local」から「/usr」に変更するため、オプションに「--prefix=/usr」を指定します。

# cd libopkele-2.0
# ./configure --prefix=/usr

 makeを実行する前に、ソースアーカイブ中の「lib/basic_rp.cc」ファイルの冒頭にinclude文を1行追加します。

#include

 修正後makeコマンドを実行します。

# make
# make install

 libopkeleのインストールは以上です。続いてmod_auth_openidをビルドし、インストールします。

mod_auth_openidのインストールと動作確認

 最後にApacheモジュール「mod_auth_openid」をビルドし、Apacheに組み込みます。ソースファイルはSubversionを使ってダウンロードします。次に作業ディレクトリを移動し、autogen.shスクリプト実行します。

# svn co https://svn.butterfat.net/public/mod_auth_openid/trunk mod_auth_openid
# cd mod_auth_openid/
# sh autogen.sh

 その後、make、make installでモジュールファイルをビルドし、Apacheモジュールディレクトリにコピーします。

# make
# make install

 OpenID認証後に表示されるコンテンツを用意します。HTMLコンテンツのルートディレクトリ配下にsample_oidディレクトリを作成し、「http://サーバー名/sample_oid/」でアクセスできるようにします。

# mkdir /nfs/contents1/ibc//html/sample_oid
# echo "

TEST OK

" > /nfs/contents1/ibc//html/sample_oid/index.html

 次にApacheの設定ファイル「httpd.conf(CentOSでは/etc/httpd/conf/httpd.conf」を修正し、図3の上のような設定を追加します。「AuthOpenIDEnabled On」でOpenID認証を有効にします。

 そのほかmod_auth_openidの設定項目については、Trac内のmod_auth_openidのページ(http://trac.butterfat.net/public/mod_auth_openid)を参照します。

 Apacheを起動(または再起動)し、mod_auth_openidを有効にします。再起動にapachectlコマンドを使用する場合は以下を実行します。

# apachectl restart

 またはOSで用意された起動スクリプト(CentOSでは/etc/init.d/httpd)を利用する場合は以下を実行します。

# /etc/init.d/httpd restart

 Webブラウザで「http://サーバー名/sample_oid/」にアクセスし、図3(下)のようなOpenIDデフォルトの認証画面が表示されていることを確認します。「Identity URL:」に、1ページで取得したようなOpenID URLを入力することで、認証手続きが開始します。

 以上OpenID認証を可能にするmod_auth_openidのインストール方法を紹介しました。Webアプリケーションとの組み合わせで利用することが一般的だったOpenIDも、今回紹介した方法ならプログラミングを伴うことなく、Apacheで手軽に利用できます。

 さて4回にわたり認証系Apacheモジュールを取り上げ解説しました。認証分野に限っても、多くのモジュールがあり、本連載で紹介したのは、その一部に過ぎません。ユーザーを識別し、適切なコンテンツを提供しなくてはいけないWebサーバーにとって、認証/承認/アクセス制御は根幹を支える重要な技術です。一見複雑な認証技術も、Apacheではモジュールファイルを追加するだけで利用できますが、認証とセキュリティー問題を切り離すことはできません。利用に際しては、脆弱(ぜいじゃく)性などのセキュリティー問題にも注意を払うようにしましょう。

 本連載が皆さんに少しでもお役に立つことを願って、本連載の結びとしたいと思います。ご愛読ありがとうございました。

愛知県出身、東京都在住。現在通信会社勤務。在学中にかかわったISPの立ち上げにはじまり、古くからオープンソースソフトウェアに親しみ、現在ではシステム構築を中心に執筆を手がけている。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています