SPNEGO入門と実装ガイド:Kerberos/NTLMで実現するNegotiate認証とHTTP認証の実践解説

はじめに — SPNEGOとは何か

SPNEGO(Simple and Protected GSS-API Negotiation Mechanism)は、クライアントとサーバー間で利用可能なセキュリティメカニズム(例:Kerberos、NTLMなど)を安全にネゴシエートするための仕組みです。GSS-API(Generic Security Service Application Program Interface)上で動作し、どの認証メカニズムを使うかを双方で合意したうえで、選択されたメカニズムによる認証トークンのやり取りを行えるようにします。HTTPの「Negotiate」認証や、Windowsの統合認証(Integrated Windows Authentication)などで広く用いられています。

SPNEGOの基本的な役割とメリット

  • 複数メカニズムの仲介:クライアントとサーバー間でKerberosやNTLMといった複数のバックエンドメカニズムを透過的に切り替えできる。

  • プロテクション:ネゴシエーション自体がGSS-APIの保護下にあるため、ネゴシエーションメッセージの改竄や中間者攻撃に対する保護を確保しやすい。

  • 相互運用性:UNIX系のGSS実装(MIT Kerberos、Heimdal)とWindowsのSSPIの橋渡しとして機能する。

プロトコルの概略(トークンとフロー)

SPNEGOはASN.1で定義されたトークン構造を持ち、代表的なトークンとしてNegTokenInit(クライアント→サーバー)とNegTokenResp(サーバー→クライアント)が存在します。NegTokenInitにはクライアントがサポートするメカニズムの一覧(メカニズムOID)や、必要に応じて各メカニズムの初期トークンが含まれます。サーバーはNegTokenRespで選択したメカニズムOIDと、選択したメカニズムに対応する受信トークン(あるいはエラー情報)を返します。

HTTPの場合、クライアントは初回にサーバーからの401応答に対して「Authorization: Negotiate 」ヘッダを送ります。サーバーは「WWW-Authenticate: Negotiate 」で返答し、必要ならさらにトークンをやり取りして最終的に認証(および必要なら相互認証やデリゲーション)を完了します。

実際に交わされるメッセージ(HTTP: Negotiate の例)

  • クライアント初期リクエストに認証情報がない → サーバーが401 + WWW-Authenticate: Negotiate

  • クライアントがNegTokenInitを含むAuthorization: Negotiate トークンを送信(サポートするメカニズムの一覧など)

  • サーバーがNegTokenRespでメカニズムを選択、場合によっては受け入れトークンを返し追加のやり取り(HTTP 401/200)を行う

  • 最終的にサーバーが認証成功ならHTTP 200、失敗なら適切なエラーを返す

Kerberosとの関係(SPNEGO + Kerberos)

KerberosはSPNEGOで最も一般的に選択されるメカニズムの一つです。HTTPでKerberosベースの認証を行う際、SPNEGOはクライアントとサーバーが「Kerberosを使う」ことを合意した後、KerberosのAP_REQ/AP_REPトークン(GSS-API経由)をやり取りします。重要な構成要素は以下のとおりです。

  • サービスプリンシパル名(SPN):HTTP/ホスト名@REALM のような形式でサーバー側に登録されたSPNがクライアントによるチケット取得に使われる。

  • キータブ(keytab):サーバー側でSPNに対応する鍵情報を保持するファイル。IISでは通常Active Directoryが鍵を管理するが、LinuxのWebサーバーではkeytabが必要。

  • 時刻同期:Kerberosは時間に敏感(チケットの有効期間)なのでNTP等で時刻同期が必須。

WindowsのSSPIと他のGSS実装

Windows環境ではGSS相当のAPIとしてSSPI(Security Support Provider Interface)が使われ、SPNEGOはSSPIの「Negotiate」パッケージとして提供されます。Linux/Unix系ではMIT KerberosやHeimdalのGSSAPI実装がSPNEGOをサポートします。実装間の挙動差(例えばトークンの初期化方法やデリゲーションの扱い)により、相互運用時に追加の設定や注意が必要になる場合があります。

デリゲーションと制約付き委任(delegation)

SPNEGO経由でKerberosを用いる場合、クライアントの資格情報(チケット)をサーバー側で使用してさらに別のサービスにアクセスする「デリゲーション」が可能です。これは便利ですがセキュリティリスクも伴います。Active Directoryでは「制約付き委任(Constrained delegation)」や「CIFS/HTTPのみ委任」などの設定があり、最小権限の原則に従って使うことが推奨されます。

ブラウザとクライアント設定の実務

ブラウザはデフォルトでSPNEGO(Negotiate)を自動的に使わないことが多く、組織内サイトに対して明示的に許可する必要があります。代表的な設定例:

  • Internet Explorer / Edge(Windows): Intranetゾーンや「自動ログオン」設定で統合認証を有効にする。

  • Firefox: network.negotiate-auth.trusted-uris にホスト名やドメインを追加。

  • Chrome: WindowsではOSの設定を参照、Linuxでは chrome://flags や環境変数を使った設定が必要な場合がある。

サーバー側の実装例(Apache / IIS / その他)

  • IIS(Windows): 「Windows 認証」を有効にするとNegotiate(Kerberos/NTLM)のサポートが可能。正しいSPN登録とアカウントの設定が必要。

  • Apache(Linux): mod_auth_kerb や mod_auth_gssapi といったモジュールでSPNEGO/Kerberosをサポート。keytabやSPNの管理が必要。

  • Webアプリケーション: 多くのフレームワークでHTTPヘッダを通じたNegotiateを扱うライブラリが存在する。バックエンドとしてMIT/HeimdalやWindows SSPIを使う。

よくあるトラブルと対処法

  • SPNの不一致:クライアントが取得したサービス名とサーバーに登録されたSPNが一致しないとチケットが発行されない → 正しいSPN(例:HTTP/host.example.com)を確認・登録する。

  • DNSとホスト名の問題:クライアントがアクセスするホスト名がSPNと食い違うと失敗する。ホスト名の正規化(canonicalization)を考慮する。

  • 時刻ズレ:Kerberosは時刻差に敏感。NTPで同期されているか確認。

  • keytabの権限や内容:サーバーのkeytabが正しいか、権限が適切か確認する。

  • フォールバックの影響:Kerberosが使えない場合にNTLMへフォールバックするとセキュリティが弱まる。不要なフォールバックは無効化する。

セキュリティ上の注意点

SPNEGOそのものはネゴシエーションを保護する仕組みですが、選択されるメカニズム次第で安全性は大きく変わります。具体的な注意点:

  • NTLMフォールバックのリスク:NTLM(特にNTLMv1)は脆弱で、リレー攻撃や辞書攻撃に対して弱い。可能であればKerberosのみを許可する設定が望ましい。

  • 中間者/リレー攻撃:HTTP環境ではNTLMリレー等の攻撃が知られている。SPNEGOを使う場合でも、TLSやチャネル保護、ホストベースのチェック(SPN検証)を併用することが重要。

  • 最小権限のデリゲーション:デリゲーション機能は強力だが乱用すると横展開のリスクがあるため、制約付き委任などで最小化する。

  • クライアント設定の適切な管理:ブラウザが自動的に資格情報を送る設定になっていると、悪意ある内部サイトに対して意図せず資格情報を渡す可能性がある。信頼するホスト列のみを許可する。

実用的なテスト手順・ツール

  • kinit / klist(Kerberos):チケット取得と内容の確認。

  • curl --negotiate -u : -I http://host.example.com/ など:HTTPのNegotiateフローのテスト(curlはGSSAPI/SSPIを利用する設定が必要)。

  • ブラウザの開発者ツール:HTTPヘッダ(Authorization / WWW-Authenticate)のやり取りを確認。

  • サーバーのログ:KerberosエラーやSPNEGO関連のメッセージ(keytab読み込み失敗、SPN不一致等)をチェック。

まとめ — 運用と設計のポイント

SPNEGOは複数の認証メカニズムを安全にネゴシエートできる便利な仕組みで、特にKerberosとの組み合わせで強力なシングルサインオンを実現します。一方で、SPNEGO自体はメカニズム選択のための「仲介役」であり、実際の安全性は選ばれたメカニズム(KerberosやNTLM)の性質や構成次第です。設計・運用時には以下を意識してください:

  • 可能な限りKerberosを利用し、NTLM等へのフォールバックは制限する。

  • SPN・keytab・時刻同期など基礎的な構成を確実に行う。

  • デリゲーションは必要最低限で、制約付き委任を利用する。

  • ブラウザやサーバー設定を適切に行い、信頼するドメインのみ自動認証を許可する。

参考文献