Geração de tokens SPNEGO para solicitações JAX-WS de saída
A classe com.ibm.wsspi.security.auth.krb5. SpnegoTokenHelper pode ser usada para criar programaticamente um token SPNEGO.
- Um token solicitado que usa credenciais do Windows Native. Quando o processo do WebSphere Java™ estiver em execução em um sistema Windows com um ID do usuário que possui credenciais Kerberos, o sistema operacional Windows manterá um Kerberos Ticket Granting Ticket (TGT) para esse usuário. A classe SpnegoTokenHelper que utiliza o TGT para solicitar um token SPNEGO que pode ser solicitado para um ServicePrincipalName (SPN), para o sistema de serviço de destino.
- Um token solicitado que usa credenciais Kerberos em cache. Em um sistema no qual um usuário efetuou login, geralmente utilizando ferramentas como a ferramenta kinit do Java, as credenciais Kerberos do usuário são armazenadas em um arquivo de cache denominado krb5cc_<userid>. Como alternativa, um arquivo keytab que contém uma chave do usuário pode ser criado utilizando várias ferramentas, como a ferramenta ktpass da Microsoft ou a ferramenta ktab Java. Esses arquivos contêm uma cópia da chave Kerberos do usuário que pode ser usada para obter um Ticket Granting Ticket (TGT) para esse ID do usuário. A classe SpnegoTokenHelper que utiliza o TGT para solicitar um token SPNEGO que pode ser solicitado para um ServicePrincipalName (SPN), para o sistema de serviço de destino. O processo do WebSphere deve ser configurado para usar o arquivo krb5cc_<userid ou arquivo keytab. O UserPrincipalName (UPN) para a credencial em cache no arquivo também deve ser fornecido.
- Um token solicitado que usa uma credencial Kerberos que, por sua vez, usa um ID do usuário e senha. Nesse cenário, o processo WebSphere usa a classe SpnegoTokenHelper para se conectar ao servidor Kerberos Key Distribution com o ID do usuário e senha fornecidos para obter um Ticket Granting Ticket (TGT). A classe, em seguida, solicita o token SPNEGO com esse TGT. A classe SpnegoTokenHelper requer o ServicePrincipalName (SPN) para o sistema de serviço de destino e o ID do usuário e senha.
- Um token solicitado usando uma credencial Kerberos existente em
um Java Subject. O Subject
pode obter uma credencial Kerberos de uma das seguintes maneiras:
- O usuário efetuou login em um aplicativo da web usando a autenticação da web SPNEGO de entrada. Somente a Autenticação da web SPNEGO precisa ser configurada e ativada no WebSphere Application Server para essa opção. O ID do usuário Kerberos que está associado ao serviço SPNEGO de entrada deve ser ativado para a delegação Kerberos completa.
- Uma solicitação de serviço da web JAX-WS foi recebida contendo um token WS-Security Kerberos. O ID do usuário Kerberos que está associado ao serviço da web de entrada deve ser ativado para a delegação Kerberos completa.
- O usuário efetuou login com o ID do usuário e senha e o WebSphere Application Server foi configurado para autenticação LTPA e Kerberos.
- Uma solicitação de serviço da web JAX-WS foi recebida contendo um token de nome do usuário com uma senha, e o WebSphere Application Server foi configurado para autenticação LTPA e Kerberos. A classe SpnegoTokenHelper usará as credenciais no Subject para solicitar um tíquete de serviço para o ServicePrincipalName (SPN), para o sistema de serviço de destino. Os métodos que estão associados a essa abordagem requerem um parâmetro do Java Subject, além do valor de SPN.
- Token solicitado usando uma credencial Kerberos no Java Subject da identidade do responsável pela chamada atual. Essa abordagem é semelhante à abordagem anterior, e um método de conveniência é usado na classe SpnegoTokenHelper para obter a identidade do responsável pela chamada atual. As restrições no Subject mencionadas anteriormente ainda se aplicam. Os métodos que estão associados a essa abordagem requerem apenas o ServicePrincipalName (SPN).
Todas as 5 abordagens têm duas variações; na primeira variação, o tempo de vida do token pode ser especificado e uma sinalização booleana indicando que um token delegável deve ser solicitado. Na segunda variação, o temo de vida do token é infinito, e o token não é solicitado como delegável.
Todas as cinco abordagens retornam uma sequência (por exemplo, “Negociar YIIFKwYG….”). É responsabilidade do programador usar a sequência para injetar o cabeçalho Authorization de saída.
- Notas para credenciais nativas
- O cache de credenciais Microsoft Kerberos
Logon Session (MSLSA) dependem da capacidade para extrair o ticket Kerberos inteiro, incluindo a chave de sessão a partir do cache de credenciais Kerberos Logon Session (LSA). Em uma tentativa de aumentar a segurança, a Microsoft implementou um recurso pelo qual ela não exporta mais as chaves de sessão para Ticket
Getting Tickets, o que pode fazer com que elas sejam inutilizáveis para o IBM® JGSS quando forem feitas tentativas de solicitar mais tickets de serviços. Esse novo recurso foi visto no Windows 2003
Server e em sistemas posteriores. A Microsoft forneceu a seguinte chave de registro
para desativar este novo recurso:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters AllowTGTSessionKey = 0x01 (DWORD)
- Requisitos no arquivo de configuração do Kerberos
- O arquivo de configuração Kerberos deve ser configurado corretamente, independentemente
da abordagem.
- O modo como o processo do WebSphere atinge o Key Distribution Center (KDC) deve ser configurado adequadamente por meio das sub-rotinas [realms] e [domain_realm].
- Os tipos de criptografia a serem usados na sub-rotina [libdefaults] devem especificar os valores default_tkt_enctypes e default_tgs_enctypes.
- A sub-rotina [libdefaults] deve incluir o seguinte:
- forwardable = true
- renewable = true
- noaddresses = true
- A sub-rotina [libdefaults] deve definir um valor clockskew razoável.
Referenciando um keytab
JAASClientUsingKeytab {
com.ibm.security.auth.module.Krb5LoginModule required useKeytab="file:///C:\\WAS\\ND855\\profiles\\AppSrv01\\config\\cells\\testserver-vmCell01-855\\cachKerbUser.keytab" credsType=both
tryFirstPass=true forwardable=true noAddress=true;
};
Exemplos de uso da classe SPNEGOTokenHelper
No primeiro exemplo, um token SPNEGO é obtido para um usuário com base nas Credenciais Nativas do Windows, sob as quais o processo WebSphere está sendo executado.
String nativeToken = SpnegoTokenHelper.buildSpnegoAuthorizationStringFromNativeCreds(spn, GSSCredential.INDEFINITE_LIFETIME, false);
- spn - ServicePrincipalName do sistema para o qual o token SPNEGO é destinado. Por exemplo, isso pode ser uma sequência como “HTTP/service.host.ibm.com@IBM.COM”
- Tempo de vida do contexto. No exemplo GSSCredential.INDEFINITE_LIFETIME
- Delegar - Se o token incluir credenciais delegáveis. No exemplo, o token não incluirá credenciais delegáveis.
O segundo exemplo demonstra o uso de um arquivo keytab ou de credenciais em cache. Neste exemplo, o método mais simples é usado (nenhum tempo de vida é especificado e o token não é delegável)
String token = SpnegoTokenHelper.buildSpnegoAuthorizationFromUpn(spn,upn, jaas);
- upn - UserPrincipalName da identidade do arquivo. Por exemplo, alice@IBM.COM.
- Jaas – O nome da configuração JAAS a ser usado (o qual referencia ao keytab do arquivo de credenciais em cache, como “JAASClientUsingKeytab”.
O terceiro exemplo mostra o uso de um ID do usuário e senha para gerar um token Kerberos.
String token = SpnegoTokenHelper.buildSpnegoAuthorizationFromUseridPassword(spn,userid,pwd,1000,true);
Os novos parâmetros introduzidos são ID do usuário e senha. O exemplo também demonstra a solicitação de um token não infinito – o token é gerado para 1000 segundos, e é delegável (o serviço que é associado a esse spn deve ser ativado para delegação).
O quarto exemplo mostra um mecanismo raramente usado, quando você começa com um Subject que contém uma credencial Kerberos. Este exemplo é mostrado para complementação, porém a menos que controle programaticamente a criação do Subject, você provavelmente não usará esse método.
String token = buildSpnegoAuthorizationFromSubject(spn, subject);
String token = SpnegoTokenHelper.buildSpnegoAuthorizationFromCallerSubject(spn);
Para obter detalhes adicionais, consulte Geração de tokens SPNEGO para solicitações JAX-WS de saída usando Ligações do conjunto de política do cliente.