저는 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 규칙에 따라 주체를 추가하고, 생성된 키 탭으로 저장합니다[새 항목이 추가됩니다]. ..그게 다입니다 :) 해결 방법이라는 것을 알고 있지만 작동합니다. Kerberos는 악몽이기 때문에 효과가 있기를 바랍니다. 이 기술의 이름만으로도 충분합니다... 빠른 구성을 방해합니다 :D
스레드를 닫을 수 있습니다.