セキュアなWebDBサーバ構築

PostgreSQLのデータをPHPで動的に表示することはできた。しかし、氏名や住所などのデータがネットワーク上やインターネット上にプレーンテキストで流れるのはちょっと考え物である。
そこで、ApacheをSSLに対応させ、クライアントとサーバ間を暗号化してページを表示させることにした。具体的には、普通のページをhttp://〜のURLで表示し、暗号化したいページをhttps://〜で表示させる。

Apacheを再インストールしなければならないため、今回はサーバをフォーマットし、1から構築することにした。
サーバインストール後の手順は次のとおりである。

  1. Apacheのインストール
    (DSOとSSLを使えるよう、オプションを設定する)
  2. PostgreSQLのインストール
  3. PHP4のインストール
    (DSOとしてインストール)
  4. PHPLIBのインストール
なお、作業は基本的にrootで行う。

1.ApacheをDSOとSSLが使えるようにインストール

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.gz

2.Apacheの解凍

用意したApacheのソースを/usr/local/srcにコピーし、解凍する。

# cd /usr/local/src
# tar zxvf apache_1.3.20.tar.gz

3.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 install

4.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=rewrite

5.Apacheのコンパイル

ApacheのConfigファイルがSSLを組み込むよう変更されたので、Apacheのコンパイルを行う。

# cd /usr/local/src/apache_1.3.20
# make

6.テスト用の証明書及びプライベート鍵の生成

テスト用の証明書及びプライベート鍵の生成を行う。
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 install

8.Apacheの起動・停止

ApacheをSSL対応で起動するには、次のように行う。

# /usr/local/apache/bin/apachectl startssl

apachectlの引数を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テスト画面が表示されるが、後者は認証のページが表示されるはずである。

2.PostgreSQLのインストール

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/pgsql

4.PostgreSQLの解凍

用意したPostgreSQLのソースを/usr/local/srcにコピーし、解凍する。

# cd /usr/local/src
# tar zxvf postgresql_7.1.3.tar.gz

5.PostgreSQLのインストール

ここからは、先ほど作成した管理者ユーザpostgresで作業を行う。

# su - postgres

postgresユーザになったら、コンパイル、インストールを行う。

$ cd postgresql_7.1.3
$ ./configure --enable-multibyte=EUC_JP
$ make all
$ make install

6.管理ユーザの設定

管理ユーザ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 .bashrc

7.データベースの初期化

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_hba.confファイルは全てのホストの接続を禁止しているため、全てのホストの接続を許可するよう変更する。
なお、この作業はpostgresユーザで行う。

# su - postgres
$ vi /usr/local/pgsql/data/pg_hba.conf

pg_hba.confファイルの末尾に、以下の行を追加する。

host all 0.0.0.0 0.0.0.0 trust

3.PHP4のインストール

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 startssl

5.動作確認

phpinfo.phpというファイルを以下の内容で作成し、クライアントからブラウズする。

<?php phpinfo(); ?>

「PHP Version 4.0.6」という表が出てきたらOK。

4.PHPLIBのインストール

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/phplib

3.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というスクリプトファイルを実行すればテーブルが作成されるが、このまま実行すると文法エラーが発生するので、以下の手順で修正する。

  1. viで/usr/local/apache/phplib/stuff/create_database.pgsqlを開く。
  2. //で始まる行を全て削除する。
  3. 保存する。

修正したら、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;
\q

5.接続データベースの設定

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を再起動する。

5.後書き

以上の設定で、SSL経由でPHP4を使ってPostgreSQLデータベースに アクセスできるようになった。


[ TOP ]