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 に附属のテスト
次の場所から(ミラーサイトがありますでなるべく近くのサイトを利用して)
postgresql-6.2.tar.gz を取得します。ソースを展開します。
% tar xvfz postgresql-6.2.tar.gz
その他、必要なパッチ(日本語パッチなど)があれば、適宜当てておきます。
(SRAの石井さんによる日本語パッチ 6.2jpPL1.patch.gz は、
にあります。)% zcat 6.2jpPL1.patch.gz | patch -p0
README, INSTALL, README.jp などのファイルに目を通します。INSTALL ファイルには、Linux-ELF 版では、以下の修正をしてもよいと書かれています。
configure を実行します。kerberos 認証を行なうため configure コマンドの引数に "--disable-hba" を付けてバックエンドサーバが HBA(ホスト主導型認証)を行なわないようにします。
% cd postgresql-6.2/src % ./configure --disable-hba
Makefile.global を編集し、KRBVERS 変数に Kerberos のバージョンを指定し、このファイルの終りに Kerberos 認証のためのコンパイルオプションの追加を行ないます。
... KRBVERS= 4 ... ifdef KRBVERS CFLAGS+=$(KRBFLAGS) LDFLAGS+= $(KRBLIBS) endif
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
make を実行すると、必要な実行モジュールなどは全て作成されます。
% make
デフォルトでは /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) としておきます。 ^^^^^^^^^^
まず、ルートになって(su root して)、ELF 共有ライブラリを再読み込みさせます。始めてインストールした場合は、/etc/ld.so.conf に PostgreSQL のライブラリディレクトリを追加:
# su # echo "/usr/local/pgsql/lib" >> /etc/ld.so.confし、次のように:
# /sbin/ldconfig # exitldconfig コマンドを実行します。
# 本当にこれは必要なのかな? たぶん LD_LIBRARY_PATH 環境変数を設定するだけでもいけると思います。
データベースディレクトリの初期化を initdb コマンドで行ないます。古いデータベースディレクトリがある場合は、rm コマンドで削除しておく必要があります。
(以前のバージョンのデータベースからのアップデートにはダンプとリロードを行ないます。ダンプとリロードの方法については FAQ や オンラインマニュアルを参照下さい。)
% setenv PGDATA /usr/local/pgsql/data % setenv PGLIB /usr/local/pgsql/lib % rm -rf $PGDATA % initdb
Kerberos サーバテーブルに登録します(=> 5.)。
バックエンドサーバを起動し、Kerberos のチケットを取得(=> 6.)してから自分のデータベースを作成します。
% postmaster -S % setenv PGHOST penty % createdb
[注: Kerberos の認証のために PGHOST 環境変数を postgres_dbms サービスの インスタンス(サーバのホスト名)に設定するかコマンドのオプションで 指定する必要があります。 ]
バージョンアップ等で以前のバージョンのデータベースから pg_dump コマンドによるダンプデータがある場合はそのデータをリロードします。
% psql -e juk < juk.dump ここで、 juk: データベース名 juk.dump: 以前のバージョンでのダンプデータ
ここで、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
% setenv TZ PST8PDT % date % /usr/local/pgsql/bin/postmaster -s & % make all runtestSRAの石井さんによる日本語パッチには次のテストも含まれます。
% psql -e regression < sql/jp.sql >& jp.out % diff expected/jp.out jp.out % mv jp.out results/
% make bench.out % vi bench.out (Linux では最後の '>' 以降を削除します。) % make bench.out.perquery