Kerberos4 認証 PostgreSQL-6.4.2 のインストール(Linux-ELF)

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 に附属のテスト


1. ソースコードの用意

1.1 ソースコードをダウンロードし展開します。

次の場所から(ミラーサイトがありますでなるべく近くのサイトを利用して)

postgresql-6.4.2.tar.gz をダウンロードします。

ソースを展開します。

	% tar xvfz postgresql-6.4.2.tar.gz

1.2 必要なパッチがあればそれを当てます。

その他、必要なパッチがあれば、適宜当てておきます。

SRAの石井さんによるパッチキットが用意されています。

にあります。例えば、jumbo-990114.patch.gz というパッチキットをダウンロードして、 このパッチを当てたい場合は:
	% zcat jumbo-990114.patch.gz | patch -p0
のようにします。

あるいはパッチ済みのソースコードアーカイブもありますのでそれをそのまま 展開して使うこともできます。

2. コンパイルの前準備

2.1 ドキュメントの確認

README, INSTALL, README.jp などのファイルに目を通します。

2.2 コンフィグレーション

configure を実行します。

	% cd postgresql-6.4.2/src
	% ./configure 

あるいは 
	% ./configure  --with-mb=EUC_JP --with-tcl --with-perl --with-odbc
のように必要なオプションを指定をできます。




[注] 以前のリリースのようにMakefile.customで指定する必要はありません。
[注] また、 hba での指定が可能となったため、--disable-hba の指定も必要
    無くなりました。


2.3 Makefile.global の編集

Makefile.global を編集し、KRBVERS 変数に Kerberos のバージョンを指定し、このファイルの終りに Kerberos 認証のためのコンパイルオプションの追加を行ないます。

	...

	KRBVERS= 4
	...

3. コンパイルとインストール

3.1 コンパイル

make を実行すると、必要な実行モジュールなどは全て作成されます。

	% make

3.2 インストール

PostgreSQL の管理者アカウントにてインストールを行ないます。デフォルトのコンフィグレーションでは /usr/local/pgsql/ ディレクトリの下にインストールされます。PostgreSQLがインストールされるディレクトリを作成しておき、そのディレクトリの所有社をPostgreSQLの管理者アカウントにしておきます。

ここでは自分が管理者なので(su しないで)そのまま行ないます。
[注] PostgreSQL の管理者を root にしてはなりません。

	% make install

3.3 共有ライブラリの再読み込み

まず、ルートになって(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を加えます。

3.4 インターフェースモジュールのインストール

各言語インターフェースのモジュールは、そのインストレーションにもよりますが、root などになって(suして)行なう必要があるかもしれません。ソースツリーの src/interfaces/ 下のサブディレクトリにある各言語インターフェースにある文書などを参照してください。

4. データベースの作成と初期化

4.1 PostgreSQLデータベースディレクトリの初期化

新規にデータベースを作成するには 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

4.2 データベースの作成

	% postmaster -S
	% setenv PGHOST penty
	% createdb

4.3 データベースのリロード

バージョンアップ等で以前のバージョンのデータベースから pg_dump コマンドによるダンプデータがある場合はそのデータをリロードします。

	% psql -e juk < juk.dump
	ここで、
		juk:	  データベース名
		juk.dump: 以前のバージョンでのダンプデータ	

4.4 Kerberos の認証の設定

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 オプションの後にホスト名が指定できます)指定す
	る必要があります。
    ]

5. Kerberos サーバに PostgreSQL サービスの登録

ここで、Kerberos4 システムがあらかじめインストールされているとします。私の使用した Kerberos4 は KTH バージョンの eBones で、 http://www.pdc.kth.se/kth-krb/ から入手できます。

Kerberos4 については、http://www.rccm.co.jp/~juk/krb/ に少しは役立につ情報があるかも知れませんので、そちらも参照下さい。

5.1 Kerberos の鍵発行局にプリンシパル postgres_dbms を登録

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 コマンドを使ってもます。

5.2 PostgreSQL サーバに postgres_dbms の鍵を登録

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 ファイルとしてインストールすることによって行なわれました。

5.3 postmaster に 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)

6. Kerberos 化された PostgreSQL のテスト

6.1 postmaster を実行し、アクセスのテストを行ないます。

ここでは、postgres_dbms の登録されている Kerberos のレルムにあらかじめユーザ(プリンシパル) juk が登録されていることとします。(プリンシパルの登録方法は 「MIT Kerberos4 オペレーションノート」 などを参照下さい。http://www.rccm.co.jp/~juk/krb/operation.txt に拙訳があります。)

	% postmaster -S						<=
(1) Kerberos のチケットを取得しない場合。

Kerberos 化されたサービスにアクセスするには、あらかじめ発券許可証が (TGT:Ticket Granting Ticket)必要です。TGT がない場合は、認証に失敗し postmaster にはアクセスできません。

	% setenv PGHOST penty					<=
	% psql							<=
	Connection to database 'juk' failed.
	connectDB() --  authentication failed with penty
(2) チケットの取得と確認。

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
(3) チケットを取得している場合。

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						<=
(4) チケットの確認。

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

7.付録: PostgreSQL に附属のテスト

7.1 regression テスト

postmaster を実行し、src/test/regressディレクトリでテストを実行します(READMEを参照)。

	% /usr/local/pgsql/bin/postmaster -s &
	% make all runtest

7.2 Wisconsin ベンチマークテスト

参考のため、src/test/bench ディレクトリで Wisconsin ベンチマークを実行します。

	% make bench.out
	% vi bench.out
	(Linux では最後の '>' 以降を削除します。)
	% make bench.out.perquery

7.3 性能テスト

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";
	        }
	}

7.3 テストスーツ

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/