Windows認証ハウツー

目次

概要

統合Windows認証は、認証を実行するサーバーと認証されるユーザーが同じドメインの一部である必要があるため、イントラネット環境内で最も頻繁に使用されます。ユーザーが自動的に認証されるには、ユーザーが使用するクライアントマシンもドメインの一部である必要があります。

Apache Tomcatで統合Windows認証を実装するには、いくつかのオプションがあります。それらは次のとおりです。

  • Tomcat組み込みサポート。
  • Waffleなどのサードパーティライブラリを使用する。
  • IISやhttpdなど、Windows認証をサポートするリバースプロキシを使用して認証手順を実行する。

これらの各オプションの設定については、以下のセクションで説明します。

Tomcat組み込みサポート

Kerberos(統合Windows認証の基盤)には注意深い設定が必要です。このガイドの手順に正確に従えば、動作する設定が得られます。以下の手順に正確に従うことが重要です。設定の柔軟性はほとんどありません。現在までのテストから、以下のことがわかっています。

  • Tomcatサーバーへのアクセスに使用されるホスト名は、SPN内のホスト名と正確に一致している必要があります。そうでない場合、認証は失敗します。この場合、デバッグログにチェックサムエラーが報告されることがあります。
  • クライアントは、サーバーがローカルの信頼されたイントラネットの一部であると認識している必要があります。
  • SPNはHTTP/<hostname>である必要があり、使用されるすべての場所でまったく同じである必要があります。
  • ポート番号はSPNに含めてはなりません。
  • 1つのドメインユーザーにマッピングできるSPNは1つまでです。
  • Tomcatは、SPNが関連付けられているドメインアカウントとして、またはドメイン管理者として実行する必要があります。ドメイン管理者ユーザーの下でTomcatを実行することは推奨されません
  • 慣例として、ドメイン名 (dev.local) は常に小文字で記述されます。ドメイン名は通常、大文字と小文字を区別しません。
  • 慣例として、Kerberosレルム名 (DEV.LOCAL) は常に大文字で記述されます。レルム名は大文字と小文字を区別します
  • ktpassコマンドを使用する際は、ドメインを指定する必要があります。

Windows認証のTomcat組み込みサポートの設定には、4つのコンポーネントがあります。ドメインコントローラー、Tomcatをホストするサーバー、Windows認証を使用したいウェブアプリケーション、およびクライアントマシンです。以下のセクションでは、各コンポーネントに必要な設定について説明します。

以下の設定例で使用される3つのマシンの名前は、win-dc01.dev.local(ドメインコントローラー)、win-tc01.dev.local(Tomcatインスタンス)、win-pc01.dev.local(クライアント)です。これらはすべてdev.localドメインのメンバーです。

注意: 以下の手順でパスワードを使用するため、ドメインのパスワードポリシーを緩和する必要がありました。これは本番環境では推奨されません。

ドメインコントローラー

これらの手順は、サーバーがすでにドメインコントローラーとして構成されていることを前提としています。Windowsサーバーをドメインコントローラーとして構成する方法は、このハウツーの範囲外です。TomcatがWindows認証をサポートできるようにドメインコントローラーを構成する手順は次のとおりです。

  • Tomcatサーバーが使用するサービス名にマッピングされるドメインユーザーを作成します。このハウツーでは、このユーザーをtc01と呼び、パスワードはtc01passです。
  • サービスプリンシパル名 (SPN) をユーザーアカウントにマッピングします。SPNは <service class>/<host>:<port>/<service name>の形式を取ります。このハウツーで使用されるSPNはHTTP/win-tc01.dev.localです。ユーザーをSPNにマッピングするには、以下を実行します。
    setspn -A HTTP/win-tc01.dev.local tc01
  • Tomcatサーバーがドメインコントローラーに認証するために使用するキータブファイルを生成します。このファイルには、サービスプロバイダーアカウント用のTomcat秘密鍵が含まれており、それに応じて保護する必要があります。ファイルを生成するには、次のコマンド(すべて1行で)を実行します。
    ktpass /out c:\tomcat.keytab /mapuser tc01@DEV.LOCAL
              /princ HTTP/win-tc01.dev.local@DEV.LOCAL
              /pass tc01pass /kvno 0
  • クライアントで使用するドメインユーザーを作成します。このハウツーでは、ドメインユーザーはtestで、パスワードはtestpassです。

上記の手順は、Windows Server 2019 Standardを実行し、フォレストとドメインの両方でWindows Server 2016機能レベルを使用しているドメインコントローラーでテストされています。

Tomcatインスタンス (Windowsサーバー)

これらの手順は、Tomcatと適切なJava JDK/JREがすでにインストールおよび構成されており、Tomcatがtc01@dev.localユーザーとして実行されていることを前提としています。Windows認証のためにTomcatインスタンスを構成する手順は次のとおりです。

  • ドメインコントローラーで作成したtomcat.keytabファイルを$CATALINA_BASE/conf/tomcat.keytabにコピーします。
  • Kerberos構成ファイル$CATALINA_BASE/conf/krb5.iniを作成します。このハウツーで使用されるファイルには以下が含まれていました。
    [libdefaults]
    default_realm = DEV.LOCAL
    default_keytab_name = FILE:c:\apache-tomcat-11.0.x\conf\tomcat.keytab
    default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
    default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
    forwardable=true
    
    [realms]
    DEV.LOCAL = {
            kdc = win-dc01.dev.local:88
    }
    
    [domain_realm]
    dev.local= DEV.LOCAL
    .dev.local= DEV.LOCAL
    このファイルの場所は、java.security.krb5.confシステムプロパティを設定することで変更できます。
  • JAASログイン構成ファイル$CATALINA_BASE/conf/jaas.confを作成します。このハウツーで使用されるファイルには以下が含まれていました。
    com.sun.security.jgss.krb5.initiate {
        com.sun.security.auth.module.Krb5LoginModule required
        doNotPrompt=true
        principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
        useKeyTab=true
        keyTab="c:/apache-tomcat-11.0.x/conf/tomcat.keytab"
        storeKey=true;
    };
    
    com.sun.security.jgss.krb5.accept {
        com.sun.security.auth.module.Krb5LoginModule required
        doNotPrompt=true
        principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
        useKeyTab=true
        keyTab="c:/apache-tomcat-11.0.x/conf/tomcat.keytab"
        storeKey=true;
    };
    このファイルの場所は、java.security.auth.login.configシステムプロパティを設定することで変更できます。使用されるLoginModuleはJVM固有のものであるため、指定されたLoginModuleが使用中のJVMと一致していることを確認してください。ログイン設定の名前は、認証バルブで使用される値と一致する必要があります。

SPNEGO認証器は、どのレルムでも動作しますが、JNDIレルムで使用する場合、デフォルトではJNDIレルムはユーザーの委任された資格情報を使用してActive Directoryに接続します。認証されたユーザー名のみが必要な場合は、認証されたユーザー名に基づいて、ロールを持たないPrincipalを単純に返すAuthenticatedUserRealmを使用できます。

上記の手順は、Windows Server 2019 StandardとAdoptOpenJDK 8u232-b09 (64ビット) を実行しているTomcatサーバーでテストされています。

Tomcatインスタンス (Linuxサーバー)

これは以下でテストされました。

  • Java 1.7.0, update 45, 64ビット
  • Ubuntu Server 12.04.3 LTS 64ビット
  • Tomcat 8.0.x (r1546570)

最新の安定版を使用することを推奨しますが、どのTomcatリリースでも動作するはずです。

設定はWindowsの場合と同じですが、以下の変更点があります。

  • LinuxサーバーはWindowsドメインの一部である必要はありません。
  • krb5.iniおよびjaas.conf内のキータブファイルへのパスは、Linuxスタイルのファイルパス(例: /usr/local/tomcat/...)を使用して、Linuxサーバー上のキータブファイルへのパスを反映するように更新する必要があります。

ウェブアプリケーション

ウェブアプリケーションは、web.xmlでTomcat固有のSPNEGO認証方法(BASICなどではなく)を使用するように構成する必要があります。他の認証器と同様に、認証バルブを明示的に構成し、バルブに属性を設定することで動作をカスタマイズできます。

クライアント

クライアントはKerberos認証を使用するように構成する必要があります。Internet Explorerの場合、これはTomcatインスタンスが「ローカルイントラネット」セキュリティゾーンにあり、統合Windows認証が有効になっている(ツール > インターネットオプション > 詳細設定で)ことを確認することを意味します。クライアントとTomcatインスタンスに同じマシンを使用した場合、Internet ExplorerがサポートされていないNTLMプロトコルを使用するため、これは機能しませんので注意してください。

サードパーティライブラリ

Waffle

このソリューションの詳細は、Waffleウェブサイトで確認できます。主な特徴は次のとおりです。

  • ドロップインソリューション
  • シンプルな設定(JAASまたはKerberosキータブの設定は不要)
  • ネイティブライブラリを使用

Spring Security - Kerberos拡張

このソリューションの詳細は、Kerberos拡張ウェブサイトで確認できます。主な特徴は次のとおりです。

  • Spring Securityへの拡張
  • Kerberosキータブファイルの生成が必要
  • 純粋なJavaソリューション

Jespa

このソリューションの詳細は、プロジェクトウェブサイトで確認できます。主な特徴は次のとおりです。

  • 純粋なJavaソリューション
  • 高度なActive Directory統合

SourceForgeのSPNEGO ADプロジェクト

このソリューションの詳細は、プロジェクトサイトで確認できます。主な特徴は次のとおりです。

  • 純粋なJavaソリューション
  • SPNEGO/Kerberos認証器
  • Active Directoryレルム

リバースプロキシ

Microsoft IIS

IISをWindows認証を提供するように構成するには、3つのステップがあります。それらは次のとおりです。

  1. IISをTomcatのリバースプロキシとして構成する(IISウェブサーバーハウツーを参照)。
  2. IISをWindows認証を使用するように構成する
  3. AJPコネクタtomcatAuthentication属性をfalseに設定することで、TomcatがIISからの認証ユーザー情報を使用するように構成します。あるいは、tomcatAuthorization属性をtrueに設定して、IISに認証を許可し、Tomcatが認可を実行するようにします。

Apache httpd

Apache httpdはWindows認証を標準ではサポートしていませんが、いくつかのサードパーティモジュールを使用できます。これらには以下が含まれます。

  1. Windowsプラットフォームで使用するmod_auth_sspi
  2. 非Windowsプラットフォーム用のmod_auth_ntlm_winbind。32ビットプラットフォーム上のhttpd 2.0.xで動作することが知られています。一部のユーザーは、httpd 2.2.xビルドと64ビットLinuxビルドの両方で安定性の問題が報告されています。

httpdをWindows認証を提供するように構成するには、3つのステップがあります。それらは次のとおりです。

  1. httpdをTomcatのリバースプロキシとして構成する(Apache httpdウェブサーバーハウツーを参照)。
  2. httpdをWindows認証を使用するように構成する
  3. AJPコネクタtomcatAuthentication属性をfalseに設定することで、Tomcatがhttpdからの認証ユーザー情報を使用するように構成します。