第6章 Kerberos を利用したネットワーク認証

目次

6.1. Kerberos で使用する用語
6.2. Kerberos の動作概要
6.3. Kerberos に対するユーザからの外観
6.4. Kerberos のインストールと管理
6.5. さらなる情報

オープンなネットワークでは、通常のパスワードによる認証を除き、ワーク ステーションがユーザを確認できる方法がありません。そのため、一般的な インストール環境の場合、ネットワーク内にあるサービスにアクセスする際には、 毎回パスワードの入力を行なわなければなりません。 Kerberos はこのような 問題に対応するための仕組みで、ユーザを一カ所で登録しておいて、これに対する 認証を他のマシンでも信頼する方法を提供しています。ネットワークの機密を 保持するには、下記の要件が満たされていなければなりません:

Kerberos はこれらの要件を、強い暗号化による認証で実現しています。ここでは Kerberos に関する基本的な動作原理を説明していますが、より詳しい技術的な説明 については、 Kerberos のドキュメンテーションをお読みください。

6.1. Kerberos で使用する用語

下記の用語集では、いくつかの Kerberos 用語を定義しています。

資格

ユーザやクライアントは、対象のサービスに要求を送信するため、何らかの 資格情報を送信する必要があります。 Kerberos では、 チケット認証情報 の 2 つの資格情報を利用します。

チケット

チケットとはクライアントが使用するサーバ単位の証明書で、サービスを 利用するサーバを認証する際に使用します。ここにはサーバの名前と クライアントの名前、クライアントのインターネットアドレスとタイム スタンプ、有効期間と乱数から生成されるセッション鍵が含まれます。 これらすべてのデータは、サーバ側の鍵を利用して暗号化されます。

認証情報

認証情報はチケットと組み合わせることで、チケットを提示したクライアントが 正当なものであることを確認することができます。認証情報はクライアントの 名前とワークステーションの IP アドレス、現在のワークステーションの 時刻とクライアントと関連するサーバだけが知っている暗号化された セッション鍵から構成されています。認証情報はチケットとは異なり、 一度だけしか使用することができません。また、クライアントは 認証情報それ自身を作成することができます。

プリンシパル

Kerberos でのプリンシパルとは、チケットを割り当てることのできる識別 可能な存在 (ユーザやサービス) を指します。プリンシパルには下記から 構成されています:

  • プライマリ— プリンシパルの最初の部分で、ユーザの場合はユーザ名と同じです。

  • インスタンス— プライマリを細分化する任意情報です。この文字列とプライマリとの 間は / で区切られます。

  • 領域— ここでは Kerberos の領域を指定します。通常、この領域には 大文字でのドメイン名を指定します。

相互認証

Kerberos はクライアントとサーバとの間で、一方が他方の識別情報を 確認します。ここではセッション鍵が使用され、これによって通信の 機密を維持しています。

セッション鍵

セッション鍵とは Kerberos が生成した一時的な機密鍵のことを指します。 セッション鍵はクライアント側に伝えられ、チケットの送受信を行なう際の クライアントとサーバの間での暗号鍵として使用します。

リプレイ

ネットワークでは、ほぼすべてのメッセージを傍受や盗難、そして再送信する ことができてしまいます。 Kerberos の世界では、これは攻撃者がチケットと 認証情報を含むサービス向けの要求を取得できてしまうことを意味するため、 もっとも危険なものとなります。攻撃者はそれを再送信 (リプレイ) することで、本来の送信者を偽装しようとすることができてしまいます。 ただし、 Kerberos では複数の仕組みを利用して、そのような偽装を防ぐ ことができるようになっています。

サーバ/サービス

サービス とは、ここでは実行すべき特定の処理を指して います。この処理を受け持つプロセスは、 サーバ と言います。

6.2. Kerberos の動作概要

Kerberos はしばしば、サードパーティ製の信頼できる認証サービスと呼ばれます。 これは Kerberos の全クライアントが他のクライアントの認証情報を判断する際、 Kerberos の判断結果を信頼することからそのように呼ばれます。 Kerberos は すべてのユーザとそのユーザの機密鍵を管理します。

Kerberos が正しく動作するようにするため、認証サーバとチケット発行サーバは 専用のマシンで動作させることをお勧めします。また、このマシンには管理者だけ が物理的にアクセスできるようにするだけでなく、ネットワーク経由でも管理者 しかアクセスできないようにしておいてください。また、ネットワークサービスに ついても、最小限のサービスのみを動作させるようにしてください。特に sshd などは動作させてはなりません。

6.2.1. 最初の通信

Kerberos との最初の通信は、通常のネットワークシステムにおけるログイン処理と とても似ていて、ユーザ名を入力します。この情報とチケット発行サービスの名称 が認証サーバ (Kerberos) に送信されます。認証サーバがそのユーザ名を知って いた場合は、今後使用するセッション鍵を乱数から生成し、クライアントとチケット 発行サーバに送信します。あとは認証サーバが、チケット発行サーバのチケットを 用意します。このチケットは、認証サーバとチケット発行サーバだけが知る セッション鍵ですべて暗号化され、下記の情報が含まれています:

  • クライアントとチケット発行サーバの名称

  • 現在の日時

  • このチケットに設定された有効期限

  • クライアントの IP アドレス

  • 新しく生成したセッション鍵

このチケットはセッション鍵とともにクライアントに送り返されますが、 この時点ではクライアントからの機密鍵を利用します。この機密鍵は Kerberos とクライアントだけが知るもので、これはユーザのパスワードから生成される ものです。クライアントがその応答を受け取ると、パスワードを尋ねられます。 このパスワードは鍵に変換されたあと、認証サーバが送信したパケットを復号 するのに使用され、ようやく暗号という 包装を解く ことが できることになります。また、パスワードはクライアントのメモリから消去 されます。チケットに書かれた有効期限が切れるまでの間に、そのチケットの 鍵を利用して次のチケットを取得することで、クライアントはその正当性を 維持できることになります。

6.2.2. サービスの要求

ネットワーク内にあるサーバのサービスに対して要求を送信する際は、まず クライアントアプリケーションがサーバに対して自身の識別情報を証明する 必要があります。そのため、アプリケーションは認証情報を生成します。 認証情報には下記の情報が含まれています:

  • クライアント側のプリンシパル

  • クライアントの IP アドレス

  • 現在の時刻

  • チェックサム (クライアント側で選択)

これらの情報は、このサーバ用にクライアントが受信したセッション鍵で、 すべて暗号化されます。その後、認証情報とチケットはサーバ側に送信されます。 サーバ側ではセッション鍵のコピーを利用して認証情報の解読を行ないます。 この解読によってクライアントが必要としているサービスについて必要な情報を すべて得ることができるほか、チケット内に含まれている情報とも比較を行なう ことができます。サーバ側ではチケットと認証情報が、いずれも同じ クライアントから発信されたものであることを確認します。

サーバ側で何らかのセキュリティ対応が行なわれていない場合、処理の中でも この段階がリプレイ攻撃として格好の標的になりかねません。誰かがネットワーク 越しに盗聴した情報を元に、要求を再送信できてしまいます。これを排除する ため、サーバ側では以前に受け付けたタイムスタンプおよびチケットを持つ 要求を受け付けないようにしています。これに加えて、要求を行なった時点とは 大きく異なる要求についても、無視されるようになっています。

6.2.3. 相互認証

Kerberos の認証は双方向に利用することができます。クライアントがサーバに 対して自身の正当性を主張するだけでなく、サーバがクライアントに対して正当性 を主張することができます。そのため、サーバ側でも認証情報を送信します。 クライアントの認証情報として受け取った中にあるチェックサムに対し、これを 追加してサーバとクライアント間で共有されているセッション鍵で暗号化します。 これにより、クライアントはサーバの正当性を応答の形で確認することができる ため、これで相互の認証が完成したことになります。

6.2.4. チケットの発行—すべてのサーバとの通信

チケットは同時に 1 つのサーバでのみ使用されるように設計されています。 これは、クライアント側で他のサービスを利用するような場合には、新しい チケットを取得しなければならないことを意味しています。 Kerberos では サーバごとにチケットを取得する仕組みが備わっていて、これを チケット発行サービス と呼んでいます。チケット発行 サービスはその名の通りサービス (他のサービスと同様の位置づけ) で、 他のサービスと同じアクセスプロトコルを利用します。アプリケーションが ある特定のサービスにアクセスする必要がある場合は、まずチケット発行 サーバに対して通信を行ないます。この要求には下記のものが含まれています:

  • 要求を行なっているプリンシパル

  • チケット許可チケット

  • 認証情報

他のサーバと同様に、チケット発行サーバもチケット許可チケットと認証情報を 確認します。これらが正しいものであると判断された場合は、チケット発行サーバ は元々のクライアントとサーバとの間で使用する新しいセッション鍵を生成します。 あとは新しいサーバに対するチケットを構築します。このチケットには下記のもの が含まれます:

  • クライアント側のプリンシパル

  • サーバ側のプリンシパル

  • 現在の時刻

  • クライアントの IP アドレス

  • 新しく生成されたセッション鍵

新しいチケットには有効期間が設定されていて、それぞれチケット許可チケット の残り有効期限か、サービスに対する有効期限のいずれか小さいほうが割り当て られます。クライアントは、チケット発行サービスが送信したチケットと セッション鍵を受け取りますが、この時点での応答は元々のセッション許可 チケットから生成されるセッション鍵で暗号化されています。クライアントは 新しいサービスに通信する際、ユーザのパスワード無しでこの応答を解読する ことができます。これにより、 Kerberos はユーザ側に問い合わせを行なう ことなく、チケットを継続的に取得できるようになっています。

6.2.5. Windows 2000 との互換性について

Windows 2000 には Kerberos 5 の Microsoft 版の実装が含まれています。 openSUSE® では Kerberos 5 の MIT 版の実装を使用していますので、 詳しい情報やガイドについては、 MIT のドキュメンテーション 6.5項 「さらなる情報」 をお読みください。

6.3. Kerberos に対するユーザからの外観

理想的にはユーザと Kerberos との通信は、ログイン時に一度だけ発生する ものです。ログイン処理にはチケット許可チケットの取得が含まれます。 また、ログアウト時にはユーザの Kerberos チケットは自動的に破壊されます。 これにより他のユーザがそのユーザになりすますことを難しくしています。 なお、チケットの自動廃棄の仕組みにより、ユーザのログインセッションが チケット許可チケットに設定された最大の有効期限 (妥当な値は 10 時間程度です) よりも長く持続した場合には、若干やっかいなことになります。しかしながら、 ユーザは新しいチケット許可チケットを kinit の実行で 取得できるため、パスワードを再入力することで、追加の認証を行なわずに Kerberos 側で必要なサービスにアクセスできるようになります。 Kerberos で暗黙のうちに取得したチケットを一覧表示するには、 klist を実行します。

下記には Kerberos 認証を使用するアプリケーションのうち、いくつかを紹介 しています。これらのアプリケーションは、 krb5-apps-clients パッケージをインストール後、 /usr/lib/mit/bin または /usr/lib/mit/sbin に配置されます。これらはいずれも 汎用的な UNIX/Linux サービスを提供するほか、追加で Kerberos による透過的な 認証機能が備わっています:

  • telnet, telnetd

  • rlogin

  • rsh, rcp, rshd

  • ftp, ftpd

  • ksu

これらのアプリケーションを利用するにあたっては、 Kerberos が既に利用者の 正当性を確認しているため、パスワードを入力する必要はありません。また、 ssh を Kerberos 対応付きでコンパイルしている場合も、一方のワーク ステーションで獲得したすべてのチケットを他方のワークステーションに転送 することができます。 ssh を利用して他のワークステーションにログイン すると、 ssh はチケットの暗号化された部分が新しい状況に合わせて調整 します。単純にワークステーション間でチケットをコピーするだけでは、 チケット内にワークステーション固有の情報 (IP アドレス) が含まれるため 不十分です。 XDM, GDM, KDM でもそれぞれ Kerberos に対応しています。 Kerberos ネットワークアプリケーションについて、詳しくは http://web.mit.edu/kerberos にある Kerberos V5 UNIX User's Guide をお読みください。

6.4. Kerberos のインストールと管理

Kerberos の環境は複数のコンポーネントから構成されています。鍵配布センター (KDC) はすべての Kerberos 関連データを保持する中央データベースで、すべての クライアントは、ネットワーク経由での認証を正しく動作させるため、この KDC に依存しています。 KDC とクライアントは、お使いの環境に合わせて 設定する必要があります:

一般的な準備

まずはネットワークの設定を確認し、 6.4.1項 「Kerberos のネットワーク構造」 に書かれている最小限の要件を満たしていることを確認します。また、 Kerberos の設定を行なうにあたって、適切な領域を選択します。詳しくは 6.4.2項 「Kerberos の領域 (realm) 選択」 をお読みください。 さらに、 KDC として動作させるマシンを注意して設定し、強固なセキュリティ 設定を行ないます。こちらについて、詳しくは 6.4.3項 「KDC ハードウエアの設定」 をお読みください。 最後に、ネットワーク内で信頼性の高い時刻提供源を用意し、すべてのチケット に正しいタイムスタンプが付与されるようにします。こちらについては 6.4.4項 「時刻同期の設定」 をお読みください。

基本設定

まずは KDC とクライアントの設定を行ないます。詳しくは 6.4.5項 「KDC の設定」6.4.6項 「Kerberos クライアントの設定」 をお読みください。 また、 Kerberos サービスに対してリモートからの管理を有効にし、 KDC の起動しているマシンに対して物理的なアクセスを不要にします。詳しくは 6.4.7項 「リモートからの Kerberos 管理の設定」 をお読みください。 最後に、お使いの領域内の各サービスに対して、プリンシパルを作成します。 詳しくは 6.4.8項 「Kerberos サービスプリンシパルの作成」 をお読みください。

Kerberos 認証の有効化

お使いのネットワーク内にある様々なサービスを Kerberos 対応にすること ができます。 PAM を使用するアプリケーションに対して Kerberos の パスワードチェック機能を設定するには、 6.4.9項 「PAM の Kerberos 対応の有効化」 の手順を行なって ください。また、 SSH や LDAP に対して Kerberos の認証を設定するには、 6.4.10項 「SSH に対する Kerberos 認証の設定」6.4.11項 「LDAP と Kerberos」 の手順を行なって ください。

6.4.1. Kerberos のネットワーク構造

Kerberos を完全に機能させるためには、 Kerberos を利用する環境が下記の 要件を満たしていなければなりません:

  • お使いのネットワーク内に DNS サーバが存在し、クライアントとサーバが 相互に名前を解決できるようになっていること。 DNS の設定について、 詳しくは 第15章 ドメインネームシステム (↑リファレンス) をお読みください。

  • お使いのネットワーク内にタイムサーバが存在していること。 Kerberos の 仕組みを正しく動作させるには、 Kerberos のチケットに書かれたタイム スタンプが正しくなければならないため、時刻の同期は必須条件です。 NTP の設定方法について、詳しくは 第17章 NTP を利用した時刻同期 (↑リファレンス) をお読みください。

  • 鍵配布センター (KDC) を Kerberos 構造の中心要素として用意すること。 ここには Kerberos のデータベースが保持されます。このマシンに対する セキュリティはもっとも厳重なものとし、一切の攻撃を受けないように すべきものです。

  • クライアント側で Kerberos 認証を使用するように設定すること。

下記の図では、 Kerberos の仕組みを構築するにあたって最小限のものを 揃えた場合の例を示しています。ネットワークの規模や配置環境に合わせて、 下記の設計を調整すべきものです。

図6.1 Kerberos のネットワーク構造

Kerberos のネットワーク構造

[Tip]サブネットルーティングの設定

図6.1「Kerberos のネットワーク構造」 のような構成で構築する際は、 2 つの サブネット (192.168.1.0/24 と 192.168.2.0/24) の間でルーティングを 設定してください。 YaST でのルーティング設定方法について、詳しくは 項 「ルーティング (経路制御) の設定」 (第13章 ネットワークの基礎, ↑リファレンス) をお読みください。

6.4.2. Kerberos の領域 (realm) 選択

Kerberos による認証の範囲のことを、領域 (realm) と呼びます。これは名前 によって識別するもので、たとえば EXAMPLE.COM のような 形式をとる場合があるほか、単に ACCOUNTING のような 名前にする場合もあります。 Kerberos は大文字と小文字を区別する仕組みで あるため、 example.comEXAMPLE.COM は別々の領域を意味することになります。大文字と小文字のどちらを使用しても かまいませんが、一般的には領域名に大文字を使用します。

DNS のドメイン名 (または ACCOUNTING.EXAMPLE.COM のような サブドメイン) を使用するのも良い考えです。下記に示しているとおり、 Kerberos のクライアントで DNS を設定し、 KDC やその他の Kerberos サービスを発見する ように設定すると、設定を単純化することができます。これを行なうには、領域の 名称を DNS のサブドメインとして設定するのがよいでしょう。

なお、 DNS の名前領域とは異なり、 Kerberos は階層構造をとることができません。 たとえば EXAMPLE.COM という領域があるとすると、 DEVELOPMENTACCOUNTING のような 副領域 をその下に作成し、それらを EXAMPLE.COM にあるプリンシパルの副次的な領域とすることはできません。その代わり、これらを 3 種類の個別の領域とし、ユーザに対して領域をまたがる認証を設定し、 一方の領域のユーザやサーバを他方のユーザやサーバと協調的に動作させることが できます。

単純化のため、下記の説明では企業全体で 1 つの領域を設定するものと仮定します。 この章の残りの部分では、 EXAMPLE.COM という領域を使用する ものとして説明します。

6.4.3. KDC ハードウエアの設定

Kerberos を使用するために最初に用意しなければならないことは、鍵配布センター (KDC と略します) として動作するマシンです。このマシンは Kerberos のユーザ とパスワードなど、すべての情報に関するデータベースを保持します。

KDC はセキュリティ面で最も重要な部分です。もしも誰かがそれに侵入できてしまう と、 Kerberos で保護しているすべてのユーザアカウントとデータ構造を取得できて しまいます。 Kerberos のデータベースにアクセスできてしまえば、そのデータ ベースに書かれている任意のプリンシパルに偽装することもできてしまいます。 そのため、このマシンに対するセキュリティはできるだけ厳しく設定する必要が あります:

  1. サーバマシンは物理的に機密を保つことのできる場所、たとえば限られたごく少数 の人間しか入ることのできない、施錠されたサーバ室などに配置してください。

  2. KDC を除くネットワークアプリケーションは一切動作させないでください。 これはサーバ/クライアントの両方を含みます。たとえば KDC では NFS 経由でのファイルシステムのインポートや、 DHCP によるネットワーク設定の 取得などを行なうべきではありません。

  3. まずは最小限のシステム構成でインストールを行ない、インストール済みの パッケージ一覧を取得して、不要なパッケージはすべてアンインストールして ください。これには inetd, portmap, cups のほか、 X ベースのサーバ類を すべて含みます。 SSH サーバについても、潜在的なセキュリティリスクとして インストールすべきではありません。

  4. X サーバを動作させ、グラフィカルなログインを提供してはなりません。 これも潜在的なセキュリティリスクになりうるためです。 Kerberos 側で 自身の管理インターフェイスを用意しています。

  5. /etc/nsswitch.conf ファイル内に、ユーザや グループの参照先がローカルファイルだけとなるように設定してください。 具体的には、 passwdgroup は下記のようになります:

    passwd:         files 
    group:          files

    /etc ディレクトリ内にある passwd, group, shadow の各ファイルを 編集し、行頭が + であるもの (これらは NIS を参照する 項目です) をすべて削除してください。

  6. /etc/shadow ファイルを編集し、 root を除くすべてのアカウントを無効化してください。具体的には、パスワード欄を * または ! の 1 文字に置き換えます。

6.4.4. 時刻同期の設定

Kerberos が正しく動作するようにするため、ネットワーク内の全サーバについて、 システム時刻を特定の時刻発信源で同期できていることを確認してください。 これは Kerberos で認証情報のリプレイを防ぐために、重要な項目です。 攻撃者がネットワーク上を流れる Kerberos の認証情報を盗聴すると、それを 利用してそのユーザを偽装することができてしまうためです。 Kerberos では これを防ぐために複数の防御を備えています。その防御のうちの 1 つがタイム スタンプです。これをチケット内に書き込んでおくことで、チケットを受信する サーバが現在時刻とは異なるチケットを受け取った場合、これを無視することで リプレイを防いでいます。

また、 Kerberos ではタイムスタンプの比較にあたって、一定量の余裕を持たせて います。しかしながら、コンピュータの時刻はその正確性を維持するのに不十分な 作りになっています。場合によっては 1 週間で 30 分も狂うような場合さえ あります。このような理由から、ネットワーク内に存在するすべてのホストでは 特定の時刻発信源による同期を設定してください。

これを実現するのに最も簡単な方法は、いずれか 1 台のサーバに NTP 時刻サーバを インストールすることです。また、残りのマシンではクライアントモードで NTP デーモンを動作させるか、もしくは 1 日 1 回程度 ntpdate を動作させるか (こちらの方法は少数のクライアントしか存在していない場合に 限られます) を設定します。 KDC それ自身についても、同じ時刻発信源に対して 同期を設定する必要があります。 NTP デーモンをそのマシンで動作させるのは セキュリティリスクとなりうるものであるため、 cron を利用して 1 日 1 回 程度の同期を設定するのがよいでしょう。 NTP クライアントの設定について、 詳しくは 項 「YaST を利用した NTP クライアントの設定」 (第17章 NTP を利用した時刻同期, ↑リファレンス) に書かれています。

また、別の方法として、専用の NTP サーバを用意してそこにハードウエアの 時刻参照源を設定し、ここから NTP デーモンによる時刻同期を設定する方法が あります。

また、 Kerberos に対してタイムスタンプの比較の際、時刻の最大誤差を調整 する方法もあります。この値 (clock skew (時刻誤差) と呼びます) は krb5.conf ファイルから設定することが できます。詳しくは 6.4.6.2.3項 「時計の誤差の調整」 をお読みください。

6.4.5. KDC の設定

この章では、 KDC のインストールと初期設定、および管理者プリンシパルの 作成方法について述べています。この作業は複数の手順から構成されています:

  1. RPM のインストール.  KDC として動作させるマシンに対しては、下記のソフトウエアパッケージを インストールします: krb5, krb5-server, krb5-client

  2. 設定ファイルの調整.  /etc/krb5.conf/var/lib/kerberos/krb5kdc/kdc.conf の各ファイルに 対して、お使いの環境に合わせた調整を行ないます。これらのファイルには KDC 上でのすべての情報が含まれています。

  3. Kerberos データベースの作成.  Kerberos はすべてのプリンシパルに対する識別情報と、認証の際に必要な すべての機密鍵を保持します。詳しくは 6.4.5.1項 「データベースの設定」 を お読みください。

  4. ACL ファイルの調整: 管理者の追加.  KDC 上にある Kerberos のデータベースは、リモートから管理することが できます。データベースに対して不正なアクセスが無いようにするため、 Kerberos ではアクセス制御リストを使用します。管理者のプリンシパルに 対しては、明示的にリモートアクセスを許可してデータベースを管理できる ようにしなければなりません。 Kerberos の ACL ファイルは、 /var/lib/kerberos/krb5kdc/kadm5.acl にあります。 詳しくは 6.4.7項 「リモートからの Kerberos 管理の設定」 を お読みください。

  5. Kerberos データベースの調整: 管理者の追加.  Kerberos を実行するには、少なくとも 1 人以上の管理者プリンシパルを設定 する必要があります。プリンシパルは KDC を起動する前に追加しなければ なりません。詳しくは 6.4.5.2項 「プリンシパルの作成」 をお読みください。

  6. Kerberos デーモンの起動.  KDC のソフトウエアをインストールして必要な設定を完了したら、 Kerberos のデーモンを起動し、領域内に Kerberos のサービスを提供します。詳しくは 6.4.5.3項 「KDC の起動」 をお読みください。

  7. 自分自身のプリンシパルの作成.  最後に自分自身のプリンシパルを追加する必要があります。詳しくは 6.4.5.2項 「プリンシパルの作成」 をお読みください。

6.4.5.1. データベースの設定

次の作業は、 Kerberos がプリンシパルに関するすべての情報を保持する データベースを作成することです。データベースにはマスターキーと呼ばれる、 データベースを保護するため (特にテープなどへのバックアップ時) の鍵を 設定します。マスターキーはパスワードから構成されるもので、 stash ファイルと呼ばれる場所に保管します。これにより、 KDC の起動時に パスワードを入力しなくても起動できるようになっています。なお、 パスワードは辞書や本などをランダムに開いて書いてあった文字列を利用する など、適切なものを設定してください。

Kerberos データベース (/var/lib/kerberos/krb5kdc/principal) をテープなどにバックアップする場合は、 stash ファイル (/var/lib/kerberos/krb5kdc/.k5.EXAMPLE.COM に あります) はバックアップしてはなりません。そうでないと、テープを読み取る だけでデータベースを解読できることになってしまいます。そのため、 パスワードは安全な場所にコピーを作成しておくか、もしくはその他の安全な 方法で保管してください。これはパスワードについても何らかの方法で保管を 行なっておかないと、忘れたり失われたりした場合に復元できなくなってしまう ためです。

stash ファイルとデータベースを作成するには、下記のように実行します:

kdb5_util create -r EXAMPLE.COM -s

すると、下記のように出力が行なわれます:

Initializing database '/var/lib/kerberos/krb5kdc/principal' for realm 'EXAMPLE.COM',
master key name 'K/M@EXAMPLE.COM'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:  1
Re-enter KDC database master key to verify:  2

1

マスターパスワードを入力します。

2

パスワードを再入力します。

確認を行なうには、下記の一覧コマンドを入力します:

kadmin.local

kadmin> listprincs

データベース内には、 Kerberos が内部的に使用する複数のプリンシパルが 存在しています:

K/M@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM

6.4.5.2. プリンシパルの作成

次に自分自身に対する Kerberos のプリンシパルを 2 つ作成します。 1 つは 日々の作業用、もう 1 つは Kerberos 関連の管理作業を行なうためのもの です。ここではログイン名を geeko と仮定します。 下記の手順で実施します:

kadmin.local

kadmin> ank geeko

下記のような出力が表示されます:

geeko@EXAMPLE.COM's Password: 1
Verifying password: 2

1

geeko に対して設定するパスワードを入力します。

1

geeko に対して設定するパスワードを再入力します。

次に kadmin のプロンプトから ank geeko/admin と入力し、 geeko/admin という名前のプリンシパルを作成します。 ユーザ名に admin という接尾語が付属していますが、 これは ロール と呼ばれるものです。このロールは Kerberos のデータベース管理の際に使用します。ユーザにはそれぞれの 目的に合わせて、複数のロールを設定します。ロールは似たような 名前ですが、異なるアカウントになります。

6.4.5.3. KDC の起動

KDC デーモンと kadmin デーモンを起動します。デーモンを手動で起動する には、それぞれ rckrb5kdc start および rckadmind start と入力します。なお、システムが 起動したときに KDC と kadmind を起動させたい場合は、 insserv krb5kdc および insserv kadmind と入力する か、もしくは YaST のランレベルエディタを使用します。

6.4.6. Kerberos クライアントの設定

DNS や NTP などのインフラが整っていて、かつ KDC の設定と起動が完了して いれば、ようやくクライアントマシン側の設定を行なうことができます。 YaST を利用して Kerberos クライアントを設定するか、もしくは下記に示す 2 つの手作業で実施することができます。

6.4.6.1. YaST を利用した Kerberos クライアントの設定

Kerberos クライアントとして動作させるにあたって、関連する全ての設定を 手作業で変更するよりも、 YaST にその作業を行なわせたほうが便利です。 Kerberos クライアントは、お使いのマシンをインストールする際に設定する ことができるほか、インストール済みのマシンでも設定することができます。 具体的には下記の手順で行ないます:

  1. root でログインし、 ネットワークサービス+Kerberos クライアント を選択します (図6.2「YaST: Kerberos クライアントの基本設定」) 。

  2. Kerberos を使用する を選択します。

  3. DNS ベースの Kerberos クライアントを設定するには、下記の手順で行ないます:

    1. DNS ベースの固定の Kerberos クライアントを設定します。

      [Note]DNS サポートの使用

      DNS サーバが Kerberos 関連のデータを提供していない場合は、 実行時に DNS から設定データを取得する のオプションを 選択することはできません。

    2. チケット関連の問題や OpenSSH への対応、時刻同期や拡張 PAM 設定などを 行なう場合は、 詳細設定 を押します。

  4. 固定の Kerberos クライアントを設定するには、下記の手順で行ないます:

    1. まずはお使いの環境に合わせて、 既定のドメイン, 既定の領域, KDC サーバアドレス をそれぞれ設定します。

    2. チケット関連の問題や OpenSSH への対応、時刻同期や拡張 PAM 設定などを 行なう場合は、 詳細設定 を押します。

図6.2 YaST: Kerberos クライアントの基本設定

YaST: Kerberos クライアントの基本設定

詳細設定 ダイアログでチケット関連のオプションを 設定する (図6.3「YaST: Kerberos クライアントの高度な設定」) には、 下記のいずれかを設定します:

  • まずは 既定のライフタイム既定の更新可能なライフタイム について、日/時/分 単位で設定します (それぞれ数字の後に空白を開けずに d, h, m を入力すると、それぞれ日/時/分単位での設定になります。

  • 完全な識別情報を転送できるようにする (チケットを他のホストで使用する 場合) には、 転送可能フラグ を選択します。

  • また、特定のチケットを転送できるようにするには、 代理可能フラグ を選択します。

  • お使いの OpenSSH に対して、 Kerberos 認証への対応を行なわせたい場合 は、関連するチェックボックスに印を入れます。これにより、クライアントは SSH サーバに対し、 Kerberos チケットを利用するようになります。

  • Kerberos 認証について特定のユーザアカウントの範囲を除外したい場合は、 最小ユーザ ID の値を指定します。この値は、たとえば システム管理者 (root) を ログインさせたくない場合などに利用します。

  • タイムスタンプとお使いのホスト時刻との間で、許される時刻差を設定する には、 クロックのズレ の値を設定します。

  • NTP サーバを利用したシステム時刻の同期を行ないたい場合は、 NTP の設定 ボタンを押します。このボタンを押すと、 項 「YaST を利用した NTP クライアントの設定」 (第17章 NTP を利用した時刻同期, ↑リファレンス) で説明している YaST NTP クライアントダイアログが表示されます。設定が完了すると、 YaST は全ての必要な設定を行なった後、 Kerberos クライアントが利用できる ようになります。

図6.3 YaST: Kerberos クライアントの高度な設定

YaST: Kerberos クライアントの高度な設定

熟練者向け PAM 設定PAM サービス のタブでの設定方法について、詳しくは公式のドキュメンテーション (6.5項 「さらなる情報」 に参照先が書かれています) と man 5 krb5.conf のマニュアルページ (krb5-doc パッケージに含まれています) を お読みください。

6.4.6.2. Kerberos クライアントの手動設定

Kerberos を手作業で設定するにあたっては、 2 種類の方法で設定すること ができます。 1 つは /etc/krb5.conf ファイル内で 固定の設定を記述する方法、もう 1 つは DNS による動的な設定を行なう 方法です。 DNS の設定の場合は、 Kerberos アプリケーションが DNS レコードを利用して、 KDC サービスの場所を特定します。固定の設定の 場合は、 krb5.conf 内に KDC サーバのホスト名を 指定します (KDC のサーバ名が変更になったり、領域などが変わったりした 場合には、適宜更新が必要になります) 。

DNS ベースの設定のほうがより柔軟な仕組みであり、設定にかかる手間も大きく 省くことができます。しかしながら、領域 (realm) 名がお使いの DNS ドメイン か、もしくはサブドメインと一致している必要があります。また、 DNS での Kerberos 設定は、セキュリティ面で若干の問題があります。攻撃者が DNS サービスを攻撃したような場合 (ネームサーバのサービスを止めてしまったり、 DNS レコードを偽造してしまったり) 、 Kerberos のインフラストラクチャが 破壊されてしまいます。ただし、このような場合でも、最悪のケースを想定 してもサービスが停止するだけの被害範囲になります。また、固定の設定でも、 krb5.conf 内に IP アドレスではなくホスト名で指定 した場合には、似たような問題が発生する可能性があります。

6.4.6.2.1. 固定の設定

Kerberos を設定するための唯一の方法は、 /etc/krb5.conf を編集することです。このファイルは既定でインストールされるもので、 様々な設定例が書かれています。設定を行なうにあたっては、これらを 忘れずに消去してください。また、 krb5.conf は複数のセクションから構成されていて、それぞれの章の名前は大括弧で 括られています (例: [this]) 。

Kerberos クライアントの設定を行なうには、下記のようなセクションを krb5.conf に追加します (ここで、 kdc.example.com は KDC のホスト名とします):

[libdefaults]
        default_realm = EXAMPLE.COM

[realms]
        EXAMPLE.COM = {
                kdc = kdc.example.com
                admin_server = kdc.example.com
        }

default_realm の行では、 Kerberos アプリケーション での既定の領域を設定します。複数の領域を設定したい場合は、 [realms] セクション内で追加します。

このファイルでは、アプリケーション側でホスト名と領域をどのように 対応づけるのかについても設定をします。たとえばリモートのホストに 接続するような場合、 Kerberos のライブラリはそのホストにどの領域を 使用すべきかを知っておく必要があるためです。これらの設定は [domain_realms] セクションで行ないます:

[domain_realm]
        .example.com = EXAMPLE.COM
        www.foobar.com = EXAMPLE.COM

上記の設定では、 example.com の DNS ドメインに 対しては EXAMPLE.COM の Kerberos 領域を利用する 意味になります。また、 www.foobar.com という 外部のホストは、 EXAMPLE.COM の領域に対する メンバーであるものと判断させる意味になります。

6.4.6.2.2. DNS ベースの設定

DNS ベースの Kerberos 設定では、 DNS の SRV レコードを頻繁に使用する 形になります。詳しくは http://www.ietf.org にある (RFC2052) A DNS RR for specifying the location of services (英語) をお読みください。 日本語訳については、 http://www5d.biglobe.ne.jp/~stssk/rfc/rfc3597j.html などの参考資料をお読みください。

Kerberos においては、 SRV レコードの名称は常に _service._proto.realm という形式で記述します。 ここで realm の部分には Kerberos の領域が入ります。また、 DNS における ドメイン名は大文字と小文字を区別しませんが、この設定方法を使用した 場合は、大文字と小文字を区別する Kerberos の領域の仕組みが適用される ことに注意してください。また、 _service にはサービス 名 (KDC やパスワードサービスなどに通信する際には、異なる名前を使用 します) が入ります。さらに _proto_udp または _tcp のいずれかですが、 全てのサービスが両方のプロトコルに対応しているわけではないことにも 注意してください。

SRV レコードのデータ部は、優先順位の値とウエイト値、ポート番号とホスト名 から構成されています。優先順位は、複数のホストの中からいずれかを選択する 際、どれを優先的に選択するのかを指定します (低い値ほど高い優先順位を 意味します) 。また、ウエイト値は同じ優先順位の複数のサーバに対して、 ある種の負荷分散を行なうための値です。設定を必要としない場合は、 0 を指定します。

現時点では、 MIT Kerberos はサービスを検出する際に下記の名前を検索します:

_kerberos

この名前は KDC デーモンの場所を探す際に利用します (認証およびチケット 発行サーバ) 。たとえば下記のようになります:

_kerberos._udp.EXAMPLE.COM.  IN  SRV    0 0 88 kdc.example.com. 
_kerberos._tcp.EXAMPLE.COM.  IN  SRV    0 0 88 kdc.example.com.
_kerberos-adm

この名前はリモート管理サービスの場所を探す際に利用します。 たとえば下記のようになります:

_kerberos-adm._tcp.EXAMPLE.COM. IN  SRV    0 0 749 kdc.example.com.

kadmind は UDP に対応していないため、 _udp のレコードは設定しません。

固定の設定ファイルでは、クライアントに対して特定のホストが example.com の DNS ドメイン内に存在しない場合でも、 EXAMPLE.COM の領域にあることを知らせる方法があります。 これは TXT レコードで設定するもので、 _kerberos.hostname のような形式で指定します。たとえば下記のようになります:

_kerberos.www.foobar.com.  IN TXT "EXAMPLE.COM"
6.4.6.2.3. 時計の誤差の調整

時刻誤差 とはチケットを受け入れる際、ホスト側の システム時刻とチケットのタイムスタンプとの間で、どれだけのズレを許容 するのかを指定する値です。通常は時刻誤差として 300 秒 (5 分) を設定 します。これは、チケットに書かれた時刻とサーバの時刻との間で、 5 分 間のズレを許容し、 5 分前のものから 5 分後のものまで受け入れる意味に なります。

NTP を利用して全てのホストの時刻同期を行なっている場合、この値を 1 分 程度など、小さく設定することもできます。時刻誤差の値は /etc/krb5.conf 内で下記のように設定します:

[libdefaults]
        clockskew = 60

6.4.7. リモートからの Kerberos 管理の設定

Kerberos のデータベースに対して、 KDC のコンソールに直接アクセスする以外 の方法でプリンシパルを追加したり削除したりできるようにするには、 /var/lib/kerberos/krb5kdc/kadm5.acl ファイルを編集して Kerberos 管理サーバを設定します。 ACL (アクセス制御リスト) ファイルでは、 権限を設定することで正確な制御を行なうことができます。詳しくは man 8 kadmind で表示されるマニュアル ページをお読みください。

ここでは自分自身に対して権限を追加し、データベースを管理できるようにする ものとします。下記の行をファイルに追加します:

geeko/admin              *

ここで geeko は自分自身のユーザ名に置き換えて ください。設定を反映させるには、 kadmind を 再起動する必要があります。

これで kadmin ツールをリモートから実行することで、 Kerberos の管理作業を 行なうことができるようになりました。まずは管理者ロールのためのチケットを 取得し、そのチケットを利用して kadmin サーバに接続します:

kadmin -p geeko/admin
Authenticating as principal geeko/admin@EXAMPLE.COM with password.
Password for geeko/admin@EXAMPLE.COM:
kadmin:  getprivs
current privileges: GET ADD MODIFY DELETE
kadmin:

getprivs コマンドを利用することで、その時点で持って いる権限を確認することができます。上記の例では、全ての権限を持っている ことを示しています。

ここではたとえば、 geeko のプリンシパルを修正すると します:

kadmin -p geeko/admin
Authenticating as principal geeko/admin@EXAMPLE.COM with password.
Password for geeko/admin@EXAMPLE.COM:

kadmin:  getprinc geeko
Principal: geeko@EXAMPLE.COM
Expiration date: [never]
Last password change: Wed Jan 12 17:28:46 CET 2005
Password expiration date: [none]
Maximum ticket life: 0 days 10:00:00
Maximum renewable life: 7 days 00:00:00
Last modified: Wed Jan 12 17:47:17 CET 2005 (admin/admin@EXAMPLE.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 2
Key: vno 1, Triple DES cbc mode with HMAC/sha1, no salt
Key: vno 1, DES cbc mode with CRC-32, no salt
Attributes:
Policy: [none]

kadmin:  modify_principal -maxlife "8 hours" geeko
Principal "geeko@EXAMPLE.COM" modified.
kadmin:  getprinc joe
Principal: geeko@EXAMPLE.COM
Expiration date: [never]
Last password change: Wed Jan 12 17:28:46 CET 2005
Password expiration date: [none]
Maximum ticket life: 0 days 08:00:00
Maximum renewable life: 7 days 00:00:00
Last modified: Wed Jan 12 17:59:49 CET 2005 (geeko/admin@EXAMPLE.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 2
Key: vno 1, Triple DES cbc mode with HMAC/sha1, no salt
Key: vno 1, DES cbc mode with CRC-32, no salt
Attributes:
Policy: [none]
kadmin:

上記の例では、チケットの有効期限の最大値を 8 時間に設定しています。 kadmin コマンドと利用可能なオプションの一覧について、 詳しくは krb5-doc パッケージ内をご覧ください。 または、 http://web.mit.edu/kerberos/www/krb5-1.8/krb5-1.8.3/doc/krb5-admin.html#Kadmin%20Optionsman8 kadmin のマニュアルページにも 記述があります。

6.4.8. Kerberos サービスプリンシパルの作成

ここまでの章では、ユーザの認証情報のみを取り扱ってきました。 Kerberos 互換の サービスでは、サービスそれ自身がクライアントに対して認証を行なう必要も あります。そのため、サービス側のプリンシパルについても、提供範囲の領域にある Kerberos データベースに登録しておかなければなりません。たとえば ldap.example.com で LDAP サービスを提供している場合、サービスプリンシパルとして ldap/ldap.example.com@EXAMPLE.COM を登録し、全クライアントに 対して認証できるようにする必要があります。

サービスプリンシパルの表記は、 サービス/ホスト名@領域 のように記述します。ここで hostname には、ホストの 完全修飾ドメイン名を記述します。

サービス記述子として利用可能なものは下記のとおりです:

サービス記述子

サービス

host

Telnet, RSH, SSH

nfs

NFSv4 (Kerberos 対応のもの)

HTTP

HTTP (Kerberos 対応のもの)

imap

IMAP

pop

POP3

ldap

LDAP

サービスプリンシパルはユーザプリンシパルに似ていますが、大きく異なる箇所 があります。ユーザプリンシパルの鍵はパスワードで保護されていて、ユーザが KDC からチケット許可チケットを受け取ると、チケットを復号化するために パスワードの入力が必要になります。このような仕組みはサービスプリンシパル には非常に不便なものになってしまい、このままであったとすると、たとえば SSH デーモンを動作させている場合、 8 時間ごとにパスワードの入力が必要に なってしまいます。

サービスプリンシパルでは、初期のチケットを復号化するのに必要な鍵は管理者 が KDC から一度だけ取り出すものとし、 keytab と 呼ばれるローカルファイルに保管します。 SSH デーモンのようなサービスで あれば、この鍵を読み込んで使用し、必要であれば新しいチケットを自動的に 取得します。 keytab ファイルは、既定では /etc/krb5.keytab に配置されています。

jupiter.example.com に対してホストのサービスプリンシパルを 作成するには、 kadmin セッション内で下記のコマンドを入力します:

kadmin -p geeko/admin
Authenticating as principal geeko/admin@EXAMPLE.COM with password.
Password for geeko/admin@EXAMPLE.COM:
kadmin:  addprinc -randkey host/jupiter.example.com
WARNING: no policy specified for host/jupiter.example.com@EXAMPLE.COM;
defaulting to no policy
Principal "host/jupiter.example.com@EXAMPLE.COM" created.

新しいプリンシパルに対してパスワードを設定する代わりに -randkey フラグを設定し、 kadmin に 対してランダムな鍵を生成するように指示しています。これはこのプリンシパル に対して、一切のユーザ操作を無くしたい意図があることによります。 つまり、これはマシンに対するサーバアカウントということになります。

最後に鍵を取り出し、ローカルの keytab ファイル /etc/krb5.keytab 内に保管します。このファイルはスーパーユーザが所有しているべきもの であるため、下記のコマンドを実行するには kadmin シェルを root で起動しなければ なりません:

kadmin:  ktadd host/jupiter.example.com
Entry for principal host/jupiter.example.com with kvno 3, encryption type Triple
DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/jupiter.example.com with kvno 3, encryption type DES
cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:

上記の処理が完了したら、忘れずに kdestroy コマンドを 利用し、 kinit で取得した管理チケットを破棄してください。

6.4.9. PAM の Kerberos 対応の有効化

openSUSE® では pam_krb5 という PAM モジュールが 同梱されていて、これを利用することで Kerberos のログインとパスワード更新を 行なうことができるようになっています。このモジュールは、コンソールでの ログインや su, KDM などのグラフィカルなログインアプリケーション (ユーザがパスワードを提供し、認証対象のアプリケーションに対して初期の Kerberos チケットを取得させたい場合) で利用することができます。 Kerberos に対応するよう PAM を設定するには、下記のコマンドを入力します:

pam-config --add --krb5

上記のコマンドは既存の PAM 設定ファイルに対して pam_krb5 モジュールを追加し、正しい順序で呼び出されるように設定するものです。 pam_krb5 の使用方法についてより細かい調整を行なう には、 /etc/krb5.conf ファイルを編集し、既定の アプリケーションを pam に追加してください。 詳しくは man 5 pam_krb5 で表示 されるマニュアルページをお読みください。

pam_krb5 モジュールは、ユーザ認証の一部として Kerberos チケットを受け取るようなネットワークサービスに対して、特に設計 されているわけではありません。これは全く異なる問題で、下記の章で詳しく 説明しています。

6.4.10. SSH に対する Kerberos 認証の設定

OpenSSH はプロトコルバージョン 1 と 2 の両方で Kerberos 認証に対応して います。バージョン 1 では、 Kerberos チケットを送信するのに特殊なプロトコル メッセージを利用します。バージョン 2 では Kerberos を直接利用するような 仕組みにはなっておらず、その代わりに GSSAPI (General Security Services API; 汎用セキュリティサービス API) を利用するようになっています。これは Kerberos 固有のプログラミングインターフェイスというわけではなく、 Kerberos や SPKM のような公開鍵認証システムなどのような、認証システムの特異性を隠蔽するため の仕組みです。ただし、同梱の GSSAPI では Kerberos にのみ対応しています。

sshd で Kerberos 認証を利用するには、 /etc/ssh/sshd_config ファイルを編集して下記のオプションを設定します:

# プロトコルバージョン 1 向けの設定 
#
# KerberosAuthentication yes
# KerberosTicketCleanup yes

# プロトコルバージョン 2 向けの設定 - できればこちらを利用してください
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

設定を変更したら、 rcsshd restart と入力して SSH デーモンを再起動します。

プロトコルバージョン 2 で Kerberos 認証を利用する場合は、クライアント側 でも同様に有効化のための設定を行なってください。設定にはシステム全体の 設定ファイルである /etc/ssh/ssh_config ファイルを 編集する方法があるほか、ユーザレベルでも ~/.ssh/config ファイルを編集して対応する方法があります。いずれのファイルとも、対象の ファイルに GSSAPIAuthentication yes というオプションを 追記します。

これで Kerberos 認証を利用して接続を行なうことができるようになりました。 klist コマンドを利用することで、有効なチケットを取得 できているかどうかを確認でき、 SSH サーバに接続することができます。 SSH プロトコルのバージョン 1 を使用したい場合は、コマンドラインで -1 というオプションを指定してください。

[Tip]追加情報

/usr/share/doc/packages/openssh/README.kerberos ファイルでは、 OpenSSH と Kerberos の作用についてより詳しい説明が 書かれています。

6.4.11. LDAP と Kerberos

Kerberos を使用する場合、ユーザの情報 (ユーザ ID, グループ, ホーム ディレクトリなど) をネットワーク内に配布するには、 LDAP を利用するのが 唯一の方法です。 LDAP を利用するにあたっては、パケットの盗聴やその他の 攻撃から防御するため、強度な暗号化メカニズムを設定する必要があります。 1 つの解決策として、 LDAP の通信そのものに対しても Kerberos を利用する 方法があります。

OpenLDAP では多くの認証手順を SASL 経由で実装しています。 SASL とは Simple Authentication Session Layer の略で、シンプルな認証機能を提供する ものです。 SASL は基本的には認証に使用するよう設計されたネットワーク プロトコルですが、 SASL の実装は cyrus-sasl と呼ばれるもので、数多くの 認証方法に対応した実装になっています。なお、 Kerberos の認証は GSSAPI (General Security Services API) 経由で行ないます。既定では GSSAPI の SASL プラグインはインストールされていないため、 LDAP を利用する際には YaST から cyrus-sasl-gssapi パッケージを インストールしてください。

Kerberos に対して OpenLDAP サーバへの接続を有効にするには、 ldap/ldap.example.com という名称のプリンシパルを作成し、 これを keytab 内に追加します。

既定では、 LDAP サーバ slapd は ldap のユーザおよびグループで 動作し、 keytab ファイルは root でのみ読み込むことができるようになっています。そのため、 LDAP 側の設定を 変更して root で動作するように 設定するか、もしくは keytab ファイルを ldap グループから読み込むことができるように設定する必要があります。後者は /etc/sysconfig/openldap ファイル内で OPENLDAP_KRB5_KEYTAB の変数に対し、 keytab ファイルの 場所を指定し、かつ OPENLDAP_CHOWN_DIRS の変数に対して yes を設定した場合、 OpenLDAP の起動スクリプト (/etc/init.d/ldap) が自動的に設定します。これらの 設定はあらかじめ設定済みのため、特に変更を行なう必要はありません。 また、 OPENLDAP_KRB5_KEYTAB に何も指定しない場合は、 /etc/krb5.keytab 以下にある既定の keytab が使用され、 下記のように権限を手作業で設定しなければなりません。

slapd を root で起動するには、 /etc/sysconfig/openldap ファイルを編集します。それぞれ OPENLDAP_USEROPENLDAP_GROUP の値に対して、行頭にコメント (#) マークを入れてコメントアウトしてください。

グループ LDAP に対して keytab ファイルの読み込みができるようにするには、 下記のように実行します:

chgrp ldap /etc/krb5.keytab
chmod 640 /etc/krb5.keytab

もう一つの (そしておそらく最適であると思われる) 方法として、 OpenLDAP に対して 独自の keytab ファイルを用意する方法があります。これを行なうには kadmin を 起動し、 ldap/ldap.example.com のプリンシパルを追加した後、下記のようなコマンドを 入力します:

ktadd -k /etc/openldap/ldap.keytab ldap/ldap.example.com@EXAMPLE.COM

その後、下記のように実行します:

chown ldap.ldap /etc/openldap/ldap.keytab 
chmod 600 /etc/openldap/ldap.keytab

さらに、異なる keytab ファイルを使用するように OpenLDAP 側を設定する には、 /etc/sysconfig/openldap 内にある下記の 変数を変更します:

OPENLDAP_KRB5_KEYTAB="/etc/openldap/ldap.keytab"

最後に rcldap restart のコマンドを実行し、 LDAP サーバを再起動すれば完了です。

6.4.11.1. LDAP を利用した Kerberos 認証の使用

ここまでの手順で、 ldapsearch のようなツールで Kerberos 認証を 利用できるようになりました。

ldapsearch -b ou=people,dc=example,dc=com '(uid=geeko)'

SASL/GSSAPI authentication started
SASL SSF: 56
SASL installing layers
[...]

# geeko, people, example.com
dn: uid=geeko,ou=people,dc=example,dc=com
uid: geeko
cn: Olaf Kirch
[...]

上記のとおり、 ldapsearch を起動すると GSSAPI 認証のメッセージが表示 されます。次のメッセージは意味不明なメッセージですが、 セキュリティの強度因数 (略して SSF) が 56 である ことを示しています (56 は任意の数字で、 DES の暗号鍵のビット数である ため、よく使用されます) 。これは GSSAPI の認証が正しく動作していて、 LDAP 接続でのデータ保護と機密保持のために暗号化を利用していることを 示しています。

Kerberos では認証は双方向に動作します。これはユーザ自身が LDAP サーバに 対して認証するだけでなく、 LDAP サーバもユーザに対して認証する必要が あることを示しています。特に、これは攻撃者が提供している不正な LDAP サーバではなく、正しい LDAP サーバに対して通信していることを確認する ために必要な仕組みです。

6.4.11.2. Kerberos 認証と LDAP アクセス制御

ここまでの作業で、各ユーザに対して LDAP ユーザレコード内にある ログインシェルの属性を修正できるようにすることができます。たとえば joe に対する LDAP の項目が、 uid=joe,ou=people,dc=example,dc=com にあるとすると、 /etc/openldap/slapd.conf のアクセス制御は下記のように 記述します:

# 全てのものをうまく動作させるために必要な設定です
access to dn.base="" by * read
# 各ユーザに対して、自身のログインシェルを変更できるようにする設定
access to dn="*,ou=people,dc=example,dc=com" attrs=loginShell
       by self write
# 各ユーザが全てのものを読み込めるようにする設定
access to *
       by users read

2 つめの構文では、認証済みのユーザに対して、自分自身の LDAP 項目内に ある loginShell への書き込み権限を付与しています。 3 つめの構文では、全ての認証済みユーザに対して、 LDAP の階層構造全体 への読み込み権限を設定しています。

ここまでの設定では 1 つだけ、見逃しやすい問題に対する回答が欠けています。 それは、 LDAP サーバが Kerberos 側のユーザ joe@EXAMPLE.COM とLDAP の識別名 uid=joe,ou=people,dc=example,dc=com をどのようにして結びつけるか、です。この割り当ては、 saslExpr というディレクティブを利用して設定します。 たとえばこの例では、 slapd.conf に対して下記の 行を追加します:

authz-regexp
   uid=(.*),cn=GSSAPI,cn=auth 
   uid=$1,ou=people,dc=example,dc=com

上記がどのように動作するのか知るには、まず SASL がユーザを認証する際、 OpenLDAP は SASL 側で提供された名前 (たとえば joe) と SASL の設定 (ここでは GSSAPI) から識別名を構成 することを知っておく必要があります。この例では、たとえば uid=joe,cn=GSSAPI,cn=auth のようになります。

authz-regexp が設定されている場合は、最初のパラメータ として正規表現を使用することで、 SASL の情報から生成された DN をチェック します。正規表現がマッチした場合は、名前は authz-regexp の 2 つめのパラメータで置き換えられます。そのうち、 $1 の部分は、 (.*) の正規表現で マッチした文字列に置き換えられます。

さらに複雑な表現を利用することもできます。より複雑なディレクトリ構造で あった場合や、ユーザ名が DN の一部になっていないような場合は、 SASL の DN からユーザ DN を検索するような設定を行なうこともできます。

6.5. さらなる情報

MIT Kerberos の公式サイトは http://web.mit.edu/kerberos (英語) にあります。ここには Kerberos のインストールや管理ガイドなど、 Kerberos 関連のリソースが用意されています。

ftp://athena-dist.mit.edu/pub/kerberos/doc/usenix.PS (英語) の論文には、難しい用語を使わない形で Kerberos の基本的な考え方の見解が 書かれています。また、 Kerberos についてさらなる調査や知識を得るための 参照リンクが書かれています。

公式の Kerberos FAQ は http://www.nrl.navy.mil/CCS/people/kenh/kerberos-faq.html (英語) で提供されています。また、 Kerberos—A Network Authentication System (Brian Tung 氏; (ISBN 0-201-37924-4)) では、広範囲に わたる情報が記されています。


openSUSE セキュリティガイド 13.1