第10回 ユーザー認証による制限(ベーシック認証編)

前回はIP認証を用いたアクセス制限方法を紹介した。今回は、パスワードなどの入力を要求するユーザー認証について解説しよう。ユーザーをグループ化すれば複雑な認証体系にも対応できる。

ユーザー認証とは

 前回「IP認証によるアクセス制限のテクニック」の予告どおり、今回は「ユーザー認証」について解説する。ユーザー認証は、Webサイトへのアクセスに対してユーザー名とパスワードの入力を求めるアクセス制御方法である。入力されたユーザー名とパスワードが、あらかじめ登録されたものと一致すればアクセスを許可し、要求どおりのページを表示する。

 前回紹介した「IP認証」は、アクセスしてきたコンピュータのIPアドレスを認識し、許可されたIPアドレスと一致するかどうかを確認する方法だった。これがアクセスするコンピュータを限定する方法であるのに対し、今回のユーザー認証は人間を限定する。重要なポイントは、どちらも確実な方法ではないというところにある。

 ユーザー認証は、ユーザー名とパスワードが漏れてしまったら意味がないし、IP認証はなりすましやコンピュータ自体の不正使用を心配しなければならない。従って、IP認証とユーザー認証を併用するのが望ましい。

ユーザー認証の注意点

 すでにお分かりいただいていると思うが、Webサイトのユーザー認証に用いるユーザーと、サーバ上のOSユーザーとはまったく無関係である。サーバのOSユーザーとして登録されていても、ユーザー認証に用いるファイルやデータベースに登録されていなければ、そのユーザーはWebサイトにアクセスできない。もちろん、同じユーザー名で登録されていても、パスワードは異なる可能性がある。

 こうした勘違いにも注意しなくてはならないのだが、その使い方にも注意を払わなくてはならない。一度ユーザー認証を通過すると、Webブラウザを閉じるまでその情報が有効になっているという点である。

 ユーザー認証で送信したユーザー名とパスワードは、Webブラウザが記憶している。従って、たとえほかのサイトへ移動したとしても、Webブラウザを終了するまでは再度認証を受けることがない。Webブラウザを起動したまま離席したりすると、本来ならユーザー認証で拒否されるべき人がWebサイトにアクセスしてしまう可能性がある。

ユーザー認証の種類

 ユーザー認証には、ユーザーの管理方法やユーザー名/パスワードの転送方法によってさらに方法を分類することができる。

ベーシック認証とダイジェスト認証

 「ベーシック認証」は、最も標準的なユーザー認証方法である。この設定が行われたディレクトリやファイルにアクセスすると、画面のようなダイアログが表示される。この認証を用いるには、アクセスを許可するユーザーのリストを作成しなくてはならない(設定方法は後述)。

ユーザー認証が使われているページにアクセスしようとすると、ユーザー名とパスワードの入力を促すダイアログが表示される

 認証用ダイアログを表示させるには、Webブラウザ側の対応が必要になる。現在一般的に使われているWebブラウザであれば、対応していないということはまずあり得ない。ただし、入力されたユーザー名とパスワードは暗号化されることなく平文でサーバに送信される。つまり、通信を盗聴されればユーザー名やパスワードが盗まれてしまうということである。

 そこで、サーバへ送信するユーザー名とパスワードを暗号化する「ダイジェスト認証」と呼ばれる方法が用意されている。ダイジェスト認証は、HTTP 1.1の機能としてRFC 2069(http://www2.rosenet.ne.jp/~jigsaw/W3C/HTTP/spec/rfc2069.txt)で定義されている。ダイジェスト認証では、ユーザー名とパスワードをMD5で暗号化するため盗聴による漏えいを防ぐことが可能だ。

 だが、ダイジェスト認証を使うにはWebブラウザ側もこれに対応する必要がある。ところが、現時点でダイジェスト認証に対応したWebブラウザは事実上存在しない()。従って、ダイジェスト認証が用いられることはごくまれで、一般的にはベーシック認証が利用されている。

:以前は米Spygrass社のWebブラウザが唯一対応していたのだが、このWebブラウザはいつの間にか消滅してしまった。

データベース認証

 ベーシック認証では、アクセスを許可するユーザーのリストはテキストファイルで管理する。アクセスを許可するユーザーの数が少なければ、このような管理方法でも困ることはないだろう。しかし、多くのユーザーを管理する場合、ファイルで管理する方法は手間が掛かって仕方ない。

 そこで考え出された方法が、データベースに登録されたユーザーの情報を利用する「データベース認証」である。データベースを使えば、ユーザー情報のメンテナンスは容易かつ確実に行うことが可能になるからだ。

 Apacheのデータベース認証に利用できるデータベースは多岐にわたる。Berkeley DB(mod_auth_db)、PostgreSQL(mod_auth_pgsql)、MySQL(mod_auth_mysql)など、Linuxで広く利用されているフリーのデータベースはすべて利用できるようになっているから安心だ。ただし、データベースごとにモジュール(括弧内に表記)が異なるため、利用するデータベースに対応するモジュールを組み込まなくてはならない。

ベーシック認証の設定

パスワードファイルの作成

 ベーシック認証を行うには、ユーザー認証に利用するファイル(パスワードファイル)を作成し、ユーザーを登録するところから始める。ユーザー登録には、Apacheに含まれる「htpasswd」プログラムを利用する。このプログラムは、apachectlなどと同じく、Apacheをインストールしたディレクトリ(/usr/local/apacheなど)のbinの中に保存されている。

 htpasswdにオプションパラメータ「-c」を付けて実行すれば、パスワードファイルが新規に作成される。ここでのポイントは、パスワードファイルを作成するディレクトリやファイルの名前は自由に決定できること。パスワードファイルは、システムの中で複数個作成・管理できるということである。後述するが、認証に使用するパスワードファイルは自由に設定できる。従って、複数のパスワードファイル(例えば部門別など)を作成し、認証を行うディレクトリ別に利用するファイルを切り替えるような運用も可能なのだ。

 話が少し横道にそれてしまったが、まずは1つパスワードファイルを作成してみよう。通常、こうしたコマンドはrootユーザーで実行する。その構文は以下のとおりである。

# htpasswd -c /usr/local/apache/.htpasswd ichishi
New password:
Re-type new password:
Adding password for user ichishi

 このように、パスワードファイル名と最初に作成するユーザーの名前を指定してhtpasswdプログラムを実行する。前述のとおり、-cを付けることでファイルが新規に作成される。

 パスワードファイルを保存するディレクトリは自由に決めて構わないが、Webサイトとして公開していないディレクトリにすることをお勧めする。なぜならば、公開しているディレクトリを指定すると、その内容を読み取られる可能性があるからだ。もちろん、正確にURLで指定しなければ読み取られることはないが、わざわざ自ら弱点を作ることもない。

 また、ファイル名は前述の実行例のように、先頭に「.」(ピリオド)を付けることをお勧めする。これは隠しファイルにすることを意味し、ファイルの存在を容易に悟られないようにする効果が得られる。

 パスワードファイルを作成したら、念のために権限(パーミッション)を確認しておこう。設定にもよるが、デフォルトのApacheはnobodyユーザーで実行される。作成したパスワードファイルは、Apacheを実行するユーザーで読み取れなければならない。ファイルの権限を確認し、644もしくは444に設定しておくこと。すべてのユーザーに対する読み取り権限さえあれば、ファイルのオーナーはだれでも構わない。

 次に、でき上がったファイルの内容を確認してみよう。ここでは、「ichishi」というユーザーを登録したから、ファイルの内容は以下のようになっている。

ichishi:s33Gaxq46QEWU

 ユーザー名とともに、暗号化されたパスワードが記録されている。暗号化されているから、読み取られたからといってすぐにログインできるようになるわけではないが、やはり危険であることは意識しておきたい。

 後は、このファイルに必要なだけユーザーを追加する。追加するときは、htpasswdを-cオプションを付けずに実行する。-cを付けるとファイルの内容が上書きされてしまうので注意していただきたい。

 なお、すでに作成したユーザーのパスワードだけを変更する場合にもhtpasswdを使用する。既存のユーザーを指定して実行した場合、パスワードだけが更新される。

# htpasswd /usr/local/apache/.htpasswd guest
New password:
Re-type new password:
Adding password for user guest

グループファイルの作成

 ユーザーを追加し、パスワードファイルが以下のような状態になったとしよう。

ichishi:s33Gaxq46QEWU
guest:n5i.VSkqBbVWk
yamamoto:alcQzciyFcGh6
yano:YQikAesFK2vXc
userta:uxW2pkKgJevQ6
shigematsu:Zjn8dkVfGEKsk
yoshida:dnZWeTDyFWt1Q
tanaka:BvrSJlQpsllu2

 このようにユーザーが増えてくるとユーザーをグループ化して、あるグループにだけアクセス権を与え、ほかのユーザーには権利を与えたくない、そうしたニーズも出てくるだろう。特に、イントラネットなどでは職務権限に応じたアクセス権の設定が求められる。

 グループを作るには、以下のようなファイルを作成する。

manager:yamamoto yano
leader:ichishi userta
member:shigematsu yoshida tanaka
guest:guest

 グループ名と「:」(コロン)に続いて、そのグループに所属させるユーザーをスペースで区切って列挙する。

グループ名:ユーザー名 ユーザー名 ユーザー名……

 グループに所属するユーザーの数に制限はないし、1人のユーザーを複数のグループに所属させても構わない。部署単位や役職単位などに応じて柔軟な設定が可能だ。

 グループファイルのファイル名や保存場所は何でも構わないが、パスワードファイルと同じディレクトリに「.groups」などのファイル名で保存するといいだろう()。

:先頭に「.」を付ける理由は前述のとおり。

設定ファイルの編集

 作成したパスワードファイルとグループファイルを使って、実際にアクセス制限を設定してみよう。

 IP認証と同じく、設定はhttpd.conf(Apacheの設定ファイル)か.htaccess(ディレクトリ別のアクセス制限設定ファイル)に制限を書き加える。まずはhttpd.confを例に、/usr/local/apache/htdocs/ディレクトリへのアクセス制限を設定してみよう。

<Directory "/usr/local/apache/htdocs/">
AuthUserFile    /usr/local/apache/.htpasswd
AuthGroupFile   /dev/null
AuthName        "Please Enter Your Password"
AuthType        Basic
Require valid-user
</Directory>

 <Directory>〜</Directory>は、前回も説明したようにあるディレクトリに対する設定が記述されるディレクティブである。ここではアクセス制限の部分を抜粋しているが、実際にはほかの設定も記述されている。制限内容はおおよそ想像がつくと思うが、個別に解説していくことにする。

 前回も紹介したとおり、.htaccessを使う場合も記述内容はまったく同じだ。ただし、<Directory>〜</Directory>は必要なく、純粋に設定内容だけを記述する。httpd.confと.htaccessの記述方法の違いについては、前回を参照していただきたい。

 また、httpd.confを書き換えた場合はApacheを再起動しないと設定が有効にならない。.htaccessは、再起動しなくても内容が反映される。この点にも注意しておいてほしい。

次回はデータベース認証

 以上で、IP認証とベーシック認証を併用してアクセス制限を設けることが可能になった。しかし、ユーザーのリストを管理するのは面倒だし、パスワードの変更にいちいちコマンドを必要とするのもうっとうしい。何より、ユーザー自身にパスワードを変更させるため、CGIプログラムを使うとしても危険すぎて現実的ではない。

 こうした問題を解決するには、「データベース認証」を利用するのが最も効果的な方法である。次回はデータベース認証について、じっくりと解説することにする。