Neste artigo abordaremos uma forma das "Strong Authentications" Oracle.
Ao decorrer deste, utilizaremos o Oracle/Kerberos para se autenticar no Windows Active Directory e então realizar a conexão com a base de dados Oracle.
A utilização deste procedimento remove a utilização de senha na conexão do usuário Oracle, ou seja, aquele velho padrão usuário/senha não existirá mais.
Daqui pra frente só conecta no usuário quem tiver o token carregador na maquina cliente, só pra dar uma prévia do que vai acontecer o usuário no banco de dados ficará assim: ALTER USER DIOGO IDENTIFIED EXTERNALLY AS 'DIOGO.FERNANDES@DATACOSMOS.COM.BR' ;
Vamos lá...
No AD, vamos criar um usuário para o HOST/NODE chamado DATABASENODE1. Em caso de RAC criar um usuário para cada nó, sugiro criar o usuário no grupo de "serviços" para um melhor gerenciamento no futuro.
Uma vez criado vamos executar o comando KTPASS para gerar uma keytab, em resumo este arquivo ficará no sqlnet do Oracle e será responsável por verificar se aquela autenticação é valida ou não. Caso queria saber mais sobre o processo procure por TGT na tecnologia Kerberos que entenderá todo o processo.
Com permissão de ADMIN no power shell execute o comando:
ktpass.exe -princ ORACLE/databasenode1.datacosmos.com.br@DATACOSMOS.COM.BR -mapuser databasenode1 -crypto all -pass "Senha_do_usuario_aqui" -out c:\temp\databasenode1.keytab
Explicando o comando: Parte 1
ktpass.exe -princ ORACLE/databasenode1.datacosmos.com.br@DATACOSMOS.COM.BR
"ORACLE" é o Serviço que criamos no AD com o comando ktpass e iremos vincular no sqlnet do banco posteriormente, depois do "/" vem o nome do host, este nome deve ser o FQDN, com o comando hostname -f você o obtém, depois do "@" vem o seu domínio.
Apos a execução do comando ktpass o nome do usuario deve ficar como ORACLE/NOME_DO_HOST.
Explicando o comando: Parte 2
-mapuser databasenode1 -crypto all -pass "Senha_do_usuario_aqui" -out c:\temp\databasenode1.keytab
Map user é o usuário que criamos anteriormente, crypto é o tipo de criptografia que neste caso está adicionando todas no arquivo de keytab e o cominho out é o arquivo chamado "keytab", este arquivo iremos transferi-lo para o host de banco de dados é fazer o apontamento no sqlnet.ora.
Pronto, com esse comando executado podemos pegar o arquivo c:\temp\DATABASENODE1.keytab do AD e iniciar nossa configuração de Strong Authentication que se autenticará no Windows.
No sqlnet no banco de dados que receberá as conexões via Strong Authentication vamos fazer a seguinte configuração:
[oracle@databasenode1 ~]$ cd $ORACLE_HOME
[oracle@databasenode1 dbhome_1]$ cd network/admin/
[oracle@databasenode1 admin]$ vi sqlnet.ora
[oracle@databasenode1 admin]$ cat sqlnet.ora
# Kerberos Parameters
SQLNET.AUTHENTICATION_SERVICES=(beq,kerberos5pre,kerberos5)
SQLNET.FALLBACK_AUTHENTICATION=TRUE
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=ORACLE
SQLNET.KERBEROS5_CONF=/u01/app/oracle/product/19.0/dbhome_1/network/admin/krb5.conf
SQLNET.KERBEROS5_CLOCKSKEW=6000
SQLNET.KERBEROS5_CONF_MIT=TRUE
# Server side only
SQLNET.KERBEROS5_KEYTAB=/u01/app/oracle/product/19.0/dbhome_1/network/admin/databasenode1.keytab
Apos isso vamos colocar as configurações do AD no arquivo krb5.conf que está no sqlnet acima.
[oracle@databasenode1 admin]$ vi /u01/app/oracle/product/19.0/dbhome_1/network/admin/krb5.conf
[oracle@databasenode1 admin]$ cat /u01/app/oracle/product/19.0/dbhome_1/network/admin/krb5.conf
[libdefaults]
default_realm = DATACOSMOS.COM.BR
clockskew = 6000
passwd_check_s_address = false
noaddresses = true
forwardable = yes
[realms]
DATACOSMOS.COM.BR = {
kdc = DATACOSMOS.COM.BR:88
}
[domain_realm]
DATACOSMOS.COM.BR = DATACOSMOS.COM.BR
.DATACOSMOS.COM.BR = DATACOSMOS.COM.BR
datacosmos.com.br = DATACOSMOS.COM.BR
.datacosmos.com.br = DATACOSMOS.COM.BR
domainsecundario.com.com=DATACOSMOS.COM.BR
.domainsecundario.com.com=DATACOSMOS.COM.BR
domainsecundario.com.COM=DATACOSMOS.COM.BR
.domainsecundario.com.COM=DATACOSMOS.COM.BR
OBS: Caso o domínio tenha correlação de confiança entre outros domínios, colocar todos como no exemplo acima. O Master é o DATACOMOS.COM.BR então criarei outros apontamentos do domainsecundario para o DATACOMOS.COM.BR, como no exemplo acima.
Uma vez essas configurações feitas vamos para o banco de dados:
[oracle@databasenode1 ~]$ sqlplus diogo@kerb
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jul 17 22:33:39 2023
Version 19.17.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Enter password:
Last Successful login time: Mon Jul 17 2023 15:21:23 -03:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
SQL> show user
USER is "DIOGO"
Podemos ver que o usuário "DIOGO" ainda esta autenticando pela forma padrão do Oracle, ou seja, usuário e senha.
Agora vamos fazer uma alteração no usuário para ele autenticar "externamente" ou seja, ele irá verificar se existe o token do usuário diogo.fernandes carregado na maquina Windows, caso sim, ele fechará conexão com o Oracle.
[oracle@databasenode1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jul 17 22:38:10 2023
Version 19.17.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
SQL> ALTER USER DIOGO IDENTIFIED EXTERNALLY AS 'DIOGO.FERNANDES@DATACOSMOS.COM.BR' ;
User altered.
Pronto, agora vamos pra maquina Windows "Client". Vamos fazer uma instalação rápida do Client 19C:
Sempre selecionar a opção Administrador neste caso.
Na pasta $ORACLE_HOME/network/admin temos os seguintes arquivos:
krb5.conf
sqlnet.ora
tnsnames.ora
O arquivo krb5.conf tem as informações necessárias para obter as informações do AD, ele será mencionado no sqlnet.ora e é assim que o Oracle vai saber em qual AD buscar e validar as informações de token, segue o arquivo de configuração do krb5.conf
[libdefaults]
default_realm = DATACOSMOS.COM.BR
clockskew = 6000
passwd_check_s_address = false
noaddresses = true
forwardable = yes
[realms]
DATACOSMOS.COM.BR = {
kdc = DATACOSMOS.COM.BR:88
}
[domain_realm]
DATACOSMOS.COM.BR = DATACOSMOS.COM.BR
.DATACOSMOS.COM.BR = DATACOSMOS.COM.BR
datacosmos.com.br = DATACOSMOS.COM.BR
.datacosmos.com.br = DATACOSMOS.COM.BR
domainsecundario.com.com=DATACOSMOS.COM.BR
.domainsecundario.com.com=DATACOSMOS.COM.BR
domainsecundario.com.COM=DATACOSMOS.COM.BR
.domainsecundario.com.COM=DATACOSMOS.COM.BR
Agora vamos pro sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
SQLNET.AUTHENTICATION_SERVICES= (KERBEROS5PRE,BEQ)
SQLNET.FALLBACK_AUTHENTICATION=TRUE
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=ORACLE
SQLNET.KERBEROS5_CONF=C:\Oracle\CLIENT19C\network\admin\krb5.conf
SQLNET.KERBEROS5_CLOCKSKEW=6000
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.KERBEROS5_CC_NAME=OSMSFT://
Podemos perceber que a ultima linha do sqlnet.ora esta com o parâmetro "OSMSFT://" setado, isso significa que nesse caso, ele irá utilizar o token previamente carregado pelo AD, mas na pratica o que isso significa ?
No powerShell da maquina cliente...
Assim que conectamos em qualquer "estação" vinculada ao AD, de imediato o AD já fornece token kerberos para aquele usuário, ou seja, no momento que loguei com o meu usuário diogo.fernandes ele já carregou os token's devidos para eu poder autenticar não somente no Oracle mas em qualquer outro serviço que o kerberos também esteja configurado, isso permite que todos os acessos de usuário se limite apenas ao AD, assim, não precisando criar 20 senhas para um usuário.
Como dito anteriormente, não é mais necessário utilizar usuário/senha para conectar no usuário "DIOGO", no momento que passo a informação "/" no sqlplus, ele já entender que é uma autenticação "forte" e inicia a procura por tokens para realizar o handshake entre o servidor de AD e Banco de dados.
No proximo artigo, abordarei sobre usuários de "produção" utilizando strong authentication, como carregar vários tokens nas mesmas maquina, e como configurar o tnsnames propriamente dito para estes usuários.
Artigo baseado na nota Doc ID 1304004.1
Autor: Diogo Fernandes - diogo.fernandes@datacosmos.com.br
Linkedin: https://www.linkedin.com/in/diogo-sfg/
Link do artigo original: https://www.linkedin.com/pulse/oracle-autenticando-windows-ad-diogo-fernandes/
Comments