ベーシック認証を行うには、ユーザー認証に利用するファイル(パスワードファイル)を作成し、ユーザーを登録するところから始める。ユーザー登録には、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 shibata:uxW2pkKgJevQ6 shigematsu:Zjn8dkVfGEKsk yoshida:dnZWeTDyFWt1Q tanaka:BvrSJlQpsllu2
このようにユーザーが増えてくるとユーザーをグループ化して、あるグループにだけアクセス権を与え、ほかのユーザーには権利を与えたくない、そうしたニーズも出てくるだろう。特に、イントラネットなどでは職務権限に応じたアクセス権の設定が求められる。
グループを作るには、以下のようなファイルを作成する。
manager:yamamoto yano leader:ichishi shibata 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プログラムを使うとしても危険すぎて現実的ではない。
こうした問題を解決するには、「データベース認証」を利用するのが最も効果的な方法である。次回はデータベース認証について、じっくりと解説することにする。
Copyright © ITmedia, Inc. All Rights Reserved.