以下要件を満たす設定を行おうとしたが、日本語でまとまった手順が記載されているものがなかったのでメモ。
- 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設定変更
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 などを確認するとヒントがあるかも。