O OID – Oracle Internet Directory é um serviço de diretório LDAP (Nota DevMan 1) nativo que pode ser utilizado para fornecer um repositório centralizado para autenticação e registro de serviço de rede. Neste artigo, cobriremos a instalação e configuração básica para que possamos utilizá-lo no lugar do tradicional tnsnames.ora (Nota DevMan 2).
O LDAP, ou Lightweight Directory Access Protocol (Protocolo Leve de Acesso a Diretório) é um protocolo para consultar e modificar serviços de diretório sobre o protocolo TCP/IP.
Um diretório é um conjunto de objetos com atributos organizados de maneira lógica e hierárquica. O exemplo mais comum é um diretório de telefones, que consiste em uma série de nomes (de pessoas ou organizações) ordenados alfabeticamente, onde cada nome possui um endereço e número de telefone associado.
Uma árvore de diretório LDAP reflete também várias delimitações: geográfico, político e/ou organizacional, dependendo do modelo escolhido. Atualmente, implementações LDA tendem a utilizar DNS – Domain Name System – para estruturar o nível mais alto da hierarquia. Aprofundando-se na hierarquia, o diretório pode parecer entradas representando pessoas, unidades organizacionais, impressoras, grupos de pessoas ou qualquer outra coisa que represente uma entrada na árvore de diretório (ou múltiplas entradas).
Saiba mais: Guia de Oracle
O arquivo tnsnames.ora é um arquivo de configuração que contém o mapeamento dos nomes de serviço de rede para os descritores de conexão. Este arquivo pode ser mantido de maneira centralizada ou localmente, para ser usada por todos os clients (metodologia centralizada) ou por clients individuais (metodologia local). O arquivo tnsnames.ora é encontrado, por padrão, em $ORACLE_HOME/network/admin em ambientes UNIX e ORACLE_HOME\network\admin em ambientes MS-Windows.
Conectando-se ao banco de dados
Temos algumas maneiras diferentes para efetuar a conexão ao banco de dados Oracle. Vejamos abaixo:
- TNSNAMES: É o método mais comum, encontrado na maioria das empresas;
- Oracle Names: Não mais suportado nas versões atuais;
- LDAP: Possível através do OID - Oracle Internet Directory;
- Hostname: Não muito útil, mas também sendo uma opção;
- JDBC: Usado por aplicações Java;
- Especificação do endereço completo: Não muito útil em termos de projeto de aplicação, mas também é uma opção.
Agora imagine uma situação em que você tenha 50 bancos de dados ou até mais, como algumas companhias realmente tem, e que você tenha que manter o arquivo TNSNAMES.ORA sempre atualizado. Convenhamos que isso passa a ser uma tarefa um pouco complicada dependendo da maneira com que os clientes de banco de dados façam a conexão.
Repositório centralizado
A primeira ferramenta disponibilizada pela Oracle para a criação de um repositório centralizado para as entradas para os bancos de dados é o Oracle Names, porém é uma metodologia não mais suportada nas versões mais recentes do banco de dados Oracle, mas ainda assim algumas empresas ainda o utilizam.
Como mencionado, o OID é muito mais que apenas uma maneira centralizada de registrar as entradas para os bancos de dados, ele pode ser utilizado para autenticação de múltiplas aplicações e bancos de dados.
É importante que você conheça a estrutura LDAP, o que não é o foco deste artigo, manteremos o foco apenas em outra maneira de manter todas as estações cliente com a informação mais atualizada possível sobre o nosso ambiente e, é claro, queremos fazer isso da maneira mais simples possível.
Mas afinal, como é que isso vai funcionar se não mais utilizaremos o arquivo tnsnames.ora? Observe a Figura 1.
Como podemos ver na Figura 1, quando uma conexão ao banco de dados é feita utilizando o SQL*Plus ou qualquer outra ferramenta no lado cliente, ele irá procurar pelo banco de dados no servidor OID e, caso encontre, o cliente receberá todas as informações necessárias para a conexão ao banco de dados em questão.
Com o TNSNAMES.ORA e o Oracle Names, é exatamente o que acontece, a diferença é que o arquivo tnsnames.ora precisa estar presente em cada estação cliente, ou apontar para uma pasta compartilhada na redel. O Oracle Names também faz a mesma coisa, porém não é mais suportado por não ter a mesma segurança e escalabilidade que o OID oferece.
Configurando o cliente para utilizar o OID
Para configurar uma estação cliente para utilizar o OID, precisamos na verdade configurar alguns arquivos:
- SQLNET.ORA – Este arquivo é responsável em definir qual o método que estamos utilizando, podemos também especificar mais de um método, permitindo que, em caso de falha, ele possa escolher e utilizar o outro método;
- LDAP.ORA – Este arquivo especifica qual o servidor do OID.
A Listagem 1 apresenta um exemplo do conteúdo do arquivo SQLNET.ORA.
SQLNET.AUTHENTICATION_SERVICES = (NTS)
NAMES.DIRECTORY_PATH = (LDAP,TNSNAMES)
TRACE_LEVEL_CLIENT = SUPPORT
trace_level_client = 16
trace_timestamp_client = true
trace_unique_client = true
trace_directory_client = c:\Temp\sql_client_trace
Como podemos ver na Listagem 1, o parâmetro NAMES.DIRECTORY_PATH é onde podemos definir quais os métodos que iremos utilizar. No nosso exemplo o primeiro método a ser utilizado é o LDAP e, caso ocorra algum problema, a conexão será direcionada para utilizar o TNSNAMES.ORA.
Vejamos agora, na Listagem 2, a configuração do segundo arquivo, o LDAP.ORA.
DIRECTORY_SERVERS = (oid01:389:636)
DEFAULT_ADMIN_CONTEXT = "dc=dbabrain,dc=com"
DIRECTORY_SERVER_TYPE = OID
Analisando o conteúdo da Listagem 2, observamos os seguintes parâmetros:
- DIRECTORY_SERVERS: Especificamos aqui o nosso servidor OID e as portas em que ele está “escutando”;
- DEFAULT_ADMIN_CONTEXT: Este é o contexto onde criamos as entradas para o banco de dados, o conceito de contexto é bastante explicado quando estudamos a estrutura do LDAP;
- DIRECTORY_SERVER_TYPE: É neste parâmetro que definimos o tipo de diretório que será utilizado. O Oracle pode utilizar outro servidor LDAP, como o Microsoft Internet Directory, por exemplo.
Pronto, agora já temos toda a configuração do lado cliente completa. Agora o cliente já está habilitado a encontrar qualquer banco de dados que esteja configurado no servidor de diretórios.
Instalando o OID
Vamos iniciar a instalação do Oracle Internet Directory. Em primeiro lugar, é necessário fazer o download do Oracle Application Server 10g, o OID é parte integrante deste aplicativo.
Neste artigo, utilizamos a versão para Linux liberada em 4 CDs, o Oracle Application Server 10g Release 2 (10.1.2.0.2).
Antes de iniciar o processo de instalação, recomendo a leitura do guia de instalação para verificar as dependências do sistema operacional.
Recomendamos ainda que você use uma ferramenta fornecida pela própria Oracle para verificar todos os pré-requisitos antes que inicie a instalação de qualquer produto Oracle.
Bem, após ter executado com sucesso todas as configurações prévias, execute o arquivo runInstaller que pode ser encontrado no Disco 1.
A Figura 2 apresenta a primeira tela logo após executar o runInstaller. Apenas especifique o caminho que você deseja utilizar.
Agora, conforme Figura 3, devemos selecionar a segunda opção de instalação: Oracle Application Server Infrastructure.
Agora, na tela da Figura 4, devemos escolher Identity Management and Metadata Repository, que é exatamente onde um banco de dados 10.2.0.4.2 será criado para armazenar os dados de nosso diretório.
Neste ponto, o Oracle irá verificar todas as dependências e, em caso de qualquer falha, pare a instalação e corrija o problema. Após tudo certo, reinicia a instalação (Figura 5).
E, conforme Figura 6, será necessário que você tenha acesso ao usuário root.
Na próxima tela (Figura 7), você deverá escolher os componentes que deverão ser instalados. Selecione os componentes:
- Oracle Internet Directory: um banco de dados Oracle baseado no servidor de diretórios LDAP V3, utilizado para centralizar a autenticação de usuários, conector da rede Oracle Net e os parâmetros do listener.
- Oracle Application Server Single Sign-On: Single Sign-On permite que você seja autenticado apenas uma vez, combinado com uma autenticação ocorrendo de maneira transparente para as próximas conexões a outros bancos de dados ou aplicações. Ele permite que você acesse várias contas e aplicações com uma única senha, inserida durante uma única conexão;
- Oracle Application Server Delegated Administration Service: Ele é parte do OID, que fornece uma administração confiável, baseado em proxy (Nota DevMan 3), das informações do diretório para usuários e administradores das aplicações;
- Oracle Application Server Directory Integration Platform: O Oracle Directory Integration Platform permite a você reduzir o tempo de administração e custo de integração dos aplicativos e diretórios, incluindo diretórios LDAP de terceiros com o OID.
Em ciência da computação, proxy é um servidor que atende a requisições repassando os dados a outros servidores. Um usuário (cliente) conecta-se a um servidor proxy, requisitando algum serviço, como um arquivo, conexão, website, ou outro recurso disponível em outro servidor.
Um servidor proxy pode, opcionalmente, alterar a requisição do cliente ou a resposta do servidor e, algumas vezes, pode disponibilizar este recurso sem nem mesmo se conectar ao servidor especificado. Pode também atuar como um servidor que armazena dados em forma de cache em redes de computadores. São instalados em máquinas com ligações tipicamente superiores às dos clientes e com poder de armazenamento elevado.
Esses servidores têm uma série de usos, como filtrar conteúdo, providenciar anonimato, entre outros.
Um HTTP caching proxy, por exemplo, permite que o cliente requisite um documento na World Wide Web e o proxy procura pelo documento em seu cache. Se encontrado, o documento é retornado imediatamente. Caso contrário, o proxy busca o documento no servidor remoto, entrega-o ao cliente e salva uma cópia no seu cache. Isso permite uma diminuição na latência, já que o servidor proxy, e não o servidor original, é acessado, proporcionando ainda uma redução do uso de banda.
O próximo passo é escolher as portas que serão usadas para o LDAP. Em nosso caso, escolhemos a opção “automático”, como mostrado na Figura 8.
Defina o Namespace (Nota DevMan 4) onde todo o conteúdo será armazenado. O nome sugerido será baseado no seu nome de domínio (Domain Name – Nota DevMan 5). Em nosso caso, definimos um namespace como “dbabrain” e “com”, conforme mostra a Figura 9.
Em geral, um namespace é um “recipiente” abstrato que fornece um contexto para determinados itens (nomes, termos técnicos ou palavras) que mantém e permite que objetos contidos em diferentes namespaces possuam o mesmo nome.
Por definição, nomes em um namespace não podem conter mais de um significado, o que significa dizer que duas ou mais “coisas” não podem compartilhar o mesmo nome.
Saiba mais: Curso de Oracle
Um namespace também é conhecido como “contexto”, pois o significado de um nome pode mudar dependendo do namespace em que ele faça parte.
Nomes podem representar objetos ou mesmo conceitos. Como exemplo, podemos citar uma tabela e uma visão (view), que não podem ser criados com o mesmo nome no banco de dados Oracle, pois são dois objetos contidos no mesmo namespace. Já um índice pode ser criado com o mesmo nome de uma tabela, uma vez que são objetos de namespaces diferentes.
O DNS (Domain Name System - Sistema de Nomes de Domínios) é um sistema de gerenciamento de nomes hierárquico e distribuído operando segundo duas definições:
- Examinar e atualizar seu banco de dados.
- Resolver nomes de domínios em endereços de rede (IPs).
O sistema de distribuição de nomes de domínio foi introduzido em 1984 e com ele os nomes de hosts residentes em um banco de dados pode ser distribuído entre servidores múltiplos, diminuindo assim a carga em qualquer servidor que provê administração no sistema de nomeação de domínios. Ele baseia-se em nomes hierárquicos e permite a inscrição de vários dados digitados além do nome do host e seu IP. Em virtude do banco de dados de DNS ser distribuído, seu tamanho é ilimitado e o desempenho não degrada tanto quando se adiciona mais servidores nele.
Na próxima tela (Figura 10) defina o nome global e o SID para o banco de dados.
Será solicitado também (Figura 11) que você defina a senha para as contas administrativas.
Você pode escolher entre definir senhas diferentes para cada conta administrativa ou usar a mesma senha para todas estas contas, que foi a nossa escolha.
Um website para administração será implementado e para isso, devemos especificar o nome para a instância web e também a senha para o usuário administrador do IAS (IAS_ADMIN), que é outro usuário que veremos mais adiante. O nome deste usuário é ORCLADMIN. Veja, na Figura 12, que definimos o nome de nossa instância web como dbabrain_ias.
E finalmente é apresentada uma tela (Figura 13) contendo toda a configuração feita e os produtos que serão instalados. Basta clicar em “Install” e a instalação será iniciada.
Ao final do processo de instalação, será requisitado que você execute um script utilizando o usuário root. Após isso, a instalação estará completa.
Iniciando o servidor LDAP
Agora que já criamos nosso servidor LDAP e toda a sua infra-estrutura, primeiramente temos que iniciar o banco de dados e o listener, conforme Listagem 3.
$ export ORACLE_HOME=/oracle/OraHome_1
$ export ORACLE_SID=dbabrain
$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 21-APR-2009 16:59:29
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Starting /oracle/OraHome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.3.0 - Production
System parameter file is /oracle/OraHome_1/network/admin/listener.ora
Log messages written to /oracle/OraHome_1/network /log/listener.log
Trace information written to /oracle/OraHome_1/network/trace/listener.trc
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=125.15.32.13)(PORT=1521)))
Connecting to (ADDRESS=(PROTOCOL=TCP)(HOST=125.15.32.13)(PORT=1521)(QUEUESIZE=100))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.3.0 - Production
Start Date 21-APR-2009 16:59:29
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level support
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/OraHome_1/network/admin/listener.ora
Listener Log File /oracle/OraHome_1/network/log/listener0.log
Listener Trace File /oracle/OraHome_1/network/trace/listener0.trc
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=125.15.32.13)(PORT=1521)))
Services Summary...
Service "DBABRAIN" has 1 instance(s).
Instance "DBABRAIN", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
$ sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Tue Apr 21 17:05:54 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 197132288 bytes
Fixed Size 1248044 bytes
Variable Size 142607572 bytes
Database Buffers 46137344 bytes
Redo Buffers 7139328 bytes
Database mounted.
Database opened.
SQL>
Pronto, nosso banco de dados e listener já estão no ar. Agora vamos iniciar o servidor LDAP. Para isso, execute o script opmnctl, que pode ser localizado em $ORACLE_HOME/opmn/bin, conforme mostra a Listagem 4.
$ cd $ORACLE_HOME/opmn/bin
$ -- Para iniciar o servidor LDAP
$ ./opmnctl startall
$ -- Para finalizar o servidor LDAP
$ ./opmnctl stopall
$ -- Para verificar o status do servidor LDAP
$ ./opmnctl status
Podemos também iniciar o servidor LDAP manualmente, sem a utilização do script.
Para isso, precisamos iniciar dois processos: oid monitor e oidldapd, conforme Listagem 5.
$ -- Iniciando o processo oid monitor
$ oidmon connect=dbabrain start
$ -- Iniciando o processo oidldapd
$oidctl connect=dbabrain server=oid01 instance=1 configset=1 start
O parâmetro connect é usado para especificar o nome do banco de dados do OID. No nosso caso, dbabrain.
Podemos agora verificar se tudo está OK. Os comandos da Listagem 6 são usados para verificar se o OID está “escutando” as portas especificadas.
$ORACLE_HOME/bin/ldapbind -p 389
$ORACLE_HOME/bin/ldapbind -p 636 -U 1
Caso não tenha utilizado as portas padrão, você pode verificar quais são essas portas no arquivo $ORACLE_HOME/install/portlist.ini
Criando os serviços e testando a conxão
Já temos o nosso OID em execução, podemos agora criar os serviços de banco de dados e testar a conexão.
Podemos fazer os testes de conexão de duas maneiras: através de ferramentas de linha de comando ou através de ferramentas gráficas.
Para iniciar a ferramenta gráfica, use o comando netmgr, ou você pode ainda utilizar qualquer ferramenta cliente que já possua o sqlnet.ora e o ldap.ora configurados.
A Figura 14 mostra a tela inicial do Net Manager.
Clique em Directory e Service Naming, e então efetue o login (Figura 15).
A conta administrativa é cn=orcladmin e a senha é a mesma que você especificou durante o processo de instalação.
Após efetuar o login, você terá acesso à lista de entradas de bancos de dados disponíveis, no nosso caso, ainda nenhum.
Para adicionar uma nova entrada, é necessário apenas clicar no ícone “+” e preencher os campos que irão aparecendo. O primeiro campo é o Service Name, que é o nome do serviço ou do banco de dados. Iremos adicionar um banco de dados chamado TEST11G, cujo nome do servidor é DBABRAIN01 e a porta TCP/IP é a 1530. A Figura 16 mostra o processo.
Neste momento temos toda a configuração pronta. Após completar os passos mostrados na Figura 16, o seu Net Manager deverá parecer como o da Figura 17, porém com apenas as entradas que você configurou.
Neste momento, qualquer cliente que tenha configurado o sqlnet.ora e ldap.ora, que apontem para o seu servidor OID já estão aptos a conectar-se ao banco de dados.
Podemos efetuar o teste através do utilitário TNSPING e conectando-se através do SQL*Plus. Vejamos o processo na Listagem 6. Utilizamos o cliente instalado em um notebook com sistema operacional Windows, inclusive para comprovar que não estamos efetuando a conexão diretamente de dentro do servidor.
-- Utilizando o TNSPING
H:\>tnsping test11g
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 13-AUG-2
007 14:35:58
Copyright (c) 1997, 2005, Oracle. All rights reserved.
Used parameter files:
C:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora
Used LDAP adapter to resolve the alias
Attempting to contact (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)
(HOST=dbabrain01)(PORT=1530))) (CONNECT_DATA=(SERVICE_NAME=test11g)))
OK (0 msec)
-- Conectando-se através do SQL*Plus
H:\>sqlplus system@test11g
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Aug 13 14:38:58 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select instance_name, hostname from v$instance;
INSTANCE_NAME HOST_NAME
---------------- ------------------------------
test dbabrain01
Se você chegou até aqui, perfeito. Agora você pode iniciar com a inserção de todos os seus bancos de dados no LDAP e parar de usar o tnsnames.ora.
Adicionando ou modificando uma entrada de banco de dados manualmente
Para adicionar ou modificar uma entrada de banco de dados no LDAP manualmente, utilize os comandos ldapadd e ldapmodify. Mas sinceramente, sugerimos que você se familiarize com a estrutura do OID antes de começar a utilizar estes comandos.
De qualquer forma, a Listagem 7 apresenta um exemplo de como adicionar uma entrada.
$ ldapadd -D "cn=orcladmin" -w 'password for oid' -h oid01 -p 389 -f 'filename'.ldif
Vejamos agora as opções utilizadas no comando da Listagem 7.
- D: O DomainName do usuário do OID necessário para ligar ao diretório;
- w: A senha do usuário definido na opção –D;
- h: O nome do host ou o endereço IP do servidor OID;
- p: O número da porta usada para conectar-se ao servidor OID. A porta padrão é a 389;
- f: O caminho completo e nome do arquivo que contém as informações que deseja adicionar.
O arquivo .ldif deverá conter a entrada que você quer adicionar ao LDAP. A Listagem 8 mostra um exemplo.
dn: cn='db or service_name',cn=OracleContext,dc=dbabrain,dc=com
objectclass: top
objectclass: orclNetService
cn: 'db or service name'
orclnetdescstring: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST='hostname')
(PORT=1530)))(CONNECT_DATA=(SID='oracle SID')))
Vejamos agora, na Listagem 9, o exemplo para adicionarmos um banco de dados chamado PROD.
dn: cn=PROD,cn=OracleContext,dc=dbabrain,dc=com
objectclass: top
objectclass: orclNetService
cn: PROD
orclnetdescstring: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)
(HOST=prodserver01)(PORT=1530)))(CONNECT_DATA=(SID=prod)))
Consultando o repositório
Uma outra grande utilidade do LDAP é que podemos utilizar o repositório para efetuar consultas, como a apresentada na Listagem 10.
SELECT replace(C.RDN,'cn=','')||'='||CHR(10)||D.ATTRVAL
FROM ods.CT_DN C, ods.ds_attrStore D
WHERE C.ENTRYID = D.ENTRYID
AND C.ENTRYID IN (SELECT ENTRYID
FROM ODS.DS_ATTRSTORE
WHERE ATTRVAL='orclNetService')
AND D.ATTRNAME='orclnetdescstring'
ORDER BY C.ENTRYID;
test11g=
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=dbabrain01)
(PORT=1530)))(CONNECT_DATA=(SERVICE_NAME=test11g)))
Como você pode ver, o resultado da consulta efetuada ao repositório LDAP é exatamente uma entrada para o banco de dados para o arquivo tnsnames.ora.
Você pode utilizar esta técnica para efetuar um backup da entrada para o banco de dados ou até mesmo para criar o próprio arquivo tnsnames.ora e deixá-lo como uma opção de uso em caso de falha do seu LDAP.
Conclusões
Como pudemos ver, a utilização do LDAP é uma opção bastante prática e de extremo benefício no tocante a administração de conexões ao banco de dados.
Imagine uma situação em que seja necessário alterar alguma informação de conexão de um banco de dados existente ou mesmo adicionar um novo banco de dados, o tradicional uso do tnsnames, na maioria das vezes, faz com que todas as estações de trabalho tenham que ser atualizadas.
A centralização deste serviço, além de facilitar muito a administração, se torna transparente aos usuários das aplicações.
Na verdade há muito mais a ser dito sobre o Oracle Internet Directory, mas com esta introdução feita neste artigo você já terá muito com o que “brincar” e também estará habilitado a tornar sua própria vida um pouco mais fácil com relação à administração do tns.
Saiu na DevMedia!
- Série: React com Redux:
Redux é uma biblioteca JavaScript criada pelo Facebook para resolver um problema inerente de aplicações front-end conforme elas crescem em tamanho e complexidade.
Saiba mais sobre Banco de Dados ;)
- Guias de Banco de Dados:
Aqui você encontra o Guia de estudo ideal para aprimorar seus conhecimentos nos principais Banco de Dados do mercado. Escolha o seu e bons estudos!