PostgreSQLのデータをPHPで動的に表示することはできた。しかし、氏名や住所などのデータがネットワーク上やインターネット上にプレーンテキストで流れるのはちょっと考え物である。
そこで、ApacheをSSLに対応させ、クライアントとサーバ間を暗号化してページを表示させることにした。具体的には、普通のページをhttp://〜のURLで表示し、暗号化したいページをhttps://〜で表示させる。
Apacheを再インストールしなければならないため、今回はサーバをフォーマットし、1から構築することにした。
サーバインストール後の手順は次のとおりである。
1.用意するソース
Apache --- Apache_1.3.20.tar.gz
OpenSSL --- openssl-0.9.6b.tar.gz
mod_ssl --- mod_ssl-2.8.4-1.3.20.tar.gz2.Apacheの解凍
用意したApacheのソースを/usr/local/srcにコピーし、解凍する。
# cd /usr/local/src
# tar zxvf apache_1.3.20.tar.gz3.OpenSSLのインストール
mod_sslを使うためにはOpenSSLが必要であるため、用意したOpenSSLのソースを/usr/local/srcにコピーし、インストールを行う。
# cd /usr/local/src
# tar zxvf openssl-0.9.6b.tar.gz
# cd openssl-0.9.6b
# ./config --prefix=/usr/local --openssldir=/usr/local/openssl -fPIC
# make
# make install4.mod_sslの組み込み
次に、用意したmod_sslのソースを/usr/local/srcにコピーし、ApacheにSSLを組み込むため、mod_sslのコンフィグを行う。
# cd /usr/local/src
# tar zxvf mod_ssl-2.8.4-1.3.20.tar.gz
# cd mod_ssl-2.8.4-1.3.20
# ./configure --with-apache=../apache_1.3.20 --with-ssl=../openssl-0.9.6b --prefix=/usr/local/apache --enable-shared=ssl --enable-module=so --enable-rule=SHARED_CORE --enable-module=rewrite --enable-shared=rewrite5.Apacheのコンパイル
ApacheのConfigファイルがSSLを組み込むよう変更されたので、Apacheのコンパイルを行う。
# cd /usr/local/src/apache_1.3.20
# make6.テスト用の証明書及びプライベート鍵の生成
テスト用の証明書及びプライベート鍵の生成を行う。
apache_1.3.20ディレクトリ内で、次のコマンドを実行する。
# make certificate このコマンドを実行すると、証明書情報を聞いてくるので、次のように答える。
- Signature Algorithm ((R)SA or (D)SA) [R]:
(暗号化方式は何を使用するか?)- RSAを使うので、
rと入力し、Return- 1.Country Name (2 letter code) [XY]:
(国名を入力(証明書発行情報))- 日本なので、
jpと入力し、Return
(2文字分しか受け付けない)- 2.State or Province Name (full name) [Snake Desert]:
(都道府県名を入力(証明書発行情報))- 名古屋で作ってるので、
Aichiと入力し、Return- 3.Locality Name (eq, city) [Snake Town]:
(市区町村名を入力(証明書発行情報))- 名古屋なので、
Nagoyaと入力し、Return- 4.Organization Name (eq, company) [Snake Oil, Ltd]:
(会社名(組織名)を入力(証明書発行情報))- 安藤工務店(仮)なので、
AndoKomutenと入力し、Return- 5.Organizational Unit Name (eq, section) [Webserver Term]:
(部署名を入力(証明書発行情報))- 情報センター(仮)なので、
Centerと入力し、Return- 6.Common Name (eq, FQDN) [www.snakeoil.com]:
(組織の通称を入力(証明書発行情報))- 通称は特に無いので、何も入力しないでReturn
- 7.Email Address (eq, name@FQDN) [www@snakeoil.com]:
(メールアドレスを入力(証明書発行情報))- 管理者のアドレスはcenter@www.andokomuten.comなので、
center@www.andokomuten.comと入力し、Return- 8.Certificate Validity (days) [365]:
(証明書の有効期限を日単位で入力(証明書発行情報))- 1年間有効にするため、
365と入力し、Return- Certifiate Version (1 or 3) [3]:
(証明書のバージョンを指定)- バージョン3を使うので、
3と入力し、Return- Encrypt the private key now? [Y/n]:
(証明書の暗号化を行うかどうか)- 行うので、
yと入力し、Return- Enter PEM pass phrase:
(パスワードを入力)- 任意のパスワードを入力(4文字以上)し、Return
- Verifying password - Enter PEM pass phrase:
(パスワードを再度入力)- 先ほど入力したパスワードを再度入力
これにより、ApacheにSSLを組み込む準備ができた。
7.Apacheのインストール
以下のコマンドを実行し、Apacheのインストールを行う。
# cd /usr/local/src/apache_1.3.20
# make install8.Apacheの起動・停止
ApacheをSSL対応で起動するには、次のように行う。
# /usr/local/apache/bin/apachectl startsslapachectlの引数を
startssl(又はsslstart)で実行すると、パスワードを聞いてくる。証明書を作成したときに設定したパスワードを入力すると、Apacheが起動する。
なお、引数を通常のstartにすると、SSLが機能しない状態でApacheが起動する。
停止はどちらもstopでできる。9.Apacheの自動起動
サーバ起動時にApacheが起動するように設定を行う。
# vi /etc/rc.d/init.d/httpd 以下のプログラムを入力し、保存する。
#!/bin/sh
case "$1" in
start)
/usr/local/apache/bin/apachectl startssl
touch /var/lock/subsys/httpd
;;
stop)
/usr/local/apache/bin/apachectl stop
rm -f /var/lock/subsys/httpd
;;
*)
echo "Usage: /etc/rc.d/init.d/httpd {start|stop}"
;;
esac
exit 0作成したファイルに実行権をつけ、シンボリックリンクを張る。
# chmod 755 /etc/rc.d/init.d/httpd
# chkconfig --add httpdただし、このままでは再起動の度にパスワードを聞いてくる。
パスワードをいちいち入力しなくてもいいようにするには、次のコマンドを実行する。
# cd /usr/local/apache/conf/ssl.key
# cp -p server.key server.key.org
# /usr/local/bin/openssl rsa -in server.key.org -out server.keyパスワードを聞いてくるので、入力してReturn。
writing RSA keyと表示されたら成功。サーバを再起動し、確認してみよう。
(セキュリティ上は起動するごとにパスワードを入力したほうがいい?)10.動作確認
httpd.confを適切に編集後、再起動し、動作を確認しよう。クライアントから
http://サーバのIPアドレス/とhttps://サーバのIPアドレス/の2つのURLを入力し、確認する。
前者は通常のApacheテスト画面が表示されるが、後者は認証のページが表示されるはずである。
1.用意するソース
PostgreSQL --- postgresql_7.1.3.tar.gz
2.管理ユーザ作成
PostgreSQLを管理するユーザ
postgresを作成する。
# useradd postgres
# passwd postgres
(パスワードを2度入力)3.インストールディレクトリの準備
PostgreSQLをインストールするディレクトリを作成し、所有者をpostgresユーザに変更する。
# mkdir /usr/local/pgsql
# chown postgres.postgres /usr/local/pgsql4.PostgreSQLの解凍
用意したPostgreSQLのソースを/usr/local/srcにコピーし、解凍する。
# cd /usr/local/src
# tar zxvf postgresql_7.1.3.tar.gz5.PostgreSQLのインストール
ここからは、先ほど作成した管理者ユーザ
postgresで作業を行う。
# su - postgres postgresユーザになったら、コンパイル、インストールを行う。
$ cd postgresql_7.1.3
$ ./configure --enable-multibyte=EUC_JP
$ make all
$ make install6.管理ユーザの設定
管理ユーザpostgresに対して環境変数を設定する。ホームディレクトリ(/home/postgres)配下の
./bashrcファイルをviで開き、"# User specific aliases and functions"という行の下に、以下の行を追加する。
export PATH="$PATH":/usr/local/pgsql/bin
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"保存したら、以下のコマンドを実行し、設定を反映させる。
(またはpostgresユーザをログアウトし、再度ログインする)
$ cd /home/postgres
$ source .bashrc7.データベースの初期化
PostgreSQLをインストールした後、データベースの初期化を一度だけ行わなければならない。
$ initdb 8.データベースの起動
PostgreSQLデータベースを起動するには、postgresユーザで以下のコマンドを実行する。
$ pg_ctl -o "-S -i" start
postmaster successfully startedと表示されれば成功。9.データベースの自動起動
ここからは
rootで作業を行う。
chkconfigを利用する場合は、viで/etc/rc.d/init.d/postgresファイルを作成し、以下の文を入力する。
#!/bin/sh # # postgres - This script is used to start/stop # the postgreSQL listener process. # # chkconfig: 345 85 15 # description: Starts and stops the PostgreSQL backend daemon\ # that handles all database requests. # processname: postmaster # # Config Variables # PGACCOUNT="postgres" # # The non-root user account which will be used to run the # PostgreSQL executeable. For this script to work, the # shell for this account must be SH/BASH. # PG_CTL="/usr/local/pgsql/bin/pg_ctl" # # The executable program which is to be run, in this case # it is the listener, which waits for requests on the port # specified during configuration. # # Source function library. . /etc/rc.d/init.d/functions # # See how we were called. # case "$1" in start) echo -n "Starting postgres: " su - $PGACCOUNT -c "$PG_CTL -o \"-S -i \" start" echo touch /var/lock/subsys/postgres ;; stop) echo -n "Stopping postgres: " su - $PGACCOUNT -c "$PG_CTL -m f stop" echo rm -f /var/lock/subsys/postgres ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0作成したファイルに実行権をつけ、シンボリックリンクを張る。
# chmod 755 /etc/rc.d/init.d/postgres
# chkconfig --add postgresサーバを再起動し、動作を確認しよう。
10.pg_hba.confファイルの設定
インターネットなどのネットワーク経由でのアクセスを可能にするためには、以下の条件を満たしている必要がある。
- pg_ctlが-iオプション付で起動されていること
- pg_hba.confファイルで許可されたホストからの接続であること
インストール直後のpg_hba.confファイルは全てのホストの接続を禁止しているため、全てのホストの接続を許可するよう変更する。
なお、この作業はpostgresユーザで行う。
# su - postgres
$ vi /usr/local/pgsql/data/pg_hba.confpg_hba.confファイルの末尾に、以下の行を追加する。
host all 0.0.0.0 0.0.0.0 trust
1.用意するソース
PHP --- php-4.0.6.tar.gz
2.PHP4のインストール
用意したPHPのソースを/usr/local/srcにコピーし、解凍、インストールする。
(この作業はrootで行う)
# cd /usr/local/src
# tar zxvf php-4.0.6.tar.gz
# cd php-4.0.6
# ./configure --enable-mbstring --enable-mbstr-enc-trans --with-pgsql=/usr/local/pgsql --with-apxs=/usr/local/apache/bin/apxs --enable-versioning
# make
# make installインストール終了後、PHP4の設定ファイルをコピーする。
# cp php.ini-dist /usr/local/lib/php.ini 3.共有ライブラリの設定
PostgreSQLのアクセス用関数で使用する共有ライブラリ(libpq)の設定を行う。
# vi /etc/ld.so.conf ファイルの最後に次の2行を追加し、保存する。
# /usr/local/lib
# /usr/local/pgsql/lib修正を反映させるため、ldconfigを再起動する。
# /sbin/ldconfig 4.Apacheの設定
Apache上でPHPが使えるよう、httpd.confファイルを設定する。
# vi /usr/local/apache/conf/httpd.conf まず、PHP4スクリプトファイル(拡張子が.php)をPHP4スクリプトだと認識させる。
#
# And for PHP 4.x, use:
#
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps上記の行を探し、以下のように修正する。
#
# And for PHP 4.x, use:
#
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps次に、index.phpというファイルがデフォルトページとして使えるよう、設定する。
<IfModule mod_dir.c>
DirectoryIndex index.html
</IfModule>上記の行を探し、以下のように修正して保存する。
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>設定を反映させるため、Apacheを再起動する。
# /usr/local/apache/bin/apachectl stop
# /usr/local/apache/bin/apachectl startssl5.動作確認
phpinfo.phpというファイルを以下の内容で作成し、クライアントからブラウズする。
<?php phpinfo(); ?> 「PHP Version 4.0.6」という表が出てきたらOK。
PHPLIBを使うと、PHPスクリプトが簡潔に書けるため、 これもインストールすることにした。
1.用意するソース
PHPLIB --- phplib-7.2d.tar.gz
2.PHPLIBのインストール
# cd /usr/local/src
# tar zxvf phplib-7.2d.tar.gz
# mv phplib-7.2d /usr/local/apache/
# ln -s phplib-7.2d /usr/local/apache/phplib3.PHPLIBの設定
PHPLIBはPHP3で使えるように作られているので、PHP4で使えるように修正しながら設定を行う。
まず、PHPLIB内のスクリプトの拡張子が.php3なので、.phpに変更する。非常に多くのファイルがあるため、シェルスクリプトを作成し、一度に作業が出来るようにする。
任意のフォルダ(例、/root)にphp32php.shというファイルを以下の内容で作成する。
#!/bin/sh
#ファイルの拡張子.php3を.phpに変更
#ファイルの内容の.php3を.phpに変更
for f in *.php3
do
mv $f `basename $f .php3`.php
done
/usr/bin/perl -pi -e 's|.php3|.php|g' *保存したら、ファイルに実行権をつけ、作業を行う。
# chmod 755 /root/php32php.sh
# cd /usr/local/apache/phplib/php
# /root/php32php.sh
# cd ../pages
# /root/php32php.sh
(adminディレクトリをチェックできないためエラーが出るが、無視)
# cd admin
# /root/php32php.sh次に、設定ファイル(
prepend.php)を編集する。
# vi /usr/local/apache/phplib/php/prepend.php 「$_PHPLIB["libdir"] = 〜 」という行を探し、次のように修正する。
$_PHPLIB["libdir"] = "/usr/local/apache/phplib/php/"引き続き、「require($_PHPLIB["libdir"] . "db_mysql.inc");」という行を探し、次のように修正する。
require($_PHPLIB["libdir"] . " db_pgsql.inc");上記修正が終われば、変更を保存する。
4.PHPLIB用テーブルの作成
PHPLIBを使うには、対象のデータベース(例、SampleDB)にPHPLIB用のテーブルを作成する必要がある。
create_database.pgsqlというスクリプトファイルを実行すればテーブルが作成されるが、このまま実行すると文法エラーが発生するので、以下の手順で修正する。
- viで
/usr/local/apache/phplib/stuff/create_database.pgsqlを開く。 //で始まる行を全て削除する。- 保存する。
修正したら、SampleDBにテーブルを作成する。
# su - postgres
$ psql -e SampleDB < /usr/local/apache/phplib/stuff/create_database.pgsql作成したテーブルに対し、Apacheの実行ユーザが読み書きできるよう、権限を付加する。
# psql SampleDB
grant all on active_sessions to nobody;
grant all on active_sessions_split to nobody;
grant all on auth_user to nobody;
grant all on auth_user_md5 to nobody;
\q5.接続データベースの設定
local.incファイルを、SampleDBデータベースに接続するように編集する。これにより、どのPHPファイルからもlocal.incに設定されているデータベースに接続するようになる。
(この作業はrootで行う)
# vi /usr/local/apache/phplib/php/local.inc 「class DB_Example extends DB_Sql」に続く行を、以下のように修正する。
class DB_Example extends DB_Sql {
var $Host = "サーバのIPアドレス又はホスト名";
var $Database = "SampleDB";
var $User = "nobody";
var $Password = "";
}6.PHPスクリプトでPHPLIBを使うための設定
PHPスクリプトを実行する際、prepend.phpファイルが自動的にスクリプトの先頭に追加されるよう、php.iniファイルを編集する。
# vi /usr/local/lib/php.ini 「auto_prepend_file = 」という行を探し、次のように修正する。
auto_prepend_file = /usr/local/apache/phplib/php/prepend.php引き続き、「;include_path = ".:/php/includes"」という行を探し、次のように修正する。
include_path = " .:/usr/local/apache/phplib/php"上記修正が終われば、変更を保存する。
7.再起動
以上の設定を反映させるため、Apacheを再起動する。
以上の設定で、SSL経由でPHP4を使ってPostgreSQLデータベースに アクセスできるようになった。