第1章 Kerberos を用いた SSO の検証

1.1. SSO および Kerberos とは

シングルサインオン (SSO) および Kerberos の基本的な情報は、JBoss EAP 『セキュリティーアーキテクチャー』の「シングルサインオン」を参照してください。

1.2. Kerberos のコンポーネント

Kerberos は、秘密鍵の暗号化を使用してクライアント/サーバーアプリケーションのユーザー認証を可能にするネットワークプロトコルです。通常、Kerberos はネットワーク上のデスクトップユーザーの認証に使用されますが、追加のツールを使用すると、web アプリケーションのユーザー認証に使用でき、複数の web アプリケーションに SSO を提供することができます。そのため、デスクトップネットワーク上で認証済みのユーザーは、再認証しなくても web アプリケーションのセキュアなリソースにシームレスにアクセスできます。ユーザーはデスクトップベースの認証メカニズムを使用して認証され、認証されたユーザーの認証トークンまたはチケットは web アプリケーションによっても使用されるため、この概念はデスクトップベースの SSO と呼ばれます。この SSO メカニズムは、すべてブラウザーを使用してユーザーの認証とトークンの発行を行うブラウザーベースの SSO など、他の SSO メカニズムとは異なります。

Kerberos プロトコルは、認証および承認で使用する複数のコンポーネントを定義します。

チケット

チケット は、プリンシパルに関する認証および承認決定を発行および実行するために Kerberos が使用するセキュリティートークンの形式です。

認証サービス (AS)

認証サービス (AS) は、プリンシパルが最初にネットワークにログインするときにプリンシパルを確認します。認証サービスは、チケット保証チケット (TGT) の発行を行います。TGT は、チケット保証サービス (TGS) の認証に必要で、セキュアなサービスおよびリソースに再度アクセスするときにも必要になります。

チケット保証サービス (TGS)

チケット保証サービス (TGS) は、サービスチケットと特定のセッション情報を、プリンシパルとアクセスするターゲットサーバーに発行します。これは 、プリンシパルによって提供される TGT と接続先の情報を基にします。このサービスチケットとセッション情報は、接続先への接続を確立し、セキュアなサービスまたはリソースへアクセスするために使用されます。

キー配布センター (KDC)

キー配布センター (KDC) は、TGS と AS の両方を格納するコンポーネントです。KDC、クライアントまたはプリンシパル、およびサーバーまたはセキュアなサービスの 3 つのコンポーネントは、Kerberos 認証の実行に必要です。

チケット保証サービス (TGS)

チケット保証チケット (TGT) は、AS がプリンシパルに発行するチケットのタイプです。プリンシパルがユーザー名とパスワードを使用して AS に対して認証されると、TGT が付与されます。TGT はクライアントによってローカルでキャッシュされますが、KDC のみが読み取れ、クライアントは読み取りできないように暗号化されます。これにより、AS は TGS によって使用される TGT の承認データや他の情報をセキュアに保存することができ、TGS はこのデータを使用して承認決定を行うことができます。

サービスチケット (ST)

service ticket (ST) は、TGT と目的の接続先を基にして TGS がプリンシパルに発行するチケットのタイプです。プリンシパルは TGS に TGT を提供し、TGS は TGT の承認データを基にしてプリンシパルが接続先にアクセスしたことを検証します。検証に成功すると、クライアントと、セキュアなサービスまたはリソースが含まれるサーバーである接続先サーバーの両方に対して、TGS は ST をクライアントに発行します。これにより、クライアントは接続先サーバーへのアクセスが許可されます。また、クライアントによってキャッシュされ、クライアントとサーバーの両方が読み取り可能な ST には、クライアントとサーバーがセキュアに通信できるようにするセッション情報も含まれています。

注記

Kerberos とネットワークの DNS 設定には密な関係があります。たとえば、実行しているホストの名前を基にクライアントが KDC にアクセスする場合、仮定を行います。そのため、Kerberos 設定だけでなくすべての DNS 設定を適切に行い、クライアントが接続できるようにすることが重要になります。

1.3. その他のコンポーネント

JBoss EAP で Kerberos SSO を有効にするには、Kerberos コンポーネントの他にも複数の項目が必要になります。

1.3.1. SPNEGO

SPNEGO (Simple and Protected GSS_API Negotiation Mechanism) は Web アプリケーションで使用するために Kerberos ベースのシングルサインオン環境を拡張するメカニズムを提供します。

SPNEGO は、クライアントアプリケーションによって使用される認証方法で、クライアントアプリケーション自体をサーバーに対して認証します。この技術は、相互の通信を試みるクライアントアプリケーションとサーバーがお互いの認証プロトコルを把握していない場合に使用されます。SPNEGO は、クライアントアプリケーションとサーバー間の共通の GSSAPI メカニズムを判断し、その後のセキュリティー操作をすべてディスパッチします。

web ブラウザーなどのクライアントコンピューター上のアプリケーションが web サーバーの保護されたページにアクセスしようとすると、サーバーは承認が必要であることを伝えます。その後、アプリケーションは Kerberos KDC からのサービスチケットを要求します。チケットの取得後、アプリケーションはこのチケットをSPNEGO 向けにフォーマットされたリクエストにラップし、ブラウザーを介して web アプリケーションに返信します。デプロイされた web アプリケーションを実行している Web コンテナーはリクエストをアンパックし、チケットを認証します。認証に成功するとアクセスが許可されます。

SPNEGO は、Red Hat Enterprise Linux に含まれる Kerberos サービスや Microsoft Active Directory には不可欠な Kerberos サーバーなど、全タイプの Kerberos プロバイダーと動作します。

1.3.2. JBoss Negotiation

JBoss Negotiation は、JBoss EAP に同梱されるフレームワークで、オーセンティケーターと JAAS ログインモジュールを提供し、JBoss EAP で SPNEGO をサポートします。JBoss Negotiation は、レガシー security サブシステムとレガシーコア管理認証のみと使用されます。JAAS ログインモジュールの詳細は、JBoss EAP 『セキュリティーアーキテクチャー』の「宣言型セキュリティーと JAAS」および「セキュリティードメイン」を参照してください。

注記

JBoss Negotiation を使用して、REST web サービスなどの一部のアプリケーションをセキュアにする場合、1 つまたは複数のセッションが作成され、クライアントがリクエストを行うと、それらのセッションがタイムアウト期間 (デフォルトでは 30 分) 開かれることがあります。Basic 認証を使用してアプリケーションをセキュアにした場合はセッションを開いたままにしないことが想定されるため、Basic 認証で想定される動作とは異なります。JBoss Negotiation はセッションを使用してネゴシエーション/接続の状態を維持するよう実装されるため、このようなセッションの作成は想定される動作です。

1.4. Kerberos の統合

Kerberos は、Red Hat Enterprise Linux などの Linux ディストリビューションを含む多くのオペレーティングシステムと統合されています。また、Kerberos は Microsoft Active Directory には不可欠で、Red Hat Directory Server および Red Hat IDM によってサポートされます。

1.5. JBoss EAP での Kerberos による SSO の提供

Kerberos は、クライアントおよびサーバーによって使用されるチケットを KDC から発行してデスクトップベースの SSO を提供します。JBoss EAP はこれと同じチケットを独自の認証および承認プロセスで使用して、既存のプロセスと統合することができます。JBoss EAP がどのようにこのチケットを再使用するかを理解する前に、チケットがどのように発行され、JBoss EAP がないデスクトップベースの SSO で認証および承認がどのように Kerberos と動作するかを理解することが重要です。

1.5.1. デスクトップベース SSO での Kerberos による認証および承認

Kerberos は、認証および承認を提供するため、サードパーティーの KDC に依存してクライアントにアクセスするサーバーの認証および承認決定を提供します。決定は 3 つの手順で行われます。

  1. 認証の交換

    プリンシパルが最初にネットワークにアクセスする場合またはチケット保証チケット (TGT) なしでセキュアなサービスにアクセスする場合、プリンシパルのクレデンシャルを使用して認証サービス (AS) に対して認証することが要求されます。AS はユーザー提供のクレデンシャルを設定済みのアイデンティティーストアと照合します。認証に成功したら、クライアントによってキャッシュされる TGT がプリンシパルに発行されます。TGT には一部のセッション情報も含まれているため、クライアントと KDC の今後の通信も保証されます。

  2. チケットの付与または承認、交換

    プリンシパルに TGT が発行されたら、プリンシパルはセキュアなサービスまたはリソースにアクセスします。プリンシパルはチケット保証サービス (TGS) にリクエストを送信し、KDC によって発行された TGT を渡し、特定の接続先に対するサービスチケット (ST) を要求します。TGS はプリンシパルが提供した TGT をチェックし、要求したリソースにアクセスできる適切な権限があることを検証します。検証に成功したら、TGS はプリンシパルがその特定の接続先にアクセスするための ST を発行します。また、TGS はクライアントと接続先サーバーの両方に対してセッション情報を作成し、クライアントと接続先サーバー間のセキュアな接続を可能にします。このセッション情報は、クライアントとサーバーが、以前のトランザクションで KDC によって個別に提供された長期キーを使用して、独自のセッション情報のみを復号化できるよう個別に暗号化されます。その後、TGS はクライアントとサーバー両方のセッション情報が含まれる ST でクライアントに応答します。

  3. サーバーへのアクセス

    これで、プリンシパルはセキュアなサービスの ST と、サーバーとセキュアに通信できるメカニズムを取得したため、クライアントは接続を確立し、セキュアなリソースへアクセスできます。クライアントは最初に ST を接続先サーバーに渡します。この ST には、その接続先用に TGS から受け取ったセッション情報のサーバーコンポーネントが含まれています。サーバーは、KDC からの長期鍵を使用して、クライアントが渡したセッション情報を復号化します。復号化できたら、クライアントはサーバーに対して認証され、サーバーもクライアントに対して認証されたことになります。この時点で信頼が確立され、クライアントとサーバー間でセキュアな通信が行えます。

注記

承認されていないプリンシパルは TGT を使用できませんが、最初に AS で認証に成功した後でのみプリンシパルに TGT が発行されます。これにより、適切に承認されたプリンシパルのみに TGT が発行されるだけでなく、承認されていない第三者がオフラインの辞書攻撃や総当り攻撃などの不正使用が目的で、TGT を取得する可能性が低減されます。

1.5.2. Kerberos および JBoss EAP

JBoss EAP を既存の Kerberos デスクトップベースの SSO 環境と統合すると、同じチケットで JBoss EAP インスタンス上でホストされる web アプリケーションへのアクセスを提供することが可能です。典型的なセットアップでは、レガシー security サブシステムまたは elytron サブシステムのいずれかを使用して、SPNEGO での Kerberos 認証を使用するよう JBoss EAP インスタンスが設定されます。SPNEGO 認証を使用するよう設定されたアプリケーションは、その JBoss EAP インスタンスにデプロイされます。ユーザーは、Kerberos によって保護されたデスクトップにログインし、KDC と認証の交換を完了します。その後ユーザーは、JBoss EAP インスタンスが直接 web ブラウザーを使用するデプロイされたアプリケーションのセキュアなリソースにアクセスしようとします。JBoss EAP は、セキュアなリソースへのアクセスには承認が必要であることを伝えます。web ブラウザーはユーザーの TGT チケットを取得し、チケットの許可 (承認) を行い、KDC と交換してユーザーを検証し、サービスチケットを取得します。ST がブラウザーに返されたら、SPNEGO 用にフォーマットされたリクエストに ST をラップし、JBoss EAP 上で実行している web アプリケーションに返信します。その後、JBoss EAP は SPNEGO リクエストをアンパックし、レガシー security サブシステムまたは elytron サブシステムのいずれかを使用して認証を実行します。認証に成功すると、ユーザーはセキュアなリソースへのアクセスが許可されます。