Configurazione di SQL*Net v.2

 

Oracle SQL*Net v.2, introdotta a partire dalla versione 7.0 di Oracle, fornisce nuove funzionalita' rispetto alla versione precedente e presenta una architettura e configurazione differente.

In questo breve documento ne vengono descritte le principali modalita' di utilizzo e configurazione.

 

Funzionalita' fornite

 

SQL*Net V.2 fornisce tutte le funzionalita' di SQL*Net V.1, tra queste:

Sono inoltre presenti nuove interessanti funzionalita':

 

Utilizzo da parte dell'utente/applicazioni

 

L'utilizzo da parte di un utente/applicazione di SQL*Net V.2 e' molto semplice. E' infatti sufficiente specificare l'alias nella stringa di connessione.

Ad esempio:

$ sqlplus scott/tiger@sunset

 

In pratica rispetto alla versione precedente si utilizza semplicemente un nome logico rispetto all'indicazione di rete, indirizzo, SID, ..

 

Analogamente avviene per la definizione dei database link.

Ad esempio:

SQL> create database link sunset
  2  connect to scott identified by tiger
  3  using sunset;

 

Con l'utilizzo di database link e sinonimi e' possibile rendere completamente trasparente ad utenti/applicazioni la distribuzione dei dati.

 

Passaggio a SQL*Net V.2

 

Il passaggio da SQL*Net V.1 a SQL*Net V.2 e' fortemente consigliato.

Tra le diverse ragioni citiamo:

 

Il passaggio alla nuova versione richiede un'attenta pianificazione in particolare per quanto riguarda le configurazioni dei vari server/client.

Poiche' nella versione 7.2 di Oracle sono supportate, e possono operare contemporaneamente, le due versioni di SQL*Net e' possibile effettuare un passaggio graduale alla V2.

 

Non esiste una versione SQL*Net V.2 per MS-DOS (e' tuttavia disponibile nei diversi ambienti MS-Windows).

 

Configurazione

 

Per la configurazione sono disponibili diversi ambienti e strumenti forniti da Oracle che facilitano l'operativa (eg. SQL*Net Easy Configuration). In alcuni casi e per alcuni parametri e' comunque necessaria una modifica manuale dei file di configurazione.

L'utilizzo di tali strumenti non e' descritto in questo documento.

 

Configurazione client

 

La configurazione sul client consente di definire la corrispondenza tra alias e servizi Oracle. Il file da configurare e' tnsnames.ora e' relativo a tutti i protocolli di rete e, generalmente, risiede in $ORACLE_HOME/network/admin.

Ad esempio:

#
# Filename: tnsnames.ora
# Modified by mail@meo.bogliolo.name on 1 Jan 1997
#
sunset = 
    (DESCRIPTION = 
        (ADDRESS_LIST = 
            (ADDRESS = 
                (COMMUNITY = company.com) 
                (PROTOCOL = TCP) 
                (Host = smile) 
                (Port = 1521) 
            ) 
        )
        (CONNECT_DATA = 
            (SID = demodb)
        )
    )

 

Nella configurazione d'esempio si fa riferimento ad un listener sulla macchina smile in ascolto sulla porta TCP-IP 1521. Nelle configurazioni tipiche vengono riportate tutte le possibili connessioni a database aziendali.

Il file TNSNAMES.ORA e' necessario anche sulle macchine tipicamente intese come server se da esse si vuole accedere all'esterno (eg. come nel caso di utilizzo DBLINK).
Se non si e' definita l'entry nel file tnsnames.ora e' anche possibile utilizzare l'indirizzo completo da linea di comando (ma naturalmente e' un po' scomodo):
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=smile.company.com)(Port=1521)))(CONNECT_DATA=(SID=demodb)))

Su PC la configurazione e' molto semplice utilizzando il tool SQL*Net Easy Conf.

Una nota sulla nuova versione di SQL*Net Net80. Viene ora utilizzato il Global Database Name al posto del SID per indicare l'istanza cui connettersi. Connettendosi quindi ad un listener in v8 la sintassi e':

        (CONNECT_DATA = 
            (SERVICE_NAME = demodb)

 

Configurazione server

 

La configurazione sul server richiede la definizione delle caratteristiche del listener. Il listener e' il programma che ascolta le richieste di connessione che provengono dalla rete ed attiva le risorse corrispondenti.

A differenza di SQL*Net v.1, il listener e' multiprotocollo e puo' ricevere quindi connessioni da sorgenti diverse (anche locali).

LISTENER=
    (ADDRESS_LIST=
        (ADDRESS=
            (PROTOCOL=ipc)
            (KEY=dbdemo)
        )
        (ADDRESS=
            (PROTOCOL=TCP)
            (HOST = sunset)
            (PORT = 1521)
        )
    )

SID_LIST_LISTENER=
    (SID_LIST=
        (SID_DESC=
            (SID_NAME=dbdemo)
            (ORACLE_HOME=/usr/oracle)
        )
    )

STARTUP_WAIT_TIME_LISTENER = 5
CONNECT_TIMEOUT_LISTENER = 60
TRACE_LEVEL_LISTENER = OFF
PASSWORD_LISTENER =

 

Sul listener vengono riportati gli estremi per le connessioni a tutte le istanze servite dal sistema.

 

Poiche' la porta socket viene esplicitamente indicata nelle configurazioni (sia client che server) non e' generalmente necessario configurare il file /etc/services.

 

Alcune configurazioni particolari

 

Sono possibili diverse configurazioni particolari i cui elementi principali vengono riportati nel seguito.

In caso di configurazioni piu' complesse puo' essere necessario configurare anche i file TNSNAMES.ORA, TNSNAV.ORA, SQLNET.ORA, PROTOCOL.ORA ed INITX.ORA.

 

La configurazione in MTS (MultiThreaded Server) offre notevoli vantaggi prestazionali nel caso di numero elevato di utenti. Maggiori elementi si trovano descritti nello specifico documento Utilizzo di Oracle Multithreaded Server.

 

E' possibile creare un'entry nel file tnsnames.ora che effettua la connessione al RDBMS Oracle locale via PIPE. Tale connessione e' notevolmente efficiente (per gli accessi locali). Ad esempio:

sunsetb = 
    (DESCRIPTION = 
        (ADDRESS_LIST = 
            (ADDRESS = 
                (PROTOCOL = beq) 
                (PROGRAM = /usr/oracle/bin/oracle) 
                (ARGV0 = oracle_BEQ_sunset) 
                (ARGS = '(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))') 
            ) 
        )
        (CONNECT_DATA = 
            (SID = demodb)
        )
    )

 

E' possibile far operare una macchina come "gateway SQL*Net" di comunicazione tra due reti con protocolli differenti. In tal modo client su una rete possono operare su server attivi su reti con protocolli differenti oppure utilizzare meccanismi di proxing necessari per operare con firewall. Il nome del prodotto e' cambiato a seconda delle versioni di Oracle (Oracle Multiprotocol Interchange, Connection Manager) ma le caratteristiche e funzionalita' sono simili.

In questo caso la configurazione della macchina "gateway" avviene agendo sul file cman.ora.

 

E' possibile configurare in load balancing due, o piu', istanze Oracle. In tale configurazione si ha un solo listener che distribuisce richieste di accesso su piu' istanze (queste istanze possono essere diverse istanze di un Paralled DB, accessi a database in sola lettura o, anche, istanze aggiornate con la Advanced Replication). Per la configurazione e' possibile utilizzare la il MTS e fare riferimento allo stesso listener in entrambe le istanze.

E' possibile utilizzare piu' listener che servano la stessa istanza Oracle e fare in modo che i client accedano in load balancing sui diversi listener. Debbono essere attivati piu' listener (eventualmente su piattaforme differenti) ed il file TNSNAMES.ORA dei client deve far riferimento ad entrambi per lo stesso servizio. In questo caso e' possibile accedere alla stessa istanza mediante, ad esempio, protocolli di rete differenti.

E' infine possibile avere una relazione di molti a molti tra listener ed istanze. I casi in cui si effettuano tali configurazioni sono dovuti a situazioni realmente complesse e particolari o a paranoie di utenti/DBA.

 

Principali parametri

Nel seguito riportiamo alcuni parametri di comune utilizzo.

Nel file SQLNET.ORA sul client e' possibile impostare un livello di trace (file sqlnet.trc) per analizzare eventuali errori (TRACE_LEVEL_CLIENT=USER), per default e' in off. E' invece sempre attivo il logging degli errori (file sqlnet.log), nel caso invece in cui non si voglia alcun file di log e' possibile ridirigerlo in questo modo:

LOG_DIRECTORY_CLIENT = /dev/null
LOG_FILE_CLIENT = /dev/null

Per attivare i controlli sull'effettiva presenza della connessione (keepalive) e' sufficiente inserire il parametro SQLNET.EXPIRE_TIME=10 nel file SQLNET.ORA sui client. Il valore indicato e' l'intervallo di tempo tra due invii di un messaggio di keepalive della linea.

Questo parametro permette la disconnessione automatica di connessioni non attive e la relativa liberazione di risorse e lock associati.
Sul sistema operativo ospite possono inoltre essere configurati parametri di timeout (eg. TCP-IP Connection Timeout). Per esempio su AIX (lo Unix di IBM) si puo' utilizzare il comando no, sugli altri Unix si configurano parametri del kernel (la modifica richiede un reboot), con MS-NT4 si possono configurare i valori dei registri TcpKeepCnt e TcpKeepTries. Ma e' opportuno modificare tali parametri con molta attenzione. Se non sapete esattamente cosa state facendo lasciate stare (ed anche se lo sapete forse non vi conviene lo stesso toccare!)

 

Nel caso di istanze con un grande numero di utenti e, in contemporanea, di applicazioni o procedure "batch" sia la configurazione in MTS che a server dedicato possono risultare inadeguate. E' in questi casi opportuno utilizzare l'MTS per le utenze normali e configurare i client "batch" in modo che venga loro riservato un processo dedicato. Il parametro e' USE_DEDICATED_SERVER=ON e viene posto nel file SQLNET.ORA.

 

Quando un client effettua un tentativo di connessione ad Oracle invia la stringa username/password in modo criptato. Se la connessione non avviene il client effettua un secondo tentativo con username/password in chiaro (tale comportamento e' presente per compatibilita' a precedenti versioni dell'RDBMS).

Per evitare l'invio di username/password in chiaro debbono essere settati la variabile ORA_ENCRYPT_LOGIN sul client ed il parametro DBLINK_ENCRYPT_LOGIN sul server (i parametri sono disponibili dalla versione 7.1). Ad esempio in MS-DOS:

rem File: AUTOEXEC.BAT
rem Oracle SQL*Net Password Encryption Forcing
set ORA_ENCRYPT_LOGIN=TRUE

 

E' possibile specificare qual e' la connessione di default che si effettua in remoto.

Su ambiente PC e' sufficiente impostare il parametro LOCAL nel file ORACLE.INI.

In ambiente Unix e' possibile impostare la variabile di ambiente TWO_TASK.

 

Opzioni dell'RDBMS

 

Sono disponibili diverse altre opzioni o pacchetti Oracle il cui utilizzo e' connesso a SQL*Net.

 

L'accesso a DBMS differenti da Oracle prevede l'acquisto del relativo prodotto di gateway (eg. Oracle Transparent Gateway for DB2). Le funzionalita' presenti sono generalmente fornite dall'intersezione delle funzioni dei due RDBMS (anche se alcune funzioni non presenti nel DB non Oracle vengono implementate dal Transparent Gateway stesso).

 

L'utilizzo delle funzioni di Distribuite Database (in scrittura) richiede l'installazione della relativa opzione DDO (Distribuited Database Option) che e' compresa nella versione 7.3 Enterprise dell'RDBMS.

 

L'utilizzo delle funzioni di replicazione asincrona, multimaster, .. richiede l'installazione delle relativa opzione ARO (Advanced Replication Option) che e' compresa nella versione 7.3 Enterprise dell'RDBMS.

 

L'utilizzo delle funzioni di encryption, validation, naming, .. sulle connessioni SQL*Net richiede l'installazione delle relativa opzione Advanced Network Option, tale opzione e' richiedibile separatamente sulle varie piattaforme.

 

Nel caso di configurazioni ampie e complesse puo' risultare utile il pacchetto Oracle Names che consente una definizione unica e centralizzata delle stringhe di connessione SQL*Net V.2. Il programma e' fornito con la versione 7.3 Enterprise.

 

SSL/TLS

E' possibile crittografare il traffico tra client e Oracle o effettuare la strong authentication utilizzando i piu' recenti algoritmi di crittografazione, il protocollo SSL e la sua evoluzione TLS.

Per la crittografia sul client va impostato il parametro SQLNET.ENCRYPTION_CLIENT con uno dei valori: Rejected, Accepted, Requested, Required. Sul server il parametro analogo e' SQLNET.ENCRYPTION_SERVER inoltre va impostato il parametro SQLNET.ENCRYPTION_TYPES_SERVER con uno dei valori: DES, 3DES168, AES128, AES256, RC4_128, RC4_256, ...
Se i parametri del client non trovano una corrispondeza con quelli del server viene restituito l'errore ORA-12660.

Per verificare la network integrity i parametri sono SQLNET.CRYPTO_CHECKSUM_CLIENT e SQLNET.CRYPTO_CHECKSUM_SERVER con le impostazioni: Rejected, Accepted, Requested, Required. In questo caso gli algoritmi utilizzabili sono: MD5, SHA-1, SHA-2 (SHA256, SHA384, SHA512).

Per la strong authentication sono necessari alcuni passi di configurazione:

 

Versioni

Le versioni di SQL*Net sono agganciate a quelle dell'RDBMS Oracle. SQL*Net v2 e' disponibile a partire dalla versione 7.0 di Oracle RDBMS.

Con la versione 7.0 dell'RDBMS e' distribuito l'SQL*Net v2.0.

...

Con la versione 7.3 dell'RDBMS e' stato distribuito l'SQL*Net v2.3.

A partire dalla 7.3 dell'RDBMS non e' piu' distribuita l'SQL*Net v.1.

A partire dalla 7.3 dell'RDBMS l'Advanced Network Option sostituisce i prodotti Secure Network Services e SQL*Net/DCE.

Le differenti release relative alla stessa versione sono tra loro compatibili. E' quindi possibile utilizzare un client con SQL*Net 2.1 verso un server con SQL*Net 2.3 mentre non e' possibile utilizzare da SQL*Net v.1 la versione SQL*Net v.2.

I prodotti opzionali (eg. Advanced Networking Option) invece richiedono versioni e release allineate.

E per finire... con la 8 di Oracle e' arrivato Net8! Ma tale nuova versione non presenta grandissimi cambiamenti rispetto a SQL*Net v.2. Comunque ne parleremo magari un'altra volta...
Solo un piccolo accenno sulle differenze:

Sintassi precedente (utilizza il SID):

sales= 
(description= 
  (address=(protocol=tcp)(host=sales-sun1)(port=1521))
  (connect_data=
     (sid=sales))


Sintassi Net 8 (utilizza il SERVICE_NAME):

sales= 
(description= 
  (address=(protocol=tcp)(host=sales-sun1)(port=1521))
  (connect_data=
     (service_name=sales.us.acme.com))

 

Altre informazioni

Puo' essere utile la seguente tabella:
 SQL*Net V1SQL*Net V2NetX
Default port 1525/tcp1521/tcp1521/tcp
Start command tcpctl startlsnrctl startlsnrctl start
Stop command tcpctl stoplsnrctl stoplsnrctl stop
Connect stringprotocol:host:sid eg. T:SRV1:DB1Specified in TNSNAMES.ORASpecified in TNSNAMES.ORA
Config files /etc/oratabtnsnames.ora, sqlnet.ora & listener.oratnsnames.ora, sqlnet.ora & listener.ora
Env variable LOCAL= TWO_TASK=TWO_TASK=

NetX utilizza protocolli di autenticazione che nel tempo sono cambiati e, in generale, non permette l'accesso al DB se la differenza di versioni tra client e server e' superiore a 2 restituendo l'errore ORA-28040 o ORA-3134.
E' tuttavia possibile aggirare tale limite agendo sulla variabile SQLNET.ALLOWED_LOGON_VERSION_SERVER. I valori possibili sono:

 

Argomenti distinti, ma che presentano aspetti architetturali di interesse, sono:

 


Testo: Configurazione di SQL*Net v.2

Data: 17 Settembre 1997

Versione: 1.3.9 - 14 Febbraio 2017

Autore: mail@meo.bogliolo.name