Windows認証 How-To

目次

概要

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

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

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

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

Tomcat組み込みサポート

Kerberos(統合Windows認証の基礎)には、慎重な構成が必要です。このガイドの手順を正確に実行すれば、動作する構成が実現します。以下の手順を正確に実行することが重要です。構成には柔軟性がほとんどありません。これまでのテストから、次のことがわかっています。

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

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

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

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

ドメインコントローラー

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

  • Tomcatサーバーで使用されるサービス名にマッピングされるドメインユーザーを作成します。このハウツーでは、このユーザーはtc01と呼ばれ、パスワードはtc01passです。
  • サービスプリンシパル名(SPN)をユーザーアカウントにマッピングします。SPNは <サービスクラス>/<ホスト>:<ポート>/<サービス名>の形式を取ります。このハウツーで使用されるSPNはHTTP/win-tc01.dev.localです。ユーザーをSPNにマッピングするには、以下を実行します。
    setspn -A HTTP/win-tc01.dev.local tc01
  • ドメインコントローラーに対して自身を認証するためにTomcatサーバーが使用するkeytabファイルを生成します。このファイルには、サービスプロバイダーアカウントの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 2016の機能レベルを使用するWindows Server 2019 Standardを実行するドメインコントローラーでテストされています。

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

これらの手順では、TomcatとJava 11 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-10.1.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-10.1.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-10.1.x/conf/tomcat.keytab"
        storeKey=true;
    };
    このファイルの場所は、java.security.auth.login.configシステムプロパティを設定することで変更できます。使用されるLoginModuleはJVM固有のものなので、指定したLoginModuleが使用されているJVMと一致していることを確認してください。ログイン構成の名前は、認証バルブで使用される値と一致する必要があります。

SPNEGO認証は、任意のレルムで動作しますが、JNDIレルムで使用する場合、デフォルトではJNDIレルムはユーザーの委任された資格情報を使用してActive Directoryに接続します。認証されたユーザー名のみが必要な場合は、役割を持たない認証されたユーザー名に基づいてプリンシパルを返すAuthenticatedUserRealmを使用できます。

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

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

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

  • Java 1.7.0、update 45、64-bit
  • Ubuntu Server 12.04.3 LTS 64-bit
  • Tomcat 8.0.x (r1546570)

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

構成はWindowsの場合と同じですが、次の変更があります。

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

Webアプリケーション

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

クライアント

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

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

Waffle

このソリューションの詳細は、Waffle Webサイトで確認できます。主な機能は次のとおりです。

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

Spring Security - Kerberos拡張機能

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

  • Spring Securityの拡張機能
  • Kerberos keytabファイルを生成する必要がある
  • 純粋なJavaソリューション

Jespa

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

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

SourceForgeのSPNEGO ADプロジェクト

このソリューションの詳細については、プロジェクトサイトをご覧ください。主な機能は以下のとおりです。

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

リバースプロキシ

Microsoft IIS

IIS を Windows 認証を提供するように設定するには、以下の3つのステップがあります。

  1. IIS を Tomcat のリバースプロキシとして設定します(IIS Webサーバーハウツーを参照)。
  2. IIS が Windows 認証を使用するように設定します。
  3. AJPコネクタの `tomcatAuthentication` 属性を `false` に設定することで、IIS からの認証ユーザー情報を Tomcat が使用するように設定します。あるいは、`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 Webサーバーハウツーを参照)。
  2. httpd が Windows 認証を使用するように設定します。
  3. AJPコネクタの `tomcatAuthentication` 属性を `false` に設定することで、httpd からの認証ユーザー情報を Tomcat が使用するように設定します。