15.6. Kerberos

寄稿: Mark Murray. 基にした文書の執筆: Mark Dapoz.

訳: 有村 光晴 .

Kerberosは、 サーバのサービスによってユーザが安全に認証を受けられる ようにするための、ネットワークの付加システム及びプロトコルです。 リモートログイン、リモートコピー、 システム間での安全なファイルのコピ ーやその他のリスクの高い仕事がかなり安全に、 そしてこれまでより制御 できるようになります。

以下の文章は、 FreeBSD用として配布されているKerberosをセットアップ する際のガイドとして読むことができます。しかし、 完全な説明が必要な場合には、マニュアルページを読んだ方がよい でしょう。

15.6.1. Kerberos のインストール

Kerberos は選択が任意な FreeBSD のコンポーネントです。 もっとも簡単なインストール方法は、FreeBSD のインストール時に sysinstall で 'krb4' または 'krb5' 配布物を選択することです。 そうすると、Kerberos の 'eBones' (KerberosIV) または 'Heimdal' (Kerberos5) 実装がインストールされます。 これらの実装が入っているのは、 これがアメリカ合衆国およびカナダの外で開発されたものであるため、 アメリカ合衆国からの暗号ソフトウェアの輸出が制限されていた時代でも アメリカ合衆国およびカナダ以外の国に住んでいるシステム所有者の手に入るものだったからです。

ほかに、MIT で実装された Kerberos が Ports Collection の security/krb5 から利用できます。

15.6.2. 初期データベースの作成

この作業はKerberosサーバだけでおこないます。まず、 古いKerberosの データベースが存在しないことを確認してください。 ディレクトリ/etc/kerberosIVに移って、 次のファイルだけが 存在することをチェックします。

# cd /etc/kerberosIV
# ls
README          krb.conf        krb.realms

もし他のファイル (principal.*master_key) が 存在する場合には、 kdb_destroyというコマンドで古い Kerberosデータベースを消してください。 Kerberosが走っていなければ、 単に余計なファイルを消せばよいです。

まず、krb.confkrb.realmsを編集してKerberosの 管理領域 (realm) を定義してください。 ここでは管理領域が EXAMPLE.COM で、サーバ名が grunt.example.com であるとします。 krb.conf というファイルを次のように編集してください。

# cat krb.conf
EXAMPLE.COM
EXAMPLE.COM grunt.example.com admin server
CS.BERKELEY.EDU okeeffe.berkeley.edu
ATHENA.MIT.EDU kerberos.mit.edu
ATHENA.MIT.EDU kerberos-1.mit.edu
ATHENA.MIT.EDU kerberos-2.mit.edu
ATHENA.MIT.EDU kerberos-3.mit.edu
LCS.MIT.EDU kerberos.lcs.mit.edu
TELECOM.MIT.EDU bitsy.mit.edu
ARC.NASA.GOV trident.arc.nasa.gov

この例にあるような他の管理領域は、実際には必要ありません。 この例は複数の管理領域を認識する方法を示したものですので、 これらの行は含めなくても結構です。

1行目はこのシステムが動いている管理領域の名前です。 他の行は管理領域とホスト名のエントリです。 行の1つめの単語が管理領域で、2つめがその管理領域の中で “鍵配布センター”(Key Distribution Center) として働くホスト名です。ホスト名の次に admin server と書いてある場合には、そのホストが 管理データベースサーバ (Administrative Database Server) も提供することを意味します。 これらの単語について詳しく知りたい場合には Kerberos のマニュアルページをご覧ください。

ここで、EXAMPLE.COM という管理領域に grunt.example.com およびその他の .example.com ドメインのすべてのホストを追加しなければなりません。 krb.realms は次のようになります。

# cat krb.realms
grunt.example.com EXAMPLE.COM
.example.com EXAMPLE.COM
.berkeley.edu CS.BERKELEY.EDU
.MIT.EDU ATHENA.MIT.EDU
.mit.edu ATHENA.MIT.EDU

もう一度注意しますが、他の管理領域を書く必要はありません。 これらは複数の管理領域を認識できるようにマシンを設定する方法を 示した例ですので、これらの行は消して構いません。

1行目は名前をつけた管理領域に 特定の システムを含めるための ものです。 残りの行は名前をつけた管理領域にサブドメインのデフォルトの システムを含めるためのものです。

これでデータベースを作成する準備ができました。 この操作はKerberos サーバ (鍵配布センター) を起動するだけです。 kdb_initコ マンドを次のように実行してください。

# kdb_init
Realm name [default  ATHENA.MIT.EDU ]: EXAMPLE.COM
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.

Enter Kerberos master key:

ここで鍵を保存して、 ローカルのマシンにあるサーバが取り出せるように します。 それにはkstashコマンドを使用します。

# kstash

Enter Kerberos master key: 

Current Kerberos master key version is 1.

Master key entered.  BEWARE!

これで暗号化されたマスタパスワードが /etc/kerberosIV/master_key に保存されました。

15.6.3. すべてが動くようにするための設定

Kerberosを導入する それぞれの システムのデータベースに、2つ のprincipal (主体名) を追加する必要があります。その名前は kpasswdrcmdです。 これら2つのprincipalは、個々 のシステムにおいて、 システム名と同じ名前のインスタンスと組にして作成 されます。

これらの kpasswdrcmd というデーモンによって、他の システムからKerberosのパスワードを変更したり、 rcprlogin, rshといったコマンドを実行したりできるよ うになります。

それでは実際にこれらのエントリを追加しましょう。

# 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: passwd
Instance: grunt

<Not found>, Create [y] ? y

Principal: passwd, Instance: grunt, kdc_key_ver: 1
New Password:                    <---- ここは「RANDOM」と入力してください
Verifying password

New Password:                    <---- ここは「RANDOM」と入力してください

Random password [y] ? 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: rcmd
Instance: grunt

<Not found>, Create [y] ?

Principal: rcmd, Instance: grunt, 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:                  <---- 何も入力しないと終了します

15.6.4. サーバファイルの作成

次に、各マシンにおけるサービスを定義している、 すべてのインスタンスを展開します。 これには ext_srvtab というコマンドを使用します。 このコマンドで作成されるファイルは、Kerberos の各クライアントの /etc/kerberosIV ディレクトリに安全な方法で コピーまたは移動する必要があります。 このファイルはそれぞれのサーバとクライアントに存在しなければならず、 また Kerberos の運用において重要なものです。

# ext_srvtab grunt

Enter Kerberos master key: 

Current Kerberos master key version is 1.

Master key entered.  BEWARE!
Generating 'grunt-new-srvtab'....

このコマンドは一時的なファイルを作成するだけです。 ファイル名をすべ てのサーバが読めるような srvtab という名前に変更しな ければなりません。 mvコマンドを用いてシステムの場所に移動 してください。

# mv grunt-new-srvtab srvtab

そのファイルがクライアントに配るためのもので、 ネットワークが安全で はないと思われる場合には、 client-new-srvtab を移動 可能なメディアにコピーして物理的に安全な方法で運んでください。 クラ イアントの/etc/kerberosIVディレクトリで、 名前を srvtabに変更し、 modeを600にするのを忘れないでください。

# mv grumble-new-srvtab srvtab
# chmod 600 srvtab

15.6.5. データベースへのユーザの追加

ここで、 ユーザのエントリをデータベースに追加する必要があります。 始めに、 ユーザjaneのエントリを作成してみましょう。 kdb_edit を用いて次のように作成してください。

# 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: jane
Instance:

<Not found>, Create [y] ? y

Principal: jane, Instance: , kdc_key_ver: 1
New Password:                    <---- 安全なパスワードを入れてください
Verifying password

New Password:                    <---- もう一度パスワードを入れてください

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:                  <---- 何も入力しないと終了します

15.6.6. すべてのテスト

まず始めにKerberosデーモンを起動する必要があります。 /etc/rc.conf ファイルを正しく編集してあれば、マシンを再 起動することでに自動的にデーモンが起動します。 これはKerberosサー バでのみ必要です。 Kerberosクライアントは/etc/kerberosIVか ら必要なものを自動的に入手します。

# kerberos &
Kerberos server starting
Sleep forever on error
Log file is /var/log/kerberos.log
Current Kerberos master key version is 1.

Master key entered.  BEWARE!

Current Kerberos master key version is 1
Local realm: EXAMPLE.COM
# kadmind -n &
KADM Server KADM0.0A initializing
Please do not use 'kill -9' to kill this job, use a
regular kill instead

Current Kerberos master key version is 1.

Master key entered.  BEWARE!

さあ、これで上で作成した jane というIDのチケットを kinitコマンドで得ることができます。

% kinit jane
MIT Project Athena (grunt.example.com)
Kerberos Initialization for "jane"
Password:

klist コマンドを用いてトークンを見て、 きちんとチケットを持って いるかどうか確認してください。

% klist
Ticket file:    /tmp/tkt245
Principal:      jane@EXAMPLE.COM

  Issued           Expires          Principal
Apr 30 11:23:22  Apr 30 19:23:22  krbtgt.EXAMPLE.COM@EXAMPLE.COM

passwd コマンドを用いてパスワードを変更して、 kpasswd デーモンが Kerberos データベースに対して認証されるかどうかチェックして ください。

% passwd
realm EXAMPLE.COM
Old password for jane:
New Password for jane:
Verifying password
New Password for jane:
Password changed.

15.6.7. su 特権の追加

Kerberos は root 権限が必要な ユーザに対し、 su コマンドのパスワードをユーザ毎に 別のもの として持つことを可能にします。 rootsu できる権利を与えられた id を追加します。これは、 principal に付いている root というインスタンスに よって制御されています。 kdb_editを用いて jane.rootというエントリを Kerberosデータベースに作成します。

# 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: jane
Instance: root

<Not found>, Create [y] ? y

Principal: jane, Instance: root, kdc_key_ver: 1
New Password:                    <---- 安全なパスワードを入れます
Verifying password

New Password:                    <---- もう一回パスワードを入れます

Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? 
Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- ここは短くしてください
Attributes [ 0 ] ? 
Edit O.K.
Principal name:                  <---- 何も入力しないと終了します

実際にトークンをもらって、 ちゃんと働いているかどうか確認しましょう。

# kinit jane.root
MIT Project Athena (grunt.example.com)
Kerberos Initialization for "jane.root"
Password:

ここで root ユーザの .klogin ファイルにユーザを追加する必要があります。

# cat /root/.klogin
jane.root@EXAMPLE.COM

su してみましょう。

% su
Password:

どのトークンを持っているか見てみましょう。

# klist
Ticket file:	/tmp/tkt_root_245
Principal:      jane.root@EXAMPLE.COM

  Issued           Expires          Principal
May  2 20:43:12  May  3 04:43:12  krbtgt.EXAMPLE.COM@EXAMPLE.COM

15.6.8. 他のコマンドの使用

ここまでの例では、jane という principal を root とい うインスタンス付きで作成しました。 これはユーザと同じ名前をprincipalと しており、 Kerberosのデフォルトの値です; <username>.root という形式の <principal>.<instance>で、 必要なエントリが root のホームディレクトリの .klogin ファイルにあれば、 <username>rootsu できます。

# cat /root/.klogin
jane.root@EXAMPLE.COM

同様に、ユーザのホームディレクトリの .kloginファイルに次の ような行がある場合には

% cat ~/.klogin
jane@EXAMPLE.COM
jack@EXAMPLE.COM

jane または jack という名前で (前述のkinit によって) 認証されている EXAMPLE.COM という管理領域のユーザ なら誰でもrloginrsh, rcp等によってこ のシステム (grunt) のjaneのアカウントまたはファ イルにアクセスできます。

たとえば、jane が他のシステムに Kerberos を用いて login します。

% kinit
MIT Project Athena (grunt.example.com)
Password: 
% rlogin grunt
Last login: Mon May  1 21:14:47 from grumble
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
	The Regents of the University of California.   All rights reserved.

FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995

次の例では、Jack が同じマシンの Jane のアカウントに login します。jane.klogin ファイルを前述のように設定しており、 Kerberos では jack という principal をインスタンスなしで設定してあります。

% kinit
% rlogin grunt -l jane
MIT Project Athena (grunt.example.com)
Password: 
Last login: Mon May  1 21:16:55 from grumble
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
	The Regents of the University of California.   All rights reserved.

FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。