Mostrando entradas con la etiqueta as400. Mostrar todas las entradas
Mostrando entradas con la etiqueta as400. Mostrar todas las entradas

domingo, noviembre 15, 2015

Consumir con RPGLE Servicios Web REST creados en Genexus



En muchas de las ocasiones es necesario integrar aplicaciones creadas con Genexus y el generador RPG mediante la utilizaciòn de los servicios web Rest.

Porque utilizar servicios web REST, justamente poque resulta mas facil realizar el parseo de datos enviados y recibidos, con SOAP, se tiene mas complicaciones en el sentido de armar bien el XML.

Realmente la independencia que se tiene con REST resulta sencillo consumirlos de una forma rapida sin muchos dolores de cabeza, ya que el trabajar con RPGLE es bastante engorroso por su sintaxis y sobre todo su editor.


Tambien se tuvo problemas con el manejo de apuntadores, en algunos casos no fue posible generan ciertos errores al compilar y sobre todo al ejecutar, la información que supuestamente deberia disponer no estaba tan visible con este concepto.

De hecho que pudo revisar algunas librerias y ejemplos que ayudan a tener una vision muy clara del tema, pero lo mas gravitante del problema es conocer RPGLE, para ello recomiendo el siguiente libro: Guia del Programador RPGLE en español

Es importante resaltar que es necesario revisar las siguientes librerias, que permiten  conectar el ISERIES con servicios web externos,  un excelente trabajo de Robert Cozzi y algunos otros amantes del ISERIES:



Un sitio con abundante información sobre RPGLE, SOAP y JSON .
  1. Scott Klement
  2. Documentacion
  3. Manejo de Apuntadores con RPGLE

Como instalar en el ISERIES  - Instrucciones:  

Descargar la Libreria: Libreria ISOCKETS
 
En la PC desempaquetar el ZIP en una carpeta, luego realice lo siguiente:
FTP iseriestest usuario password
FTP QGPL/iSockets 
BINARY
QUOTE SITE NAMEFMT 1
CD /QSYS.LIB/QGPL.LIB
LCD "C:\[carpeta donde esta el archivo iSockets.savf]
QUOTE RCMD CRTSAVF QGPL/ISOCKETS
PUT iSOCKETS.SAVF
QUIT


En el ISERIES, restauramos la libreria con el siguiente comando:
RSTLIB SAVLIB(ISOCKETS) DEV(*SAVF) SAVF(QGPL/ISOCKETS)

Como utilizar ISOCKETS desde RPG IV?

En este link existen algunas instrucciones con ejemplos para utilizar de mejor manera la libreria  iSockets ===> , Ejemplos.

Para el Caso tambien hemos creado un servicio web REST EMISOR con un Data Provider de tal forma que pueda ser leido con el Metodo GET, si deseamos utilizar el metodo POST debemos utilizar un Procedimiento, en virtud de ello para mayor facilidad ya que solo se trata de recuperar informaciòn que es nuestro caso utilizaremos un DataProvider.

En nuestro caso hemos trabajado con JDK1.6 y Tomcat7.

En las Reglas del DataProvider:
// Parametros
Parm(In:&Numerocliente); 
Tener presente que el nombre del parametro es CASE SENSITIVE.


En el SOURCE:
 SDTConsultaClientes    
      Where ClienteCodigo = &Cliente
    {
        Cliente         = ClienteCodigo
        Nombres      = ClienteNombres
        Estado         = ClienteEstado
        codigoError   = '0000'

        mensajeError = 'PROCESO OK'
    }

En las propiedades:
Expose as Web Service = True
WebServices Protocol   =  REST Protocol

El ejemplo que a continuacion se detalla fue adoptado en base al codigo publicado en la siguiente URL: Ejemplo con RPGLE e ISOCKETS - GetUrlData

Se tuvo algunos problemas al utilizar la librerias YAJL, dicha libreria  que permiten leer y escribir JSON, en nuestro caso especifico se requeria solo leer un JSON, de tal forma que se opte por acoplar un algoritmo que permita cumplir con ese objetivo, aquello facilito el consumo del servicio web desde el ISERIES, con estos antecendentes se procedio a crear el mismo, tomando como ejemplo de la libreria ISOCKETS el siguiente programa RPGLE:


      H OPTION(*NODEBUGIO:*SRCSTMT)  BNDDIR('ISOCKETS':'QC2LE')
      /IF DEFINED(*CRTBNDRPG)
     H DFTACTGRP(*NO)
      /ELSE
     H NOMAIN
      /ENDIF

      /COPY iSockets/QCPYSRC,iSockets
      /COPY iSockets/QCPYSRC,cprotos

      /IF NOT DEFINED(*CRTBNDRPG)
     D GetURLData      PR            10I 0
     D  URL                         128A   Const
     D  rtnHTML                   65535A   OPTIONS(*VARSIZE)
     D  nRtnLen                      10I 0 Const


     P GetURLData      B                   Export
     D GetURLData      PI            10I 0
     D  URL                         128A   Const
     D  rtnHTML                   65535A   OPTIONS(*VARSIZE)
     D  nRtnLen                      10I 0 Const
      /ELSE
     D URL             S            128A
      /ENDIF


     D SALIDA          S           2000A
     D LARGO           S             10A
     D cRet            S            100A   dim(30)   
     D szURL           S            128A   Varying
     D hURL            S             10I 0
     D nBytes          S             10I 0
     D szHtml          S          65535A
     D pHtml           S               *   Inz(%addr(szHtml))
     D nLen            S             10I 0
     D nPage           S             10I 0
     D nPageB          S             10I 0
     D nPageF          S             10I 0
     D szDomain        S                   Like(szURL)
     D szPage          S                   Like(szURL)
     D szParms         S                   Like(szURL)


     D cJson           S           2000A
     D nPos            S             10I00
     D nPosIni         S             10I00
     D nPosFin         S             10I00
     D cReturn         S           2000A
     D nLarJson        S             10I00
     D nLargo          S             10I00
     D nUbiIni         S             10I00
     D nUbiFin         S             10I00
     D nLarCpo         S             10I00
     D cCampo          S            100A
     D cValor          S            100A
     D nError          S            010I00
     D nNro            S            010I00
     D cLinea          S            050A
     D cBuscar         S            020A
     D cCliente         S            010A

      /IF DEFINED(*CRTBNDRPG)
     C     *ENTRY        PLIST
     C                   PARM                    cCliente    // Parametro de Entrada Cliente
     C                   PARM                    cRet         // Retorna dato en unarreglo

      /free
           URL = 'http://localhost:8080/swrest/rest'
               + '/consultaccliente?Clientecodigo='
               + %trim(ccliente);
      /end-free

      /ENDIF

     C*                  callp      Joblog('URL-->%s':URL)   

     C* Permite desplegar en JOBLOG de la SESION el contenido de la Variable
     C                   callp     iSocketsOptions('DBG':*ON)

     C                   if        %Parms >= 1
     C                   eval      szUrl = %trimR(URL)
     C                   endif
     C                   if        szURL = ''
     C                   return
     C                   endif

      **  Find the end of the URL
     C                   eval      nLen = %scan(' ':szURL)
     C                   if        nLen > 0 and nLen < %len(szURL)
     C                   eval      %len(szURL) = nLen
     C                   endif

     C                   if        stricmp(%subst(szURL:1:5):'http:')=0 or
     C                              stricmp(%subst(szURL:1:6):'https:')=0
     C                   eval      nPageF = %scan('//':szURL)
     C                   if        nPageF > 0
     C                   eval      szUrl = %subst(szURL:nPageF+2)
     C                   endif
     C                   endif

     C                   eval      nPageF = %scan('\':szURL)
     C                   eval      nPageB = %scan('/':szURL)
     C                   if        nPageB = 0 and nPageF = 0
     C                   eval      nPage = 0
     C                   else
     C                   if        nPageB > nPageF
     C                   eval      nPage = nPageB
     C                   else
     C                   eval      nPage = nPageF
     C                   endif
     C                   endif
     C                   if        nPage > 0
     C                   eval      szDomain = %subst(szURL:1:nPage-1)
     C                   eval      szPage   = %Subst(szURL:nPage)
     C                   else
     C                   eval      szDomain = %trimR(szURL)
     C                   endif

     C                   eval      nBytes=GetUrldata(szDomain:
     C                                              szPage : *OMIT:
     C                                              pHtml:%size(szHtml):
     C                                              0 : 367)

     C* Recuperar los datos que retorna el SW REST y la Longitud de los datos.
     C                   MOVEL     SZHTML        cReturn
     C                   MOVEL     NBYTES        LARGO
      /free
           exsr leer_json;
      /end-free
     C
     c                   return
      /IF NOT DEFINED(*CRTBNDRPG)
     C                   if        nBytes <= nRtnLen
     C                   eval      szRtnHtml = %subst(szHtml:nBytes)
     C                   else
     C                   eval      szRtnHtml = %subst(szHtml:nRtnLen)
     C                   endif
     C                   callp      Joblog('Salida larga %s':szrtnhtml)
      /free
           dsply  szRTNhtml;
      /end-free
     C                   callp      Joblog('Salida CORTA %s':szrtnhtml)
     C                   return    nBytes
      /else
     C                   return
      /endif
      /free

         // Rutina propia para recuperar datos de JSON exclusivo para datos      

         // alfanumericos
         begsr leer_json;



           for nNro = 1 to 30;
               cRet(nNro) = '';   // Encerar variable
           endfor;

           nPosIni  = %scan('200 OK' : cReturn);  // Revisar si existe respuesta
           if nPosIni <= 0;
              nLarJson = 0;
           else;
              nLarJson = 1;
           Endif;
           if nLarJson = 0;
               cRet(01) = '500';
               cRet(02) = 'SERVICIO WEB NO DISPONIBLE';
           else;
               nPosIni  = %scan('{' : cReturn);
               nLargo   = %size(cReturn);
               nLarJson = nLargo - nPosIni;
               cJson    = %subst(cReturn : nPosIni : nLarJson);
               cBuscar  = 'codigoError';
               exsr Busca_error;
               exsr Busca_Json ;
               if %trim(cValor) = '0000';
                  cRet(01) = %trim(cValor);
                  cRet(02) = 'SERVICIO WEB EN LINEA';
               else;
                  cRet(01) = %trim(cValor);
                  cBuscar = 'mensajeError';
                  exsr Busca_error;
                  exsr Busca_Json ;
                  cRet(02) = cValor;
                  nLarJson = 0;
               endIf;
           endIf;
           if  nLarJson > 0;

               nPosIni  = 1;
               nNro     = 3;
               dow nlarjson > 0;
                   exsr Busca_Json;
                   if nError > 0;
                      leave;
                   endif;
                   cRet(nnro) = cValor;
                   exsr Busca_Json;
                   if nError > 0;
                      leave;
                   endif;
                   nNro = nNro + 1;
                   cRet(nNro) = cValor;
                   nNro = nNro + 1;
               enddo;
           Endif;
         endsr;


         // Subrutina para Buscar en la cadena JSON si existe error en la 

         // Recuperacion de datos
         begsr Busca_Error;

            nError   = 0;
            nPosIni  = 1;
            nUbiIni = %scan(%trim(cBuscar) : cJson : nPosIni);
            if nUbiIni = 0;
               nError = 1;
            else;
               nPosIni = nUbiIni + 1 + %len(%trim(cBuscar));
            endif;
         endsr;

         // Subrutina para Buscar en la cadena JSON los datos de etiqueta y valor,
         // funciona bien solo en el caso de DATOS ALFANUMERICOS, cuya forma 
         // simple es {"NombreCliente":"JOSE CANDELARIOS TRES PATINES", 
         // "ClienteCodigo":"95959595"}
         begsr Busca_json;

            nError   = 0;
            nUbiIni = %scan('"' : cJson : nPosIni);
            if nUbiIni = 0;
               nError = 1;
            else;
               nPosFin = nUbiIni + 1;
               nUbiFin = %scan('"' : cJson : nPosFin);
               if nUbiFin = 0;
                  nError = 2;
               else;
                  nPosIni = nUbiFin + 1;
                  nUbiIni = nUbiIni + 1;
                  nUbiFin = nUbiFin;
                  nLarCpo = nUbiFin - nUbiIni;
                  if nLarCpo > 0;
                     cValor  = %subst(cJson : nUbiIni : nLarCpo);
                  else;
                     cValor = '';
                  endif;
               endif;
           endif;
         endsr;
      /end-free



En el ISERIES se puede crear un RPG o CL que invoque a dicho programa de la siguiente forma:
CALL CONSUMESW('09292', '')

y Retornara un Arreglo de la siguiente forma:
Pos-1 0000
Pos-2 SERVICIO WEB DISPONIBLE
Pos-3 Cliente
Pos-4 09292
Pos-5 Nombres
Pos-6 JOSE CANDELARIO TRES PATINES
Pos-7 codigoError
Pos-8 '0000'
Pos-9 mensajeError
Pos-10 'PROCEOS OK'

De esta forma el acceso resulta facil, ya que en RPG realmente es complicado el manejo de cadenas, un poco a mejorado con el RPGLE, pero su editor SEU realmente es muy pobre para este tipo de tareas.

Existe algunas nuevas funciones para ello sugiero siguiente LINK:
Nuevas funciones de RPGLE
Cualquier comentario adicional por favor dejeme hagame conocer  y estaremos en contacto, quiero agradecer a todos ellos que me respondieron a la consulta el HELP400.

CONCLUSIONES: Para aspectos de explotación de la información lo mejor es accesar a ella con cualquier otro lenguaje como Java, CSharp o Python entre los mas utilizados, pero para interconectar el servidor ISERIES y su potente sistema operativo, personalmente creo que vale la pena optar por la idea de consumir servicios web REST o SOAP, con RPGLE, exponer servicios web con RPGLE, de muchas formas no le veo muy eficiente porque es un esfuerzo grande para poder obtener resultados aceptables, creo que los lenguajes de 3ra generacion tienen una series de librerias y funciones que superan en gran medida la funcionalidad del RPGLE, recuerden es una vision muy personal.

martes, agosto 13, 2013

Iseries Db2 A Mysql con Migration Toolkit

Una de las tareas recurrentes a la que nos enfrentamos quienes estamos dedicados al desarrollo de sistemas o a la administración de bases de datos es la migración de información entre difrentes o iguales SGBD.  Actualmente, cada motor de base de datos ofrece en mayor o menor medida, herramientas que facilitan estas tareas. En este artículo trataré el caso de Mysql que incluye  en su paquete de instalación un programa destinado a migrar datos desde cualquier motor que proporcione una interfaz de conexión JBDC.
Que necesitaremos?
Bueno, antes de iniciar con el proceso será necesario que tengas instalado en tu equipo lo siguiente:
  • Mysql Gui Tools.  Esto lo puedes descargar desde la página de mysql en http://www.mysql.com/
  • Mysql Migration Toolkit. Este programa está incluido en las Gui Tools y lo podrás encontrar en el menú Inicio / Programas / Mysql
  • IBM Iseries Access for Windows.  Esto lo puedes descargar de la página de IBM
  • También tendrás que tener instalado el JDK de java pues la comunicación será a través de JBDC
Para el artículo quiero suponer que ya  sabes como instalar las herramientas de conexión por lo que me enfocaré al proceso de migración.
 Lo primero que tendremos que hacer es copiar los .jar  de IBM que nos permitirán comunicarnos con Iseries. Para ello, dependiendo de tu sistema operativo, iremos a la carpeta de instalación del client access que en mi caso es:  C:\Program Files\IBM\Client Access  Luego buscaremos la ruta jt400 y entraremos a lib.  La ruta de acceso completa es: C:\Program Files\IBM\Client Access\jt400\lib. Una vez que hemos llegado a este directorio vamos a seleccionar los siguientes archivos de extensión Jar:
  • jt400.jar
  • jt400Servlet.jar
  • jui400.jar
  • uitools.jar
  • util400.jar
  • x4j400.jar
y los copiaremos al directorio Java / Lib del directorio de instalación de las Gui Tools de Mysql. En mi caso este directorio es: C:\Program Files\MySQL\MySQL Tools for 5.0\java\lib.  Muy bien, hecho lo anterior, hemos incluido el soporte para comunicarnos a Iseries Db2.
Ahora. ejecutaremos el programa “Mysql Migration ToolKit” que está en Inicio / Programas / Mysql  la pantalla inicial que veremos es la siguiente:
 


  Esta pantalla es muy importante  pues nos permite saber si el programa cuenta con los requerimientos mínimos para ejecutarse. Como podemos observar en la imagen a la izquierda, tanto el Java Loader como el entorno de ejecución deben encontrarse inicializados.
Hecho esto presionamos el botón “Next” para continuar a la pantalla “configuration type”



Aquí nos aparecerán dos opciones. Para el caso que nos ocupa seleccionaremos “Direct Migration”


Después presionaremos “Next” para continuar con el proceso.  El programa nos mostrará la pantalla “Source Database”. Es en esta pantalla donde estableceremos la configuración del origen de datos.  


Al dar click en Database System,  veremos que el programa soporta la migración por default de orígenes tan diversos como SqlServer, Oracle, Sybase, Etc. Para casos como el de DB2 que no está contemplado por defecto, tendremos que seleccionar “Generic Jdbc”.  Seleccionado esto nos aparecerá en la parte inferior de la ventana , el cuadro de configuración de la conexión.

La información que deberemos capturar es la siguiente:
  • Class Name: Es el nombre de la clase java a usar para conectarnos a Iseries. El valor a capturar es: com.ibm.as400.access.AS400JDBCDriver
  • Connection String: La cadena de conexión que se compone de jdbc:<clase>://<dsn o ip del servidor iseries>>/<instancia>;libraries:<Base de datos o schema>;socket timeout=3000000;thread used=false Quedando en mi caso de la siguiente manera: jdbc:as400://DNSNOMBSERVIDOR/NOMBLIB;libraries=MIDATABASE;socket timeout=3000000;thread used=false
  • Username: Nombre de usuario
  • Password: Password de acceso.
Como ejemplo:
  • Class Name: com.ibm.as400.access.AS400JDBCDriver
  • Connection String: jdbc: as400://192.168.200.5/SEGURI;libraries=SEGURI;socket timeout=3000000;thread used=false
  • User Name: Usuario
  • Password: Password
Ya que hemos capturado la información de conexión presionaremos “Next” para dirigirnos a la siguiente pantalla donde configuraremos la conexión al servidor de base de datos destino.

 Ya que la base de datos destino es el propio mysql, la configuración nos va a resultar familiar pues solo deberemos indicar ip del servidor, nombre de usuario y contraseña.  Presionamos ”Next” para continuar a la siguiente pantalla, donde, si hemos configurado correctamente nuestras conexiones nos mostrará la siguiente información.

 Hasta este punto solo hemos configurado la conexión entre mysql y Db2 por lo que al presionar el botón “Next” comenzaremos a configurar tanto el origen como el destino de los datos a migrar. La pantalla  que nos aparece “Source schemadata selection” nos muestra los schemas del servidor de base de datos y nos pide seleccionemos del cuál queremos migrar datos.

Seleccionamos el schema del que deseamos migrar información y presionamos siguiente.
La pantalla inicia el proceso de ingeniería inversa para obtener la información de objetos en el schema seleccionado.  Una vez que ha finalizado el análisis presionamos “Next”


En esta pantalla el programa nos muestra el total de objetos que ha encontrado en el schema seleccionado.

Si el objetivo es migrar el total de tablas encontradas da click en “Next” para continuar con el siguiente paso. De otra manera tendrás que dar click en “Detailed selection” para elegir la o tablas a migrar.

Como podemos ver en la pantalla previa, se nos muestra el contenido del schema seleccionado donde podemos elegir la tabla o tablas a migrar. Presionamos “Next” para continuar.
En esta nueva pantalla tendremos que establecer las opciones de migración tanto para el origen como para el destino. Si no tienes mucha experiencia con los Engines de mysql así como el collation te recomiendo que intentes la migración con los valores por default.




Presionamos “Next” para continuar. y el programa comenzará a generar el bloque de sentencias DDL para la migración de datos. Una vez que haya finalizado presionamos ”Next” 





Si todo es correcto, nos dará un mensaje indicándonos que el mapeo se ha realizado correctamente. Presionamos siguiente.




En esta parte del asistente podemos elegir entre crear los objetos al vuelo o, si queremos verificar la definición de nuestros campos generar el script con todo el bloque de sentencias DDL para la migración. Seleccionamos la creación OnLine y presionamos “Next”




En este momento se comenzarán a crear los objetos seleccionados para su migración. Al finalizar el proceso podremos ver el resultado. Presionamos “Next” al ver que todo va bien en este punto.

 

El programa nos confirma que todo va bien. Aquí es importante mencionar que de ocurrir algún error en la creación de los objetos, se nos mostrará los problemas al seleccionar el filtro: “Show create problems”. Presionaremos “Next”




Una vez creadas las tablas que migraremos, procederemos a definir la manera en que el contenido será transferido a mysql. Podemos, como en el caso del metadata hacerlo al vuelo u online, o generar el script de migración para su análisis y revisión. En este caso hemos elegido OnLine. Presionamos Next




Hecho lo anterior, el programa comenzará el proceso de transferencia de datos desde Iseries Db2 hasta Mysql. De ser satisfactoria la transferencia, el programa nos lo indicará con un mensaje de éxito.

Y ahora prácticamente hemos terminado con el proceso de migración desde Db2 Iseries a Mysql.  El sistema en la pantalla que le sigue a la anterior nos mostrará un resumen del proceso de migración donde además de conocer el número y tipo de objetos migrados, también podremos ver el resultado de cualquier error ocurrido durante el proceso. Aquí la pantalla de resumen y la vista de la tabla migrada a Mysql:

 





Como pueden ver, migrar información a Mysql desde DB2, Oracle, Access, Ms Sql o cualquier motor que soporte conectividad JDBC es muy sencillo.
Tomado de: Articulo original

lunes, abril 09, 2012

Monitorizar AS400 / iSeries con Nagios / Centreon

Tomado de: Articulo Original

Screenshots

Vista de Servicios por Host.


Eventos producidos por mis servidores AS400


Gráficas de uso de disco y cpu:

iSeries Plugin para Nagios

Monitorizar iSeries con el Plugin "check-iseries.php".

El plugin para Nagios "check_iseries.php", desarrollado con licencia open source por esta compañia www.stic-online.de/stic/html/as400plugin.html, nos permite hacer una sesion telnet en nuestro servidor y recopilar informacióbn mediante mandatos de AS400 / iSeries.

El funcionamiento podría describirse como:


iSeries SNMP

SNMP es un protocolo bastante enrevesado, pero útil, que posibilita el intercambio de información entre dispositivos de red. Y esto, implica cualquier dispositivo, ordenador que esté en la red, desde una cafetera que tenga su propio SNMP hasta el servidor más potente.

Cada dispositivo (un switch, una impresora) o ordenador posee un identificador propio llamado "MIB" para cada "objeto" del dispositivo en la red. Este "objeto", describe un estado o un valor de nuestros dispositivo u ordenador.

Para ser claros, hay un valor MIB para el estado "on/off" de un ordenador, para definir si la cafetera necesita más agua, para definir cuanto espacio hay en disco.

Cada fabricante tiene su propio MIB. Para usar SNMP, necesitamos:
1. tener SNMP activado en el dispositivo o servidor (no se si hay cafeteras que lo tengan).
2. Activar una "comunidad" para conectarse al dispositivo o servidor. (activar SNMP en AS400)
3. Un software para comunicarse desde un cliente mediante protocolo SNMP. (Desde linux basta con SNMPWALK).
4. Conocer el mib del dispositivo.

Instalar SNMP en Linux.

Básicamente instalar el paquete:

sudo apt-get install snmpd

Probablemente el instalador requerirá alguna dependendencia, que en ese caso, se resuelve automaticamente o:
sudo apt-get install paquete_requerido.

Configurar SNMP en AS400

CFGTCPSNMP ->
1. CHGSNMPA SYSCONTACT('mi nombre') SYSLOC('mi nombre') SNDAUTTRP(*YES) OBJACC(*READ)
2. trabajar con comunidades. Añadir un nombre que no sea "public" o el nombre del servidor (por razones de seguridad).

Iniciar SNMP: STRTCPSVR *SNMP

3. Test de SNMP.

Probar desde linux el siguiente mandato desde la linea de comandos (si habeís instalado SNMPWALK)

snmpwalk -v 1 -c micomunidadeniseries miip

Si obtienes una larga lista de información, enhorabuena! SNMP funciona en tu AS400!

Instalar Centreon

Instalar Centreon.

Sigo con el blog.

Espero tener ahora un poco más de tiempo para trabajar en este blog.
Actualmente os puedo decir que se puede hacer DE TODO con Nagios en AS400. Lo mejor de Nagios es que nos permite editar nuestros comandos (aqui es cuando necesitamos conocimientos en lenguajes como PHP, Python, perl, java) para escribir nuestros comandos.

Actualmente estoy monitorizando, no solo el sistema, sino las aplicaciones. Ejemplos:

1. Ejecutar un script php que compruebe que el servidor http está funcionando mientras ejecuto un query en el AS400. Puedo grabar el tiempo de respuesta en las gráficas de Centreon.
2. Comprobar que las transaciones FTP funcionan, ejecutando RUNQRY desde Nagios.

Asi que espero comenzar a describiros algunas cosas.

Instalar Nagios

Instalación de Nagios.

Existe amplia documentación en internet sobre como instalar Nagios y no voy a dedicar este blog a explicar como hacerlo, pero si algunos detalles.

En mi instalación tengo:

1. Ubuntu Server. Si no tienes muchos conocimientos de Linux, recomiendo Ubuntu Desktop.
2. Instalar PHP, Apache y MySQL (todos pueden ser instalados con apt-get o vienen por defecto en Ubuntu, según versión).
3. Nagios 3.
4. Paquetes como: SNMP, Perl, etc (los irá requiriendo la instalación).

1. Preinstalación. Apache y PHP
•sudo apt-get install build-essential
•sudo apt-get install libgd2-xpm-dev
•sudo apt-get install apache2
•sudo apt-get install php5-common php5 libapache2-mod-php5
(para Centreon) sudo apt-get install mysql-server

Comprueba en http://localhost si Apache está funcionando.
Si no, prueba a activarlo:

sudo /etc/init.d/apache2 restart o sudo /etc/init.d/apache2 start

Si Apache no viene configurado para usar PHP:
sudo vim /etc/apache2/apache2.con

y copia en el fichero:
DirectoryIndex index.html index.php index.cgi


2. Descargar Nagios. www.nagios.org

Si es la primera vez que trabajas con Nagios, recomiendo que hagas una instalación limpia, sin usar "APT-GET INSTALL NAGIOS3", ya que APT-GET te va a crear otros directorios de instalación, y cuando instales Centreon, vas a tener que cambiar el instalador de Centreon, y es bastante complicado.

Asi pues recomiendo descargar el fichero "tar" de nagios y seguir paso a paso la instalación. (usa el browser o wget):

Nagios Core:
sudo wget http://downloads.sourceforge.net/nagios/nagios-3.1.0.tar.gz?use_mirror=voxel

Nagios Plugins (necesario):
sudo wget http://downloads.sourceforge.net/nagiosplug/nagios-plugins-1.4.13.tar.gz?use_mirror=voxel

3. Comenzar la Instalación.

Descomprimir:
sudo tar -zxvf nagios-3.1.0.tar.gz

Crear usuarios:
•sudo useradd -m nagios
•sudo passwd nagios
•sudo groupadd nagcmd
•sudo usermod -a -G nagcmd nagios
•sudo usermod -a -G nagcmd www-data

Compilar Nagios:
•sudo ./configure --with-command-group=nagcmd
•sudo make all
•sudo make install
•sudo make install-init
•sudo make install-config
•sudo make install-commandmode
•sudo make install-webconf

4.Configurar el servidor WEB.
vamos a añadir un usuario admin para la interfaz Web de nagios mediante este mandato:

sudo htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

Y ahora, configuremos el directorio donde se ejecuta la aplicacion web de Nagios:
ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin


Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user


Alias /nagios /usr/local/nagios/share


Options None
AllowOverride None
Order allow,deny
Allow from all
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user


ServerName localhost


reinicia apache:sudo /etc/init.d/apache2 restart


5. Instalando los Plugins de Nagios.


Extraemos el fichero tar "nagios-plugin-xxx" y hacemos lo siguiente:


•cd ~/
•tar -zxvf nagios-plugins-1.4.13.tar.gz
•cd nagios-plugins-1.4.13
•sudo ./configure --with-nagios-user=nagios --with-nagios-group=nagios
•sudo make
•sudo make install

Enlace simbolico para acceder a nagios
sudo ln -s /etc/init.d/nagios /etc/rcS.d/S99nagios

Verificar configuracion de Nagios (en nuestro caso debe de ser OK, ya que no la hemos editado):
sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Start Nagios:

sudo /etc/init.d/nagios start

6. Test de Nagios:

Web: http://localhost/nagios


ERRORES.

a. Faltan paquetes de instalación.

Normalmente Nagios necesita paquetes especiales en función del plugin que usamos. Si usamos SNMP o plugin basados en perl o java, debemos de hacer la instalacion.

Con suerte, Ubuntu es muy amigable para ayudarnos a hacer estas instalaciones con APT-GET.

y para que "Centreon"?

Centreon es un "front-end" para Nagios. Es una aplicación web instalada en el mismo servidor que Nagios. No es imprescindible, pero si muy útil.

por que?
Una vez instalamos Nagios, se nos hace un poco complicado configurarlo para añadir servicios y comandos. Se hace a través de archivos de texto
Ademas, tenemos que parar Nagios cada vez que añadimos un nuevo servicio.

Aunque no nos evita tener que repasar (o aprender) sobre Linux, es una herramienta muy interesante para que nos empiece a gustar Nagios y jugar con él (que es la mejor manera de aprender a vaces).

Otra de las ventajas de Centreon es que se adapta muy bien a otros plugins para Nagios como la generación de gráficas (que es una de las cosas que necesitaba y más me han atraido). A parte, tiene la misma usabilidad que Nagios.

Descargar Centreon:
http://www.centreon.com/Centreon/download.html

sábado, marzo 26, 2011

Seguridades en el AS400

Tomado de: Auditoria


Comienzo aquí una serie de algunas entradas sobre auditoría de seguridad en entornos AS/400. Me váis a permitir que emplee la nomenclatura deAS/400, incorrecta por obsolescencia, pero es la que todo el mundo comprende. Realmente, AS/400 ya no existe como tal, puesto que esta nomenclatura dejó de usarse para pasar a utilizar eServer iSeriesIBM System i, y por último, IBM Power Systems.
En cuanto al sistema operativo, más de lo mismo. Lo que en su día eraOS/400 se pasó a llamar i5/OS, y hoy en día se llama IBM i. Para facilitar la comprensión de este batiburrillo de nomenclaturas he confeccionado esta tabla, que recoge para cada producto el año de introducción. No he podido confirmar al 100% el año de introducción de la nomenclatura i5/OS, motivo por el cual aparece asteriscado:
evolucion nomenclaturas as400
as400
Algunos IBM System i (AS/400)
A pesar de que las nomenclaturas han sido cambiantes a lo largo del tiempo, en la jerga lo usual es que se hable de auditoría de un AS/400, aunque nos refiramos a la auditoría de seguridad del sistema operativo que corre en eseAS/400, siendo comunes otras acepciones coloquiales, como Análisis de la Seguridad de un 400 y expresiones similares. En adelante, y espero que nadie se ofenda, yo emplearé la nomenclatura a la antigua usanza :)
Hechas estas matizaciones, introducimos un poco qué es un 400, para qué se utiliza y cuál será el ámbito de estudio al que circunscribiremos estos artículos.
El AS/400 (IBM Power Systems)
Para introducir un poco este tipo de máquina, podemos decir que un AS/400es una máquina intermedia que cubre el hueco existente entre un mainframe(también conocido como host) y los pequeños servidores que normalmente operan en clúster atendiendo servicios distribuídos. En la literatura es habitual hablar de estas máquinas intermedias como máquinas mid-range, y son frecuentemente utilizadas para procesado de transacciones, con lo que es usual ver máquinas AS/400 al cargo de la transaccionalidad de empresas de seguros, entidades financieras, sistemas gubernamentales, etc., siempre con el permiso de los hermanos mayores del AS/400: los mainframes.
Teniendo en cuenta que la brecha entre los mainframes y las máquinas mid-range se ha reducido drásticamente en los últimos años, a pesar de seguir existiendo, los 400 gozan de una gran ventaja, que deriva de su menor capacidad: costes menores de adquisición y mantenimiento, lo que los hace ideales cuando la transaccionalidad es fuerte en ambientes donde no se requiere una computadora central.
Modo normal de funcionamiento
Los AS/400 están pensados para funcionar de muchas maneras, siendo el modo más frecuente la existencia de un hardware común compartido que da servicio a un número determinado de distintos LPAR o particiones lógicas. En el caso de máquinas IBM, los LPARes pueden funcionar con distintos sistemas operativos: z/OS, z/VM, z/VSE, z/TPF, AIX, Linux e IBM i y cada LPAR puede cubrir distintos objetivos (desarrollo, QA, producción). En el caso de AS/400, lo normal es que funcionen con IBM i (recordad: lo que en su día era OS/400), aunque no necesariamente tiene por qué ser así.
Seguridad en IBM i
Hoy en día no es descabellado catalogar a IBM i como uno de los sistemas operativos más seguros de la industria, debido, entre otras cosas, a que:
  • Es un sistema que requiere un conocimiento muy específico para ser administrado y operado, y por tanto, también para ser atacado.
  • Es un sistema en el que la seguridad ha ido de la mano de su desarrollo desde prácticamente sus orígenes, otorgándole una más que merecida relevancia.
  • Aunque es un sistema que atiende entornos complejos, no deja de ser un sistema concebido desde la simplicidad. Y la simplicidad es siempre un aliado de la seguridad.
  • El sistema operativo tiene una comunión perfecta con las características de seguridad que puede ofrecer el hardware (por ejemplo, el cifrado de datos) y la integración con otras plataformas.
  • Aunque no tiene necesariamente que ser así, es frecuente que los 400 estén en el back de una instalación. Esto implica que la relación con el exterior y sus ataques es muy limitada y está fuertemente controlada, conviertiendo a los ataques internos en principales candidatos.
La seguridad en IBM i se basa en el concepto del diseño basado en objetos. Esto abre la veda para poder implementar la seguridad en diversas capas, como por ejemplo, la utilización de perfiles de usuario, permisos de los objetos, firma de los objetos y verificaciones de integridad de los mismos.
Los objetos se empaquetan en contenedores que agrupan objetos consistentes entre sí, así como con el contenedor. Los objetos están siempre encapsulados en estos contenedores, lo que tiene una implicación vital para la seguridad. Un objeto nunca puede ser usado si el uso requiere que se pierda consistencia con el tipo de objeto y su contenedor.
Esto hace fácil articular que los datos no sean tratados como código ejecutable y viceversa, lo que hace muy complicado, en un ambiente de administración adecuado, que los objetos puedan ser usados de modo incorrecto. Este modo de confinamiento tiene como principal ventaja no cohibir la flexibilidad del sistema, pero tiene como principal inconveniente la necesidad de una puesta en marcha y una administración de seguridad exigente que entraña complejidad.
En síntesis, la seguridad estará principalmente basada en relaciones entre usuarios y recursos:
  • Desde la óptica de los usuarios, en sentido creciente, los perfiles de usuario, las descripciones de tareas, los perfiles de grupo y los valores de sistema
  • Desde la óptica de los recursos, también en sentido creciente, los objetos individuales, las librerías y directorios, las listas de autorización y los valores del sistema.
Material de estudio y libro de referencia
Todo, o prácticamente todo lo que comentemos estará alineado con los manuales del fabricante. Son completos y suficientes, y ellos son los que mejor conocen su producto. Es por tanto que para sacarle el mayor provecho a estos artículos, una lectura y comprensión de este material es aconsejable.
Para no inundaros con una lista extensa de PDFs, creo que lo mejor que podemos hacer es basarnos en el propio manual del fabricante. La última edición que he podido encontrar es Security Guide for IBM i V6.1, que data de finales de mayo de 2009. Os recomiendo tenerlo a mano, ya que en él podréis encontrar información extensa sobre lo que veremos en esta serie de artículos.
En la próxima entrega hablaremos del análisis de los valores del sistema (WRKSYSVAL), donde prestaremos atención a los valores generales relacionados con la seguridad.


En el capítulo anterior vimos una pequeña introducción a lo que son los AS/400, cómo operan, y cuáles son las características generales que definen su seguridad. En este artículo vamos a ir desgranando un poco los conceptos generales, con la idea de ofrecer una idea mínima de cómo debe afrontarse la auditoría en estos sistemas.
Importante
Aunque trataré de explicarlo de la manera más sencilla, auditar un 400 requiere conocer al menos cómo funciona. Habrá cosas que pase por alto (por ejemplo, explicar qué es la toma de atribuciones, qué es un pass-through, qué es una tarea o job, etc.) con lo que insisto en que es recomendable leer y comprender el material de estudio antes de leer estos artículos, o de lo contrario, a duras penas se podrán comprender.
No obstante, podéis dejar comentarios si existen dudas.
Conexión a la consola de AS/400
Aunque existen clientes libres para acceder a un 400, como por ejemplo, tn5250, yo os recomiendo encarecidamente trabajar con el cliente propietario de IBM, que forma parte de las herramientas que conforman la suite IBM Personal Communications. Esta suite, además del cliente telnet para conectar al 400, trae un cliente 3270 para conectarse a su hermano mayor el mainframe.
Hago esta recomendación por dos motivos principales: el primero es que el cliente tb5250, a mí al menos, me ha dado problemas de estabilidad, dejándome la consola frita en más de una ocasión. El segundo es que las herramientas IBM traen funcionalidades que facilitan enormemente trabajar con la consola: edición, impresión, múltiples sesiones ... en definitiva, es un producto más usable.
Recordaos que para poder tener línea de mandatos, tenemos que tener esta atribución. Lo usual es que sólo los usuarios técnicos tengan acceso a la línea de comandos, de modo que los usuarios de aplicaciones sólo acceden a los programas que para ello se dispongan. Es la manera más elemental de construir seguridad en un sistema de estas características.
Work with System Values (WRKSYSVAL). Trabajar con los valores del sistema
Lo primero que hay que mirar en un 400 son los valores de sistema. Es la parte más fácil de inspeccionar, ya que es es muy intuitiva y fácil de comprender. Los valores del sistema son un conjunto de parámetros que dictaminarán cómo debe comportarse el sistema a la hora de funcionar.
Para poder trabajar con ellos, existe un comando de línea que se llama Work with System Values (Trabajar con los valores del sistema), y se invoca con el mandato WRKSYSVAL. Nosotros nos vamos a centrar sólo en los valores de sistema que tienen que ver con la seguridad, y optaremos siempre por auditar solicitando extracciones de información. La mejor manera de auditar es sentarse con el administrador de seguridad, y pedirle ejecuciones que serán volcadas a fichero o a impresora, según proceda, para nuestro posterior análisis. No es una buena práctica recibir atributos especiales para lanzar nosotros mismos consultas, ya que el riesgo de cometer un error y perjudicar la producción es elevado.
Para inspeccionar los valores delsistema, solicitaremos la ejecución de WRKSYSVAL, siendo preferente la obtención de un fichero que nos permita localizar después los parámetros:
WRKSYSVAL SYSVAL(*SEC) (mostrará los valores en pantalla, sólo es útil para consultas específicas)
WRKSYSVAL SYSVAL(*SEC) OUTPUT (*PRINT) (enviará al spool de impresión el resultado, puede ser interesante para tener una copia en papel)
WRKSYSVAL SYSVAL(*SEC) OUTPUT (*FILE) fichero (grabará la ejecución en el fichero especificado, lo recomendable.)
La descripción técnica de este mandato la tenéis enhttp://publib.boulder.ibm.com/infocenter/systems/scope/i5os/index.jsp. Llegado a este punto se hace muy recomendable tener a nuestro lado el documento V5R3 iSeries Security Reference (SC41-5302-07), para poder encontrar descripciones completas de lo que estamos estudiando.
Siguiendo el mismo orden que aparece en la documentación oficial, en este capítulo aprenderemos a interpretar los siguientes grupos de parámetros:
  1. Nivel de Seguridad (QSECURITY)
  2. Valores de sistema generales de seguridad
  3. Valores de sistema relacionados con la seguridad
  4. Valores de sistema de backup y restauración relacionados con la seguridad
  5. Valores de seguridad que aplican a las contraseñas
  6. Valores de sistema que controlan los parámetros de auditoría
Veamos en qué consisten, uno a uno.
1. QSECURITY (Nivel de seguridad)
El nivel de seguridad es un valor numérico que establece las condiciones de contorno generales del nivel de seguridad. Es un número creciente, lo que implica que valores más elevados implican una seguridad más elevada. Los niveles estándares de seguridad en un 400 son los siguientes:
  • Nivel 10 (Seguridad del sistema no obligatoria, no es posible establecerlo)
  • Nivel 20 (Seguridad sign-on)
  • Nivel 30 (Seguridad sign-on y de recursos)
  • Nivel 40 (Seguridad sign-on, de recursos y protección de integridad)
  • Nivel 50 (Seguridad sign-on, de recursos y protección de integridad mejorada)
Según el fabricante se recomienda un valor mínimo de 30 (en algunos textos más recientes, recomienda 40), siendo lo realmente oportuno acudir al menos al nivel 40. El nivel de seguridad 40 incluye a los niveles 20 y 30, mejorándolos especialmente en lo que a controles de integridad se refiere:
  • Prevención ante el uso de interfaces no soportadas
  • Protección de descripciones de jobs, forzando a que aquellos que envíen trabajos a la cola deban tener autoridad *USE para que estos no fallen
  • Impedimento del uso de los login por defecto
  • Permisividad el uso de HSP (Enhanced Storage Protection, protección mejorada de almacenamiento), haciendo marcajes específicos en los bloques de información de sólo lectura, lectura-escritura o sin acceso
  • Protección específica de los espacios asociados a cada programa y direcciones de jobs
Salvo requisito regulatorio no es preciso, por lo general, irse a niveles superiores como el 50, en el que básicamente se adoptan medidas de integridad mejoradas que sí pueden, al contrario que el nivel 40, tener afectación sobre el rendimiento.
2. Valores de sistema generales de seguridad
En este apartado estudiaremos algunos parámetros que guardan relación con aspectos generales de la seguridad del sistema. Son los siguientes:
  • Allow User Domain Objects (QALWUSRDMN). Este parámetro dicta qué librerías del sistema permitirán la existencia de objetos de usuarios de los tipos *USRSPC, *USRIDX, and *USRQ. El valor recomendado es *ALL, aunque yo soy partidario de permitir sólo la presencia de estos objetos en la librería de temporales QTEMP.
  • Authority for New Objects (QCRTAUT). Define la autoridad pública para un objeto de nueva creación cuando la autoridad de creación de la libería en la que estará ese nuevo objeto es *SYSVAL y el nuevo objeto creado tiene la autoridad pública *LIBCRTAUT. No es excesivamente relevante, y se recomienda el valor *CHANGE.
  • Display Sign-On Information (QDSPSGNINF). Define si se mostrará información en el sign-on: fecha de última conexión, número de intentos de conexión inválidos y número de días que restan hasta la expiración de la clave. El valor recomendado es 1 (activo)
  • Inactive Job Time-Out Interval (QINACTITV). Número de minutos que se permite antes de que se tomen acciones sobre los jobs inactivos. Es usual que este parámetro esté a *NONE (no se realizan estas verificaciones por parte del sistema), delegando la monitorización en la supervisión manual de los operadores.
  • Inactive Job Time-Out Message Queue (QINACTMSGQ). Aplica sólo si tenemos las verificaciones de inactividad activas. Dicta qué acción tomar si se produce un timeout. El valor recomendable es *ENDJOB (finalización del job), si bien lo usual es que estas tareas administrativas se realicen desde sala por parte de los operadores.
  • Limit Device Sessions (QLMTDEVSSN). Establece si se permite a los usuarios estar conectados a más de un dispositivo. Por motivos obvios (usuarios que comparten contraseña) se recomienda que este valor esté a 1 (un único dispositivo por usuario)
  • Limit Security Officer (QLMTSECOFR). Es ideal para restrigir la capacidad de login de usuarios privilegiados (aquellos con atribuciones *ALLOBJ o *SERVICE) a sólo algunas estaciones especialmente protegidas. Se recomienda hacer uso de esta funcionalidad (parámetro a 1), lo que impedirá que en caso de compromiso de los usuarios privilegiados, se pueda ganar consola desde cualquier estación.
  • Maximum Sign-On Attempts (QMAXSIGN). Número máximo de intentos erróneos de conexión. Un valor de 3 intentos es razonable.
  • Action When Sign-On Attempts Reached (QMAXSGNACN). QUé hacer si se supera el número máximo de intentos erróneos de conexión. Lo recomendable es poner este parámetro a 3, lo que implicará deshabilitar el usuario y el dispositivo asociado, frenando los intentos de acceso mediante fuerza bruta.
  • Retain Server Security (QRETSVRSEC). Este parámetro dictaminará si es factible conservar en el sistema información descifrable relacionada con la autenticación de usuarios, o de listas de validación (*VLDL). Se recomienda dejar a 0, lo que implica que no se rentendrá esta información.
  • Remote Sign-On Control (QRMTSIGN). Empleado para gestionar conexiones remotas, lo que incluye conexiones Telnet (las ordinarias) y los pass-through que existan entre particiones (práctica muy extendida). El valor recomendado es *FRCSIGNON, lo que hará que las conexiones remotas tengan que pasar por el servicio de sign-on ordinario.
  • Scan File Systems (QSCANFS). Permite construir mecanismos para el escaneo de sistemas de ficheros en busca de, por ejemplo, malware. Se recomienda el valor *ROOTOPNUD, para que al menos se escanee el sistema de ficheros del root. No perdamos de vista que este parámetro requiere que se hayan definido las listas de qué, dónde y cómo mirar.
  • Scan File Systems Control (QSCANFSCTL). Similar al anterior. El valor *NONE es el recomendado.
  • Share Memory Control (QSHRMEMCTL). Define qué usuarios tienen potestad para hacer uso de la memoria compartida con capacidad de ser escrita. El valor recomendado es 1, lo que permite hacer uso de la memoria compartida.
  • Use Adopted Authority (QUSEADPAUT). Define qué usuarios pueden crear programas con la autoridad especial que permite la adopción de autoridades (*USEADPAUT(*YES)). El valor recomendado es *NONE, lo que provocará que todos los usuarios pueden hacer uso de las autoridades adoptadas sólo en caso de que el perfilado de los programas y servicios lo permita. Es preferible delegar en el correcto perfilado antes que frenar la capacidad de desarrollo y operación.
3. Valores de sistema relacionados con la seguridad
  • Automatic Device Configuration (QAUTOCFG). Determina si los dispositivos añadidos al sistema deben configurarse automáticamente o no. El valor recomendado es 0 (desactivado), con la idea de prevenir la conexión sin supervisión de dispositivos maliciosos.
  • Automatic Configuration of Virtual Devices (QAUTOVRT). Determina si los dispositivos virtuales procedentes de pass-through y/o vía TELNET serán configurados automáticamente o no. El valor recomendado es 0 (desactivado)
  • Device Recovery Action (QDEVRCYACN). Establece las acciones a tomar cuando se producen errores I/O en el tratamiento de tareas. El valor recomendable es *DSCMSG (desconexión del job y posterior envío del mensaje de error al usuario en el próximo sign-on)
  • Disconnected Job Time-Out Interval (QDSCJOBITV). Guarda relación con el anterior. Es el tiempo en minutos para que el sistema termine los jobsinterrumpidos. Se recomiendan 240 minutos, suficientes para tomar acciones y a la par, impedir la presencia de tareas muertas en la cola.
  • Remote Service Attribute (QRMTSRVATR). Establece si es posible analizar sistemas remotamente a través de las utilidades de servicio remoto. Se recomienda no activar esta característica (valor 0) por motivos más que obvios. Puntualmente puede habilitarse, siempre que se tengan las máximas precauciones y que el proceso esté debidamente supervisado.
4. Valores de sistema de backup y restauración relacionados con la seguridad
Debemos revisar los siguientes parámetros:
  1. Verify Object on Restore (QVFYOBJRST). Este parámetro determina si los objetos que han de ser restaurados deben tener firmas digitales para verificar su idoneidad y permitir su restauración. Se recomienda que esté activo, con el valor 3, lo que hará que sólo se restauren comandos firmados y objetos firmados en caso de que las firmas sean válidas. Por desgracia, el uso de componentes firmados no es una práctica muy extendida.
  2. Force Conversion on Restore (QFRCCVNRST). Este parámetro indicará si es preciso forzar la conversión de determinados objetos en el momento de restaurar, como por ejemplo, programas (*PGM) y programas de servicio (*SRVPGM), así como paquetería SQL (*SQLPKG) y módulos (*MODULE). La idea es dotar de mejor integridad al proceso de restauración, ya que los objetos que no puedan convertirse al no contener suficiente información no serán restaurados. El valor mínimo recomendado para el parámetro es 3, lo que implica que los objetos en los que haya sospecha de adulteración o simplemente presencia de errores, serán convertidos antes de ser empleados.
  3. Allow Restoring of Security-Sensitive Objects (QALWOBJRST). Establece si los objetos considerados de alta sensibilidad son susceptibles de recuperación. El valor en operación debe ser *NONE, es decir, no se permite la recuperación de objetos sensibles, pero por necesidades obvias, en un evento de restauración debe estar a *ALL, lo que permitirá ejecutar la restauración siempre y cuando se disponga de la autoridad adecuada.
5. Valores de seguridad que aplican a las contraseñas
Los podéis encontrar en la página 288 de nuestro material de estudio. Son autoexplicativos, y son básicamente una colección de parámetros que tienen que ver con las contraseñas que se utilizan en el sistema. La reproduzco a continuación:
valores de contraseñas
En este campo habrá que ajustarse a lo que nos dicte el sentido común, y a la política de seguridad de la compañía que estemos auditando. La gestión de claves de un 400 puede ser muy profunda y enrevesada, y lo que menos querremos causar es complicar las cosas recomendando acciones sobre las contraseñas que obliguen a la compañía a tomar acciones costosas que sólo provoquen quejas e incidencias con mínimos incrementos de la seguridad.
Los parámetros a estudiar son los siguientes:
  • Password Expiration Interval (QPWDEXPITV). Determina la vida útil de la contraseña en días para forzar su cambio. Se recomienda que sea de 30 a 90 días.
  • Password Level (QPWDLVL). El nivel de contraseña permite a los administradores seleccionar entre claves de 1 a 10 dígitos, o bien de 1 a 128 dígitos. El valor adecuado debe discutirse con los administradores de seguridad, ya que forzar hasta 128 dígitos puede tener repercusiones en otros sistemas que beban del 400 y que no admitan tales longitudes.
  • Minimum Length of Passwords (QPWDMINLEN). Longitud mínima de las claves. Se recomienda un mínimo de 6 caracteres para evitar claves sencillas.
  • Maximum Length of Passwords (QPWDMAXLEN). Longitud máxima de las claves. El fabricante recomienda 8 caracteres, si bien esto puede ser modificado de acuerdo a los administradores.
  • Required Difference in Passwords (QPWDRQDDIF). Este parámetro nos dirá si el sistema requiere que las claves que usemos deban ser o no diferentes a las anteriores. El valor recomendado es 5, lo que equivale a que el sistema comprobará que la nueva contraseña no sea ninguna de las escogidas en las 10 últimas ocasiones. Este punto es siempre fuente de controversia, ya que los administradores lo querrán tener a 0 (se permite duplicidad) por facilitar la operativa y por disminuir las quejas de los usuarios.
  • Restricted Characters for Passwords (QPWDLMTCHR). Este parámetro indica si se limitará la presencia de ciertos caracteres en las contraseñas. El fabricante recomienda limitar el uso de vocales para construir claves más sólidas (impiden la construcción de palabras). Los caracteres #, $ y @ suelen estar restringidos igualmente por compatibilidad con otros sistemas.
  • Restriction of Consecutive Digits for Passwords (QPWDLMTAJC). Este parámetro nos indica si se permite la adyacencia numérica en las claves. Por ejemplo, si una clave que sea 12345 o 12er45 se permite o no. La idea es prevenir el uso de fechas, números de DNI, etc. como contraseñas. Por defecto es una opción que se permite, y no suele estar restringida por asuntos de operatividad. Carne de discusión con los administradores, y nunca fácil de resolver.
  • Restriction of Repeated Characters for Passwords (QPWDLMTREP). Similar al anterior, pero en vez de dígitos, este parámetro dictamina si un caracter puede estar repetido en una clave o no. Por ejemplo, la clave ekgDf4e, que contiene dos veces el carácter "e". Por defecto está a 0, luego se permiten. A discutir con los administradores. Sólo justificaría su uso en instalaciones de máxima seguridad, y cuando se considere que aporta mejoras a la gestión de contraseñas.
  • Character Position Difference for Passwords (QPWDPOSDIF). Controla la repetición de los mismos caracteres en las mismas posiciones respecto a claves anteriores. Es algo enrevesado, y suele estar desactivado (valor a 0). Nunca lo he visto activo.
  • Requirement for Numeric Character in Passwords (QPWDRQDDGT). Este parámetro indica si se requiere la presencia de números en la contraseña o no. La idea es prevenir la existencia de claves débiles con sólo caracteres (palabras sencillas como hola, root, usuario, etc.). Por defecto viene a 0, es decir, no se exige, aunque yo lo veo una práctica recomendable.
  • Password Approval Program (QPWDVLDPGM). Determina si existen medios de aceptación adicionales de las claves elegidas antes de ser incorporadas al sistema. No suele estar activo, ya que el sistema sólo acepta programas de aprobación que residan en pools de almacenamiento auxiliares (ASP, Auxiliary Pool Storage), lo que implica costes adicionales. Por defecto viene a *NONE, es decir, no se emplean programas de aceptación adicionales.
6. Valores de sistema que controlan los parámetros de auditoría
Esta colección de parámetros nos darán información relevante sobre los mecanismos de auditoría intrínsecos de la plataforma, y es crucial tratarlos con sumo cuidado. Son los siguientes:
  • Auditing Control (QAUDCTL). El el parámetro primario. Este parámetro indicará si están activas o inactivas las medidas de auditoría de los parámetros QAUDLVL y QAUDLVL2, la auditoría de cambios en objetos objetos mediante Change Object Auditing (CHGOBJAUD), los comandos de cambio de auditoría DLO (CHGDLOAUD) y la auditoría a usuarios que se efectúe mediante (CHGUSRAUD). Por defecto está a *NONE, lo que implica que esta auditoría no se realiza. Si no existen problemas de rendimiento, yo aconsejo que esté en los valores *OBJAUD (cambios en objeto mediante los comandos CHGOBJAUD, CHGDLOAUD y CHGAUD) y *AUDLVL (se auditan las funciones definidas en QAUDLVL, QAUDLVL2, así como el comando (CHGUSRAUD) Change User Audit. Es aconsejable, mediante el parámetro *NOQTEMP, que las acciones de auditoría no se ejecuten en la librería de temporales QTEMP, ya que no suele aportar nada más que consumo de recursos.
  • Auditing End Action (QAUDENDACN). Este parámetro nos indica qué debe hacer el sistema si la auditoría está funcionando y por cualquier razón (principalmente, disco lleno) no se pueden seguir grabando entradas a la bitácora de auditoría. Lo usual es que esté a *NOTIFY, lo que hará que se envíen mensajes CPI2283 a las colas QSYSOPR y QSYSMSG para que los operadores puedan tomar las acciones establecidas en caso de falta de espacio.
  • Auditing Force Level (QAUDFRCLVL). Define cómo articular el paso de la bitácora de auditoría de memoria a almacenamiento en disco. Se recomienda el valor *SYS, lo que hará que el sistema decida en base a criterios de rendimiento cuándo migrar los registros. En algunas ocasiones son los operadores los que realizan los tránsitos, aunque lo usual es que sea el sistema el que se ocupe.
  • Auditing Level (QAUDLVL). Nivel primario de auditoría. Junto a QAUDLVL2 dictaminará que eventos de seguridad serán grabados en el registro de auditoría. Este comando admite muchísimos valores, y debe ser discutido con los administradores. Como mínimo, deberían grabarse los eventos de fallo de autoridad (*AUTFAIL), las operaciones de creación de objetos (*CREATE), de eliminación (*DELETE), las acciones que afectan a jobs (*JOBDTA) y las relacionadas con seguridad (*SECURITY), pero en función a la instalación, pueden ser muchos más.
  • Auditing Level Extension (QAUDLVL2). Se emplea cuando son necesarios más de 16 valores de auditoría, siendo una extensión del anterior.
  • Auditing for New Objects (QCRTOBJAUD). Determina el valor de auditoría para los objetos de nueva creación, siempre y cuando la librería donde esté ese nuevo objeto esté puesta en *SYSVAL. También es el valor que controla los nuevos documentos del sistema que no están en contenedores. Un buen valor es auditar los cambios, mediante *CHANGE. Ojito porque, por defecto, está desactivada (*NONE).
Resumen
Estos son los principales valores del sistema que tienen relación con la seguridad. No son los únicos, y sólo deben tomarse como una guía de lo que usualmente se suele comprobar para dictaminar si la parametrización de seguridad de un AS/400 es razonable o no.
En la siguiente entrega, siguiendo escrupulosamente el manual del fabricante, haremos un estudio de los perfiles de usuario. Es una de las partes más importantes en la auditoría de un 400, ya que a fin de cuentas, como sucede en cualquier otro sistema, un mal perfilado puede resultar letal para la seguridad.

Cuando auditamos un sistema operativo siempre es interesante analizar el perfilado de los usuarios. El perfilado arroja siempre información sobre los riesgos que derivan de que los usuarios tengan o no los privilegios adecuados para hacer uso del sistema, o si lo preferimos, de la capacidad que tienen los usuarios de realizar acciones maliciosas intencionadas o accidentales.
Por desgracia, es frecuente minusvalorar el análisis del perfilado, ya que muchas auditorías se centran en aspectos técnicos como la configuración de seguridad y la presencia de vulnerabilidades que permitan a un atacante la realización de actividades maliciosas en un equipo o conjunto de equipos. Sin restar importancia a este tipo de análisis, el estudio del perfilado cobra especial interés en grandes sistemas donde existe un número muy elevado de usuarios, algunos de los cuales podrían estar legítimamente presentes en el sistema con excesivas atribuciones que facilitarían en gran medida un ataque. En general, y para cualquier sistema, sería siempre deseable un estudio mixto que combine el análisis de la seguridad perimetral (test de intrusión basado en configuración de seguridad endeble y/o vulnerabilidades) así como el estudio de los perfiles (probabilidad de realizar acciones maliciosas disponiendo de cuenta en el sistema)
En grandes sistemas transaccionales es muy complicado, por no decir prácticamente imposible, la intrusión tradicional, es decir, aquella en la que un usuario sin cuenta logra acceso al sistema aprovechando vulnerabilidades. El histórico de vulnerabilidades en los 400, z/OS y similares es prácticamente inexistente, con lo que no es de esperar que existan vulnerabilidades que permitan entrar alegremente al sistema, ganar privilegios de administración o elevar los privilegios que tenemos concedidos. Donde normalmente vamos a encontrar problemas es en la configuración de seguridad, y concretamente, en cómo se administran los perfiles.
Es bastante frecuente que el perfilado no esté suficientemente ajustado a los requisitos deseables de seguridad establecidos para la instalación, y esto responde principalmente a dos factores: por un lado son sistemas con un legado anterior extenso, lo que implica que arrastran una configuración que puede tener años de vida y en la que pueden existir errores no advertidos, y por otro lado, son frecuentes las instalaciones donde se percibe cierta ausencia de tareas administrativas regulares que permitan sanear y actualizar la situación de los perfiles, lo que suele provocar que en la declaración de perfilado existan errores diversos como por ejemplo, la dotación de excesivos privilegios, la concesión de permisos sobre programas que el usuario no utiliza, bien porque ya no pertenece a la organización, bien porque ha cambiado su rol en la misma. En definitiva, cuando auditamos un 400 hay que prestar especial atención a los perfiles, ya que buena parte de la seguridad global del sistema reside en estas declaraciones.
Una vez más, seguiremos los contenidos de la guía de referencia de seguridad del fabricante, que hemos enlazado en los capítulos anteriores. Dado que el análisis de los perfiles de usuario requiere realizar numerosas comprobaciones, vamos a dividir este tema en varias secciones. En la que publicamos hoy, hablaremos de algunos conceptos introductorios y generales relacionados con la auditoría del perfilado, para ofrecer una visión general antes de entrar en detalle.
En capítulos anteriores ...
Para situarnos, estos son los contenidos vistos con anterioridad:
Display User Profiles (DSPUSRPRF)
El comando de consola DSPUSRPRF (Display User Profiles) permite, como su propio nombre indica, obtener información sobre los perfiles declarados en el sistema, tanto de grupos como usuarios.
Su funcionamiento es muy sencillo. Así pues, DSPUSRPRF USRPRF(SHERNANDO) mostraría en pantalla el perfil del usuario shernando, siempre y cuando se tengan permisos para realizar la consulta. Empleando el mismo comando es posible obtener un fichero que contenga todos los perfiles dados de alta en el sistema:
DSPUSRPRF USRPRF(*ALL) TYPE(*BASIC) OUTPUT(*OUTFILE) OUTFILE(AUDITORIA/PERFILES)
Esta ejecución escribirá en el fichero PERFILES de la librería AUDITORIA todos los perfiles del sistema. Normalmente el auditor solicitará al administrador de seguridad la extracción de estos perfiles, ya que mostrar perfiles de usuario ajenos al nuestro requiere permisos especiales. Adicionalmente, por una cuestión de asepsia, es recomendable ordenar la extracción y recogerla junto al administrador de seguridad para que quede constancia de que el material proporcionado es conforme a los deseos de ambas partes.
Mediante la ejecución anterior estaremos en condiciones de realizar diversas pruebas sobre la totalidad de usuarios. La consulta mostrará información suficiente para poder analizar estos siete grupos de información y sus correspondientes campos de información:
  1. Fecha y hora: UPDCEN, UPDDAT, UPDTIM, UPSYST
  2. Nombre de usuario: UPUPRF, UPUSCL, UPJBDS, UPJBDL, UPTEXT
  3. Claves/Sign-on: UPDSIN, UPDSIN, UPPWCC, UPPWCD, UPPWCT, UPPWEI, UPPWEX, UPPWON, UPPSOC, UPPSOD, UPPSOT, UPNVSA, UPSTAT
  4. Capacidades: UPLDVS, UPSPAU, UPMXST, UPMXSU, UPPRLT, UPLTCP
  5. Condiciones iniciales de usuario: UPINPG, UPINPL, UPINMN, UPINML, UPATPG, UPATPL
  6. Pertenencias: UPOWNR, UPGRPF, UPGRAU, UPGRPI, UPACCD
  7. Auditoría: UPOBJA, UPAUDL
El objetivo del auditor será opinar, para todos los perfiles, sobre las condiciones de los campos enumerados anteriormente. Los veremos uno a uno en capítulos posteriores.
Autoridades especiales
En el 400 hay un conjunto de autoridades que se consideran especiales. Son, por así decirlo, privilegios elevados que se confieren a usuarios y grupos para la realización de tareas administrativas. Hay que ser especialmente cauto al analizar los perfiles de usuario, ya que si hay usuarios capaces de realizar acciones maliciosas, intencionadas o no, son los usuarios con atributos especiales.
La manera más fácil de analizarlos es enumerar la totalidad de usuarios obtenidos en nuestra descarga que no tienen el parámetro UPSPAU igual a *NONE (es decir, aquellos que no están marcados como usuarios sin autorizaciones especiales). Los tipos de autoridades especiales son:
  • *ALLOBJ: Autoridad "todos los objetos" (All Objects). Permite realizar operaciones en todos los objetos del sistema.
  • *AUDIT: Autoridad de auditoría (Audit). Permite a los usuarios definir las características de la auditoría del sistema, objetos y usuarios
  • *IOSYSCFG: Autoridad de configuración de sistema (I/O System Config). Permite a los usuarios configurar la comunicación, así como los dispositivos de entrada y salidad del sistema.
  • *JOBCTL: Autoridad de control de trabajos (Job Control). Esta autoridad ofrece control sobre los jobs del sistema.
  • *SAVSYS: Autoridad de salvado del sistema (Save System). Permite salvar y restaurar objetos.
  • *SECADM: Autoridad de administrador de seguridad (Security Administrator). Permite trabajar con perfiles de usuario del sistema.
  • *SERVICE: Autoridad de servicio (Service). Permite la realización de funciones de mantenimiento del software en el sistema.
  • *SPLCTL: Autoridad de control de colas (Spool Control). Permite obtener control total sobre los jobs sometidos a batch y las colas de salida.
Autoridades públicas (Public Authorities)
Las autoridades públicas sirven para simplificar la administración del sistema. Un objeto con autoridad pública implica que es accesible por todos los usuarios, siempre y cuando no recaiga sobre ese objeto alguna restricción particular que acote su disponibilidad.
Por defecto, muchos comandos vienen por defecto con la autoridad pública en *EXCLUDE, es decir, que por defecto se impide que cualquier usuario pueda realizar uso de esos comandos. Tómese en especial atención la presencia de autoridades públicas ya que entrañan un riesgo potencial elevado.
QSECOFR
Por último, para terminar esta introducción al perfilado de usuarios, resulta obligatorio hablar de QSECOFR. Este perfil es el perfil de máxima autoridad en el sistema, y suele venir de fábrica con la clave QSECOFR (expirada, luego obliga al cambio) y goza de las autoridades especiales *ALLOBJ, *SAVSYS, *JOBCTL, *SECADM, *SPLCTL, *SERVICE, *AUDIT y *IOSYSCFG
A todos los efectos, QSECOFR es el UID 0 del sistema. No debe perderse de vista que los 400 vienen, en una instalación de fábrica, con numerosos perfiles declarados (comienzan todos por Q), con lo que es más que recomendable ojear la guía de referencia de seguridad, concretamente la sección Appendix B. IBM-Supplied User Profiles para comprender la naturaleza de estos usuarios a la hora de auditar los perfiles.
En lo que a QSECOFR se refiere, no resulta admisible que sea un usuario empleado en el día a día de la administración del sistema. Lo usual es crear usuarios administradores de seguridad con privilegios elevados, trazables y personalizados, dejando a QSECOFR para acciones de emergencia o para eventos donde sea estrictamente necesaria su utilización. Es por tanto que la clave de QSECOFR debe estar custodiada y cambiada siempre que se haga uso del usuario y como no podía ser de otro modo, la monitorización de seguridad debe ser implacable, registrando todos los movimientos de este usuario, aún a riesgo de que podría eliminar sus trazas, con lo que es recomendable la monitorización específica del mismo por terceras personas ajenas a los administradores de seguridad en los centros de explotación (por ejemplo, en la sala de operación). Estas medidas son igualmente aplicables a todos los usuarios con autoridades especiales activos, lo que incluye a los administradores de seguridad.
En el próximo capítulo veremos cómo opinar sobre la seguridad del sistema atendiendo a la información que podemos obtener del perfilado de los usuarios declarados.

Contraseñas por defecto
Estudiar las contraseñas por defecto es una tarea típica en el análisis de la seguridad de un sistema operativo. El caso de un 400 no es una excepción.
En sistemas transaccionales de medio y largo alcance es relativamente frecuente, dado el elevado número de usuarios, que existan muchos perfiles con contraseñas por defecto. Adicionalmente son sistemas que vienen de fábrica poblados con multitud de perfiles que tienen contraseñas por defecto, los cuales, en ausencia de una administración de seguridad adecuada, pueden perdurar en la vida útil del sistema pasando inadvertidos. Para facilitar su localización, los sistemas operativos de un 400 tienen una utilidad a disposición de los administradores de seguridad: el análisis de las contraseñas por defecto.
El riesgo de la existencia de contraseñas por defecto es más que obvio, ya que facultan a un atacante a lograr acceso al sistema sin la necesidad de explotar vulnerabilidades.
Analyze Default Password (ANZDFTPWD)
Tal y como se puede leer en el capítulo cuarto de la guía de referencia de seguridad del fabricante, este comando permite imprimir un informe completo de todos los perfiles de usuario declarados en el sistema que tienen contraseña por defecto, así como tomar medidas para mitigar los riesgos que estos perfiles representan. Las acciones pueden ser *NONE (no se toma ninguna medida), *DISABLE (desactivar el perfil) y *PDWEXP (poner la contraseña como caducada, lo que hará que al siguiente inicio de sesión el usuario deba cambiarla). En un 400 se entiende como contraseña por defecto aquella en la que el nombre del perfil de usuario coincide con la clave de dicho perfil.
Este comando, restringido para el oficial de seguridad (QSECOFR), está principalmente orientado a localizar perfiles por defecto que están declarados en el sistema en una instalación nueva, pero lógicamente, también permite al auditor localizar malas prácticas en la gestión de contraseñas, identificando perfiles a los que en vez de otorgar claves complejas, le han sido otorgadas claves simples, coincidentes con su nombre de perfil. Técnicamente hablando, el comando se surte del fichero de datos QASECPWD2, presente en la libería QUSRSYS.
Contraseñas por defecto de fábrica
Las siguientes credenciales suelen ser las habituales en una instalación de fábrica. Resulta fácil comprobar que la lista de duplas (notadas comoperfil;contraseña) no es precisamente corta, lo que hace más que justificable el análisis de las contraseñas por defecto:
11111111;11111111
22222222;22222222
IBM;PASSWORD
IBM;2222
IBM;SERVICE
IBM;IBM
QAUTPROF;
QDBSHR;
QDOC;
QLPAUTO;
QNETSPLF;
QPGMR;QPGMR
QSECOFR;11111111
QSECOFR;22222222
SECOFR;SECOFR
QSRVBAS;QSRVBAS
QTFTP;
QTSTRQS;
QBRMS;
QDBSHRDO;
QDSNX;
QLPINSTALL;
QNFSANON;
QPM400;
QSNADS;
QSVCDRCTR;
QTMHHTTP1;
QUMB;
QCLUMGT;
QDFTOWN;QDFTOWN
QEJB;
QMQM;
QNOTES;
QPRJOWN;
QSPL;
QSYS;
QTMHHTTP;
QUSER;QUSER
QCLUSTER;
QDIRSRV;
QFNC;
QMQMADM;
QNTP;
QRJE;
QSPLJOB;
QSYSOPR;QSYSOPR
QTMPLPD;
QYPSJSVR;
QCOLSRV;
QDLFM;
QGATE;
QMSF;
QPEX;
QRMTCAL;
QSRV;QSRV;IBMCEL
QTCP;
QTMTWSG;
QYPUOWN;
QSERV;QSERV
El menú SECTOOLS
sectools
Esta utilidad es parte de un menú especial llamado SECTOOLS, un menú accesible mendiante go sectools, en el que además del análisis de contraseñas por defecto (ANZDFTPWD), es posible desplegar la lista de perfiles activos (DSPACTPRFL), los inactivos, analizar la actividad de los perfiles (ANZPRFACT), consultar la agenda de activación y desactivación de perfiles (DSPACTSCD), cambiar la agenda (CHGACTSCDE), gestionar la agenda de expiraciones (DSPEXPSCDE y CHGEXPSCDE) y imprimir información interna de los perfiles (PRTPRFINT).
Una auditoría completa del 400 haría recomendable revisar todas estas ejecuciones para determinar si existen indicios de una configuración de seguridad incorrecta. Elementos que nos pueden hacer sospechar son, por ejemplo, una agenda de desactivación y/o expiración sin entradas (síntoma de que los perfiles se crean sin expiración), un elevado número de perfiles inactivos, etc.
En el próximo capítulo indagaremos más en el análisis de los perfiles de usuario.