# Oracle autenticando no Windows AD

Neste artigo abordaremos uma forma das "Strong Authentications" Oracle.

Ao decorrer deste, utilizaremos o Oracle/Kerberos para se autenticar no AD 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:

```bash
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.

![Não foi fornecido texto alternativo para esta imagem](https://media.licdn.com/dms/image/v2/D4D12AQF8p2FtO0toXw/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1689364962551?e=1752105600&v=beta&t=2miQypso4vXlxtVXjg4uh0uciEMolvWAORE4NNf-bUM align="left")

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:

```bash
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**

```bash
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.

![No alt text provided for this image](https://media.licdn.com/dms/image/v2/D4D12AQGyD8twwQAFiQ/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1689693789649?e=1752105600&v=beta&t=mMksTlD1HsJZzBABcl8yVgp26vAhPx2xhKGFVqlaiFI align="left")

Apos a execução do comando ktpass o nome do usuario deve ficar como ORACLE/NOME\_DO\_HOST.

### **Explicando o comando: Parte 2**

```bash
-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.

![Não foi fornecido texto alternativo para esta imagem](https://media.licdn.com/dms/image/v2/D4D12AQEkOnNf0HhWhg/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1689365792077?e=1752105600&v=beta&t=aAxcsqYMzCNmDOqriM6hf6fn23Bp8nWuePpmbQhaF6Y align="left")

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:

```bash
[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.

```bash
[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:

```bash
[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.

```bash
[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:

![No alt text provided for this image](https://media.licdn.com/dms/image/v2/D4D12AQGzhGzVfKyO9g/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1689644477218?e=1752105600&v=beta&t=Te1OcA85YCKLlB7B5UTVsu57G_E73AQjK0U1u8m4mGQ align="left")

Sempre selecionar a opção Administrador neste caso.

Na pasta $ORACLE\_HOME/network/admin temos os seguintes arquivos:

1. krb5.conf
    
2. sqlnet.ora
    
3. tnsnames.ora
    

![No alt text provided for this image](https://media.licdn.com/dms/image/v2/D4D12AQF0ixmLsIaoKQ/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1689644683031?e=1752105600&v=beta&t=YIWGTaBCuBk3rOUfsq7DL9JUlmqS6-wAgaems2ZsrXc align="left")

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

```bash
[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

```bash
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...

![No alt text provided for this image](https://media.licdn.com/dms/image/v2/D4D12AQHk4tZoU7d5eA/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1689646337842?e=1752105600&v=beta&t=_XQ1lbNbdsGehfVS9lKGEZJUalbU07oURHx9t0SGqXk align="left")

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.

![No alt text provided for this image](https://media.licdn.com/dms/image/v2/D4D12AQF0UVhZyUXiag/article-inline_image-shrink_1500_2232/article-inline_image-shrink_1500_2232/0/1689646971061?e=1752105600&v=beta&t=B_nFRU59D9KLwNR_YX6USCoo5J63YhddWfK9Iz270vE align="left")

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**
