Apache2 / PostgreSQLを使ってログインユーザを管理しよう


Apache2を使ってユーザ認証するためにBasic認証を使う方法があります。 簡易的なら「.htpasswd」という便利なものがありますが、ユーザ数が多くなったりパスワード変更が面倒になります。(私はなりました)そこで、データベースを使って対応してみればよいかと思いました。
キーファイルはApache2.2系に標準で付いているmod_authn_dbdモジュールです。

参考サイト:らんすの本棚 Apache データベースを使ったユーザ認証・Apache2.2系 mod_authn_dbd編
      Let's Postgres pgcrypto
      PostgreSQL 9.0.4文書 第 20章データベースロールと権限

使ったrpm

アプリケーション名ファイル名
【apache2】 apache2-2.2.31-3vl6.x86_64
apache2-devel-2.2.31-3vl6.x86_64
mod_ssl-apache2-2.2.31-3vl6.x86_64
【postgresql】 postgresql-server-9.0.23-1vl6.x86_64
postgresql-9.0.23-1vl6.x86_64
postgresql-libs-9.0.23-1vl6.x86_64
postgresql-contrib-9.0.23-1vl6.x86_64
【pgsql】 apr-util-pgsql-1.3.9-8vl6.x86_64

  1. データベースの準備
    最初にユーザ情報を入れるデータベースの準備をします。
    必要な情報は「ID」と「パスワード」です。それ以外は好みで増やしてください。(漢字名やふりがな等)
    データベースについて
    ・データベース名login
    ・テーブル名idpw
    ・接続情報所有者:sslweb / パスワード:uebu
    権限:select / update / insert / delete
     テーブル内容
    ユーザ名userid text 重複禁止・空欄禁止
    パスワードpass text 空欄禁止
    手順
    1. postgreでログインします
    2. ユーザ登録
      $ createuser -E sslweb
      新しいロールをスーパーユーザにしますか? (y/n)n
      新しいロールに対してデータベースを作成する権限を与えますか? (y/n)n
      新しいロールに対して別のロールを作成する権限を与えますか? (y/n)y
    3. $createdb login -O sslweb -W
      パスワード「uebu」を入力※非表示です
    4. $psql login sslweb
    5. login=#create table idpw (userid text primary key,pass text not null);
    6. login=#grant select,update,insert,delete on idpw to sslweb;
    \du にてユーザ情報を確認できます。
    \dpにてテーブルごとの権限が確認できます。

  2. データベースの暗号設定
    暗号にはPostgreSQLのpgcryptoを使います。このプログラムはcontirbに収納されいています。
    インストール後は「/usr/share/pgsql/contrib/pgcrypto.sql」にあります。
    暗号化・複合化はPostgreSQLで処理をするため秘匿されますが、PostgreSQLと通信するAPサーバ間の通信盗聴されてしまいます。対策としてSSLを使います。
    手順
    pgcrypto関数の登録
    pgcryptoを使いたいデータベースに関数を登録します。
    psql idpw < /usr/share/pgsql/contrib/pgcrypto.sql

  3. ユーザ情報を1件入れてみる サンプル ユーザ名:hoge / パスワード:word
    手順
    insrt into idpw values('hoge',crypt('word',gen_salt('md5')));

  4. ApacheからPostgreSQLのモジュールを呼び出せるように設定
    手順
    1. rootで処理をする
    2. # vi /etc/ld.so.conf
    3. # /usr/lib64 <-追加する
    4. # /sbin/ldconfig <-修正を反映させるために、ldconfigを再起動する

  5. Apache2の環境設定ファイルを設定
    設定ファイル:/etc/apache2/conf/httpd.conf
    1. 【Directory】ディレクティブルの外で設定する。
      # mod_dbd configuretion
      DBDriver pgsql
      #DBDparams "host=ホスト名 dbname=データベース名 user=DBユーザ名 password=パスワード"
      DBDparams "host=localhost dbname=login user=webssl password=uebu"

      DBDMin 4
      DBDKeep 8
      DBDMax 20
      DBDExptime 300
    2. 【Directory】ディレクティブル内で設定する
      パスワードが必要なディレクトリは /var/www/html/sslweb に格納する。
      \
      # core authentication and mod_auth_basic configuration
      # for mod_authn_dbd
      AuthType Basic
      AuthName "sslweb"
      AuthBasicProvider dbd
      # core authorization configuration
      Require valid-user

      # mod_authn_dbd SQL query to authenticate a user
      AuthDBDUserPWQuery "SELECT pass FROM idpw WHERE userid = %s"

      ※「userid = $s」ですが、「$s」をシングルクォーテーションで囲まないように注意。

  6. Apacheを再起動する
      rootユーザで行う
    1. # /etc/rc.d/init.d/apache2 restart
      Apache2 HTTP Serverを停止中: [ OK ]
      Apache2 HTTP Serverを起動中: [ OK ]

確認のため、指定したフォルダをブラウザでアクセスし、ユーザ承認されて画面表示されればOKです。
2019/12/28 記述

Let's PC の Topに戻る
ホームページのTopに戻る