Partilhar via


Usando a autenticação integrada Kerberos para se conectar ao SQL Server

Baixar driver JDBC

A partir do Microsoft JDBC Driver 4.0 para SQL Server, uma aplicação pode usar a propriedade de conexão authenticationScheme para indicar que quer se conectar a uma base de dados usando a autenticação integrada Kerberos tipo 4. Para obter mais informações sobre as propriedades da conexão, consulte Definindo as propriedades da conexão. Para obter mais informações sobre Kerberos, consulte Microsoft Kerberos.

Ao usar a autenticação integrada com o Java Krb5LoginModule, você pode configurar o módulo usando Class Krb5LoginModule.

O Microsoft JDBC Driver para SQL Server define as seguintes propriedades para IBM Java VMs:

  • useDefaultCcache = true
  • moduleBanner = falso

O Microsoft JDBC Driver para SQL Server define as seguintes propriedades para todas as outras VMs Java:

  • useTicketCache = verdadeiro
  • doNotPrompt = verdadeiro

Observações

Antes do Microsoft JDBC Driver 4.0 para SQL Server, os aplicativos podiam especificar a autenticação integrada (usando Kerberos ou NTLM, dependendo do que está disponível) usando a propriedade de conexão integratedSecurity e fazendo referência ao mssql-jdbc_auth-version-arch<><>.dll, conforme descrito em Criando a URL de conexão.

A partir do Microsoft JDBC Driver 4.0 para SQL Server, um aplicativo pode usar a propriedade authenticationScheme para indicar que deseja se conectar a um banco de dados com autenticação integrada Kerberos pela implementação pura de Kerberos em Java.

  • Se você quiser autenticação integrada usando Krb5LoginModule, você ainda deve especificar a propriedade integratedSecurity=true connection. Em seguida, você também especificaria a propriedade de conexão authenticationScheme=JavaKerberos.

  • Para continuar usando a autenticação integrada com mssql-jdbc_auth-version-arch<><>.dll, basta especificar a propriedade de conexão integratedSecurity=true (e, opcionalmente, authenticationScheme=NativeAuthentication).

  • Se especificar authenticationScheme=JavaKerberos, mas não especificar também integratedSecurity=true, o driver ignorará a propriedade de conexão authenticationScheme e esperará encontrar credenciais de nome de utilizador e palavra-passe na string de conexão.

Ao usar uma fonte de dados para criar conexões, você pode definir programaticamente o esquema de autenticação usando setAuthenticationScheme e (opcionalmente) definir o SPN para conexões Kerberos usando setServerSpn.

Um novo logger foi adicionado para dar suporte à autenticação Kerberos: com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Para obter mais informações, consulte Rastreamento da operação do driver.

As diretrizes a seguir ajudarão você a configurar o Kerberos:

  1. Defina AllowTgtSessionKey como 1 no registro para Windows. Para obter mais informações, consulte Entradas do Registro do protocolo Kerberos e chaves de configuração KDC no Windows Server 2003.
  2. Certifique-se de que a configuração do Kerberos (krb5.conf em ambientes UNIX) aponta para o domínio correto e o KDC para o seu ambiente.
  3. Inicialize o cache TGT usando o kinit ou efetuando login no domínio.
  4. Quando um aplicativo que usa authenticationScheme=JavaKerberos é executado nos sistemas operacionais Windows Vista ou Windows 7, você deve usar uma conta de usuário padrão. No entanto, se você executar o aplicativo sob uma conta de administrador, o aplicativo deve ser executado com privilégios de administrador.

Observação

O atributo de conexão serverSpn só é suportado pelo Microsoft JDBC Drivers 4.2 e superior.

Nomes principais de serviço

Um SPN (nome da entidade de serviço) é o nome pelo qual um cliente identifica exclusivamente uma instância de um serviço.

Você pode especificar o SPN usando a propriedade de conexão serverSpn ou deixar o driver criá-lo para você (o padrão). Essa propriedade está na forma de: "MSSQLSvc/fqdn:port@REALM", onde fqdn é o nome de domínio totalmente qualificado, port é o número da porta, e REALM é o domínio Kerberos do SQL Server em letras maiúsculas. A parte de realm dessa propriedade será opcional se o realm padrão da configuração Kerberos for o mesmo realm do Servidor e não estiver incluído por padrão. Se desejar oferecer suporte a um cenário de autenticação entre regiões em que o realm padrão na configuração Kerberos seja diferente do realm do Server, defina o SPN com a propriedade serverSpn.

Por exemplo, o seu SPN pode ser semelhante a: MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM

Para obter mais informações sobre nomes principais de serviço (SPNs), consulte:

Observação

Antes da versão 6.2 do driver JDBC, para o uso adequado do Kerberos Cross Realm, você precisaria definir explicitamente o serverSpn.

A partir da versão 6.2, o driver poderá criar o serverSpn por padrão, mesmo ao usar Kerberos Cross Realm. Embora se possa usar serverSpn explicitamente também.

Criando um arquivo de configuração do módulo de login

Opcionalmente, você pode especificar um arquivo de configuração Kerberos. Se um arquivo de configuração não for especificado, as seguintes configurações estarão em vigor:

Máquina Virtual Java da Sun
com.sun.security.auth.module.Krb5LoginModule necessário useTicketCache=true;

IBM JVM
com.ibm.security.auth.module.Krb5LoginModule required useDefaultCcache = true;

Se você decidir criar um arquivo de configuração do módulo de login, o arquivo deverá seguir este formato:

<name> {  
    <LoginModule> <flag> <LoginModule options>;  
    <optional_additional_LoginModules, flags_and_options>;  
};  

Um arquivo de configuração de login consiste em uma ou mais entradas, cada uma especificando qual tecnologia de autenticação subjacente deve ser usada para um aplicativo ou aplicativos específicos. Por exemplo

SQLJDBCDriver {  
   com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;  
};  

Cada entrada do arquivo de configuração do módulo de login consiste em um nome seguido por uma ou mais entradas específicas do LoginModule. Cada entrada relacionada com o LoginModule é terminada por um ponto-e-vírgula e todo o grupo de entradas relacionadas com o LoginModule é colocado entre chaves. Cada entrada do arquivo de configuração é encerrada por um ponto-e-vírgula.

Além de permitir que o driver adquira credenciais Kerberos usando as configurações especificadas no arquivo de configuração do módulo de login, o driver pode usar credenciais existentes. Esse método pode ser útil quando seu aplicativo precisa criar conexões usando as credenciais de mais de um usuário.

O driver tentará usar as credenciais existentes, se estiverem disponíveis, antes de tentar fazer login usando o módulo de login especificado. Assim, ao usar o Subject.doAs método para executar código em um contexto específico, uma conexão será criada com as credenciais passadas para a Subject.doAs chamada.

Para obter mais informações, consulte Arquivo de configuração de login JAAS e Classe Krb5LoginModule.

A partir do Microsoft JDBC Driver 6.2, o nome da entrada da configuração do módulo de login pode ser passado usando a propriedade de conexão jaasConfigurationName. Esse método permite que cada conexão tenha sua própria configuração de login ou use um nome diferente de SQLJDBCDriver.

Criando um arquivo de configuração Kerberos

Para obter mais informações sobre arquivos de configuração Kerberos, consulte Requisitos Kerberos.

Este exemplo é um arquivo de configuração de domínio, onde YYYY e ZZZZ são os nomes de domínio.

[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  
}  

Habilitando o arquivo de configuração de domínio e o arquivo de configuração do módulo de login

Você pode ativar um arquivo de configuração de domínio com -Djava.security.krb5.conf. Você pode habilitar um arquivo de configuração do módulo de login com -Djava.security.auth.login.config.

Por exemplo, o seguinte comando pode ser usado para iniciar o aplicativo:

Java.exe -Djava.security.auth.login.config=SQLJDBCDriver.conf -Djava.security.krb5.conf=krb5.ini <APPLICATION_NAME>  

Verificando se o SQL Server pode ser acessado via Kerberos

Execute a seguinte consulta no SQL Server Management Studio:

select auth_scheme from sys.dm_exec_connections where session_id=@@spid

Certifique-se de que tem a permissão necessária para executar esta consulta.

Delegação restrita

A partir do Microsoft JDBC Driver 6.2, o driver suporta a delegação restrita de Kerberos. A credencial delegada pode ser passada como objeto org.ietf.jgss.GSSCredential, essas credenciais são usadas pelo driver para estabelecer a conexão.

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);

Conexão Kerberos usando nome principal, senha e território

A partir do Microsoft JDBC Driver 6.2, o driver pode estabelecer uma conexão Kerberos usando o Nome Principal e a Senha passados na cadeia de conexão.

jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user@REALM;password=<password>

A propriedade username não requer um REALM se o usuário pertencer ao default_realm definido no arquivo krb5.conf. Quando userName e password são definidos junto com integratedSecurity=true; e authenticationScheme=JavaKerberos; propriedade, a conexão é estabelecida com um valor de userName como o Principal do Kerberos junto com a senha fornecida.

A partir do Microsoft JDBC Driver 9.4, o usuário pode especificar o território para autenticação Kerberos na cadeia de conexão.

jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user;password=<password>;realm=REALM

Usando autenticação Kerberos de máquinas Unix no mesmo domínio

Este guia pressupõe que já existe uma configuração Kerberos em funcionamento. Execute o código a seguir em uma máquina Windows com autenticação Kerberos em funcionamento para verificar se o acima mencionado é verdadeiro. O código imprimirá "Esquema de autenticação: KERBEROS" no console se for bem-sucedido. Nenhum outro sinalizador de tempo de execução, dependências ou configurações de driver são necessários fora dos fornecidos. O mesmo bloco de código pode ser executado no Linux para verificar conexões bem-sucedidas.

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));
    }
}
  1. Junte a máquina cliente ao mesmo domínio que o servidor.
  2. (Opcional) Defina o local padrão do bilhete Kerberos. Esta etapa é feita de forma mais conveniente definindo a variável de KRB5CCNAME ambiente.
  3. Obtenha o tíquete Kerberos, gerando um novo ou colocando um existente no local padrão do tíquete Kerberos. Para gerar um ticket, use um terminal e inicialize o ticket através de kinit USER@DOMAIN.AD, onde "UTILIZADOR" e "DOMÍNIO.AD" são o principal e o domínio, respetivamente. Por exemplo: kinit SQL_SERVER_USER03@EXAMPLE.COM. O ticket será gerado no local padrão do ticket ou no caminho KRB5CCNAME caso esteja definido.
  4. O terminal solicitará uma senha, digite a senha.
  5. Verifique as credenciais no ticket via klist e confirme se as credenciais são as que tencionas usar para autenticação.
  6. Execute o código de exemplo acima e confirme se a autenticação Kerberos foi bem-sucedida.

Integração com plataforma nativa GSS

A integração GSS da plataforma nativa permite que os aplicativos Java usem o GSS-API nativo em vez dos mecanismos criptográficos da implementação JDK da GSS-API. Por exemplo, o código de exemplo a seguir demonstra como habilitar o uso do GSS-API nativo dentro do driver:

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));
    }
}

Além disso, os seguintes argumentos da JVM também são necessários:

-Dsun.security.jgss.native=true
-Djavax.security.auth.useSubjectCredsOnly=false

Você também pode, opcionalmente, fornecer o caminho para a biblioteca GSS nativa.

-Dsun.security.jgss.lib=path/to/native/gss/library // This is optional

Para obter mais informações sobre argumentos JVM, consulte a documentação oficial do Java.

Proteção estendida com Kerberos

Você também pode habilitar a Proteção Estendida para Kerberos ao usar o driver JDBC. A única restrição é que, para o driver JDBC, ao usar a Proteção Estendida, a Criptografia Forçada não deve ser habilitada.

Para obter mais informações sobre como habilitar a Proteção Estendida, consulte:

Para obter mais informações sobre como se conectar com criptografia, consulte:

Ver também

Conectando-se ao SQL Server com o driver JDBC