2017年5月5日金曜日

Apache + Oracle DBでDigest認証

以下要件を満たす設定を行おうとしたが、日本語でまとまった手順が記載されているものがなかったのでメモ。

  • Apacheの設定によりLinux上のディレクトリをhtmlにて参照させる
  • html参照時にはDigest認証を行う
  • Digest認証で用いるユーザについてはデータベース(Oracle)に保存したユーザ情報を用いる

●環境

  • Webサーバ
    • Amazon Linux AMI release 2016.09
  • データベース
    • AWS RDS Oracle SE Two(開発/テスト用)
    • Oracle 12.1.0.2 v7

●pcreインストール

# cd /usr/local/src
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
# tar zxvf pcre-8.40.tar.gz
# cd pcre-8.40
# ./configure --prefix=/opt/pcre-8.40
# make install

● Oracle Instant Clientインストール

http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

上記URLより以下をダウンロード。
oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm

rpmインストール。
# rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
# rpm -ivh oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
# rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
シンボリックリンクをはる。
# ln -s /usr/include/oracle/12.1/client64 /usr/lib/oracle12.1/client64/include
環境変数を設定する。 .bashrcに以下を追加し、読み込んでおく。
# vi ~/.bashrc
export ORACLE_HOME=/usr/lib/oracle/12.1/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$PATH:$ORACLE_HOME/bin
CPPFLAGS=-I/usr/include/oracle/12.1/client64; export CPPFLAGS
LDFLAGS=-L/usr/lib/oracle/12.1/client64; export LDFLAGS
# . ~/.bashrc

●aprインストール

# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache/apr/apr-1.5.2.tar.gz
# tar zxvf apr-1.5.2.tar.gz
# cd apr-1.5.2
# ./configure --prefix=/opt/apr-1.5.2
# make
# make install
# cd /opt
# ln -s /opt/apr-1.5.2 apr

●apr-utilインストール

# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache/apr/apr-util-1.5.4.tar.gz
# tar zxvf apr-util-1.5.4.tar.gz
# cd apr-util-1.5.4
# ./configure --prefix=/opt/apr-util-1.5.4 --with-apr=/opt/apr --with-oracle=/usr/lib/oracle/12.1/client64 --with-oracle-include=/usr/include/oracle/12.1/client64
# make
# make install
# cd /opt
# ln -s /opt/apr-util-1.5.4 apr-util

この時点で以下ディレクトリにapr_dbd_oracle.soができている。
# ls -l /opt/apr-util/lib/apr-util-1
total 180
-rwxr-xr-x 1 root root 77448 Apr 23 08:04 apr_dbd_oracle-1.so
-rw-r--r-- 1 root root 98364 Apr 23 08:04 apr_dbd_oracle.a
-rwxr-xr-x 1 root root  1073 Apr 23 08:04 apr_dbd_oracle.la
lrwxrwxrwx 1 root root    19 Apr 23 08:04 apr_dbd_oracle.so -> apr_dbd_oracle-1.so

●Apacheインストール

# cd /usr/local/src
# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//httpd/httpd-2.4.25.tar.gz
# tar zxvf httpd-2.4.25.tar.gz
# cd httpd-2.4.25
# ./configure --prefix=/opt/httpd-2.4.25
# make
# make install
# cd /opt
# ln -s /opt/httpd-2.4.25 httpd
# /opt/httpd/bin/httpd -V
Server version: Apache/2.4.25 (Unix)
~(以下略)~

●Apache設定変更

Apacheの設定ファイルである /opt/httpd/conf/httpd.conf を以下の通り修正する。

ServerRootの下あたりにPidFileの設定を追加。
     31 ServerRoot "/opt/httpd-2.4.25"
     32 PidFile "/var/run/httpd.pid"

authn_dbd_moduleのコメントアウトをはずす。
     70 LoadModule authn_dbd_module modules/mod_authn_dbd.so

auth_digest_moduleのコメントアウトをはずす。
     83 LoadModule auth_digest_module modules/mod_auth_digest.so

dbd_moduleのコメントアウトをはずす。
     94 LoadModule dbd_module modules/mod_dbd.so

Digest認証後に参照させるディレクトリの設定を行う。
    254 <Directory "/opt/httpd-2.4.25/htdocs/XXXXXXX">
    255     Options Indexes FollowSymLinks
    256     AuthType Digest
    257     AuthName digest
    258     AuthDigestProvider dbd
    259     AuthDBDUserRealmQuery "SELECT password FROM users WHERE username = %s AND realm = %s"
    260     Require valid-user
    261 </Directory>

接続するOracle DBの設定を行う。 ※設定内容は環境に合わせて設定
    247 DBDriver oracle
    248 DBDParams "user=<DB(RDS)のユーザ名> pass=<DB(RDS)のパスワード> dbname=ORCL server=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<DB(RDS)のホスト名>)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"
    249 DBDMin     4
    250 DBDKeep    8
    251 DBDMax     20
    252 DBDExptime 300

●DBデータ投入

sqlplusを用いてデータベースに接続。
# sqlplus64 '<DB(RDS)のユーザ名> @(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<DB(RDS)のホスト名>) (PORT=1521))(CONNECT_DATA=(SID=ORCL)))'

Digest認証用のユーザテーブルを作成する。
SQL> CREATE TABLE USERS
   (    "USERNAME" VARCHAR2(16),
        "PASSWORD" VARCHAR2(255),
        "REALM" VARCHAR2(16)
   ); 

レコードを挿入する。
passwordは「username:password:realm」をMD5でハッシュ化したものを設定。
 realmはhttpd.confで設定した"AuthName"の設定値と合わせる。
今回は「digest」を設定。
SQL> INSERT INTO USERS VALUES('<username>', '<MD5(username:password:realm)>','digest');
SQL> COMMIT;

●チェック

Apacheを再起動し、ブラウザで http://<WebサーバのIPアドレス>/XXXXXXX にアクセス。
Digest認証のダイアログが出てくればひとまずOK。
そして、データベースに保存したユーザ名/パスワードを入力して認証成功すればOK。

うまくいかない場合は、 Apacheのエラーログ /opt/httpd/logs/error_log などを確認するとヒントがあるかも。

0 件のコメント:

コメントを投稿