Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de Microsoft JDBC Driver 4.0 para SQL Server, una aplicación puede usar la propiedad de conexión authenticationScheme para indicar que quiere conectar con una base de datos mediante la autenticación integrada de Kerberos de tipo 4. Para más información sobre las propiedades de conexión, consulte Establecimiento de las propiedades de conexión. Para más información sobre Kerberos, consulte Microsoft Kerberos.
Cuando se usa la autenticación integrada con Krb5LoginModule de Java, se puede configurar el módulo mediante Class Krb5LoginModule.
Microsoft JDBC Driver para SQL Server establece las propiedades siguientes para las máquinas virtuales Java de IBM:
- useDefaultCcache = true
- moduleBanner = false
Microsoft JDBC Driver para SQL Server establece las propiedades siguientes para todas las demás máquinas virtuales Java:
- useTicketCache = true
- doNotPrompt = true
Observaciones
Antes del controlador JDBC 4.0 de Microsoft para SQL Server, las aplicaciones podían especificar la autenticación integrada (con Kerberos o NTLM, en función de la que estuviera disponible) mediante la propiedad de conexión integratedSecurity y por referencia a mssql-jdbc_auth-<versión>-<arch>.dll, como se describe en Creación de la dirección URL de conexión.
A partir de Microsoft JDBC Driver 4.0 para SQL Server, una aplicación puede usar la propiedad de conexión authenticationScheme para indicar que quiere conectar con una base de datos mediante la autenticación integrada de Kerberos con la implementación Kerberos pura de Java:
Si desea usar la autenticación integrada mediante Krb5LoginModule, debe seguir especificando la propiedad de conexión integratedSecurity=true. También especificaría la propiedad de conexión authenticationScheme=JavaKerberos.
Para seguir usando la autenticación integrada con mssql-jdbc_auth-<versión>-<arch>.dll, solo tiene que especificar la propiedad de conexión integratedSecurity=true (y opcionalmente authenticationScheme=NativeAuthentication).
Si especifica authenticationScheme=JavaKerberos pero no integratedSecurity=true, el controlador omitirá la propiedad de conexión authenticationScheme y esperará hasta que encuentre las credenciales de nombre de usuario y contraseña en la cadena de conexión.
Cuando se usa un origen de datos para crear conexiones, se puede establecer mediante programación el esquema de autenticación con setAuthenticationScheme y, opcionalmente, establecer el SPN para las conexiones de Kerberos mediante setServerSpn.
Se ha agregado un nuevo registrador para admitir la autenticación Kerberos: com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Para obtener más información, vea Seguimiento del funcionamiento del controlador.
Las directrices siguientes le ayudarán a configurar Kerberos:
- Establezca AllowTgtSessionKey en 1 en el Registro para Windows. Para obtener más información, vea Kerberos protocol registry entries and KDC configuration keys in Windows Server 2003 (Entradas del Registro del protocolo Kerberos y claves de configuración del KDC en Windows Server 2003).
- Asegúrese de que la configuración de Kerberos (krb5.conf en entornos UNIX) apunta al dominio Kerberos y al KDC correctos para su entorno.
- Inicialice la memoria caché del TGT mediante kinit o iniciando sesión en el dominio.
- Cuando una aplicación que usa authenticationScheme=JavaKerberos se ejecuta en los sistemas operativos Windows Vista o Windows 7, debe emplear una cuenta de usuario estándar. Sin embargo, si ejecuta la aplicación en una cuenta de administrador, la aplicación debe ejecutarse con privilegios de administrador.
Nota:
El atributo de conexión serverSpn solo es compatible con Microsoft JDBC Driver 4.2 y superior.
Nombres de entidad de servicio
Un nombre principal de servicio (SPN) es el nombre por el que un cliente identifica de forma unívoca una instancia de un servicio.
Puede especificar el SPN con la propiedad de conexión serverSpn o dejar que el controlador lo genere automáticamente (el valor predeterminado). Esta propiedad tiene el formato "MSSQLSvc/fqdn:port@REALM", donde "fqdn" es el nombre de dominio completo, "port" es el número de puerto y "REALM" es el dominio Kerberos de SQL Server en letras mayúsculas. La parte correspondiente al reino de esta propiedad es opcional si el reino predeterminado de su configuración de Kerberos es el mismo que el del servidor y no se incluye de forma predeterminada. Si desea admitir un escenario de autenticación entre dominios Kerberos donde el dominio Kerberos predeterminado en la configuración de Kerberos es diferente del dominio Kerberos del servidor, debe establecer el SPN con la propiedad serverSpn.
Por ejemplo, el SPN podría ser: MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM
Para obtener más información sobre los nombres de entidad de servicio (SPN), consulte:
Nota:
Antes de la publicación de la versión 6.2 del controlador JDBC, para usar correctamente Kerberos de varios reinos, era necesario establecer explícitamente el serverSpn.
A partir de la versión 6.2, el controlador podrá compilar serverSpn de forma predeterminada, incluso al usar Kerberos entre dominios. Aunque también se puede usar serverSpn explícitamente.
Crear un archivo de configuración de módulo de inicio de sesión
Si lo desea, puede especificar un archivo de configuración de Kerberos. Si no se especifica ningún archivo de configuración, se usarán las configuraciones siguientes:
Máquina virtual Java de Sun
com.sun.security.auth.module.Krb5LoginModule requerido useTicketCache=true;
Máquina virtual Java de IBM
com.ibm.security.auth.module.Krb5LoginModule requerido useDefaultCcache = true;
Si decide crear un archivo de configuración de un módulo de inicio de sesión, el archivo debe seguir este formato:
<name> {
<LoginModule> <flag> <LoginModule options>;
<optional_additional_LoginModules, flags_and_options>;
};
Un archivo de configuración de inicio de sesión consta de una o varias entradas, cada una de las cuales especifica qué tecnología de autenticación subyacente se debe usar para una o varias aplicaciones determinadas. Por ejemplo,
SQLJDBCDriver {
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
};
Cada entrada del archivo de configuración del módulo de inicio de sesión consta de un nombre seguido de una o varias entradas específicas de LoginModule. Cada entrada específica de LoginModule finaliza con un punto y coma y todo el grupo de entradas específicas de LoginModule se encierra entre llaves. Cada entrada del archivo de configuración termina con un signo de punto y coma.
Además de permitir al controlador adquirir credenciales de Kerberos usando las configuraciones especificadas en el archivo de configuración del módulo de inicio de sesión, el controlador puede emplear credenciales existentes. Este método puede resultar útil cuando la aplicación necesite crear conexiones usando credenciales de más de un usuario.
El controlador intentará usar credenciales existentes si están disponibles, antes de intentar el inicio de sesión usando el módulo de inicio de sesión especificado. Así, cuando se usa el método Subject.doAs para ejecutar código bajo un contexto determinado, se creará una conexión con las credenciales pasadas a la llamada a Subject.doAs.
Para obtener más información, vea JAAS Login Configuration File (Archivo de configuración de inicio de sesión JAAS) y Class Krb5LoginModule (Clase Krb5LoginModule).
A partir de la versión 6.2 de Microsoft JDBC Driver, el nombre de entrada de la configuración del módulo de inicio de sesión se puede indicar mediante la propiedad de conexión jaasConfigurationName. Este método permite que cada conexión tenga su propia configuración de inicio de sesión o use un nombre distinto de SQLJDBCDriver.
Crear un archivo de configuración de Kerberos
Para obtener más información sobre los archivos de configuración de Kerberos, vea Requisitos de Kerberos.
A continuación se muestra un archivo de configuración de dominio de ejemplo, donde YYYY y ZZZZ son los nombres de dominio.
[libdefaults]
default_realm = YYYY.CORP.CONTOSO.COM
dns_lookup_realm = false
dns_lookup_kdc = true
ticket_lifetime = 24h
forwardable = yes
[domain_realm]
.yyyy.corp.contoso.com = YYYY.CORP.CONTOSO.COM
.zzzz.corp.contoso.com = ZZZZ.CORP.CONTOSO.COM
[realms]
YYYY.CORP.CONTOSO.COM = {
kdc = krbtgt/YYYY.CORP. CONTOSO.COM @ YYYY.CORP. CONTOSO.COM
default_domain = YYYY.CORP. CONTOSO.COM
}
ZZZZ.CORP. CONTOSO.COM = {
kdc = krbtgt/ZZZZ.CORP. CONTOSO.COM @ ZZZZ.CORP. CONTOSO.COM
default_domain = ZZZZ.CORP. CONTOSO.COM
}
Habilitar el archivo de configuración de dominio y el archivo de configuración de módulo de inicio de sesión
Puede habilitar un archivo de configuración de dominio con -Djava.security.krb5.conf. Puede habilitar un archivo de configuración del módulo de inicio de sesión con -Djava.security.auth.login.config.
Por ejemplo, se puede usar el siguiente comando para iniciar la aplicación:
Java.exe -Djava.security.auth.login.config=SQLJDBCDriver.conf -Djava.security.krb5.conf=krb5.ini <APPLICATION_NAME>
Comprobar que se puede acceder a SQL Server mediante Kerberos
Ejecute la consulta siguiente en SQL Server Management Studio:
select auth_scheme from sys.dm_exec_connections where session_id=@@spid
Asegúrese de que tiene el permiso necesario para ejecutar esta consulta.
Delegación restringida
A partir de Microsoft JDBC Driver 6.2, el controlador admite la delegación restringida de Kerberos. La credencial delegada se puede proporcionar como un objeto org.ietf.jgss.GSSCredential. Estas credenciales son utilizadas por el controlador para establecer la conexión.
Properties driverProperties = new Properties();
GSSCredential impersonatedUserCredential = [userCredential]
driverProperties.setProperty("integratedSecurity", "true");
driverProperties.setProperty("authenticationScheme", "JavaKerberos");
driverProperties.put("gsscredential", impersonatedUserCredential);
Connection conn = DriverManager.getConnection(CONNECTION_URI, driverProperties);
Conexión Kerberos con nombre principal, contraseña y reino
A partir de la versión 6.2 de Microsoft JDBC Driver, el controlador puede establecer una conexión Kerberos mediante el nombre de entidad de seguridad y la contraseña proporcionados en la cadena de conexión.
jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user@REALM;password=<password>
La propiedad username no requiere un REALM si el usuario pertenece al default_realm configurado en el archivo krb5.conf. Cuando se establecen userName y password junto con integratedSecurity=true; y la propiedad authenticationScheme=JavaKerberos;, se establece la conexión usando el valor de userName como principal de Kerberos, junto con la contraseña suministrada.
A partir de la versión 9.4 del controlador Microsoft JDBC Driver, el usuario puede especificar el reino para la autenticación Kerberos en la cadena de conexión.
jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user;password=<password>;realm=REALM
Uso de la autenticación Kerberos en equipos Unix del mismo dominio
Esta guía presupone que ya existe una configuración de Kerberos operativa. Ejecute el siguiente código en un equipo Windows con la autenticación Kerberos de trabajo para comprobar si lo antes mencionado es cierto. El código imprimirá "Esquema de autenticación: KERBEROS" en la consola si se realiza correctamente. No se requiere ninguna otra marca de tiempo de ejecución, dependencia o configuración del controlador fuera de las proporcionadas. Se puede ejecutar el mismo bloque de código en Linux para comprobar las conexiones correctas.
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("<server>");
ds.setPortNumber(1433); // change if necessary
ds.setIntegratedSecurity(true);
ds.setAuthenticationScheme("JavaKerberos");
ds.setDatabaseName("<database>");
try (Connection c = ds.getConnection(); Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select auth_scheme from sys.dm_exec_connections where session_id=@@spid")) {
while (rs.next()) {
System.out.println("Authentication Scheme: " + rs.getString(1));
}
}
- Una el equipo cliente al mismo dominio que el servidor.
- (Opcional) Establezca la ubicación predeterminada del ticket de Kerberos. Este paso se realiza de forma más cómoda estableciendo la variable de entorno
KRB5CCNAME. - Obtenga el vale Kerberos, ya sea generando uno nuevo o situando uno existente en la ubicación del vale Kerberos predeterminada. Para generar un ticket, use un terminal e inicialice el ticket mediante
kinit USER@DOMAIN.AD, donde "USER" y "DOMAIN.AD" son el principal y el dominio, respectivamente. Por ejemplo:kinit SQL_SERVER_USER03@EXAMPLE.COM. El ticket se generará en la ubicación predeterminada del ticket o en la rutaKRB5CCNAMEsi se ha establecido. - El terminal solicitará una contraseña. Escríbala.
- Compruebe las credenciales del ticket mediante
klisty confirme que las credenciales son las que tiene previsto utilizar para autenticarse. - Ejecute el código de ejemplo anterior y confirme que la autenticación Kerberos se ha realizado correctamente.
Integración GSS de plataforma nativa
La integración de GSS de plataforma nativa permite a las aplicaciones Java usar la API de GSS nativa en lugar de los mecanismos criptográficos de la implementación de JDK de GSS-API. Por ejemplo, el código de ejemplo siguiente muestra cómo habilitar el uso de la API de GSS nativa en el controlador:
GSSCredential credential = GSSManager.getInstance().createCredential(null, GSSCredential.DEFAULT_LIFETIME, new Oid("1.2.840.113554.1.2.2"), GSSCredential.INITIATE_ONLY);
SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL("jdbc:sqlserver://<server>;databaseName=<database>;integratedSecurity=true;authenticationScheme=JavaKerberos;");
ds.setGSSCredentials(credential);
ds.getConnection();
try (Connection conn = ds.getConnection()) {
ResultSet rs = conn.executeQuery("select auth_scheme from sys.dm_exec_connections where session_id=@@spid")) {
while (rs.next()) {
System.out.println("Authentication Scheme: " + rs.getString(1));
}
}
Además, también se requieren los siguientes argumentos de JVM:
-Dsun.security.jgss.native=true
-Djavax.security.auth.useSubjectCredsOnly=false
También puede proporcionar opcionalmente la ruta de acceso a la biblioteca de GSS nativa.
-Dsun.security.jgss.lib=path/to/native/gss/library // This is optional
Para más información sobre los argumentos de JVM, consulte la documentación oficial de Java.
Protección ampliada con Kerberos
También puede habilitar la protección ampliada para Kerberos al usar el driver JDBC. La restricción es que para el driver JDBC, cuando se usa la protección ampliada, no se debe habilitar el cifrado forzado.
Para obtener más información sobre cómo habilitar la protección ampliada, consulte:
Para más información sobre cómo conectarse con el cifrado, consulte: