![kerberos [jdbcドライバ]を介してRedhat7とMSSQLデータベース間の接続を確立する](https://linux33.com/image/159087/kerberos%20%5Bjdbc%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%5D%E3%82%92%E4%BB%8B%E3%81%97%E3%81%A6Redhat7%E3%81%A8MSSQL%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E9%96%93%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%82%92%E7%A2%BA%E7%AB%8B%E3%81%99%E3%82%8B.png)
私は、mssqlに接続するためにRedhat 7で作成されたJavaアプリケーションが、当社の自動デバイスによって生成されたキータブに格納されているプリンシパルを解析できないという非常に迷惑な問題を解決しています。プリンシパルは svcAccount/fqdn@RELM キータブに保存されます。
テストのために、次のコマンドを使用してcCacheを作成しました。
kinit -f -c -p FILENAME svcAccount@REALM
この接続構成は、cCacheに格納されているサブジェクトの構文がMicrosoftアプリケーションに対して不安定であるため、うまく機能しますが、使用しているキータブとの接続を確立しようとすると、次のエラーが発生します。
**com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user
'domain\ svcAccount/fqdn '**
KRB5.confに "auth_to_local"を追加しようとしましたが、kerberosがこの設定を無視しているようです。
Windowsサーバーでこのプリンシパル名をマッピングする方法を知っていますか?私のJavaアプリケーションでこれを修正する必要がありますか、それとも間違ったKerberos設定ですか?より難しくするには、kadmin権限がなく、キータブを変更することはできません。
Kerberos 構成:
Klist –kte keytab.file:
KVNO Timestamp Principal
3 12/31/1969 19:00:00 svcAccount/fqdn@RELM (encryption method)
3 12/31/1969 19:00:00 svcAccount/fqdn@RELM (encryption method)
3 12/31/1969 19:00:00 svcAccount/fqdn@RELM (encryption method)
SQLJDBCDriver.conf
SQLJDBCDriver {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="FILE:/home/filename.keytab"
principal=" svcAccount/fqdn@RELM "
storeKye=true
debug=true
credsType=both
doNotPrompt=true;
};
Javaはパラメータで始まります。
JAVA_OPTS="-Dspring.jmx.enabled=false -Dkerberos.client.reference.name=SQLJDBCDriver -Djava.security.auth.login.config=/etc/path/SQLJDBCDriver.conf -Djavax.security.auth.useSubjectCredsOnly=false -Dsun.security.krb5.debug=true -Djava.security.krb5.conf=/etc/krb5.conf -Dspring.profiles.active=uat"
接続文字列:
url: jdbc:sqlserver://serverName:2431;databaseName=DB_NAME;integratedSecurity=true;authenticationScheme=JavaKerberos;serverSpn=MSSQLSvc/fqdn:2431@DOMAIN
KRB5.CONF
[libdefaults]
default_realm = DOMAIN.COM
default_ccache_name = KEYRING:persistent:%{uid}
dns_lookup_realm = true
dns_lookup_kdc = true
noaddresses = true
kdc_timesync = 0
rdns = false
kdc_timeout = X
max_retries = X
ticket_lifetime = XX
renew_lifetime = XX
[realms]
DOMAIN.COM = {
}
[domain_realm]
domain.com = DOMAIN.COM
[appdefaults]
pam = {
validate = true
keytab = /etc/krb5.keytab
banner = login
minimum_uid = X
addressless = X
use_shmem = tX
ignore_unknown_principals = X
}
kinit = {
renewable = true
forwardable= true
}
答え1
**com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user
'domain\ svcAccount/fqdn '**
前後にスペースがあることを確認してくださいsvcAccount/fqdn
。
SQLJDBCDriver.confでは、これらのスペースは二重引用符内にも存在します。
principal=" svcAccount/fqdn@RELM "
svcAccount
はと同じではなく、<space>svcAccount
同じRELM<space>
ではありませんRELM
。余分なスペースを削除してSQLJDBCDriver.conf
もう一度やり直してください。
さらに、ファイル[domain_realm]
のこの部分には、krb5.conf
次の行のいずれかまたは両方が必要な場合と必要がない場合があります。
domain = RELM
.domain = RELM
答え2
回答ありがとうございますが、投稿を準備しながら該当の欄を間違って入力しました。接続文字列にハードコードされたユーザー名とパスワードを使用し、cCacheファイルを使用して接続を確立できるため、「ドメイン」行に問題があるとは思いません。これは krb5.conf が接続設定を許可するが、kerberos が勝ったことを意味します。 Microsoft サービスについて理解できるように、変換されたサブジェクトを渡しません。
いよいよつながったと付け加えたいです。
回避策:すべてのツール[ktutil kinit kadmin etc]と共にkrb5サーバーをダウンロードし、Principal @ REALMルールに従ってサブジェクトを追加し、生成されたキータブとして保存します[新しいエントリが追加されます]。 ..それはすべてです:)回避策であることを知っていますが、動作します。ケルベロスは悪夢だから効果がありますように。この技術の名前だけで十分です。
スレッドを閉じることができます。