1998-01-31
桑村 潤
このドキュメントは http://www.rccm.co.jp/~juk/pgsql/INSTALL+krb.html にあります。
更新履歴: 1998-01-31 MOD JuK 6.2についての文書から6.4.2 についてに書き換え
Kerberos は MIT(マサチューセッツ工科大学) で開発されたオープンシステムのための認証システムです。現在の最新版はバージョン5ですが、合州国政府の輸出規制のため自由には利用できません。ここで、利用する KTH-KRB は Kerberos4 の国際版 eBones を KTH(スウェーデン王立技術研究所)で移植・維持管理されているもので、元の Kerberos4 よりさらに利用しやすいものとなっています。ここでは、 PostgreSQL を KTH 版 Kerberos4 の認証で利用するための、PostgreSQL のインストールの仕方について述べます。
1. ソースコードの用意
2. コンパイルの前準備
3. コンパイルとインストール
4. データベースの作成と初期化
5. Kerberos サーバに PostgreSQL サービスの登録
6. Kerberos 化された PostgreSQL のテスト
7. 付録: PostgreSQL に附属のテスト
次の場所から(ミラーサイトがありますでなるべく近くのサイトを利用して)
postgresql-6.4.2.tar.gz をダウンロードします。ソースを展開します。
% tar xvfz postgresql-6.4.2.tar.gz
その他、必要なパッチがあれば、適宜当てておきます。
SRAの石井さんによるパッチキットが用意されています。
にあります。例えば、jumbo-990114.patch.gz というパッチキットをダウンロードして、 このパッチを当てたい場合は:% zcat jumbo-990114.patch.gz | patch -p0のようにします。
あるいはパッチ済みのソースコードアーカイブもありますのでそれをそのまま 展開して使うこともできます。
README, INSTALL, README.jp などのファイルに目を通します。
configure を実行します。
% cd postgresql-6.4.2/src % ./configure あるいは % ./configure --with-mb=EUC_JP --with-tcl --with-perl --with-odbc のように必要なオプションを指定をできます。[注] 以前のリリースのようにMakefile.customで指定する必要はありません。 [注] また、 hba での指定が可能となったため、--disable-hba の指定も必要 無くなりました。
Makefile.global を編集し、KRBVERS 変数に Kerberos のバージョンを指定し、このファイルの終りに Kerberos 認証のためのコンパイルオプションの追加を行ないます。
... KRBVERS= 4 ...
make を実行すると、必要な実行モジュールなどは全て作成されます。
% make
PostgreSQL の管理者アカウントにてインストールを行ないます。デフォルトのコンフィグレーションでは /usr/local/pgsql/ ディレクトリの下にインストールされます。PostgreSQLがインストールされるディレクトリを作成しておき、そのディレクトリの所有社をPostgreSQLの管理者アカウントにしておきます。
ここでは自分が管理者なので(su しないで)そのまま行ないます。
[注] PostgreSQL の管理者を root にしてはなりません。
% make install
まず、ルートになって(su root して)、ELF 共有ライブラリを再読み込みさせます。始めてインストールした場合は、/etc/ld.so.conf に PostgreSQL のライブラリディレクトリを追加:
# su # echo "/usr/local/pgsql/lib" >> /etc/ld.so.confし、ldconfig コマンド
# /sbin/ldconfigを実行します。
あるいは、LD_LIBRARY_PATH 環境変数に/usr/local/pgsql/libを加えます。
新規にデータベースを作成するには initdb コマンドでデータベースディレクトリの初期化を行ないます。古いデータベースディレクトリがある場合は、rm コマンドで削除しておく必要があります。
(ただし、以前のバージョンのデータベースからのアップデートは、元のデータベースのバージョンにもよりますが、データのダンプ(pg_dump/pg_dumpall)とリロード(psqlで行ないます)を行なうかあるいはデータベースのアップグレード(pg_upgrade)を行なう必要があります。これらの手順については FAQ やオンラインマニュアルあるいは文書INSTALLなどを参照下さい。)
% setenv PGDATA /usr/local/pgsql/data % setenv PGLIB /usr/local/pgsql/lib % rm -rf $PGDATA % initdb
% postmaster -S % setenv PGHOST penty % createdb
バージョンアップ等で以前のバージョンのデータベースから pg_dump コマンドによるダンプデータがある場合はそのデータをリロードします。
% psql -e juk < juk.dump ここで、 juk: データベース名 juk.dump: 以前のバージョンでのダンプデータ
rootになって(suし)、サービスpostgres_dbmsを登録します。
% su # echo "postgres_dbms 5432/tcp # Reserve for PostgreSQL" >> /etc/services
ホストアクセス制御ファイル(data/pg_hba.conf)にKerberos認証の設定を行ないます。
たとえば、次の設定はどこからアクセスする場合にもKerberos4の認証を必要とします。
host all 0.0.0.0 0.0.0.0 krb4
なお、Kerberos認証による接続を行なうには、Kerberosサーバのデータベーステーブルに登録し(5.)、Kerberos のチケットを取得(6.)してからアクセスします(psqlコマンドなどを使います)。
[注: Kerberos の認証のために PGHOST 環境変数にPostgreSQLサーバのホスト名 (postgres_dbms サービスのインスタンス)を設定するかコマンドのオプショ ンで(psql の場合は -h オプションの後にホスト名が指定できます)指定す る必要があります。 ]
ここで、Kerberos4 システムがあらかじめインストールされているとします。私の使用した Kerberos4 は KTH バージョンの eBones で、 http://www.pdc.kth.se/kth-krb/ から入手できます。
Kerberos4 については、http://www.rccm.co.jp/~juk/krb/ に少しは役立につ情報があるかも知れませんので、そちらも参照下さい。
Kerberos デーモンは、Kerberos の 鍵発行局(KDC: Key Distribution Center) の役割をはたしますので、そのデーモンの走る Kerberos サーバマシンにて PostgreSQL サーバのプリンシパルとインスタンスを登録します。ここでは、PostgreSQL のプリンシパル名はデフォルトの postgres_dbms 、インスタンスは PostgreSQL サーバマシンのホスト名の penty です。
行末に "<=" があるのは入力行です。
kdc# kdb_edit <= Opening database... Enter Kerberos master key: ******** <= Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: postgres_dbms <= Instance: penty <=, Create [y] ? Principal: postgres_dbms, Instance: penty, kdc_key_ver: 1 New Password: RANDOM <= Verifying password New Password: RANDOM <= Random password [y] ? <= Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? <= Max ticket lifetime (*5 minutes) [ 255 ] ? <= Attributes [ 0 ] ? <= Edit O.K. Principal name: <= kdc#
# この作業は次の ksrvutil コマンドを使ってもます。
PostgreSQL サーバに始めて、Kerberos のアプリケーションをインストールする場合は、/etc/krb.conf と /etc/krb.realm の設定を行ないます。たとえば、
# cat /etc/krb.conf MY.REALM.JP MY.REALM.JP kdc.my.realm.jp admin server # cat /etc/krb.realms .my.realm.jp MY.REALM.JPのように設定します。
PostgreSQL サーバの Kerberos サービステーブル(srvtab)に Kerberos 認証に必要な posgres_dbms の鍵の登録を行ないます。登録は PostgreSQL サーバマシンでルートになって行ないます。ksrvutil コマンドを使うためには、PostgreSQL サーバマシンに Kerberos の管理コマンドがインストールされていることと、Kerberos サーバマシンで Kerberos の管理デーモン(kadmind)が走っている必要があります。
penty% su penty# ksrvutil add <= Name: postgres_dbms <= Instance: penty <= Realm: MY.REALM.JP <= Version number: 1 New principal: postgres_dbms.penty@MY.REALM.JP; version 1 Is this correct? (y,n) [y] y <= Password: ******** Verifying password Password: ******** <= Key successfully added. Would you like to add another key? (y,n) [y] n <= Old keyfile in /etc/srvtab.old. penty#
(ksrvutil コマンドがインストールされていない場合、)この作業は従来 Kerberos サーバマシンで ext_srvtab コマンドを実行し、
kdc# ext_srvtab penty <= Enter Kerberos master password: ******** <= Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'penty-new-srvtab'....ジェネレートされたサービステーブルファイル(ここでは penty-new-srvtab) を PostgreSQL サーバに安全な方法(ネットワークを介さずフロッピーディスクなど)で輸送し、/etc/srvtab ファイルとしてインストールすることによって行なわれました。
PostgreSQL のバックエンド(postmaster)用に postgres というグループを作成し、postmaster が srvtab を読めるようにアクセス権を与えます。
penty# chgrp postgres /etc/srvtab penty# chmod g+r /etc/srvtab penty# ls -l /etc/srvtab -rw-r----- 1 root postgres 71 Oct 8 23:31 /etc/srvtab
もちろん postmaster を起動する PostgreSQL の管理者ユーザ(juk)は postgres グループに属している必要があります。これは、管理者ユーザで id コマンドを実行すると確認できます。
penty% grep postgres /etc/group postgres::77:juk penty% id uid=1037(juk) gid=100(users) groups=100(users),77(postgres)
ここでは、postgres_dbms の登録されている Kerberos のレルムにあらかじめユーザ(プリンシパル) juk が登録されていることとします。(プリンシパルの登録方法は 「MIT Kerberos4 オペレーションノート」 などを参照下さい。http://www.rccm.co.jp/~juk/krb/operation.txt に拙訳があります。)
% postmaster -S <=
Kerberos 化されたサービスにアクセスするには、あらかじめ発券許可証が (TGT:Ticket Granting Ticket)必要です。TGT がない場合は、認証に失敗し postmaster にはアクセスできません。
% setenv PGHOST penty <= % psql <= Connection to database 'juk' failed. connectDB() -- authentication failed with penty
kinit もしくは kauth コマンドで TGT を取得します。(kauth を使うとダイアルアップ接続の場合にでも TGT を取得することが可能です。)
% kinit <= eBones International (penty) Kerberos Initialization Kerberos name: juk <= Password: ******** <= % klist <= Ticket file: /tmp/tkt1037 Principal: juk@MY.REALM.JP Issued Expires Principal Jun 19 00:45:58 Jun 19 10:45:58 krbtgt.MY.REALM.JP@MY.REALM.JP
TGT を取得後に psql が正常に実行された場合です。
% psql <= Welcome to the POSTGRESQL interactive sql monitor: Please read the file COPYRIGHT for copyright terms of POSTGRESQL type \? for help on slash commands type \q to quit type \g or terminate with semicolon to execute query You are currently connected to the database: juk juk=> \q <=
TGT を取得して psql コマンドを実行したことによって、セッションチケット postgres_dbms.penty@MY.REALM.JP が自動的に取得されている事に注意してください。
% klist <= Ticket file: /tmp/tkt1037 Principal: juk@MY.REALM.JP Issued Expires Principal Jun 19 00:45:58 Jun 19 10:45:58 krbtgt.MY.REALM.JP@MY.REALM.JP Jun 19 00:46:18 Jun 19 10:46:18 postgres_dbms.penty@MY.REALM.JP
postmaster を実行し、src/test/regressディレクトリでテストを実行します(READMEを参照)。
% /usr/local/pgsql/bin/postmaster -s & % make all runtest
参考のため、src/test/bench ディレクトリで Wisconsin ベンチマークを実行します。
% make bench.out % vi bench.out (Linux では最後の '>' 以降を削除します。) % make bench.out.perquery
src/test/performance ディレクトリに性能テストがあります。このテストの実行 はpostmasterを止めてから行ないます。
Linux の time コマンドの出力フォーマットのため、出力結果 Results.pgsql には、ユーザ(user)CPU 時間しか記録されません。経過 (elapse)時間は Tmp.pgsql に出力されているので、これを処理して (extests.pl)経過時間を出力する必要があります。
% start-pgsql.sh % runtests.pl pgsql % extests.pl < Tmp.pgsql > Results.pgsqlなお、extests.plは以下の通りです。
#!/usr/bin/perl while (<>) { $str = $_; if (!/^0/) { ($test, $rtime) = split (/: /, $str); ($usr, $system, $rtime, $rest) = split (/[ ]/, $rtime); $etime = substr($rtime, 0, index( $rtime, "e")); ($emin, $esec) = split (/:/, $etime); $rtime = $emin * 60 + $esec; print "$test: $rtime\n"; } }
src/test/suite ディレクトリにテストスーツがあります。このテストの実 行は "*.sql" をそれぞれ実行し結果をresultsサブディレクトリのものとdiff コマンドで比較するのですが、出力が多過ぎて、合っているところと違ってい るところの区別がつき辛いので、以下のような C-シェルスクリプトで行なう と少しはわかりやすくなります。
#!/bin/csh -f mkdir -p old mkdir -p new foreach f (*.sql) psql -eq < $f >& $f.out end foreach f (*.out) sed -e 's/^ *//' -e 's/|/ /g' -e 's/-+/-/g' -e 's/[ ]*$//' $f | egrep -v "row.*\)" | grep -v ^$ > new/$f sed -e 's/-- /-/g' -e 's/ / /g' -e 's/[ ]*$//' results/$f | grep -v ^$ > old/$f end date > diffs echo "" >> diffs echo "==================" >> diffs echo "Result differences" >> diffs echo "==================" >> diffs echo "" >> diffs foreach f (*.out) echo $f >> diffs echo ======================================== >> diffs diff -b old/$f new/$f >> diffs echo "" >> diffs end rm -rf old/ new/