目次
オープンなネットワークでは、通常のパスワードによる認証を除き、ワーク ステーションがユーザを確認できる方法がありません。そのため、一般的な インストール環境の場合、ネットワーク内にあるサービスにアクセスする際には、 毎回パスワードの入力を行なわなければなりません。 Kerberos はこのような 問題に対応するための仕組みで、ユーザを一カ所で登録しておいて、これに対する 認証を他のマシンでも信頼する方法を提供しています。ネットワークの機密を 保持するには、下記の要件が満たされていなければなりません:
すべてのユーザが必要なサービスに対する識別情報を持ち、他人がその識別 情報を偽装できないこと。
それぞれのネットワークサーバも識別情報を持っていること。識別情報が存在 しないと、攻撃者がサーバを装うことができてしまい、サーバに送信されるはず の機密情報を取得できてしまいます。サーバはクライアントを、クライアントは サーバを認証する、という考え方を 相互認証 と呼びます。
Kerberos はこれらの要件を、強い暗号化による認証で実現しています。ここでは Kerberos に関する基本的な動作原理を説明していますが、より詳しい技術的な説明 については、 Kerberos のドキュメンテーションをお読みください。
下記の用語集では、いくつかの Kerberos 用語を定義しています。
ユーザやクライアントは、対象のサービスに要求を送信するため、何らかの 資格情報を送信する必要があります。 Kerberos では、 「チケット」 と 「認証情報」 の 2 つの資格情報を利用します。
チケットとはクライアントが使用するサーバ単位の証明書で、サービスを 利用するサーバを認証する際に使用します。ここにはサーバの名前と クライアントの名前、クライアントのインターネットアドレスとタイム スタンプ、有効期間と乱数から生成されるセッション鍵が含まれます。 これらすべてのデータは、サーバ側の鍵を利用して暗号化されます。
認証情報はチケットと組み合わせることで、チケットを提示したクライアントが 正当なものであることを確認することができます。認証情報はクライアントの 名前とワークステーションの IP アドレス、現在のワークステーションの 時刻とクライアントと関連するサーバだけが知っている暗号化された セッション鍵から構成されています。認証情報はチケットとは異なり、 一度だけしか使用することができません。また、クライアントは 認証情報それ自身を作成することができます。
Kerberos でのプリンシパルとは、チケットを割り当てることのできる識別 可能な存在 (ユーザやサービス) を指します。プリンシパルには下記から 構成されています:
プライマリ— プリンシパルの最初の部分で、ユーザの場合はユーザ名と同じです。
インスタンス—
プライマリを細分化する任意情報です。この文字列とプライマリとの
間は /
で区切られます。
領域— ここでは Kerberos の領域を指定します。通常、この領域には 大文字でのドメイン名を指定します。
Kerberos はクライアントとサーバとの間で、一方が他方の識別情報を 確認します。ここではセッション鍵が使用され、これによって通信の 機密を維持しています。
セッション鍵とは Kerberos が生成した一時的な機密鍵のことを指します。 セッション鍵はクライアント側に伝えられ、チケットの送受信を行なう際の クライアントとサーバの間での暗号鍵として使用します。
ネットワークでは、ほぼすべてのメッセージを傍受や盗難、そして再送信する ことができてしまいます。 Kerberos の世界では、これは攻撃者がチケットと 認証情報を含むサービス向けの要求を取得できてしまうことを意味するため、 もっとも危険なものとなります。攻撃者はそれを再送信 (リプレイ) することで、本来の送信者を偽装しようとすることができてしまいます。 ただし、 Kerberos では複数の仕組みを利用して、そのような偽装を防ぐ ことができるようになっています。
サービス とは、ここでは実行すべき特定の処理を指して います。この処理を受け持つプロセスは、 サーバ と言います。
Kerberos はしばしば、サードパーティ製の信頼できる認証サービスと呼ばれます。 これは Kerberos の全クライアントが他のクライアントの認証情報を判断する際、 Kerberos の判断結果を信頼することからそのように呼ばれます。 Kerberos は すべてのユーザとそのユーザの機密鍵を管理します。
Kerberos が正しく動作するようにするため、認証サーバとチケット発行サーバは
専用のマシンで動作させることをお勧めします。また、このマシンには管理者だけ
が物理的にアクセスできるようにするだけでなく、ネットワーク経由でも管理者
しかアクセスできないようにしておいてください。また、ネットワークサービスに
ついても、最小限のサービスのみを動作させるようにしてください。特に
sshd
などは動作させてはなりません。
Kerberos との最初の通信は、通常のネットワークシステムにおけるログイン処理と とても似ていて、ユーザ名を入力します。この情報とチケット発行サービスの名称 が認証サーバ (Kerberos) に送信されます。認証サーバがそのユーザ名を知って いた場合は、今後使用するセッション鍵を乱数から生成し、クライアントとチケット 発行サーバに送信します。あとは認証サーバが、チケット発行サーバのチケットを 用意します。このチケットは、認証サーバとチケット発行サーバだけが知る セッション鍵ですべて暗号化され、下記の情報が含まれています:
クライアントとチケット発行サーバの名称
現在の日時
このチケットに設定された有効期限
クライアントの IP アドレス
新しく生成したセッション鍵
このチケットはセッション鍵とともにクライアントに送り返されますが、 この時点ではクライアントからの機密鍵を利用します。この機密鍵は Kerberos とクライアントだけが知るもので、これはユーザのパスワードから生成される ものです。クライアントがその応答を受け取ると、パスワードを尋ねられます。 このパスワードは鍵に変換されたあと、認証サーバが送信したパケットを復号 するのに使用され、ようやく暗号という 「包装を解く」 ことが できることになります。また、パスワードはクライアントのメモリから消去 されます。チケットに書かれた有効期限が切れるまでの間に、そのチケットの 鍵を利用して次のチケットを取得することで、クライアントはその正当性を 維持できることになります。
ネットワーク内にあるサーバのサービスに対して要求を送信する際は、まず クライアントアプリケーションがサーバに対して自身の識別情報を証明する 必要があります。そのため、アプリケーションは認証情報を生成します。 認証情報には下記の情報が含まれています:
クライアント側のプリンシパル
クライアントの IP アドレス
現在の時刻
チェックサム (クライアント側で選択)
これらの情報は、このサーバ用にクライアントが受信したセッション鍵で、 すべて暗号化されます。その後、認証情報とチケットはサーバ側に送信されます。 サーバ側ではセッション鍵のコピーを利用して認証情報の解読を行ないます。 この解読によってクライアントが必要としているサービスについて必要な情報を すべて得ることができるほか、チケット内に含まれている情報とも比較を行なう ことができます。サーバ側ではチケットと認証情報が、いずれも同じ クライアントから発信されたものであることを確認します。
サーバ側で何らかのセキュリティ対応が行なわれていない場合、処理の中でも この段階がリプレイ攻撃として格好の標的になりかねません。誰かがネットワーク 越しに盗聴した情報を元に、要求を再送信できてしまいます。これを排除する ため、サーバ側では以前に受け付けたタイムスタンプおよびチケットを持つ 要求を受け付けないようにしています。これに加えて、要求を行なった時点とは 大きく異なる要求についても、無視されるようになっています。
Kerberos の認証は双方向に利用することができます。クライアントがサーバに 対して自身の正当性を主張するだけでなく、サーバがクライアントに対して正当性 を主張することができます。そのため、サーバ側でも認証情報を送信します。 クライアントの認証情報として受け取った中にあるチェックサムに対し、これを 追加してサーバとクライアント間で共有されているセッション鍵で暗号化します。 これにより、クライアントはサーバの正当性を応答の形で確認することができる ため、これで相互の認証が完成したことになります。
チケットは同時に 1 つのサーバでのみ使用されるように設計されています。 これは、クライアント側で他のサービスを利用するような場合には、新しい チケットを取得しなければならないことを意味しています。 Kerberos では サーバごとにチケットを取得する仕組みが備わっていて、これを 「チケット発行サービス」 と呼んでいます。チケット発行 サービスはその名の通りサービス (他のサービスと同様の位置づけ) で、 他のサービスと同じアクセスプロトコルを利用します。アプリケーションが ある特定のサービスにアクセスする必要がある場合は、まずチケット発行 サーバに対して通信を行ないます。この要求には下記のものが含まれています:
要求を行なっているプリンシパル
チケット許可チケット
認証情報
他のサーバと同様に、チケット発行サーバもチケット許可チケットと認証情報を 確認します。これらが正しいものであると判断された場合は、チケット発行サーバ は元々のクライアントとサーバとの間で使用する新しいセッション鍵を生成します。 あとは新しいサーバに対するチケットを構築します。このチケットには下記のもの が含まれます:
クライアント側のプリンシパル
サーバ側のプリンシパル
現在の時刻
クライアントの IP アドレス
新しく生成されたセッション鍵
新しいチケットには有効期間が設定されていて、それぞれチケット許可チケット の残り有効期限か、サービスに対する有効期限のいずれか小さいほうが割り当て られます。クライアントは、チケット発行サービスが送信したチケットと セッション鍵を受け取りますが、この時点での応答は元々のセッション許可 チケットから生成されるセッション鍵で暗号化されています。クライアントは 新しいサービスに通信する際、ユーザのパスワード無しでこの応答を解読する ことができます。これにより、 Kerberos はユーザ側に問い合わせを行なう ことなく、チケットを継続的に取得できるようになっています。
Windows 2000 には Kerberos 5 の Microsoft 版の実装が含まれています。 openSUSE® では Kerberos 5 の MIT 版の実装を使用していますので、 詳しい情報やガイドについては、 MIT のドキュメンテーション 6.5項 「さらなる情報」 をお読みください。
理想的にはユーザと 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 をお読みください。
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 対応にすること ができます。 PAM を使用するアプリケーションに対して Kerberos の パスワードチェック機能を設定するには、 6.4.9項 「PAM の Kerberos 対応の有効化」 の手順を行なって ください。また、 SSH や LDAP に対して Kerberos の認証を設定するには、 6.4.10項 「SSH に対する Kerberos 認証の設定」 や 6.4.11項 「LDAP と Kerberos」 の手順を行なって ください。
Kerberos を完全に機能させるためには、 Kerberos を利用する環境が下記の 要件を満たしていなければなりません:
お使いのネットワーク内に DNS サーバが存在し、クライアントとサーバが 相互に名前を解決できるようになっていること。 DNS の設定について、 詳しくは 第15章 ドメインネームシステム (↑リファレンス) をお読みください。
お使いのネットワーク内にタイムサーバが存在していること。 Kerberos の 仕組みを正しく動作させるには、 Kerberos のチケットに書かれたタイム スタンプが正しくなければならないため、時刻の同期は必須条件です。 NTP の設定方法について、詳しくは 第17章 NTP を利用した時刻同期 (↑リファレンス) をお読みください。
鍵配布センター (KDC) を Kerberos 構造の中心要素として用意すること。 ここには Kerberos のデータベースが保持されます。このマシンに対する セキュリティはもっとも厳重なものとし、一切の攻撃を受けないように すべきものです。
クライアント側で Kerberos 認証を使用するように設定すること。
下記の図では、 Kerberos の仕組みを構築するにあたって最小限のものを 揃えた場合の例を示しています。ネットワークの規模や配置環境に合わせて、 下記の設計を調整すべきものです。
サブネットルーティングの設定 | |
---|---|
図6.1「Kerberos のネットワーク構造」 のような構成で構築する際は、 2 つの サブネット (192.168.1.0/24 と 192.168.2.0/24) の間でルーティングを 設定してください。 YaST でのルーティング設定方法について、詳しくは 項 「ルーティング (経路制御) の設定」 (第13章 ネットワークの基礎, ↑リファレンス) をお読みください。 |
Kerberos による認証の範囲のことを、領域 (realm) と呼びます。これは名前
によって識別するもので、たとえば EXAMPLE.COM
のような
形式をとる場合があるほか、単に ACCOUNTING
のような
名前にする場合もあります。 Kerberos は大文字と小文字を区別する仕組みで
あるため、 example.com
と EXAMPLE.COM
は別々の領域を意味することになります。大文字と小文字のどちらを使用しても
かまいませんが、一般的には領域名に大文字を使用します。
DNS のドメイン名 (または ACCOUNTING.EXAMPLE.COM
のような
サブドメイン) を使用するのも良い考えです。下記に示しているとおり、 Kerberos
のクライアントで DNS を設定し、 KDC やその他の Kerberos サービスを発見する
ように設定すると、設定を単純化することができます。これを行なうには、領域の
名称を DNS のサブドメインとして設定するのがよいでしょう。
なお、 DNS の名前領域とは異なり、 Kerberos は階層構造をとることができません。
たとえば EXAMPLE.COM
という領域があるとすると、
DEVELOPMENT
や ACCOUNTING
のような
「副領域」 をその下に作成し、それらを EXAMPLE.COM
にあるプリンシパルの副次的な領域とすることはできません。その代わり、これらを
3 種類の個別の領域とし、ユーザに対して領域をまたがる認証を設定し、
一方の領域のユーザやサーバを他方のユーザやサーバと協調的に動作させることが
できます。
単純化のため、下記の説明では企業全体で 1 つの領域を設定するものと仮定します。
この章の残りの部分では、 EXAMPLE.COM
という領域を使用する
ものとして説明します。
Kerberos を使用するために最初に用意しなければならないことは、鍵配布センター (KDC と略します) として動作するマシンです。このマシンは Kerberos のユーザ とパスワードなど、すべての情報に関するデータベースを保持します。
KDC はセキュリティ面で最も重要な部分です。もしも誰かがそれに侵入できてしまう と、 Kerberos で保護しているすべてのユーザアカウントとデータ構造を取得できて しまいます。 Kerberos のデータベースにアクセスできてしまえば、そのデータ ベースに書かれている任意のプリンシパルに偽装することもできてしまいます。 そのため、このマシンに対するセキュリティはできるだけ厳しく設定する必要が あります:
サーバマシンは物理的に機密を保つことのできる場所、たとえば限られたごく少数 の人間しか入ることのできない、施錠されたサーバ室などに配置してください。
KDC を除くネットワークアプリケーションは一切動作させないでください。 これはサーバ/クライアントの両方を含みます。たとえば KDC では NFS 経由でのファイルシステムのインポートや、 DHCP によるネットワーク設定の 取得などを行なうべきではありません。
まずは最小限のシステム構成でインストールを行ない、インストール済みの パッケージ一覧を取得して、不要なパッケージはすべてアンインストールして ください。これには inetd, portmap, cups のほか、 X ベースのサーバ類を すべて含みます。 SSH サーバについても、潜在的なセキュリティリスクとして インストールすべきではありません。
X サーバを動作させ、グラフィカルなログインを提供してはなりません。 これも潜在的なセキュリティリスクになりうるためです。 Kerberos 側で 自身の管理インターフェイスを用意しています。
/etc/nsswitch.conf
ファイル内に、ユーザや
グループの参照先がローカルファイルだけとなるように設定してください。
具体的には、 passwd
と group
は下記のようになります:
passwd: files group: files
/etc
ディレクトリ内にある passwd
,
group
, shadow
の各ファイルを
編集し、行頭が +
であるもの (これらは NIS を参照する
項目です) をすべて削除してください。
/etc/shadow
ファイルを編集し、 root
を除くすべてのアカウントを無効化してください。具体的には、パスワード欄を
*
または !
の 1 文字に置き換えます。
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項 「時計の誤差の調整」
をお読みください。
この章では、 KDC のインストールと初期設定、および管理者プリンシパルの 作成方法について述べています。この作業は複数の手順から構成されています:
RPM のインストール.
KDC として動作させるマシンに対しては、下記のソフトウエアパッケージを
インストールします: krb5
,
krb5-server
,
krb5-client
設定ファイルの調整.
/etc/krb5.conf
と
/var/lib/kerberos/krb5kdc/kdc.conf
の各ファイルに
対して、お使いの環境に合わせた調整を行ないます。これらのファイルには
KDC 上でのすべての情報が含まれています。
Kerberos データベースの作成. Kerberos はすべてのプリンシパルに対する識別情報と、認証の際に必要な すべての機密鍵を保持します。詳しくは 6.4.5.1項 「データベースの設定」 を お読みください。
ACL ファイルの調整: 管理者の追加.
KDC 上にある Kerberos のデータベースは、リモートから管理することが
できます。データベースに対して不正なアクセスが無いようにするため、
Kerberos ではアクセス制御リストを使用します。管理者のプリンシパルに
対しては、明示的にリモートアクセスを許可してデータベースを管理できる
ようにしなければなりません。 Kerberos の ACL ファイルは、
/var/lib/kerberos/krb5kdc/kadm5.acl
にあります。
詳しくは 6.4.7項 「リモートからの Kerberos 管理の設定」 を
お読みください。
Kerberos データベースの調整: 管理者の追加. Kerberos を実行するには、少なくとも 1 人以上の管理者プリンシパルを設定 する必要があります。プリンシパルは KDC を起動する前に追加しなければ なりません。詳しくは 6.4.5.2項 「プリンシパルの作成」 をお読みください。
Kerberos デーモンの起動. KDC のソフトウエアをインストールして必要な設定を完了したら、 Kerberos のデーモンを起動し、領域内に Kerberos のサービスを提供します。詳しくは 6.4.5.3項 「KDC の起動」 をお読みください。
自分自身のプリンシパルの作成. 最後に自分自身のプリンシパルを追加する必要があります。詳しくは 6.4.5.2項 「プリンシパルの作成」 をお読みください。
次の作業は、 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: Re-enter KDC database master key to verify:
確認を行なうには、下記の一覧コマンドを入力します:
kadmin.local kadmin> listprincs
データベース内には、 Kerberos が内部的に使用する複数のプリンシパルが 存在しています:
K/M@EXAMPLE.COM kadmin/admin@EXAMPLE.COM kadmin/changepw@EXAMPLE.COM krbtgt/EXAMPLE.COM@EXAMPLE.COM
次に自分自身に対する Kerberos のプリンシパルを 2 つ作成します。 1 つは
日々の作業用、もう 1 つは Kerberos 関連の管理作業を行なうためのもの
です。ここではログイン名を geeko
と仮定します。
下記の手順で実施します:
kadmin.local kadmin> ank geeko
下記のような出力が表示されます:
geeko@EXAMPLE.COM's Password: Verifying password:
次に kadmin のプロンプトから
ank geeko/admin
と入力し、
geeko/admin
という名前のプリンシパルを作成します。
ユーザ名に admin
という接尾語が付属していますが、
これは ロール と呼ばれるものです。このロールは
Kerberos のデータベース管理の際に使用します。ユーザにはそれぞれの
目的に合わせて、複数のロールを設定します。ロールは似たような
名前ですが、異なるアカウントになります。
KDC デーモンと kadmin デーモンを起動します。デーモンを手動で起動する
には、それぞれ rckrb5kdc start および
rckadmind start と入力します。なお、システムが
起動したときに KDC と kadmind を起動させたい場合は、
insserv krb5kdc
および
insserv kadmind
と入力する
か、もしくは YaST のランレベルエディタを使用します。
DNS や NTP などのインフラが整っていて、かつ KDC の設定と起動が完了して いれば、ようやくクライアントマシン側の設定を行なうことができます。 YaST を利用して Kerberos クライアントを設定するか、もしくは下記に示す 2 つの手作業で実施することができます。
Kerberos クライアントとして動作させるにあたって、関連する全ての設定を 手作業で変更するよりも、 YaST にその作業を行なわせたほうが便利です。 Kerberos クライアントは、お使いのマシンをインストールする際に設定する ことができるほか、インストール済みのマシンでも設定することができます。 具体的には下記の手順で行ないます:
root
でログインし、 + を選択します
(図6.2「YaST: Kerberos クライアントの基本設定」) 。
を選択します。
DNS ベースの Kerberos クライアントを設定するには、下記の手順で行ないます:
DNS ベースの固定の Kerberos クライアントを設定します。
DNS サポートの使用 | |
---|---|
DNS サーバが Kerberos 関連のデータを提供していない場合は、 のオプションを 選択することはできません。 |
チケット関連の問題や OpenSSH への対応、時刻同期や拡張 PAM 設定などを 行なう場合は、
を押します。固定の Kerberos クライアントを設定するには、下記の手順で行ないます:
まずはお使いの環境に合わせて、
, , をそれぞれ設定します。チケット関連の問題や OpenSSH への対応、時刻同期や拡張 PAM 設定などを 行なう場合は、
を押します。図6.3「YaST: Kerberos クライアントの高度な設定」) には、 下記のいずれかを設定します:
ダイアログでチケット関連のオプションを 設定する (まずは d, h, m を入力すると、それぞれ日/時/分単位での設定になります。
と について、日/時/分 単位で設定します (それぞれ数字の後に空白を開けずに完全な識別情報を転送できるようにする (チケットを他のホストで使用する 場合) には、
を選択します。また、特定のチケットを転送できるようにするには、
を選択します。お使いの OpenSSH に対して、 Kerberos 認証への対応を行なわせたい場合 は、関連するチェックボックスに印を入れます。これにより、クライアントは SSH サーバに対し、 Kerberos チケットを利用するようになります。
Kerberos 認証について特定のユーザアカウントの範囲を除外したい場合は、
root
) を
ログインさせたくない場合などに利用します。
タイムスタンプとお使いのホスト時刻との間で、許される時刻差を設定する には、
の値を設定します。NTP サーバを利用したシステム時刻の同期を行ないたい場合は、
ボタンを押します。このボタンを押すと、 項 「YaST を利用した NTP クライアントの設定」 (第17章 NTP を利用した時刻同期, ↑リファレンス) で説明している YaST NTP クライアントダイアログが表示されます。設定が完了すると、 YaST は全ての必要な設定を行なった後、 Kerberos クライアントが利用できる ようになります。
6.5項 「さらなる情報」 に参照先が書かれています)
と man 5 krb5.conf のマニュアルページ
(krb5-doc
パッケージに含まれています) を
お読みください。
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 アドレスではなくホスト名で指定
した場合には、似たような問題が発生する可能性があります。
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
の領域に対する
メンバーであるものと判断させる意味になります。
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 はサービスを検出する際に下記の名前を検索します:
この名前は 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._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"
時刻誤差 とはチケットを受け入れる際、ホスト側の システム時刻とチケットのタイムスタンプとの間で、どれだけのズレを許容 するのかを指定する値です。通常は時刻誤差として 300 秒 (5 分) を設定 します。これは、チケットに書かれた時刻とサーバの時刻との間で、 5 分 間のズレを許容し、 5 分前のものから 5 分後のものまで受け入れる意味に なります。
NTP を利用して全てのホストの時刻同期を行なっている場合、この値を 1 分
程度など、小さく設定することもできます。時刻誤差の値は
/etc/krb5.conf
内で下記のように設定します:
[libdefaults] clockskew = 60
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%20Options
や man8 kadmin
のマニュアルページにも
記述があります。
ここまでの章では、ユーザの認証情報のみを取り扱ってきました。 Kerberos 互換の
サービスでは、サービスそれ自身がクライアントに対して認証を行なう必要も
あります。そのため、サービス側のプリンシパルについても、提供範囲の領域にある
Kerberos データベースに登録しておかなければなりません。たとえば ldap.example.com
で LDAP サービスを提供している場合、サービスプリンシパルとして
ldap/ldap.example.com@EXAMPLE.COM
を登録し、全クライアントに
対して認証できるようにする必要があります。
サービスプリンシパルの表記は、
のように記述します。ここで サービス
/ホスト名
@領域
hostname
には、ホストの
完全修飾ドメイン名を記述します。
サービス記述子として利用可能なものは下記のとおりです:
サービス記述子 |
サービス |
---|---|
|
Telnet, RSH, SSH |
|
NFSv4 (Kerberos 対応のもの) |
|
HTTP (Kerberos 対応のもの) |
|
IMAP |
|
POP3 |
|
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 で取得した管理チケットを破棄してください。
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 チケットを受け取るようなネットワークサービスに対して、特に設計
されているわけではありません。これは全く異なる問題で、下記の章で詳しく
説明しています。
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
というオプションを指定してください。
追加情報 | |
---|---|
|
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_USER
と
OPENLDAP_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 サーバを再起動すれば完了です。
ここまでの手順で、 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 サーバに対して通信していることを確認する ために必要な仕組みです。
ここまでの作業で、各ユーザに対して 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 を検索するような設定を行なうこともできます。
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)) では、広範囲に わたる情報が記されています。