SafeChildren Banner

Havoc Oracle Solaris Experts

jueves, 13 de agosto de 2009

Instalación de Oracle 10g en una zona sobre Solaris - Parte 4

Introducción
Hasta aquí hemos visto cómo instalar y configurar Oracle en una Zona de Solaris 10, en este post vamos a ver cómo configurar el listener para que se gestione con SMF (en vez de la forma tradicional). Es cierto, el listener de Oracle es muy robusto, durante los últimos cuatro años sólo he tenido que reiniciarlo en tres ocasiones, y las tres estaban con Oracle 10.2.0.1, desde que hice el upgrade a 10.2.0.4 no se ha quedado tonto nunca, sin embargo, creo que es mejor utilizar SMF para eliminar un punto de fallo más

Configuración del Listener
Para la configuración del listener tenemos dos opciones: editar el archivo $ORACLE_HOME/network/admin/listener.ora o ejecutar $ORACLE_HOME/bin/netca

En ambos casos, la configuración no reviste complicación, a continuación os muestro la configuración del listener llamada PRIMARY y un segundo listener llamado STANDBY cada listener escucha en tres puertos

$ vi $ORACLE_HOME/network/admin/listener.ora

PRIMARY =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = osiris.test.com)(PORT = 1703))
(ADDRESS = (PROTOCOL = TCP)(HOST = osiris.test.com)(PORT = 1704))
(ADDRESS = (PROTOCOL = TCP)(HOST = osiris.test.com)(PORT = 1705))
)
)

STANDBY =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = osiris.test.com)(PORT = 2703))
(ADDRESS = (PROTOCOL = TCP)(HOST = osiris.test.com)(PORT = 2704))
(ADDRESS = (PROTOCOL = TCP)(HOST = osiris.test.com)(PORT = 2705))
)
)

:wq
Ahora vamos a aplicar unas reglas básicas de seguridad para evitar que nos puedan (o tengan más dificil) manipular nuestro listener y a su vez nuestra base de datos.

Configuración de password en el Listener
A partir de la versión 10g, los parámetros de configuración por defecto del listener se han incrementado para garantizar una mayor seguridad. A partir de esta versión, las tareas de mantenimiento remotas están deshabilitadas (ADMIN_RESTRICTIONS ON) y se establece como nivel de seguridad el acceso mediante el propietario de la instalación, en la mayoria oracle, en la máquina en la que se ejecuta.
$ lsnrctl

LSNRCTL for Solaris: Version 10.2.0.4.0 - Production on 12-AUG-2009 13:36:18

Copyright (c) 1991, 2007, Oracle. All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> set current_listener STANDBY
Current Listener is STANDBY
LSNRCTL> start
Starting /u01/app/oracle/10.2/db/bin/tnslsnr: please wait...

TNSLSNR for Solaris: Version 10.2.0.4.0 - Production
System parameter file is /u01/app/oracle/10.2/db/network/admin/listener.ora
Log messages written to /u01/app/oracle/10.2/db/network/log/standby.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2703)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2704)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2705)))

Connecting to (ADDRESS=(PROTOCOL=TCP)(Host=osiris.test.com)(Port=2703))
STATUS of the LISTENER
------------------------
Alias STANDBY
Version TNSLSNR for Solaris: Version 10.2.0.4.0 - Production
Start Date 12-AUG-2009 13:36:33
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/10.2/db/network/admin/listener.ora
Listener Log File /u01/app/oracle/10.2/db/network/log/standby.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2703)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2704)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2705)))
Services Summary...
Service "TEST" has 1 instance(s).
Instance "TEST", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
LSNRCTL> change_password
Old password: __por defecto no tiene__
New password:
Reenter new password:
Connecting to (ADDRESS=(PROTOCOL=TCP)(Host=osiris.test.com)(Port=2703))
Password changed for STANDBY
The command completed successfully
LSNRCTL> save_config
Connecting to (ADDRESS=(PROTOCOL=TCP)(Host=osiris.test.com)(Port=2703))
Saved STANDBY configuration parameters.
Listener Parameter File /u01/app/oracle/10.2/db/network/admin/listener.ora
Old Parameter File /u01/app/oracle/10.2/db/network/admin/listener.bak
The command completed successfully
LSNRCTL> status
Connecting to (ADDRESS=(PROTOCOL=TCP)(Host=osiris.test.com)(Port=2703))
STATUS of the LISTENER
------------------------
Alias STANDBY
Version TNSLSNR for Solaris: Version 10.2.0.4.0 - Production
Start Date 12-AUG-2009 13:36:33
Uptime 0 days 0 hr. 9 min. 5 sec
Trace Level off
Security ON: Password or Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/10.2/db/network/admin/listener.ora
Listener Log File /u01/app/oracle/10.2/db/network/log/standby.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2703)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2704)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osiris.test.com)(PORT=2705)))
Services Summary...
Service "TEST" has 1 instance(s).
Instance "TEST", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
LSNRCTL> quit
Corregir los permisos de $TNS_ADMIN ($ORACLE_HOME/network/admin)
Vamos a limitar el acceso a los archivo listener.ora, tnsnames.ora y sqlnet.ora al usuario oracle y sólo a él. En la primera parte de la instalación, creaba un profile para el usuario oracle con una máscara 027, ésto hace que no tengamos que estar corrigiendo los permisos cada vez que lanzamos alguna utilidad de Oracle. Si no queremos asignar esta máscara (creo que es altamente recomendable) deberemos asegurarnos que todos los ficheros de nuestra instalación están protegidos.

Sin embargo, vamos a aplicar un valor más restrictivo a nuestro listener.ora y sqlnet.ora para que sólo oracle pueda editarlo.

Nota: Recuerda que si ejecutas $ORACLE_HOME/bin/netca creará copias de seguridad listenerFECHA.bak que tendrán los permisos según la máscara
$ pwd
/u01/app/oracle/10.2/db/network
$ ls -ltr
total 22
drwxr-x--- 2 oracle dba 512 ago 3 15:52 bin
drwxr-x--- 4 oracle dba 512 ago 3 15:52 tools
drwxr-x--- 4 oracle dba 512 ago 3 15:54 install
drwxr-x--- 2 oracle dba 512 ago 3 15:55 doc
drwxr-x--- 2 oracle dba 1024 ago 3 15:55 mesg
drwxr-x--- 2 oracle dba 1024 ago 3 16:33 lib32
drwxr-x--- 2 oracle dba 512 ago 3 16:36 jlib
drwxr-x--- 2 oracle dba 1024 ago 3 16:39 lib
drwxr-x--- 2 oracle dba 512 ago 4 16:42 trace
drwxr-x--- 2 oracle dba 512 ago 12 12:51 log
drwxr-x--- 3 oracle dba 512 ago 12 13:36 admin
$ umask
0027
$ ls -l admin/
total 64
-rw------- 1 oracle dba 1570 ago 12 13:54 listener.ora
drwxr-x--- 2 oracle dba 512 ago 3 15:52 samples
-rw-r----- 1 oracle dba 172 dic 26 2003 shrept.lst
-rw-r----- 1 oracle dba 6490 ago 11 14:02 sqlnet.log
-rw------- 1 oracle dba 91 ago 12 13:07 sqlnet.ora
-rw-r----- 1 oracle dba 6546 ago 11 14:02 tnsnames.ora


Cambios de permisos en lsnrctl
Oracle recomienda asignar 751 a $ORACLE_HOME/bin/lsnrctl, sin embargo, es más seguro establecer 750 o mejor 700 aunque este último cambio requiere de una verificación más extensa en un entorno de pruebas.
$ which lsnrctl
/u01/app/oracle/10.2/db/bin/lsnrctl
$ ls -l /u01/app/oracle/10.2/db/bin/lsnrctl
-rwxr-x--x 1 oracle dba 140024 ago 3 16:39 /u01/app/oracle/10.2/db/bin/lsnrctl
$ chmod 750 /u01/app/oracle/10.2/db/bin/lsnrctl
$ ls -l /u01/app/oracle/10.2/db/bin/lsnrctl
-rwxr-x--- 1 oracle dba 140024 ago 3 16:39 /u01/app/oracle/10.2/db/bin/lsnrctl
Eliminar Servicios no necesario
El servicio PL/SQL External Procedures (ExtProc) sirve para que el PL/SQL pueda ejecutar binarios del sistema, sin embargo, si no es necesario, eliminaremos el servicio del listener. En nuestro ejemplo no está

Cambiar el puerto por defecto
Aunque no es obligatorio, si es muy recomendable cambiar el puerto por defecto 1521 por otro, en nuestro caso es 1703, 1704, 1704 y 2703, 2704, 2705

Configuración del listener mediante SMF
Al igual que explicaba como Instalar Hadoop sobre Solaris con SMF podemos seguir los mismos pasos para configurar nuestro listener y olvidarnos de un servicio. Para ello, deberemos crear el directorio /var/svc/manifest/application/database/oracle y copiar el archivo listener.xml de la siguiente forma.

Recuerda que debes editar las propiedades "home", "project" y "listener" con tus valores antes de importar el XML
# mkdir -p /var/svc/manifest/application/database/oracle
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/oracle-install/smf/listener.xml
# svccfg
svc:> validate /var/svc/manifest/application/database/oracle/listener.xml
svc:> import /var/svc/manifest/application/database/oracle/listener.xml
svc:> quit
Una vez validado e importado, vamos a crear el method encargado de lanzar el listener, para ello, crearemos el archivo listener en /lib/svc/method/listener
# cd /lib/svc/method
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/oracle-install/smf/listener
# chmod 750 listener
# chown root:bin listener
Por ultimo, nos queda activar el servicio, para ello ejecutaremos el siguiente comando, teniendo en cuenta que hay cuatro instancias primary_10g, standby_10g, primary_11g y standby_11g, en función de cuál sea.
# svcadm enable -t svc:/application/database/oracle/listener:primary_10g
Podemos comprobar su estado utilizando el comando svcs y el servicio que queremos comprobar en nuestro caso listener
# svcs listener
STATE STIME FMRI
disabled ago_10 svc:/application/database/oracle/listener:primary_11g
disabled 16:21:24 svc:/application/database/oracle/listener:standby_11g
disabled 16:23:13 svc:/application/database/oracle/listener:standby_10g
online 16:21:37 svc:/application/database/oracle/listener:primary_10g
# svcadm enable svc:/application/database/oracle/listener:standby_10g
# svcs listener
STATE STIME FMRI
disabled ago_10 svc:/application/database/oracle/listener:primary_11g
disabled 16:21:24 svc:/application/database/oracle/listener:standby_11g
online 16:21:37 svc:/application/database/oracle/listener:primary_10g
online 16:23:47 svc:/application/database/oracle/listener:standby_10g
Nota: Puedes descargarte directamente el archivo listener.xml y listener si lo prefieres.

Uso de SVC para Iniciar y Detener el listener
Ahora, en vez de utilizar lsnrctl stop LISTENER, utilizaremos svcadm {enable|disable} FMRI, por ejemplo, para detener el listener PRIMARY
# svcadm disable svc:/application/database/oracle/listener:primary_10g
Como se encuentra dentro de SMF, si por algún motivo el proceso se muere SMF se encargará de volverlo a lanzar, aquí tienes un ejemplo.
$ ps -ef|grep ls
oracle 9325 27127 0 16:29:37 pts/1 0:00 grep ls
oracle 8986 7561 0 16:21:38 ? 0:00 /u01/app/oracle/10.2/db/bin/tnslsnr PRIMARY -inherit
oracle 9124 7561 0 16:23:48 ? 0:00 /u01/app/oracle/10.2/db/bin/tnslsnr STANDBY -inherit
$ kill -9 9124
$ ps -ef|grep ls
oracle 9349 27127 0 16:29:47 pts/1 0:00 grep ls
oracle 8986 7561 0 16:21:38 ? 0:00 /u01/app/oracle/10.2/db/bin/tnslsnr PRIMARY -inherit
oracle 9347 7561 0 16:29:46 ? 0:00 /u01/app/oracle/10.2/db/bin/tnslsnr STANDBY -inherit
$ svcs listener
STATE STIME FMRI
disabled ago_10 svc:/application/database/oracle/listener:primary_11g
disabled 16:21:24 svc:/application/database/oracle/listener:standby_11g
online 16:21:37 svc:/application/database/oracle/listener:primary_10g
online 16:29:46 svc:/application/database/oracle/listener:standby_10g
Resumiendo
En este post hemos visto como configurar nuestro listener para hacerlo más seguro y además, cómo configurarlo para usar el framework SMF permitiéndonos olvidarnos un poco de este proceso vital para Oracle. Espero que os haya gustado y no haberos aburrido, en la próxima entrega entraremos en la configuración de los TNS, múltiples bases de datos utilizando projects para cada una de ellas, y por último haremos una base de datos de ejemplo que nos servirá como catálogo de RMAN.

Referencias

1 comentario:

  1. ole urkutxo!! no entiendo casi nada :), pero te lo curras y tiene buena pinta :)!
    un abrazo.

    ResponderEliminar