FreeBSD ハンドブック
前のページ | 第 15章セキュリティ | 次のページ

# 15.6. Kerberos

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

訳: 有村 光晴 `<arimura@jp.FreeBSD.org>`.

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.conf` と `krb.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 (主体名) を追加する必要があります。その名前は `kpasswd`と`rcmd`です。 これら2つのprincipalは、個々 のシステムにおいて、 システム名と同じ名前のインスタンスと組にして作成 されます。

これらの `kpasswd` と `rcmd` というデーモンによって、他の システムからKerberosのパスワードを変更したり、 `rcp`や `rlogin`, `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` コマンドのパスワードをユーザ毎に 別のもの として持つことを可能にします。 `root` に `su` できる権利を与えられた 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>` が `root` に `su` できます。

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

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

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

`jane` または `jack` という名前で (前述の`kinit` によって) 認証されている `EXAMPLE.COM` という管理領域のユーザ なら誰でも`rlogin` や `rsh`, `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

前のページ | ホーム | 次のページ
S/Key | 上に戻る | ファイアウォール

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

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