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

1997-10-19
桑村 潤

このドキュメントは http://www.rccm.co.jp/~juk/pgsql/INSTALL+krb.html にあります。

更新履歴:
1998-04-08 ADD JuK 6.3.1 での注意。

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


6.3.1 での注意:
バージョン 6.3.1 では、マルチバイトオプション組み込まれ、パッチ の必要が無くなっています。ただし、Makefile.custom での設定変数が "MB=EUC" のように変わっています。詳しくはソース配布に附属の README.mb などを御覧下さい。
また、KERBEROS 認証は、Makefile.global に "KRBVERS= 4" を加えるだけ で、configure のときの "--disable-hba" オプションも必要無くなりました。
6.3.1 の問題点は、scan.l が変わったため、'float8' と 'int4' の比較 演算のオペレータが '>=" のとき右項に負の整数がくるとエラーになります。 この問題は、6.3 の scan.l を持ってくると直るようです。

1. ソースコードの用意

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

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

postgresql-6.2.tar.gz を取得します。

ソースを展開します。

	% tar xvfz postgresql-6.2.tar.gz

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

その他、必要なパッチ(日本語パッチなど)があれば、適宜当てておきます。

(SRAの石井さんによる日本語パッチ 6.2jpPL1.patch.gz は、

にあります。)
	% zcat 6.2jpPL1.patch.gz | patch -p0

2. コンパイルの前準備

2.1 ドキュメントの確認

README, INSTALL, README.jp などのファイルに目を通します。INSTALL ファイルには、Linux-ELF 版では、以下の修正をしてもよいと書かれています。

(1) template/linux-elf で CFLAGS の設定行に " -m486" オプションを加えます。
(2) include/config.h に "#define HAVE_SIGSETJMP 1" を設定します。
(1)は configure の実行前に行ない、(2) は configure の実行後に行なうことにご注意下さい。

2.2 コンフィグレーション

configure を実行します。kerberos 認証を行なうため configure コマンドの引数に "--disable-hba" を付けてバックエンドサーバが HBA(ホスト主導型認証)を行なわないようにします。

	% cd postgresql-6.2/src
	% ./configure --disable-hba

2.3 Makefile.global の編集

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

	...

	KRBVERS= 4
	...

	ifdef KRBVERS
	   CFLAGS+=$(KRBFLAGS)
	   LDFLAGS+= $(KRBLIBS)
	endif

2.4 Makefile.custom の作成

Makefile.custom を自分の環境に合わせて作成します。 例えば、私の Makefile.custom は以下のような内容です。

HAVE_Cplusplus= true
USE_TCL= true
TCL_INCDIR= /usr/local/include
TCL_LIBDIR= /usr/local/lib
TCL_LIB= -ltcl7.6jp
TK_INCDIR= /usr/local/include
TK_LIBDIR= /usr/local/lib
TK_LIB= -ltk4.2jp
X11_INCDIR= /usr/include
X11_LIBDIR= /usr/X11/lib
X11_LIB= -lX11
JP=1

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

3.1 コンパイル

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

	% make

3.2 インストール

デフォルトでは /usr/local/pgsql/ ディレクトリの下にインストールされます。 PostgreSQL の管理者は自分なので(su しないで)そのまま行ないます。
[注] PostgreSQL の管理者を root にしてはなりません。

	% make install

Tcl/Tk の実行モジュールを使いたい場合は、Makefile.custom での指定の他、ソースコードのあるサブディレクトリにてコンパイルとインストールをする必要があります。

	% cd src/bin/pgtclsh
	% make install

    [注]
	 linux-elf 等では pgtclsh 等の実行モジュールを作らなくても、
	tcl/tk のコマンドラインから:
	    % load /usr/local/pgsql/lib/libpgtcl.so
	を実行することによって pgsql のインターフェースライブラリをロー
	ドして使えます(石井@SRAさんより)。ただし、libpgtcl.so を作る
	時のライブラリのリンクの順番に気を付ける必要があります。具体的
	には、src/interfaces/libpgtcl/Makefile で次のように:
	    LDFLAGS += -L $(SRCDIR)/interfaces/libpq -lpq $(KRBLIBS)
	としておきます。                                  ^^^^^^^^^^

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

まず、ルートになって(su root して)、ELF 共有ライブラリを再読み込みさせます。始めてインストールした場合は、/etc/ld.so.conf に PostgreSQL のライブラリディレクトリを追加:

	# su
	# echo "/usr/local/pgsql/lib" >> /etc/ld.so.conf
し、次のように:
	# /sbin/ldconfig
	# exit
ldconfig コマンドを実行します。

# 本当にこれは必要なのかな? たぶん LD_LIBRARY_PATH 環境変数を設定するだけでもいけると思います。

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

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

データベースディレクトリの初期化を initdb コマンドで行ないます。古いデータベースディレクトリがある場合は、rm コマンドで削除しておく必要があります。

(以前のバージョンのデータベースからのアップデートにはダンプとリロードを行ないます。ダンプとリロードの方法については FAQ や オンラインマニュアルを参照下さい。)

	% setenv PGDATA /usr/local/pgsql/data
	% setenv PGLIB /usr/local/pgsql/lib
	% rm -rf $PGDATA
	% initdb

4.2 データベースの作成

Kerberos サーバテーブルに登録します(=> 5.)。

バックエンドサーバを起動し、Kerberos のチケットを取得(=> 6.)してから自分のデータベースを作成します。

	% postmaster -S
	% setenv PGHOST penty
	% createdb

    [注:
	Kerberos の認証のために PGHOST 環境変数を postgres_dbms サービスの
	インスタンス(サーバのホスト名)に設定するかコマンドのオプションで 
	指定する必要があります。
    ]

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

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

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

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 ディレクトリで regression テスト を実行。(そのディレクトリの README を参照)
	% setenv TZ PST8PDT
	% date
	% /usr/local/pgsql/bin/postmaster -s &
	% make all runtest
SRAの石井さんによる日本語パッチには次のテストも含まれます。
	% psql -e regression < sql/jp.sql >& jp.out
	% diff expected/jp.out jp.out
	% mv jp.out results/

7.2 Wisconsin ベンチマークテスト

参考のため、src/test/bench ディレクトリで Wisconsin ベンチマークを実行します。
	% make bench.out
	% vi bench.out
	(Linux では最後の '>' 以降を削除します。)
	% make bench.out.perquery