web-dev-qa-db-ja.com

JDBCを介したWindowsユーザーとしてのSQLServerインスタンスへの認証

テナント対応のWebアプリケーションで複数のデータベースタイプをサポートする必要があります。特に、「jdbc:jtds:sqlserver://192.168.1.189:1433/ApplicationName」のような接続文字列でnet.sourceforge.jtds.jdbc.Driverクラスを使用することにより、MicrosoftのSQLServerを正常にサポートしました。これは機能しますが、ユーザーがSQL Serverインスタンスでユーザーを明示的に定義し、SQLServer認証を有効にする必要があります。

現在、必然的に要件が変更され、Windows認証を介したSQLServerへの接続をサポートすることになっています。データベースサーバーは、データベース接続に渡される資格情報がSQLServerのインストールまたはWindowsOSで定義されたユーザーのものであるかどうかを何らかの方法で区別できる必要があるため、これには明らかに接続文字列の何らかの変更が必要です。しかし、それは何ですか?

;useNTLMv2=true;domain=WORKGROUPで接続文字列を拡張するまで進んだ場合は、インターネットからのアドバイスに基づいて行動します。そのデータベースサーバーにWindowsユーザーとして認証したいことを認識させるようですが、実際のログインは次のように失敗します。

The login is from an untrusted domain and cannot be used with Windows authentication. (code 18452, state 28000)

テストのセットアップでは、J2EEアプリとSQLサーバーインスタンスの両方が実際には同じマシン上にありますが(本番環境ではそうではない場合があります)、それでもこのコンピューターはそれ自体にログオンするのに十分な信頼性がありませんか?明らかに、私はここでパズルの大部分を見逃しています。 SQL Serverインスタンスを開始したユーザーが、実際にJDBCを介してログオンできることを納得させるには、何をする必要がありますか?

編集

Webアプリケーションを完全なMicrosoftインフラストラクチャスタック(SQL Server、Active Directory、ドメインネームサービスなど)と統合しようとして、すでに多くの失敗した努力をしているので、この質問を制限する必要があります。

SQL Serverインストールにユーザーアカウントでアクセスする方法を知っている人はいますか「Windowsユーザー」として定義[〜#〜] jdbc [〜# 〜] J2EEアプリケーションを形成します。なし Active Directory、Webアプリケーションを実行するWindowsマシン、および独自のDLLを使用する必要がありますか?恩恵は、そのサブ問題のあらゆる解決のためのものです。問題全体が明らかに広すぎて、1つのフォーラム投稿で答えることができません。

9
Kilian Foth

あなたが説明することは確かに実行可能であるように思われます。 SQL Server 2008 R2 Expressをスタンドアロンサーバーで実行していて、そのサーバーでWindowsユーザー名/パスワードを使用して、別のWindowsマシンおよびXubuntu14.04ボックスからjTDS1.3.1を介して接続できました。

SQL Serverを実行しているマシンで、「kilian」という名前のWindowsユーザーを作成しました。 SQL Server自体で、NT AUTHORITY\Authenticated UsersのSQLログインを作成しました。次に、データベース(「myDb」という名前)で、そのSQLログイン用に「AuthenticatedUsers」という名前のユーザーを作成しました。簡単にするために、そのユーザーにデータベースに対するdb_owner権限を付与しました。

DatabaseUser.png

'kilian'のSQLログインはなく、その名前のデータベースユーザーもありません。

次に、他の2台のマシン(WindowsワークステーションとXubuntuボックス)から、これを実行しました。

package com.example.jtdstest;

import Java.sql.*;

public class JtdsTestMain {

    public static void main(String[] args) {
        try (Connection con = DriverManager.getConnection(
                "jdbc:jtds:sqlserver://192.168.1.137:52865/myDb" +
                    ";domain=whatever",
                "kilian",
                "4theBounty")) {
            try (Statement s = con.createStatement()) {
                String sql = "SELECT LastName FROM Clients WHERE ID=1";
                try (ResultSet rs = s.executeQuery(sql)) {
                    rs.next();
                    System.out.println(rs.getString("LastName"));
                }
            }
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }

    }

}

その他の注意事項:

  • useNTLMv2=trueを含める必要はありませんでした。そのパラメータの有無にかかわらず接続することができました。

  • I did SQL ServerにSQL認証を使用しないように指示するには、domain=を含める必要がありますが、指定した実際の値に違いはありません。 (私は文字通り「何でも」を使用しましたが、これはサーバーの名前でも、サーバーが属するワークグループの名前でもありませんでした。)

3
Gord Thompson

エラーが発生しました

ログインは信頼されていないドメインからのものであり、Windows認証では使用できません

2012 SQL ServerDBインスタンスが最近2016にアップグレードされたとき。JTDSドライバーとSQLServer 2016でADベースの認証を使用するには、でuseNTLMv2=truedomain=example.comの両方のサフィックスを指定する必要があるようです。接続を確立するため。ドメイン名は絶対に必要で、テストで確認しました。これは、JTDSドライバーバージョン1.3.1で使用されます。

JTDS1.3.1を使用したSQLServer 2016DBへのADベースの認証を使用した接続文字列の動作例:

jdbc:jtds:sqlserver://sqlserver2016db.example.com/MY_DB_NAME;domain=example.com;prepareSQL=2;useNTLMv2=true
3
beaudet

2つの可能性があります。1。サーバーが理解できないローカルシステムアカウントを使用している場合この場合、ドメインアカウントに切り替えます。

  1. Windows認証にはさまざまな資格情報要件があり、それらを満たしていない可能性があります。この場合、要件に一致するようにパスワードを変更してみてください。

両方が起こっている可能性は非常に高いです。

1
Omkar J

代替方法

別の解決策は、統合されたセキュリティを利用することです。これにより、アプリケーションは、アプリケーションが現在実行されているユーザーとしてデータベースに接続できます。これは、接続文字列のプロパティにintegratedSecurity=true;を追加することで有効になります。問題が発生した場合は、クラスパスまたはアプリライブラリ内でsqljdbc_auth.dllにアクセスできることを確認してください。

セキュリティノート

おそらくすでにご存知でしょうが、デモンストレーションの一部として以前に提案されたように、データベースへの「認証済みユーザー」へのアクセスを許可しないように注意する必要があります。アプリケーションが実行されているユーザーアカウントを特定し、データベースサーバー内のその特定のユーザーのみにアクセスを許可します。

出典/追加情報

1
Jason W

主な問題は、完全なJavaソリューション(DLLなし)を使用したWindows認証です。したがって、以下のライブラリの1つを使用できます。

したがって、アプリが上記のライブラリの1つで認証されると、JDBCは「integratedSecurity = true;」を使用して正常に実行されるはずです。必要に応じて「authenticationScheme = JavaKerberos」。

1
doxav

linuxマシンからJDBCを介してWindows認証を使用してSQLServerに接続する方法を説明する他の SO post を参照してください

1
zuckermanori

まず、jdbc接続を次のように記述する必要があります。

String url ="jdbc:sqlserver://PC01\inst01;databaseName=DB01;integratedSecurity=true";

その後

you need to enable the SQL Server TCP/IP Protocol in Sql Server Configuration Manager app. You can see the protocol in SQL Server Network Configuration.

1
Ersin Gülbahar

これは、jTDSドライバー用の私のNiFiセットアップです。

データベース接続URL:_jdbc:jtds:sqlserver://192.168.1.189:1433;DOMAIN=domain_name_

_useNTLMv2=true_を追加する必要はありませんでしたが、ほとんどの人は追加する必要があるため、それが機能しない場合は、_jdbc:jtds:sqlserver://192.168.1.189:1433;DOMAIN=domain_name;useNTLMv2=true_も試すことができます。

データベースドライバクラス名:_net.sourceforge.jtds.jdbc.Driver_

データベースユーザー:domain_user_name (**without** @domain)パスワード:_domain_password_

検証クエリ:_select 1_

0