Basic認証の設定(DB認証)
「Basic認証の設定(ファイル認証)」では,ファイルでユーザー名とパスワードを
を管理する方法を説明しました。このページでは,データベースを用いて,ユーザー名とパスワードを管理する方法を
説明します。
データベースでユーザー情報を管理するメリットとしては
- ユーザー情報を操作できるアプリケーションを作成する等して,管理を簡素化できる
- データベースで認証を行える他のサービスと連携し,データを一元管理できる
等があげられます。
反対に,データベースの情報を盗まれると,被害が大きくなってしまいます。
その為セキュリティには十分注意する必要があります。
mod_auth_pgsql のインストール
mod_auth_pgsqlをインストールします。
root $ emerge mod_auth_pgsql
インストールされたmod_auth_pgsqlのバージョンは 2.0.2-r1 でした。
テーブルの作成
Basic認証をPostgreSQLと連携して行うために、PostgreSQL側の準備をします。
mod_auth_pgsqlはグループを使用する等、細かな設定ができますが、ここでは最低限のテーブルと
カラムを作成します。テーブル web_userは以下の2つのカラムから成ります。
テーブル:web_user
user_id
|
passwd
|
接続時のユーザー名を記録します。
|
接続時のパスワードを記録します。
パスワードは暗号化して記録します。
|
Postgresqlに接続できるユーザーでpsqlを起動します。
例ではgsideと言うデータベースに接続しています。
postgres $ psql gside
以下のSQL文でテーブルを作成します。
gside=# create table web_user (
gside=# user_id varchar(20) NOT NULL,
gside=# passwd varchar(20) NOT NULL
gside=# );
今回mod_auth_pgsqlでは、nobodyユーザーでPostgreSQLに接続するよう設定します。
このため、nobodyユーザーの作成と、web_userテーブルのSELECT権限の
追加を行います。
nobody ユーザーにはデータベース作成権限とユーザー作成権限は与えません。
postgres $ createuser nobody
Shall the new user be allowed to create databases? (y/n) n
Shall the new user be allowed to create more new users? (y/n) n
CREATE USER
psqlから以下のSQL文で権限の追加を行います。
gside=# grant select on web_user to nobody;
認証ディレクトリの指定
/var/www/localhost/htdocs/Gentoo以下のコンテンツに対して認証を設定します。
/etc/apache2/conf/apache2.confに以下の記述を追加します。
<Directory "/var/www/localhost/htdocs/Gentoo">
<Limit GET POST>
Auth_PG_host 127.0.0.1
Auth_PG_port 5432
Auth_PG_database gside
Auth_PG_pwd_table web_user
Auth_PG_uid_field user_id
Auth_PG_pwd_field passwd
Auth_PG_user nobody
AuthName "Please Enter Your Password"
Authtype Basic
Require valid-user
</Limit>
</Directory>
起動オプションの変更を行います。/etc/conf.d/apache2を編集します。
APACHE2_OPTS="-D AUTH_PGSQL"
Apacheの再起動を行います。
root $ /etc/init.d/apache2 restart
暗号化パスワードの生成
mod_auth_pgsqlは、何も指定しないとCRYPT方式で暗号化されたパスワードを採用します。
そこでCRYPT方式の暗号化パスワードを生成する方法を説明します。
暗号化するパスワードを hogehoge とすると、
$ perl -e 'print crypt("hogehoge", "xx");'
とすると、暗号化されたパスワードが生成されます。"xx"の部分は自由に英数字2文字を
設定します。
psqlからユーザーとパスワードを追加するSQL文を実行します。
gside=# Insert Into web_user (
gside=# (user_id,passwd)
gside=# Values ('hoge','xxHLAO.FfWdak');