Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Apuntes de RACF PDF
Apuntes de RACF PDF
Juan Mautalen
2
PREFACIO
Este texto intenta ser una guía básica de RACF (Resource Access Control Facility), dirigida
principalmente a aquellas personas que quieran iniciarse como administradores del producto. De todos
modos, la información que contiene, aunque sea parcialmente, puede resultar de gran utilidad tanto para
los system programmers como para los system operators (o cualquier otro usuario con inquietudes en el
plano de la seguridad en plataforma mainframe).
Los requisitos previos para abordar su lectura son realmente mínimos. Una cierta familiaridad con el
entorno z/OS, sumada a un manejo básico de TSO, ISPF y JCL, son suficientes para comprender sin
problemas los temas expuestos.
La información que se brinda está basada en la versión de RACF provista por la versión 1.11 del z/OS.
Sin embargo, salvo contadas excepciones, también es válida para versiones anteriores de RACF, o
incluso posteriores.
Al tratarse de un manual introductorio, he omitido intencionalmente el tratamiento de varios temas que,
si bien importantes, considero que están mas allá del contenido que debe abarcar un texto básico (RRSF-
Racf Remote Sharing Facility- o Certificados Digitales, por ejemplo). Otros temas tampoco son
tratados, pero por considerar, en estos casos, que se trata de facilidades raramente utilizadas (security
labels, por ejemplo).
Con respecto a los comandos de RACF, solo he descripto los operandos de uso más frecuente. La
sintaxis completa puede consultarse en línea desde una sesión de TSO mediante el comando HELP, o
bien en el manual de IBM “RACF - Command Languaje Reference”.
En cualquier caso, toda información sobre RACF que el lector no encuentre en la presente guía, o que
pretenda ampliar, puede hallarla en la documentación oficial del producto.
En lo relativo al alcance, tampoco he incursionado en el análisis de la protección dada por RACF a
ciertos “productos de base”, como ser: DB2, CICS o IMS. Para ello, debe no solo debe recabarse
información en la bibliografía específica de RACF sino principalmente en la documentación propia de
cada producto. En la siguiente dirección web se pueden consultar y descargar gratuitamente todos los
manuales oficiales de IBM vinculados al entorno z/OS:
http://www-03.ibm.com/systems/z/os/zos/bkserv/r11pdf/#secserv
Lo ideal sería leer la presente guía junto a una terminal con acceso a TSO, disponiendo de un usuario
con atributo SPECIAL, para poder probar en la práctica los comandos y opciones que se van
describiendo. Naturalmente, las opciones críticas deben siempre experimentarse en un entorno no
productivo, a menos que se pretenda adquirir una rápida popularidad -y no de la mejor manera- dentro
de la organización. En ciertas ocasiones notarán que se hace referencia, en determinado capítulo, a
algún tema que recién se trata en detalle en uno posterior. Esto me resultó inevitable, más allá de mis
esfuerzos por organizar el material lo más posible.
A lo largo de esta guía he optado, en muchos casos, por dar recomendaciones respecto a la
configuración y políticas de seguridad que estimo más convenientes. Estas deben entenderse como mi
opinión personal, producto de mi propia experiencia. En ningún caso se trata de sugerencias de IBM,
salvo que ello se indique explícitamente. En cualquier caso, toda organización debe determinar sus
necesidades particulares de seguridad y decidir qué opciones le resultan las más apropiadas para
satisfacerlas.
TABLA DE CONTENIDOS
1 - INTRODUCCIÓN ..........................................................................................................................6
1.1 - Consideraciones generales .........................................................................................................6
1.2 - Identificación y autenticación de usuarios ..................................................................................6
1.3 - Control de acceso a recursos ......................................................................................................6
1.4 - Herramientas de auditoría ..........................................................................................................6
1.5 - Seguridad externa para aplicaciones ...........................................................................................7
1 - INTRODUCCIÓN
2 - LA BASE DE RACF
Actualización automática
SYS1.RACF.PRIM1 SYS1.RACF.BACK1
SYS1.RACF.PRIM2 SYS1.RACF.BACK2
La alocación e inicialización de las bases de RACF se realiza a través del utilitario IRRMIN00, el cual
se describirá en detalle en el capítulo referido a programas utilitarios. Los datasets que constituyen las
bases de RACF deben ser definidos con características específicas, que mencionamos a continuación.
2.2 - Características
Es altamente recomendable que la organización sea PSU (Physical Secuencial Unamovable), de modo
que una eventual desfragmentación del disco dónde esté alocado no mueva el dataset de lugar. En
efecto, en el momento de IPL RACF toma registro de la ubicación absoluta, dentro de los discos, de los
datasets que conforman sus bases. Por lo tanto, cualquier movimiento posterior implicará que los
datasets ya no se encuentren dónde RACF tiene registrado, siendo las consecuencias impredecibles
(puede incluso que los problemas no se noten inmediatamente, sino que solo aparezcan cuando
efectivamente sea sobrescrito con nueva información el área de disco correspondiente a la ubicación
original). Debido a esta recomendación, es conveniente que los datasets que conforman las bases de
RACF (primaria y backup) residan en discos que no se encuentren bajo SMS (Storage Management
Subsystem), para que puedan alocarse como PSU. De no ser posible, deben alocarse como PS y tomarse
todas las precauciones necesarias para que los datasets no sean movidos (mientras se encuentren activos
en alguna LPAR).
Es obligatorio que tengan su espacio alocado en forma contigua, o sea que ocupen un único extent.
El tamaño de la base depende, naturalmente, del volumen de información que cada organización tenga
almacenada (lo cual no solo involucra la cantidad de usuarios definidos, sino muchos otros factores
adicionales). En cualquier caso, desde el punto de vista de storage, el espacio ocupado por las bases de
RACF es realmente pequeño. Es habitual y recomendable que la base de backup esté alocada con
idéntico tamaño que la primaria.
2.3 - Estructura
La base de RACF tiene una estructura propia bastante compleja. Sólo daremos una idea básica de cómo
está organizada, ya que una descripción detallada está más allá de los objetivos de este manual
introductorio.
La base de RACF está conformada, esencialmente, por entidades denominadas “perfiles” (profiles), que
pueden pensarse como registros que contienen distintos campos. Todo perfil pertenece a una “clase”
(class), que está identificada con un nombre de hasta 8 caracteres. Las clases, por lo tanto, agrupan
lógicamente a los perfiles. En el RACF que viene con el sistema operativo z/OS 1.11, IBM provee 230
clases predefinidas, cada una con un propósito específico, cuyos nombres son fijos e inalterables. Si
fuese necesario, existe la posibilidad de definir clases adicionales. Sin embargo, en la presente guía,
solo haremos referencia a las clases predefinidas por IBM, que suelen ser suficientes para satisfacer los
requerimientos de seguridad habituales de una organización.
Clase Descripción
USER Cada perfil en esta clase representa un usuario
GROUP Cada perfil en esta clase representa un grupo
DATASET Los perfiles en esta clase son reglas que protegen archivos
Existe también la posibilidad de ejecutar comandos de RACF utilizando una serie de paneles accesibles
desde una sesión de TSO. Estos proporcionan una interfaz amigable para el usuario, evitándole tener
que recordar los comandos de RACF y su sintaxis. Sin embargo, el administrador de RACF memorizará
rápidamente la sintaxis de los comandos básicos, en cuyo caso la utilización de los paneles resulta lenta
y tediosa, siendo mucho más práctico y veloz ejecutar los comandos tipeándolos directamente. Por lo
tanto, no haremos referencia en el futuro a la utilización de los paneles, ya que no suelen ser muy
utilizados.
Aunque no suele resultar necesario en la operatoria habitual, también se pueden ejecutar comandos de
RACF desde una consola del sistema. Esta facilidad cobra especial importancia cuando, por algún
motivo, no se disponga de sesiones de TSO.
Es de destacar que un usuario final, que solo tenga acceso a regiones CICS, no tendrá la posibilidad de
ejecutar ningún comando de RACF.
Los comandos actúan siempre sobre la base primaria, y son replicados inmediatamente en la base de
backup (asumiendo que RACF esté configurado para mantener sincronizadas ambas bases).
Los comandos requieren operandos, algunos posicionales y otros no. A lo largo de la presente guía
analizaremos la mayoría de los comandos y describiremos sus operandos más relevantes. A modo de
ejemplo, mostramos a continuación un comando que da de alta un usuario en la base de RACF:
Ciertos operandos, si se omiten, toman un valor por defecto. En el caso anterior, por ejemplo, al no
haberse codificado explícitamente OWNER, quedará por defecto como OWNER del nuevo usuario
aquel que ejecute el comando ADDUSER.
3 - USUARIOS Y GRUPOS
Ejemplo:
AG conta DATA(‘Subgerencia de Contabilidad’) SUPGROUP(finanzas) OWNER(finanzas)
Este comando define un nuevo grupo de nombre CONTA. El mismo se define como subgrupo del grupo
FINANZAS, que debe existir previamente (sino el comando falla). En este caso, se eligió definir como
owner a un grupo, que por lo tanto debe ser el grupo FINANZAS.
Autoridad requerida
Para definir un nuevo grupo, quien ejecuta el comando debe satisfacer alguna de las siguientes
condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga dentro de su campo de acción al grupo
superior del que se intenta definir.
Ser el owner del grupo superior.
Estar conectado al grupo superior con nivel de autoridad JOIN.
Para poder definir al grupo con algún “segmento no base” (por ejemplo, el segmento OMVS), el usuario
tiene que cumplir alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener autoridad a través de perfiles apropiados en la clase FIELDS.
Ejemplo:
ALG conta DATA(‘Sector de Contabilidad - Jefatura’)
Este comando modifica la Installation Data del grupo CONTA.
Consideraciones:
Hacemos notar que el nuevo valor especificado en DATA reemplaza íntegramente al valor
anterior. No se puede modificar parcialmente este campo. Si se pretende agregar algo a
continuación de la DATA existente, debe ejecutarse el comando retipeando toda la DATA. Esto
no solo es válido para grupos, sino para la Installation Data de cualquier perfil en la base de
RACF.
No existe la opción de modificar el nombre de un grupo. La única forma que prevé RACF para
renombrar un grupo consiste en darlo de baja para luego redefinirlo con el nuevo nombre. Esto es
trabajoso, ya que antes de borrar el grupo viejo, debe tomarse debida nota de los usuarios que
tiene conectados, así como también de todas sus autorizaciones, de modo que el nuevo grupo
resulte un clon del anterior. Al no ser una tarea sencilla, conviene establecer desde el comienzo
una buena nomenclatura, de modo a evitar, dentro de lo posible, tener que rebautizar grupos en el
futuro.
Autoridad requerida
Para poder modificar el grupo superior, quien ejecuta el comando debe cumplir con alguna de las
condiciones siguientes:
Tener el atributo SPECIAL a nivel de sistema.
Tanto para el actual grupo superior como para el futuro, satisfacer alguna de las opciones que se
enumeran:
- Ser el owner.
- Estar conectado con nivel de autoridad JOIN.
- Tener el atributo SPECIAL a nivel de un grupo que lo tenga dentro de su campo de acción.
Observemos que si el owner del grupo era su grupo superior, no podrá cambiarse el grupo superior sin
modificar asimismo el owner (ya que el único grupo que se admite como owner es el grupo superior)
Para poder especificar cualquier otro operando del comando ALTGROUP (con excepción del manejo
de segmentos no base), quien ejecuta el comando debe satisfacer alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga dentro de su campo de acción al grupo
que se modifica.
Ser el owner del grupo.
Para poder agregar, modificar o deletear “segmentos no base” del grupo, quien ejecuta el comando debe
satisfacer alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Consideraciones:
RACF no permite borrar un grupo que tenga usuarios conectados. En consecuencia, como paso
previo al comando DELGROUP, deben ser removidos todos sus usuarios.
RACF no permite borrar un grupo que tenga subgrupos. Por lo tanto, debe modificarse el grupo
superior de todos aquellos grupos que sean subgrupos del que se quiere borrar.
RACF no permite borrar un grupo si existen en la base perfiles de dataset cuyo primer calificador
(High level Qualifier, o HLQ) coincida con el nombre del grupo. Los mismos deben deletearse
previamente a la ejecución de comando DELGROUP, ya que en caso contrario el comando falla.
La ejecución exitosa del comando DELGROUP no elimina las referencias al grupo que puedan
existir en otros perfiles de la base (por ejemplo, el grupo puede figurar en la lista de acceso de
perfiles de dataset o de recursos generales). Por esta razón, con el objeto de mantener la base
prolija (sin referencias a grupos inexistentes), el borrado del grupo debe ser acompañado de la
eliminación de todas las referencias al mismo que existan en la base. Mas adelante veremos que
IBM provee, a tal efecto, el utilitario IRRRID00.
Autoridad requerida
Para poder borrar un grupo, quien ejecuta el comando debe cumplir con alguna de las condiciones
siguientes:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga dentro de su campo de acción al grupo
que se pretende borrar.
Ser el owner del grupo superior.
Estar conectado al grupo superior con nivel de autoridad JOIN.
Ser el owner del grupo que se pretende deletear.
Ejemplo:
LG conta OMVS
La salida tendría el siguiente aspecto:
INFORMATION FOR GROUP CONTA
SUPERIOR GROUP=FINANZAS OWNER=FINANZAS CREATED=10.245
INSTALLATION DATA=SECTOR DE CONTABILIDAD - JEFATURA
NO MODEL DATA SET
TERMUACC
Del listado precedente, se desprende claramente la siguiente información sobre el grupo CONTA:
El grupo superior es el grupo FINANZAS.
El owner del grupo CONTA es el grupo FINANZAS.
El grupo fue creado el día 245 del año 2010.
El grupo CONTA tiene 2 subgrupos, cuyos nombres son PAGOS y SUELDOS.
El grupo CONTA tiene 2 usuarios conectados, de identificadores CONFJ01 y CONFJ02.
El grupo CONTA tiene segmento de OMVS con un GID igual 15.
No describiremos, en este punto, el resto de la información listada, ya que para comprender ciertos
campos específicos se requieren nociones que se verán más adelante (MODEL y TERMUACC, por
ejemplo).
Autoridad requerida
Para listar el segmento base de un perfil de grupo, quien ejecuta el comando debe cumplir con alguna de
las condiciones siguientes:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga dentro de su campo de acción al grupo
que se pretende listar.
Tener el atributo AUDITOR a nivel de sistema.
Tener el atributo AUDITOR a nivel de un grupo que tenga dentro de su campo de acción al
grupo que se pretende listar.
Ser el owner del grupo.
Estar conectado al grupo con nivel de autoridad CONNECT o JOIN.
Para poder listar “segmentos no base” del grupo, quien ejecuta el comando debe satisfacer alguna de las
siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener autoridad a través de perfiles apropiados en la clase FIELDS.
Segmento Base
USERID Identificador del usuario.
NAME Nombre asociado con el usuario, de longitud máxima 20.
DATA Información sobre el usuario, con una longitud máxima de 255 caracteres.
DFLTGRP Nombre del grupo default del usuario.
PASSWORD Password que se otorga usuario.
OWNER Owner del usuario.
Segmento de TSO
PROC Nombre del procedimiento de logon a TSO (default) para el usuario
ACCTNUM Código de cuenta (default) para el usuario
COMMAND Comando a ejecutarse durante el logon a TSO
SIZE Tamaño mínimo de la región, expresado en Kbytes, default para el usuario
MAXSIZE Tamaño máximo que el usuario puede requerir en el momento de logon
Segmento de OMVS
UID UID del usuario. Número entre 0 y 2147483647. 0 indica superusuario.
HOME Home directory del usuario.
PROGRAM Shell asignado.
Con respecto al identificador del usuario, ya señalamos anteriormente las condiciones que debe cumplir.
En el campo NAME, si se trata de una persona física, se pone usualmente su nombre y apellido. En el
caso de usuarios asociados a procesos, se puede colocar un nombre que identifique la tarea para la que
es utilizado.
En la DATA, la organización guarda información administrativa que considere importante sobre el
usuario. Por ejemplo, se puede incluir su número de documento y el sector de la empresa dónde
desempeña sus tareas.
El grupo default debe ser un grupo que exista previamente en la base de RACF.
La password inicial es una clave expirada, lo cual significa que el usuario es forzado a cambiarla en el
momento del logon inicial. Por esta razón, no es necesario que cumpla con las reglas para passwords
fijadas por la organización en la SETROPTS (esto se verá en detalle en el capítulo correspondiente).
Debe tener una longitud máxima de 8 caracteres.
Es de destacar que RACF permite también la autenticación a través de Password Phrases, que son
cadenas de caracteres alfanuméricos y especiales (incluyendo blancos), de longitud mínima 9 y máxima
100. Presentan una posibilidad más robusta que las passwords tradicionales, dada su mayor longitud.
Sin embargo, por el momento son de utilidad limitada ya que existen aplicaciones que no las soportan,
algunas de uso muy difundido. CICS, por ejemplo, acaba de anunciar el soporte de Password Phrases
para su versión 4.2, que recién estará disponible a mediados del 2011. También debemos señalar que,
aún cuando el usuario tenga asignada una Password Phrase, debe también obligatoriamente contar con
una password tradicional (que podría ser desconocida por el usuario, para que se vea obligado a
autenticarse usando su Password Phrase). Por lo tanto, si bien creemos importante mencionar su
existencia y entendemos que en el futuro van seguramente a desempeñar un rol relevante, no haremos
más referencias a ellas en el presente manual.
El OWNER del usuario puede ser cualquier otro grupo o usuario existente en la base de RACF.
El segmento de TSO solo debe definirse para usuarios que tengan que usar esta facilidad. La mayoría de
los parámetros especificados se convierten en los valores default para el usuario, quien puede
cambiarlos, de ser necesario, en la pantalla de logon a TSO.
El segmento de OMVS solo debe definirse para usuarios que lo necesiten. Existe incluso, a partir del
z/OS 1.11, la posibilidad de configurar RACF de forma que este segmento se le agregue
automáticamente a los usuarios la primera vez que invoquen algún servicio Unix que lo requiera.
Para los operandos TSO y OMVS, solo se indicaron los suboperandos más frecuentes, existiendo varios
otros. Si no se especifica TSO u OMVS, el usuario simplemente queda definido sin tal segmento.
Autoridad requerida
Para definir un nuevo usuario, quien ejecuta el comando debe cumplir con alguna de las condiciones
siguientes:
Tener el atributo SPECIAL a nivel de sistema.
Tener CLAUTH en la clase USER y verificar además alguno de los siguientes requisitos:
- Ser el owner del grupo default especificado en el comando ADDUSER.
- Estar conectado con nivel de autoridad JOIN al grupo default especificado en el comando
ADDUSER.
- Tener el atributo SPECIAL a nivel de un grupo que tenga dentro de su campo de acción al
grupo default especificado en el comando ADDUSER.
Para poder definir al usuario con algún segmento no base (por ejemplo, segmentos de TSO u OMVS),
quien ejecuta el comando tiene que cumplir alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener autoridad a través de perfiles apropiados en la clase FIELDS.
GROUP indica el nombre de un grupo al cual el usuario se encuentra previamente conectado y sobre el
cual actuarán los nuevos valores especificados en los operandos AUTHORITY y UACC. Si se omite
GROUP, pero se codifica AUTHORITY o UACC, los mismos actúan sobre del grupo default del
usuario (aún en el caso en que se haya especificado DFLTGRP para cambiar el grupo default del
usuario, actúan sobre viejo).
REVOKE(mm/dd/aa) especifica una fecha futura a partir de la cual el usuario no podrá acceder al
sistema. Si la fecha ingresada no es posterior a la fecha actual, RACF informa que la fecha no es válida,
y envía al usuario que ejecuta el comando un mensaje para que especifique una fecha futura (esto
último, suponiendo que el comando se ejecuta en foreground. Si la ejecución es en batch, simplemente
se ignora el operando, por fecha inválida). Mientras el usuario tenga una fecha de revocación futura, se
considera que tiene un REVOKE pendiente. Si se codifica REVOKE sin especificar fecha, el REVOKE
toma efecto la próxima vez que el usuario ingrese al sistema. En este caso, el usuario adquiere el
atributo REVOKED (más adelante veremos en detalle todos los atributos de usuario).
NOREVOKE tiene como efecto quitar la fecha de revocación futura, si el usuario la tuviera.
RESUME(mm/dd/aa) especifica una fecha futura a partir de la cual el usuario podrá acceder al sistema
nuevamente. Usualmente, se utiliza este operando para anular el efecto del REVOKE. En el caso en que
el usuario no tenga un REVOKE pendiente, o no tenga el atributo REVOKED, el RESUME(mm/dd/aa)
es ignorado. Mientras el usuario tenga una fecha de resume futura, se considera que tiene un RESUME
pendiente. Si se codifica RESUME sin especificar fecha, el RESUME toma efecto inmediatamente (o
sea, habilita al usuario a ingresar al sistema de inmediato) y le saca el atributo REVOKED, si lo tuviera.
NORESUME tiene como efecto quitar la fecha de resume futura, si el usuario la tuviera.
Si se especifican ambos operandos REVOKE(mm/dd/aa) y RESUME(mm/dd/aa), las fechas no deben
entrar en conflicto (básicamente, la fecha especificada en RESUME debe ser posterior a la fecha del
REVOKE). Por ejemplo, el siguiente comando inhabilita al usuario fin7632 a usar el sistema desde el
1/1/2010 hasta el 31/1/2010.
ALU fin7632 REVOKE(1/1/10) RESUME(31/1/10)
Con respecto al formato de la fecha, el mismo debe ser mes/día/año. Los ceros a la izquierda, para mes
y día, pueden ser omitidos (1/1/03 equivale a 01/01/03). El año debe ser siempre de 2 dígitos, y se
extiende a 4 de acuerdo al siguiente criterio:
aa se traduce en 20aa si aa es menor a 71
aa se traduce en 19aa si aa es mayor o igual a 71
Consideraciones:
Sólo puede cambiarse el grupo default de un usuario por otro grupo al cual se encuentre
previamente conectado. Si el grupo especificado en DFLTGRP no es un grupo al cual esté
conectado, el grupo default no es alterado. Esto no evita que el resto del comando se procese. Es
posible y frecuente que un comando de RACF solo resulte exitoso parcialmente.
No existe la opción de modificar el identificador de un usuario. La única forma prevista por
RACF para renombrar un usuario consiste en deletearlo y darlo de alta nuevamente con el nuevo
identificador. Esto es trabajoso, ya que antes de borrar el usuario viejo, debe tomarse debida nota
de los grupos a los que se encuentra conectado, así como también de todas las autorizaciones que
tiene, de modo que el nuevo usuario resulte un clon del anterior. Al no ser una tarea sencilla,
conviene establecer desde el comienzo una buena nomenclatura de usuarios, de modo a evitar,
dentro de lo posible, tener que rebautizar en el futuro.
Autoridad requerida
El nivel de autoridad requerido depende del campo del perfil de usuario que se pretenda modificar.
Mencionamos a continuación algunos casos, que consideramos los más relevantes. La lista no pretende
de ningún modo ser exhaustiva.
El atributo SPECIAL a nivel de sistema permite especificar cualquier operando, con excepción de
UAUDIT/NOUAUDIT.
Si el owner del usuario está dentro del campo de acción de un grupo en el cual el usuario tiene el
atributo SPECIAL, entonces puede especificar cualquier operando, con excepción de SPECIAL,
AUDITOR, OPERATIONS y UAUDIT/NOUAUDIT.
Si es el owner del usuario, entonces básicamente puede especificar cualquier operando, con
excepción de SPECIAL, AUDITOR, OPERATIONS y UAUDIT/NOUAUDIT. Para otorgar
CLAUTH sobre una clase debe además tener él mismo CLAUTH sobre ella.
Todo usuario puede cambiar su NAME y DFLTGRP. Naturalmente, si decide cambiar su grupo
default, debe encontrarse previamente conectado al nuevo grupo que especifique.
Para poder otorgar los atributos SPECIAL, AUDITOR y OPERATIONS a nivel de sistema se
requiere el atributo SPECIAL a nivel de sistema.
Para especificar UAUDIT/NOUAUDIT, es necesario tener el atributo AUDITOR a nivel de
sistema, o bien a nivel de un grupo que tenga al usuario dentro de su campo de acción.
Para agregar, modificar o deletear información de “segmentos no base” del usuario, se requiere el
atributo SPECIAL a nivel de sistema o bien tener suficiente autoridad en perfiles apropiados de la
clase FIELDS.
Si tiene autorización sobre el recurso IRR.PASSWORD.RESET de la clase FACILITY puede
otorgar una nueva password para cualquier usuario (ver 7.5).
Consideraciones:
No es posible borrar un usuario si existen en la base perfiles de dataset cuyo HLQ sea igual al
identificador del usuario. Los mismos deben borrarse previamente, ya que en caso contrario el
comando DELUSER falla.
En concordancia con lo anterior, también deben renombrarse (o deletearse, si no fuese necesario
conservarlos) los datasets cuyo HLQ coincida con el identificador del usuario. Esto hay que
hacerlo antes de borrar los perfiles de dataset, para evitar, por un lado, tener que manipular
archivos “no protegidos”, así como también para preservar su nivel de protección, si alguno de
ellos tuviera un perfil discreto. Esto quedará claro en el capítulo siguiente, cuando tratemos
específicamente la protección de datasets.
Si el usuario a eliminar se encuentra trabajando dentro del sistema en el momento en que se
ejecuta el comando de baja, es muy posible que pueda seguir haciéndolo normalmente hasta que
cierre su sesión. Obviamente, una vez que salga del sistema, ya no podrá ingresar nuevamente.
Si resultara imprescindible que cese de inmediato toda actividad, se puede solicitar a los
operadores del equipo que cancelen todas las sesiones que pueda tener activas.
Como dar de baja a un usuario de manera adecuada puede llevar algo de tiempo, resulta útil,
como medida inicial, revocarle su acceso al sistema ejecutando el comando:
ALTUSER userid REVOKE
De este modo, el usuario queda imposibilitado de ingresar al sistema (si ya está adentro,
corresponden las mismas consideraciones que en el punto anterior) durante el tiempo que
insuman los pasos previos a la baja. Incluso, en algunas organizaciones, se va revocando
diariamente a los usuarios a ser dados de baja, hasta que al cabo de una semana, por ejemplo, se
ejecuta un proceso que los borra efectivamente.
Autoridad requerida
Para poder deletear un usuario, quien ejecuta el comando debe cumplir con alguna de las condiciones
siguientes:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga dentro de su campo de acción al
usuario que se pretende eliminar.
Ser el owner del usuario.
Estar conectado a su grupo default con nivel de autoridad JOIN no es suficiente para poder deletear el
usuario.
Ejemplo:
LU fin7632 TSO OMVS
La salida tendría el siguiente aspecto:
CATEGORY-AUTHORIZATION
NONE SPECIFIED
SECURITY-LABEL= NONE SPECIFIED
TSO INFORMATION
-----------------------------
ACCTNUM= FINA01
PROC= IKJFIN
SIZE= 00008192
MAXSIZE= 00000000
USERDATA= 0000
COMMAND=
NO OMVS INFORMATION
Del listado precedente, se obtiene gran cantidad de información sobre el usuario FIN7632, entre la que
destacamos la siguiente:
El grupo default es el grupo FINANZAS.
El campo CREATED indica la fecha de creación del usuario, en formato juliano. En el ejemplo
expuesto, el usuario fue dado de alta el 7 de junio del año 2010 (día 158 del año 10).
El OWNER es FINADM, que en principio podría ser un grupo o un usuario. En caso de ser un
usuario, esto no significa que sea FINADM quién ejecutó el comando de alta. En ningún lugar
de la base de RACF está guardada la información sobre quién dio el alta (este dato debería
rastrearse en los registros tipo 80 del SMF, dónde se loguea información sobre los comandos de
RACF ejecutados).
PASSDATE indica la fecha en la que el usuario cambió su password por última vez. Todo
usuario puede cambiar su password en cualquier momento, si así lo desea, ya sea a través del
comando PASSWORD, o bien mediante los paneles de logon de ciertas aplicaciones (TSO o
CICS, por ejemplo). El valor 00.000 significa que el usuario tiene una password expirada. Esto
indica que aún no ha ingresado desde que el administrador se la otorgó.
PASS-INTERVAL establece la cantidad de días que la password de este usuario permanecerá
válida, contados a partir del día en que se cambió por última vez. El valor debe estar
comprendido entre 1 y 254. De todos modos, la cantidad de días pasados los cuáles el usuario es
forzado a cambiar su password surge del mínimo entre el valor del PASS-INTERVAL del
usuario y el valor global seteado en la SETROPTS. Por ejemplo, si el usuario tiene
PASS-INTERVAL=45 en su perfil, pero el valor de la SETROPTS es 30, tendrá que cambiar su
password obligatoriamente cada 30 días.
PASS-INTERVAL=N/A indica que el usuario tiene una password que nunca vence. Desde el
punto de vista de seguridad, esta es una opción poco recomendable. Es útil, sin embargo, para
usuarios que no corresponden a personas físicas (siempre y cuando se pueda tener certeza de que
nadie conoce su password). Si ambos campos PASSDATE y PASS-INTERVAL tienen el valor
N/A, entonces el usuario tiene el atributo PROTECTED, al cual nos referiremos más adelante.
ATTRIBUTES= NONE muestra que el usuario no posee ningún atributo particular a nivel de
sistema. Examinaremos posteriormente en detalle los posibles atributos que se le pueden otorgar
a un usuario.
El campo LAST-ACCESS indica fecha y hora en que el usuario ingresó al sistema por última
vez, con ciertas salvedades:
- Si al usuario se le da un RESUME, los valores del campo LAST-ACCESS son actualizados
con la fecha y hora en que se ejecutó el comando.
- Si se cambia la password del usuario, ya sea con el comando ALTUSER o PASSWORD, los
valores del campo LAST-ACCESS son actualizados con la fecha y hora en que se ejecutó el
comando.
- Si un job se ejecuta bajo la identidad del usuario, los valores del campo LAST-ACCESS son
igualmente actualizados con la fecha y hora de iniciación del job.
- Si el usuario nunca ingresó, el campo LAST-ACCESS muestra el valor UNKNOWN.
Es importante tener en cuenta estos detalles, para no interpretar erróneamente la información
brindada por el campo LAST-ACCESS.
LOGON ALLOWED (anyday anytime) significa que el usuario no tiene ninguna restricción de
día y horario para ingresar al sistema.
A continuación, en la salida del comando LU, figuran todos los grupos a los cuales el usuario está
conectado, mostrando varios parámetros que caracterizan cada conexión. El primer grupo listado es
siempre el grupo default del usuario (recordemos que todo usuario está conectado, como mínimo, a
su grupo default). Para cada uno de los grupos, la información mostrada tiene idénticos campos, que
describimos a continuación:
Un usuario es conectado a un grupo con un determinado nivel de autoridad. Este se muestra en el
campo AUTH, y sus posibles valores son: USE, CREATE, CONNECT y JOIN (enumerados en
orden jerárquico, o sea que cada uno incluye los privilegios del anterior). El valor por defecto es
USE, suficiente para la casi totalidad de los casos. Más adelante discutiremos en detalle los
alcances de cada uno de estos niveles.
CONNECT-OWNER es un campo que se mantiene por razones de compatibilidad con versiones
anteriores de RACF, pero que actualmente es totalmente irrelevante desde el punto de vista de
seguridad. El valor que asume por defecto es el usuario que conectó el usuario al grupo.
CONNECT-DATE muestra la fecha en que el usuario fue conectado al grupo.
El campo CONNECTS indica la cantidad de veces que el usuario ingresó al sistema
especificando este grupo en el momento de logon (tanto CICS como TSO permiten, por
ejemplo, especificar un grupo en la pantalla de logon). Como actualmente es muy habitual que la
opción GRPLIST esté activa en la SETROPTS (esto se analizará en detalle más adelante, en el
capítulo dedicado a la SETROPTS), no suele especificarse un grupo distinto del default en la
pantalla de logon. En virtud de ello, es frecuente que solo se incremente la cuenta del campo
CONNECTS para el grupo default del usuario, quedando el mismo en 00 para los otros grupos.
Así, en el ejemplo mostrado, el usuario FIN7632 se conectó 857 veces usando su grupo default,
de nombre FINANZAS, mientras que la cuenta para el otro grupo al que está conectado, llamado
COBROS, permanece en 00. Esto no significa, de ninguna manera, que el usuario no esté
haciendo uso de su conexión al grupo COBROS. Obtener acceso a un recurso protegido gracias
d pertenecer a un cierto grupo no incrementa el valor del campo CONNECTS para ese grupo.
Solo se incrementa el contador cuando el usuario se loguea a una aplicación especificando al
grupo como “grupo de conexión”.
El campo UACC en la conexión de un usuario a un grupo puede tomar los valores NONE,
READ, UPDATE, CONTROL o ALTER, siendo NONE el valor por defecto. Este parámetro,
que se especifica a nivel de grupo, determina el UACC de los perfiles de dataset o de recursos
generales que el usuario eventualmente defina en la base de RACF, siempre y cuando haya
iniciado la sesión especificando este grupo como “grupo de conexión”, y se cumpla que:
- El usuario no codifica explícitamente el operando UACC en la definición del perfil. En caso
contrario, este valor prevalece.
- Para perfiles de recursos generales, la clase de RACF correspondiente no debe tener
DFTUACC especificado en la CDT (Class Descriptor Table), pues de otro modo el perfil
toma por defecto ese valor.
Autoridad requerida
Todo usuario puede listar el segmento base de su propio perfil. Para listar el segmento base del perfil de
otro, debe cumplir con alguna de las condiciones siguientes:
Ser el owner del usuario.
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga dentro de su campo de acción al
usuario a listar.
Tener el atributo AUDITOR a nivel de sistema.
Tener el atributo AUDITOR a nivel de un grupo que tenga dentro de su campo de acción al
usuario a listar.
Tener acceso READ sobre el recurso IRR.LISTUSER de la clase FACILITY (ver 7.5).
Para poder listar “segmentos no base”, debe satisfacer alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener autoridad a través de perfiles apropiados en la clase FIELDS.
Autoridad requerida
Todo usuario está autorizado a modificar su propia password y el intervalo de validez de la misma (no
puede, sin embargo, usar la opción NOINTERVAL, salvo que tenga la autoridad suficiente).
Para resetear la password de otro usuario al valor de su grupo default, quien ejecuta el comando debe
cumplir con alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga al usuario dentro de su campo de
acción.
Ser el owner del usuario.
Para cambiar el intervalo de validez de la password de otro usuario, o especificar NOINTERVAL, quien
ejecuta el comando debe cumplir con alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga al usuario dentro de su campo de
acción.
Atributo SPECIAL
El atributo SPECIAL a nivel de sistema confiere al usuario la autoridad para ejecutar cualquier
comando de RACF. Por lo tanto, el atributo SPECIAL otorga un absoluto control sobre la base de
RACF, pudiendo los usuarios que lo tienen, definir, modificar y deletear cualquier perfil, así como
también modificar las opciones de configuración de RACF establecidas en la SETROPTS, con la
siguiente importante excepción:
El atributo SPECIAL no permite listar ni modificar opciones relativas a auditoría (que quedan, por lo
tanto, reservadas a los usuarios con atributo AUDITOR). Más específicamente, un usuario con atributo
SPECIAL (y sin atributo AUDITOR) no podrá listar ni modificar:
o Parámetros SAUDIT, CMDVIOL, OPERAUDIT, AUDIT CLASSES, LOGOPTIONS,
SECLABELAUDIT, SECLEVELAUDIT, APPLAUDIT de la SETROPTS.
o Atributo UAUDIT en perfiles de usuario.
o Campo GLOBALAUDIT en perfiles de dataset o de recursos generales.
Solo un usuario con atributo SPECIAL a nivel de sistema puede dar o quitar este atributo a otro usuario.
En una base de RACF recién inicializada, el usuario IBMUSER, provisto por IBM, tiene el atributo
SPECIAL. Ingresando con este usuario, debe otorgarse el atributo SPECIAL a los administradores de
RACF de la organización. A continuación, luego de verificar que los nuevos administradores pueden
trabajar normalmente, resulta muy recomendable, desde el punto de vista de seguridad, quitarle al
usuario IBMUSER el atributo SPECIAL y darle los atributos REVOKE, RESTRICTED y
PROTECTED (no es posible eliminarlo). En efecto, como el usuario IBMUSER existe en toda base de
RACF, es un blanco ideal de hackeo, razón por la cual mantenerlo inutilizable es lo más aconsejable.
El atributo SPECIAL no brinda acceso alguno a los recursos del sistema protegidos por RACF (con 2
excepciones particulares, que son el acceso a “datasets no catalogados” y “datasets no protegidos”). Sin
embargo, el usuario con atributo SPECIAL tiene la posibilidad de otorgarse a sí mismo el acceso a
cualquier perfil de la base con el máximo nivel de autoridad. Por lo tanto, indirectamente, tiene acceso
irrestricto a los recursos protegidos del sistema.
Debido al enorme poder que confiere el atributo SPECIAL a nivel de sistema, solo un muy reducido
conjunto de usuarios -encargados de la administración centralizada de RACF- deben tenerlo. No es
sencillo recomendar una cantidad óptima, ya que ello depende de la complejidad de la base (la cantidad
total de usuarios es solo uno de los aspectos a considerar) y de la organización. Sin embargo, podemos
señalar que, siempre que ello no comprometa la eficiencia de la administración, cuantos menos usuarios
con atributo SPECIAL existan, mejor. Normalmente, deberían sobrar los dedos de las manos para
contar la cantidad de usuarios con atributo SPECIAL a nivel de sistema. Es por cierto recomendable,
para su uso en una situación de emergencia, conservar bajo sobre y en lugar seguro un usuario con este
atributo.
Atributo AUDITOR
Los usuarios con atributo AUDITOR pueden listar la información completa de cualquier perfil de la
base de RACF y de la SETROPTS (incluidas aquellas opciones que no se le muestran a un usuario con
atributo SPECIAL), así como también utilizar el comando SEARCH de búsqueda y el utilitario
IRRUT100 (permite buscar y listar las ocurrencias de un usuario o grupo en la base de RACF). Pueden,
asimismo, modificar las opciones de logging para usuarios, perfiles de dataset, perfiles de recursos
generales y las opciones de auditoría globales establecidas en la SETROPTS. Fuera de las opciones
relativas a auditoría, el atributo AUDITOR no confiere autoridad para modificar ningún dato en la base
de RACF. Tampoco otorga acceso a ningún recurso protegido.
El utilitario DSMON brinda importante información para auditar el sistema. Sólo los usuarios con
atributo AUDITOR pueden utilizarlo (salvo que el programa ICHDSM00, invocado por la herramienta,
se encuentre protegido en la clase PROGRAM, en cuyo caso es necesario tener acceso al mismo).
El atributo AUDITOR debe ser otorgado criteriosamente, y únicamente a los usuarios que desempeñen
tareas globales de auditoría. Resulta aconsejable que los usuarios con atributo SPECIAL no tengan el
atributo AUDITOR, de modo de no concentrar excesivo poder en una única persona.
El atributo AUDITOR a nivel de sistema solo puede ser otorgado o quitado por un usuario con atributo
SPECIAL a nivel de sistema. Por lo tanto, con respecto a la observación anterior, si se pretende una
buena separación de funciones en la organización, debe controlarse que los usuarios administradores de
RACF que tienen el atributo SPECIAL no se otorguen a sí mismos el atributo AUDITOR. Para ello,
basta con analizar el logging de los comandos de RACF ejecutados, que se obtiene de los registros tipo
80 del SMF.
Atributo OPERATIONS
Este atributo, a diferencia de los anteriores, otorga al usuario acceso a gran cantidad de recursos
protegidos por RACF. En efecto, un usuario con atributo OPERATIONS a nivel de sistema tiene acceso
ALTER -el máximo posible- a todos los perfiles en las clases DATASET, DASDVOL, GDASDVOL,
TAPEVOL, PSFMPL, VMBATCH, VMCMD, VMMDISK, VMNODE, VMRDR (las últimas cinco
totalmente irrelevantes para z/OS, ya que se relacionan con VM), con las siguientes importantes
salvedades:
1) Si el usuario figura explícitamente en la lista de acceso del perfil con un nivel de autoridad
menor, entonces ése será su nivel de acceso. En efecto, a la hora de determinar el nivel de acceso
de un usuario sobre un perfil, la presencia del identificador del usuario en la lista de acceso es
mandatoria y toma preeminencia por sobre los eventuales grupos a los que está conectado o el
nivel de autoridad implícito dado por el atributo OPERATIONS. En un capítulo posterior
analizaremos en detalle el proceso de chequeo de autoridad de un usuario sobre un recurso que
lleva a cabo RACF.
2) Si el usuario no está en la lista de acceso del perfil, pero figuran en la misma uno o más grupos a
los cuales se encuentra conectado (asumimos que la instalación tiene la opción List of Groups
Checking Active en la SETROPTS, lo cual es la configuración habitual hoy en día), entonces su
nivel de autoridad será el más permisivo dado por sus grupos.
Ejemplo:
Supongamos que el usuario FIN5214 tiene el atributo OPERATIONS a nivel de sistema, que
está conectado únicamente a los grupos FINANZAS y CONTA, y que existe en la base un perfil
de dataset CUIL.** con la siguiente lista de acceso
FINANZAS UPDATE
CONTA READ
COBROS ALTER
En este caso, el nivel de autoridad del usuario FIN5214 sobre el perfil CUIL.** será UPDATE,
es decir el más permisivo dado por sus grupos (ya que no figura explícitamente FIN5214 en la
lista de acceso). El atributo OPERATIONS no entra en juego ya que existen en la lista de acceso
del perfil grupos a los cuales el usuario está conectado.
3) Security levels, categories y security labels también pueden limitar el acceso implícito a un
perfil dado por el atributo OPERATIONS. Sin embargo, ya mencionamos que son opciones
poco utilizadas que no analizaremos.
En virtud de las salvedades expuestas concluimos que, para un usuario con el atributo OPERATIONS,
la presencia de su identificador de usuario o de alguno de sus grupos en la lista de acceso de un perfil
(de una clase dónde actúe el atributo OPERATIONS) solo sirve para eventualmente reducir su nivel de
autoridad.
El atributo OPERATIONS a nivel de sistema solo puede ser otorgado o quitado por un usuario con
atributo SPECIAL a nivel de sistema. Se trata de un atributo que brinda gran poder de acceso, razón por
la cual debe ser otorgado con suma cautela, y en contadísimos casos. Más aún, es perfectamente posible
(e incluso recomendable) no tener usuarios con atributo OPERATIONS a nivel de sistema. Por ejemplo,
para los usuarios de administración de storage, existen mecanismos alternativos al atributo
OPERATIONS para brindarles acceso a los recursos que requieren sus funciones. En cualquier caso,
otorgar el atributo OPERATIONS no suele ser más que una solución fácil (que se paga a expensas de la
seguridad) para evitar identificar exactamente los recursos a los que precisa acceder el usuario.
Atributo CLAUTH
Este atributo, que significa Class Authority, se otorga para una (o varias) clases de RACF, y solo es
aplicable a nivel de sistema. Las clases para las cuáles es válido son la clase USER o cualquier otra
clase definida en la CDT (GROUP y DATASET quedan pues excluidas).
Básicamente, poseer el atributo CLAUTH para una determinada clase autoriza al usuario a definir
nuevos perfiles en ella (y el cualquier otra con idéntico POSIT number), teniendo en cuenta las
siguientes salvedades:
1) La opción GENERICOWNER de la SETROPTS, que veremos en el capítulo correspondiente,
puede limitar la posibilidad de crear perfiles en una clase dada por el atributo CLAUTH.
2) Tener únicamente CLAUTH en la clase USER no autoriza a dar de alta un nuevo usuario en la
base de RACF. Adicionalmente, se debe ser el owner del grupo default del usuario a definir, o
bien estar conectado al mismo con nivel de autoridad JOIN.
El atributo CLAUTH sobre una clase brinda una bastante limitada capacidad de administración sobre
sus perfiles. En efecto, si bien permite definir nuevos perfiles, no permite modificar, borrar, o listar
perfiles ya existentes (siempre y cuando estas acciones no estén posibilitadas por algún otro tipo de
autoridad). Si el usuario con el atributo CLAUTH define un nuevo perfil sin especificar owner, queda
por defecto como dueño del perfil y por lo tanto con poder de administración casi total sobre el mismo.
En cambio, si especifica un owner distinto de su usuario, ya no podrá actuar sobre él una vez creado.
CLAUTH resulta, de todos modos, útil como herramienta de descentralización de ciertas tareas de
administración de RACF, y es bastante utilizado en muchas organizaciones. Para estar autorizado a
otorgarlo sobre una determinada clase, debe cumplirse alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener CLAUTH sobre esa clase, y además estar autorizado a modificar el perfil del usuario (por
ejemplo, siendo su owner).
Atributo REVOKE
El atributo REVOKE a nivel de sistema impide al usuario el logon a cualquier aplicación (TSO, CICS,
IMS, etc.), así como también la ejecución de trabajos batch. Únicamente las Started Task pueden
arrancar con un usuario revocado, aunque es posible que experimenten inconvenientes posteriores,
dependiendo de lo que hagan.
El atributo REVOKE, a diferencia de los anteriores, no solo puede ser otorgado por un usuario con la
suficiente autoridad (atributo SPECIAL u owner del usuario), sino que también puede ser dado
automáticamente por RACF en alguna de las siguientes situaciones:
1) Si en la SETROPTS está especificado que “el usuario será revocado después de N intentos
consecutivos y fallidos de password”, entonces al (N+1) intento consecutivo de password
inválida el usuario es revocado. Naturalmente, un ingreso válido vuelve la cuenta a 0.
2) Si en la SETROPTS está especificado que “el usuario será automáticamente revocado después
de N días de inactividad”, y transcurrieron al menos (N+1) días desde su último ingreso al
sistema, el usuario será revocado por RACF en el momento del intento de logon. Cabe aclarar
que, aunque se haya excedido el tiempo de inactividad estipulado, hasta tanto el usuario no
intente loguearse al sistema no adquirirá el atributo REVOKE, ya que RACF lo otorga al
procesar la solicitud de logon.
Con respecto a las situaciones recién descriptas, merecen una consideración particular los usuarios con
atributo SPECIAL a nivel de sistema. En efecto, RACF no los revoca automáticamente, sino que emite
un mensaje por consola solicitando al operador, o bien que confirme la revocación, o bien que otorgue
un intento adicional de ingreso de password u omita la inactividad, según sea el caso. Sin este
tratamiento diferenciado, sería perfectamente posible que una persona revocara intencionalmente
(mediante ingresos consecutivos de passwords incorrectas) a todos los usuarios con atributo SPECIAL
de la organización, generando una situación delicada de la cual no es sencillo recuperarse.
Atributo GRPACC
El atributo GRPACC (Group Access) a nivel de sistema funciona del siguiente modo:
Si un usuario con GRPACC se encuentra conectado a un grupo A y define un perfil de dataset cuyo
HLQ es A (suponiendo que tenga autoridad suficiente para hacerlo), automáticamente se agregará en la
lista de acceso al grupo A con autoridad UPDATE. Se trata de un atributo poco utilizado, y para
otorgarlo o quitarlo es necesario tener el atributo SPECIAL, o bien ser el owner del perfil del usuario.
Atributo ADSP
ADSP significa Automatic Data Set Protection. Si un usuario tiene este atributo a nivel de sistema, cada
vez que cree un dataset permanente en disco (o en cartucho, si la clase TAPEVOL está activa y la
opción TAPEDSN está especificada en la SETROPTS), RACF automáticamente le definirá un perfil
discreto de dataset.
Siendo la tendencia actual la de utilizar solo perfiles de dataset genéricos, pues son más sencillos de
administrar y presentan varias ventajas sobre los discretos, el atributo ADSP ha caído francamente en
desuso. Existe la opción NOADSP a nivel de la SETROPTS que inhibe el eventual atributo ADSP que
puedan tener los usuarios.
Para otorgar o quitar el atributo ADSP es necesario, o bien tener el atributo SPECIAL, o bien ser el
owner del perfil del usuario. Para setear ADSP|NOADSP a nivel de la SETROPTS es necesario tener el
atributo SPECIAL a nivel de sistema.
Atributo RESTRICTED
Este atributo es solo aplicable a nivel de sistema. Se trata de un atributo de carácter limitativo, que
restringe casi completamente los recursos a los cuáles puede acceder el usuario. En efecto, un usuario
con el atributo RESTRICTED no puede obtener acceso a un recurso protegido por RACF ni por una
regla en la clase GLOBAL, ni por el UACC del perfil protector, ni por la presencia de “*” en las listas
de acceso. Dicho de otro modo, un usuario con atributo RESTRICTED solo puede acceder a aquellos
recursos para los cuales se encuentre explícitamente autorizado, ya sea porque su identificador de
usuario, o alguno de los grupos a los que está conectado, figura en las listas de acceso del perfil con el
nivel de autoridad requerido.
El atributo RESTRICTED es útil en situaciones dónde se requiere tener un absoluto control de los
recursos a los que debe acceder el usuario. Antes de otorgarlo, es vital realizar un detallado
relevamiento de todos los recursos a los que necesita acceder y con qué nivel de autoridad, de modo de
no provocar una interrupción en las tareas operativas.
Para otorgar o quitar el atributo RESTRICTED a un usuario, es necesario, o bien tener el atributo
SPECIAL, o bien ser el owner de su perfil.
Atributo PROTECTED
Un usuario con atributo PROTECTED (protegido) no puede loguearse a ninguna aplicación del sistema
que requiera el uso de una password. Por ejemplo, no puede iniciar sesiones de TSO, CICS, NETVIEW,
etc. Si alguien intenta loguearse con un usuario que tenga el atributo PROTECTED, RACF
directamente rechaza el pedido de logon sin considerarlo ni siquiera un intento fallido por password
inválida. Se trata de usuarios sin password que resultan inmunes a la revocación automática por
ingresos consecutivos de passwords erróneas. Sin embargo, sí están sujetos a la eventual revocación
automática por inactividad.
Básicamente, se trata de un atributo muy útil para aquellos usuarios asociados con started tasks que no
necesiten loguearse a ninguna aplicación. Para estos usuarios, el atributo PROTECTED asegura no solo
que no se puedan utilizar para ingresar a ninguna aplicación, sino que también elimina la posibilidad de
que se los revoque (voluntaria o involuntariamente) por ingresos consecutivos de passwords inválidas.
Los usuarios de las regiones CICS, por ejemplo, son excelentes candidatos para este atributo.
Se otorga a un usuario el atributo PROTECTED, ya sea en el momento de su creación (comando
ADDUSER) o con posterioridad (comando ALTUSER), especificando el operando NOPASSWORD.
Ejemplo: ALTUSER userid NOPASSWORD
Cuando un usuario tiene este atributo, los campos PASSDATE y PASS-INTERVAL de la salida del
comando LISTUSER muestran el valor N/A.
Para quitar el atributo PROTECTED, basta con darle al usuario una password, ejecutando el comando:
ALTUSER userid PASSWORD(password)
Para otorgar el atributo PROTECTED, se debe cumplir alguna de las siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga al usuario dentro de su campo de
acción.
Ser el owner del usuario.
Atributo UAUDIT
El atributo UAUDIT (User Audit) indica que RACF grabe registros tipo 80 del SMF toda vez que el
usuario efectúe alguna de las siguientes acciones:
Ejecute un comando de RACF (con excepción de los comandos LISTUSER, LISTGROUP,
LISTDSD, RLIST y SEARCH, que nunca se registran dada su baja criticidad).
Intente acceder a un recurso protegido, resulte el acceso fallido o exitoso (independientemente
de la configuración de auditoría que tenga el perfil protector del recurso), excepto en el caso en
que el acceso haya sido autorizado por una regla en la clase GLOBAL.
Defina algún nuevo recurso cuya creación esté controlada por RACF (la alocación de un nuevo
dataset, por ejemplo).
Para poder otorgar o quitar el atributo UAUDIT, se debe tener el atributo AUDITOR a nivel de sistema,
o bien a nivel de un grupo que tenga al usuario dentro de su campo de acción. El atributo SPECIAL,
incluso a nivel de sistema, no permite listar -y mucho menos dar o quitar- este atributo.
No se debe abusar del atributo UAUDIT ya que puede provocar un aumento muy considerable de la
cantidad de registros SMF grabados por RACF, con los consiguientes problemas de tipo operativo que
ello acarrea. Es conveniente otorgarlo solo cuando se requiera un monitoreo estricto de la actividad de
un determinado usuario, y por un período limitado de tiempo.
GRUPO1
Owner: GRUPOA
GRUPO2 GRUPO3
Owner: GRUPO1 Owner: GRUPO1
En el diagrama anterior, la flecha significa “tiene como subgrupo a”. Por lo tanto, se tiene que:
o GRUPO1 tiene 2 subgrupos: GRUPO2 y GRUPO3.
o GRUPO2 tiene un único subgrupo: GRUPO4.
o GRUPO3 tiene 2 subgrupos: GRUPO5 y GRUPO6.
o GRUPO4, GRUPO5 y GRUPO6 no tienen subgrupos.
Los grupos que forman parte del campo de acción del GRUPO1 son:
GRUPO1, GRUPO2, GRUPO3, GRUPO4 y GRUPO5.
GRUPO6 no forma parte del campo de acción de GRUPO1 ya que el owner no es su grupo superior,
sino el usuario USU1.
Los usuarios dentro del campo de acción de un grupo son todos aquellos cuyo owner es un grupo que se
encuentre a su vez dentro del campo de acción. No están dentro del campo de acción aquellos usuarios
cuyo owner sea otro usuario. La eventual pertenencia de un usuario a un grupo dentro del campo de
acción no implica que el usuario se encuentre dentro del campo de acción. En otras palabras, el factor
determinante para establecer si determinado usuario está o no dentro del campo de acción de un grupo
es su owner y no sus conexiones.
En cuanto a perfiles de dataset, se encuentran dentro del campo de acción del grupo aquellos que
cumplen con alguna de las siguientes condiciones:
Su owner es un grupo que está dentro del campo de acción.
Su owner es un usuario dentro del campo de acción.
Su HLQ es un usuario o grupo dentro del campo de acción.
En lo referido a perfiles de recursos generales, se encuentran dentro del campo de acción del grupo
aquellos que cumplen con alguna de las siguientes condiciones:
Su owner es un grupo que está dentro del campo de acción.
Su owner es un usuario dentro del campo de acción.
Por ejemplo, volviendo al caso del diagrama, perfiles de recursos generales cuyo owner es GRUPO5
están dentro del campo de acción de GRUPO1, mientras que aquellos cuyo owner es GRUPO6 no lo
están. Asimismo, si USU2 es un usuario cuyo owner es GRUPO2 y USU22 es un usuario cuyo owner
es USU2, entonces USU2 está dentro del campo de acción de GRUPO1, mientras que USU22 no. En
consecuencia, todo perfil de recursos generales cuyo owner sea USU2 está dentro del campo de acción
de GRUPO1, mientras que aquellos cuyo owner sea USU22 están afuera.
Comando CONNECT
Sintaxis:
CONNECT|CO userid [GROUP(nombre)] [OWNER(usuario/grupo)] [AUTHORITY(nivel)]
[REVOKE(mm/dd/aa)] [RESUME(mm/dd/aa)] [ADSP|NOADSP] [AUDITOR|NOAUDITOR]
[GRPACC|NOGRPACC] [OPERATIONS|NOOPERATIONS]
[SPECIAL|NOSPECIAL] UACC(nivel)
Como ya señalamos, este comando también se utiliza para modificar algún parámetro de una conexión
ya existente (no existe un comando exclusivo de modificación de conexión). Si la conexión ya existe, el
comando solo modifica los parámetros especificados (no se aplica ningún valor por defecto).
El userid es requerido y debe estar inmediatamente a continuación del comando CONNECT.
Si no se codifica GROUP, el comando conecta por defecto al usuario al “actual grupo de conexión” de
quién ejecuta el comando (que suele ser su grupo default). Debe tenerse cuidado con esto, ya que
muchas veces no es el efecto buscado, sino que simplemente se omite el grupo por distracción.
El OWNER de la conexión es totalmente irrelevante. Su valor por defecto es el identificador del usuario
que ejecuta el comando CONNECT.
AUTHORITY indica el nivel de autoridad del usuario como miembro del grupo, que analizaremos en
detalle más adelante en este mismo capítulo. USE es el valor por defecto.
Por defecto, no se le asigna al usuario ningún atributo a nivel del grupo.
UACC asume por defecto el valor NONE.
Autoridad requerida
Para conectar un usuario a un grupo (o modificar parámetros de una conexión ya existente) a través del
comando CONNECT, el usuario que ejecuta el comando debe cumplir alguna de las condiciones
siguientes:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de grupo, y el grupo al cual se pretende conectar al usuario
encontrarse dentro de su campo de acción.
Ser el owner del grupo.
Estar conectado al grupo con nivel de autoridad CONNECT o JOIN. En caso de tener nivel de
autoridad CONNECT, no puede conectar al usuario con nivel de autoridad JOIN (suponiendo
que no detente otro tipo de atributo que se lo permita, como SPECIAL a nivel de sistema).
Para otorgar o quitar los atributos SPECIAL, AUDITOR u OPERATIONS a “nivel del grupo”, el
usuario que ejecuta el comando debe tener el atributo SPECIAL, ya sea a nivel de sistema, o a nivel de
un grupo que tenga al grupo en cuestión dentro de su campo de acción.
Comando REMOVE
Sintaxis:
REMOVE|RE userid [GROUP(nombre)] [OWNER(usuario/grupo)]
Este comando desconecta un usuario de un grupo. No permite modificar parámetros de la conexión
(esto debe hacerse con el comando CONNECT).
El userid es requerido y debe estar inmediatamente a continuación del comando REMOVE.
GROUP indica el nombre del grupo del cual se desea desconectar al usuario. Si se omite, asume por
defecto el nombre del “actual grupo de conexión” de quien ejecuta el comando REMOVE.
Con respecto al operando OWNER, funciona del siguiente modo: supongamos que se pretende
desconectar al usuario A del grupo B.
Si A es owner de perfiles de dataset cuyo HLQ es B, RACF no permite la desconexión, salvo
que se codifique el operando OWNER a través del cual se especifica un usuario o grupo que se
convertirá en el nuevo owner de estos perfiles. Si se pone un usuario como OWNER, debe estar
conectado al grupo.
Si A no es owner de ningún perfil de dataset cuyo HLQ es B, entonces el operando OWNER es
irrelevante y puede omitirse.
Observación:
No se puede desconectar a un usuario de su grupo default. Por lo tanto, suponiendo que el usuario
USUA está conectado únicamente al grupo GRPB (que por lo tanto es su grupo default) y que se
pretende que USUA quede conectado únicamente al grupo GRPC, debería ejecutarse una secuencia de
comandos similar a la siguiente:
1. CONNECT USUA GROUP(GRPC) conecta USUA a GRPC
2. ALTUSER USUA DFLTGRP(GRPC) cambia el grupo default de USUA por GRPC
3. REMOVE USUA GROUP(GRPB) desconecta USUA de GRPB
Ya se describió detalladamente en secciones anteriores el significado de los parámetros de la conexión
(ver ejemplo del comando LISTUSER y parámetros a nivel de grupo). Sólo restan por analizar los
posibles niveles de autoridad de un usuario dentro de un grupo.
Autoridad requerida
Para desconectar un usuario de un grupo, el usuario que ejecuta el comando debe cumplir alguna de las
condiciones siguientes:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de grupo, y el grupo del cual se pretende desconectar al
usuario encontrarse dentro de su campo de acción.
Ser el owner del grupo.
Estar conectado al grupo con nivel de autoridad CONNECT o JOIN.
Nivel USE
Un usuario conectado a un grupo con nivel de autoridad USE está habilitado a:
o Ingresar al sistema especificando ese grupo como “grupo de conexión”.
o Acceder a recursos protegidos a los cuáles el grupo se encuentre autorizado.
Se trata del nivel de autoridad suficiente para la casi totalidad de los casos.
Nivel CREATE
Adicionalmente, el nivel de autoridad CREATE permite:
o Alocar nuevos datasets cuyo HLQ sea el grupo.
o Definir nuevos perfiles de dataset cuyo HLQ sea el grupo. Observemos que si queda el usuario
como owner, puede posteriormente administrarlos.
Sin embargo, salvo que se encuentre autorizado por otro motivo, el nivel de autoridad CREATE no
permite deletear datasets cuyo HLQ sea el grupo en cuestión.
Nivel CONNECT
Adicionalmente, el nivel de autoridad CONNECT permite:
o Conectar al grupo usuarios ya existentes en la base de RACF, otorgándoles nivel de autoridad
USE, CREATE o CONNECT.
Nivel JOIN
Adicionalmente, el nivel de autoridad JOIN permite:
o Si tiene el atributo CLAUTH(USER), definir nuevos usuarios dentro del grupo, con nivel de
autoridad USE, CREATE, CONNECT o JOIN.
o Conectar al grupo usuarios ya existentes en la base de RACF, con nivel de autoridad JOIN.
o Crear nuevos grupos de RACF que sean subgrupos del grupo en cuestión.
o Borrar subgrupos del grupo con el comando DELGROUP.
4 - PROTECCIÓN DE DATASETS
Datasets
En el entorno z/OS, los archivos pueden residir en disco o en cartucho, y vienen identificados por un
nombre cuya longitud máxima es de 44 caracteres. La cadena de caracteres que lo conforma se divide
en calificadores, de longitud mínima 1 y máxima 8, separados entre sí por un punto (.) (los puntos
forman parte del nombre, o sea que cuentan con respecto al máximo de 44).
El primer carácter de cada calificador debe ser alfabético (A hasta Z) o nacional (#, @, $). Los restantes
pueden ser alfabéticos, numéricos (0 a 9), nacionales o un guión (-). No se distinguen mayúsculas de
minúsculas.
No existe un límite para la cantidad de calificadores que pueda tener un dataset, más allá del que surge
obviamente de la longitud máxima permitida en el nombre. El primer calificador se abrevia HLQ (High
level Qualifier).
Ejemplos:
PROD1.FINANZAS.A2009 Nombre válido, con 3 calificadores. PROD1 es el HLQ.
BASEPERS Nombre válido, de un único calificador.
TEST1.2010 Nombre inválido, pues el segundo calificador empieza con
un número, lo que no está permitido.
Perfiles de Dataset
Los perfiles de dataset se dividen en 2 tipos:
• Discretos
• Genéricos.
Más adelante analizaremos en detalle las diferencias entre unos y otros. Por el momento digamos que,
en sus primeras versiones, los únicos perfiles de dataset que admitía RACF eran los discretos, que
protegen un único archivo. Con posterioridad, surgieron los perfiles de dataset genéricos, que resultaron
más prácticos y fáciles de administrar. A diferencia de los discretos, dónde debía existir un perfil por
cada dataset protegido, un único perfil genérico permite proteger una cantidad ilimitada de archivos de
nombres similares. La tendencia actual es a utilizar casi exclusivamente perfiles de dataset genéricos,
aunque para ciertas situaciones muy particulares los perfiles discretos continúan siendo una mejor
opción.
Los perfiles de dataset siguen las mismas convenciones para sus nombres que los archivos, con las
siguientes salvedades:
o Deben tener 2 o más calificadores.
o El HLQ debe coincidir con un usuario o grupo existente en la base de RACF. Los
denominaremos “perfil de dataset de usuario” o “perfil de dataset de grupo”, según sea el caso.
o Con excepción del HLQ, pueden utilizarse en los siguientes calificadores los caracteres
comodín: %, *, **. El doble asterisco solo puede usarse si la opción EGN (Enhanced Generic
Naming) está activa en la SETROPTS. Estos 3 símbolos también se denominan caracteres
genéricos o variables.
En todo lo que sigue, vamos a asumir que la clase DATASET está seteada como GENERIC y
GENCMD, y que la opción EGN -que habilita el uso del ** en los perfiles de dataset- está activa, lo
cual es lo habitual en todas las organizaciones. Estas opciones se establecen en la SETROPTS y se
analizarán en detalle en el capítulo correspondiente. Por otro lado, salvo que aclaremos lo contrario,
supondremos que todos los archivos residen en disco (también llamados DASD, sigla de Direct Access
Storage Device).
Asterisco (*)
Para esta variable, caben distintas posibilidades:
Si forma parte de un calificador que contiene otros caracteres, debe ser el carácter final. En tal
caso indica que en esa posición puede haber 0 o más caracteres hasta completar el calificador.
Ejemplo: TEST.FIN*
Si constituye un calificador completo, indica que en esa posición puede existir cualquier
calificador pero que debe necesariamente existir uno.
Ejemplo: TEST.*.A2002
Ejemplo:
Perfiles:
1. TEST.FINANZAS.A2002 discreto
2. TEST.FINANZAS.A2002 genérico completo
3. TEST.FINANZAS.**
4. TEST.FINAN%%%.*
5. TEST.FINAN*.*
6. TEST.*.A*
7. TEST.FINANZAS.A%
8. TEST.*.A2002.*
Los 6 primeros perfiles cubren al archivo TEST.FINANZAS.A2002, mientras que los números 7 y 8 no
lo hacen (el 7 solo contempla un único carácter luego de la “A” del último calificador, mientras que el *
final en el 8 exige la existencia de un cuarto calificador).
Por lo tanto, como muestra el ejemplo, muchos perfiles de dataset pueden cubrir al mismo archivo. Sin
embargo, a la hora de determinar la protección, RACF se guía por el principio del perfil más específico.
Esto significa que, dado un archivo, o bien RACF no lo encuentra protegido, o bien determina un único
perfil que lo protege (que puede resultar discreto o genérico), que llamamos “perfil protector”.
Para determinar el perfil protector, RACF procede del siguiente modo:
Si existe un perfil discreto para el archivo, entonces éste será su perfil protector.
Si no existe un perfil discreto, RACF busca todos los perfiles genéricos que lo cubren (si no existiera
ninguno, simplemente el archivo no estaría protegido), y procede a compararlos, de izquierda a derecha.
En el primer carácter en que encuentre alguna diferencia, se descartan aquellos más genéricos, de
acuerdo al siguiente criterio:
- Los caracteres “no genéricos” son más específicos que las variables.
- Para las variables, el orden, desde el menos al más genérico, es %, * y **.
Siguiendo este procedimiento, RACF siempre determina, a lo sumo, un único perfil protector para un
dataset. Si volvemos al ejemplo anterior, notamos que los perfiles del 1 al 6 están ordenados del más al
menos específico. En este caso, el perfil discreto actúa como perfil protector del archivo
TEST.FINANZAS.A2002
Un perfil discreto se distingue de un genérico completo de igual nombre por no presentar, cuando se lo
lista, el símbolo (G) característico de los perfiles genéricos (ver 4.10).
Consideraciones importantes:
RACF no brinda la posibilidad de proteger datasets particionados a nivel de miembros
(members). Solo se puede proteger una biblioteca de manera global, a través de un único perfil de
dataset. Por lo tanto, si un miembro particular requiriera un tratamiento diferenciado en cuanto a
su seguridad, se lo debería aislar en otra biblioteca y protegerla de manera adecuada.
En el caso de archivos VSAM, solo es necesario proteger el nombre del cluster. Los nombres de
los restantes componentes del VSAM (data e index) no intervienen en el momento de resolver
sobre una solicitud de acceso.
corresponde, o si se omite y existe más de un perfil discreto con ese nombre, el comando falla. Si no se
especificó el operando FROM, o se codificó con un perfil genérico, o con un perfil de una clase que no
sea DATASET, el operando FVOLUME es ignorado.
Los operandos UNIT y VOLUME son requeridos únicamente en el caso de perfiles discretos que
correspondan a archivos no-vsam y no catalogados. En tal caso, UNIT debe indicar el tipo de
dispositivo dónde reside el archivo mientras que VOLUME especifica el volumen. Si el perfil es
genérico, o se especificó el operando MODEL, UNIT y VOLUME son ignorados.
El operando WARNING establece que el perfil se define en modo warning. Esto significa que, si un
usuario requiere acceso a un recurso protegido por el perfil, y RACF determina que no está autorizado,
en lugar de denegar el acceso lo autoriza pero envía un mensaje a la terminal del usuario (y graba uno
similar en el SYSLOG) indicando que el acceso no correspondía pero fue otorgado por estar el perfil
protector en modo warning. En ciertas ocasiones, cuando aún no se logró determinar exactamente que
usuarios deben acceder a los archivos protegidos por un perfil, puede resultar útil definirlo en modo
warning, de modo a no provocar una interrupción en alguna tarea crítica. Sin embargo, debe tenerse
presente que aquellos recursos protegidos por un perfil en modo warning se encuentran accesibles por
cualquier usuario con el máximo nivel de autoridad, o sea que se encuentran básicamente desprotegidos.
Por lo tanto, debe usarse esta facilidad con sumo cuidado, y normalmente por un período muy corto de
tiempo.Si se omite el operando WARNING, el perfil queda definido como NOWARNING, que
llamamos modo fail. Este debe ser el modo en que se encuentren usualmente todos los perfiles de la
base.
NOTIFY especifica un usuario que será notificado cada vez que el perfil sea usado para denegar un
acceso. Hacemos notar que si el perfil es utilizado para rechazar la creación o eliminación de un
archivo, no se envía notificación alguna. Si el usuario especificado en el operando NOTIFY se
encuentra con una sesión activa de TSO, recibirá las notificaciones en tiempo real. En caso contrario las
recibirá en el momento de su próximo logon (no se pierden). Si la cantidad de notificaciones esperadas
es elevada, el usuario debe loguearse frecuentemente a TSO de modo de liberar el espacio que ocupan
sus mensajes pendientes en el archivo SYS1.BRODCAST. De todos modos, no es conveniente tener en
forma permanente un usuario en el campo NOTIFY de un perfil, si se supone que el mismo denegará
gran cantidad de accesos. NOTIFY no admite más de un usuario, ni un grupo de RACF. Si se lo
codifica sin especificar usuario, queda como usuario a ser notificado quien ejecutó el comando
ADDSD. Si se lo omite, ningún usuario será notificado, que es lo más habitual.
El operando AUDIT indica a qué nivel se pretende auditar el uso de este perfil. La información se graba
en registros tipo 80 del SMF. Se distinguen 2 conceptos diferentes, a saber: “tipo de acceso” y “nivel de
acceso”:
Los posibles tipos de acceso son los siguientes:
o NONE indica que ningún intento de acceso será grabado.
o SUCCESS indica que se grabarán accesos exitosos.
o FAILURES indica que se grabarán intentos de acceso fallidos.
o ALL indica que se grabará todo intento de acceso, sea fallido o exitoso.
Los posibles niveles de acceso son los siguientes:
o READ
o UPDATE
o CONTROL
o ALTER
En el operando AUDIT se pueden especificar uno (o más) tipos de acceso acompañados del nivel de
acceso deseado (obviamente NONE no requiere un nivel de acceso asociado). EXECUTE no es un nivel
factible de ser auditado.
FAILURES(READ) es el valor por defecto, y provoca que se registre todo intento de acceso denegado
por el perfil (intentos de acceso fallidos superiores a READ también son registrados). Debe tenerse
cuidado en no especificar un nivel de auditoría que genere un volumen grande e inútil de información.
Por ejemplo, SUCCESS(READ), en el caso de un perfil que proteja recursos muy utilizados, generaría
una enorme cantidad de registros tipo 80 de SMF que probablemente no sean necesarios en absoluto.
Más adelante veremos cómo interactúa el nivel de auditoría del perfil con los seteos globales de
auditoría que se establecen en la SETROPTS.
Ejemplos
1) AD ‘conta.balance.a2010’ DATA(‘balance del 2010’) OWNER(conta) UACC(none) -
AUDIT(SUCCESS(update) FAILURES(read))
Define un perfil discreto de dataset para el archivo de nombre CONTA.BALANCE.A2010. Tal
dataset debe estar catalogado, pues en caso contrario el comando fallaría ya que no se especificó
UNIT ni VOLSER. Se decidió auditar todo acceso fallido más los accesos exitosos de nivel
UPDATE (o superior).
2) AD ‘conta.pagos.a2010’ GENERIC DATA(‘pagos del 2010’) UACC(none) -
OWNER(jef254) NOTIFY(jef254)
Define un perfil “genérico completo” para el archivo de nombre CONTA.PAGOS.A2010, ya
que se codificó el operando GENERIC. A diferencia del caso anterior, tal archivo ni siquiera
tiene necesidad de existir en el momento de la creación del perfil. Se decidió establecer como
owner y usuario a ser notificado a JEF254.
Para poder usar el operando FROM, que permite crear un nuevo perfil de dataset basándose en uno ya
existente, RACF exige además que el usuario que ejecuta el comando satisfaga alguno de los siguientes
requisitos:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga al perfil tomado como modelo dentro
de su campo de acción.
Ser el owner del perfil tomado como modelo.
Tener un identificador de usuario que coincida con el HLQ del perfil tomado como modelo.
Si el perfil modelo es discreto, tener autoridad ALTER sobre el perfil.
Autoridad requerida
Para modificar un perfil de dataset, quien ejecuta el comando debe cumplir con alguno de los siguientes
requisitos:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga al perfil dentro de su campo de acción.
Ser el owner del perfil.
Su identificador de usuario debe coincidir con el HLQ del perfil.
Si el perfil es discreto, tener autoridad ALTER sobre el perfil.
genéricamente, en caso de que existiera alguno perfil genérico apropiado, o simplemente desprotegido
en caso contrario.
SET es el valor por defecto, y también se aplica exclusivamente a perfiles discretos. Este operando
desactiva el bit de protección del archivo, y requiere que el volumen donde reside esté en línea. Si el
archivo tuviera su bit de protección desactivado, y se especifica SET, el comando falla. En tal caso,
debería codificarse NOSET para poder borrar el perfil.
VOLUME solo es necesario para perfiles discretos, siempre y cuando existan en la base de RACF más
de un perfil discreto con el nombre en cuestión pero con distintos volúmenes asociados. En efecto, en
tal caso, VOLUME es requerido por RACF para saber cuál es exactamente el perfil discreto que debe
borrar de la base.
Autoridad requerida
Para eliminar un perfil de dataset, quien ejecuta el comando debe cumplir con alguno de los siguientes
requisitos:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga al perfil dentro de su campo de acción.
Ser el owner del perfil.
Su identificador de usuario debe coincidir con el HLQ del perfil.
Si el perfil es discreto, tener autoridad ALTER sobre el perfil.
Observación importante:
Los perfiles genéricos, al ser listados (ya sea con el comando LISTDSD o SEARCH), siempre tienen a
continuación de su nombre el símbolo (G). Por lo tanto, la ausencia de la (G) indica sin lugar a dudas
que se trata de un perfil discreto.
Ejemplo:
LD DA(‘conta.pagos.**’) ALL DSNS
Este comando lista toda la información del perfil genérico CONTA.PAGOS.**, siempre y cuando
exista. La salida tendría el siguiente aspecto:
INFORMATION FOR DATASET CONTA.PAGOS.** (G)
LEVEL OWNER UNIVERSAL ACCESS WARNING ERASE
00 CONTA NONE NO NO
AUDITING
FAILURES(READ)
NOTIFY
CON587
YOUR ACCESS CREATION GROUP DATASET TYPE
NONE ADMIN NON-VSAM
GLOBALAUDIT
NONE
INSTALLATION DATA
AREA DE CONTABILIDAD - PAGOS
SECURITY LEVEL
NO SECURITY LEVEL
CATEGORIES
NO CATEGORIES
SECLABEL
NO SECLABEL
CREATION DATE LAST REFERENCE DATE LAST CHANGE DATE
(DAY) (YEAR) (DAY) (YEAR) (DAY) (YEAR)
295 10 NOT APPLICABLE FOR GENERIC PROFILE
ALTER COUNT CONTROL COUNT UPDATE COUNT READ COUNT
NOT APPLICABLE FOR GENERIC PROFILE
ID ACCESS
CONTA ALTER
FINAN READ
FIN2514 UPDATE
ID ACCESS CLASS ENTITY NAME
NO ENTRIES IN CONDITIONAL ACCESS LIST
CATALOGUED DATA SETS AFFECTED BY PROFILE CHANGE
CONTA.PAGOS.A2007
CONTA.PAGOS.A2008
CONTA.PAGOS.A2009
CONTA.PAGOS.PROVEE
CONTA.PAGOS.PROVEE.DATA (D)
CONTA.PAGOS.PROVEE.INDEX (I)
El campo YOUR ACCESS muestra el nivel de autoridad que tiene sobre el perfil el usuario que
ejecuta el comando LISTDSD.
CREATION GROUP indica el “grupo de conexión” que tenía el usuario que definió el perfil en
el momento de la creación.
DATASET TYPE puede tomar los valores NON-VSAM, VSAM, MODEL o TAPE.
GLOBALAUDIT funciona de manera similar al campo AUDIT, pero es únicamente visible y
modificable por usuarios con el atributo AUDITOR a nivel de sistema, o a nivel de un grupo que
tenga al perfil dentro de su campo de acción.
La INSTALLATION DATA es opcional, pero es una buena costumbre usar este campo para
describir brevemente el perfil.
SECURITY-LEVEL, CATEGORIES y SECLABEL son campos relacionados con un nivel extra
de seguridad que brinda RACF y es realmente muy poco utilizado. Si la organización no usa esta
seguridad adicional, los 3 campos deben indicar que no tienen información.
CREATION DATE indica el día y el año en que se definió el perfil. En este caso, el perfil se
creó el día 295 del año 2010.
LAST REFERENCE DATE y LAST CHANGE DATE no se aplican a perfiles genéricos.
Solamente se mantienen estos campos para perfiles discretos.
ALTER COUNT, CONTROL COUNT, UPDATE COUNT y READ COUNT no se aplican a
perfiles genéricos. En el caso de perfiles discretos, solo se mantienen actualizados si está
especificado en la SETROPTS que se mantengan estadísticas para la clase DATASET.
La lista de acceso estándar del perfil tiene entradas constituidas por usuarios o grupos, con su
nivel de acceso correspondiente. En el ejemplo, existen 3 entradas en la lista de acceso estándar
(vale la misma aclaración que se hizo previamente, en el sentido en que no se puede distinguir a
priori si se trata de usuarios o grupos). Eventualmente, también puede figurar en la lista de
acceso una entrada *, que tiene un significado similar -pero no idéntico- al del UACC.
La lista de acceso condicional se encuentra vacía (no contiene ninguna entrada). No nos
ocuparemos en la presente guía de analizar la lista de acceso condicional de un perfil (no es muy
frecuente su uso, por otro lado).
Al haber especificado el operando DSNS en el comando LISTDSD, la salida incluye una lista de
los archivos catalogados que se encuentran protegidos por el perfil. En nuestro caso, existen
4datasets, uno de los cuáles es VSAM (y por eso genera 3 entradas en el listado,
correspondientes a sus distintos componentes).
Es posible que un usuario pueda ejecutar el comando del ejemplo pero que algunos campos no le sean
mostrados por carecer de la autoridad suficiente (por ejemplo, GLOBALAUDIT o listas de acceso).
Autoridad requerida
Para listar un perfil de dataset, quien ejecuta el comando debe cumplir con alguno de los siguientes
requisitos:
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de sistema.
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de un grupo que tenga al perfil
dentro de su campo de acción.
Su identificador de usuario debe coincidir con el HLQ del perfil.
Ser el owner del perfil.
Tener autoridad READ o superior sobre el perfil.
Existir una regla en la GLOBAL que coincida con el perfil y otorgue autoridad READ o
superior.
Para que se liste el campo GLOBALAUDIT se debe tener el atributo AUDITOR (ya sea a nivel de
sistema, o a nivel de grupo para un grupo que tenga al perfil dentro de su campo de acción).
Para ver las listas de acceso del perfil, quien ejecuta el comando debe satisfacer alguna de las siguientes
condiciones:
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de sistema.
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de un grupo que tenga al perfil
dentro de su campo de acción.
Su identificador de usuario debe coincidir con el HLQ del perfil.
Ser el owner del perfil.
Existir una regla en la GLOBAL que coincida con el perfil y otorgue autoridad ALTER.
Si el perfil es discreto, tener autoridad ALTER.
Ejemplos:
1) PE ‘conta.balance.a2010’ ID(conta) ACCESS(update)
Otorga UPDATE en la lista de acceso estándar del perfil discreto CONTA.BALANCE.A2002 al
grupo CONTA. Si el grupo ya figuraba, modifica su nivel a UPDATE, mientras que si no estaba,
lo incorpora con este nivel de acceso.
2) PE ‘conta.pagos.a2010.**’ FROM(‘conta.provee.a2010’) FGENERIC -
ID(jef234 jef587) ACCESS(ALTER)
Copia al perfil genérico CONTA.PAGOS.A2010.** las entradas de las listas de acceso del perfil
“genérico completo” de nombre CONTA.PROVEE.A2010. Independientemente de las entradas
que se copien, la presencia de ID y ACCESS indica que los usuario JEF234 y JEF587 serán
incorporados a la lista de acceso estándar del perfil CONTA.PAGOS.A2010.** con nivel de
autoridad ALTER.
3) PE ‘conta.a2010.**’ RESET ID(*) ACCESS(READ)
Vacía las listas de acceso (estándar y condicional) del perfil genérico CONTA.A2010.** e
incorpora en la lista estándar la entrada * con nivel de acceso READ. El orden de los operandos
no tiene importancia en este caso, pudiendo haberse especificado RESET al final (si se codifican
ambos operandos -RESET y ID-, primero se vacía la lista de acceso y luego se procesa el ID).
Autoridad requerida
Para ejecutar exitosamente el comando PERMIT sobre un perfil de dataset, el usuario debe satisfacer
alguna de las siguientes condiciones:
Tener el atributo ADSP y el HLQ del dataset coincidir con su identificador de usuario. En este
caso, se le creará automáticamente un perfil discreto.
Para crear un “dataset de grupo”, quien lo hace debe satisfacer alguna de las condiciones que se
enumeran a continuación:
El dataset quedará protegido por un perfil genérico y, se cumple alguno de los requisitos
siguientes:
- Tiene autoridad ALTER sobre tal perfil.
- Tiene autoridad ALTER a través de una regla en la GLOBAL.
- Está conectado al grupo dado por el HLQ con autoridad CREATE o superior.
Tener el atributo ADSP y el HLQ ser un grupo al cual esté conectado con autoridad CREATE o
superior. En este caso, se le creará automáticamente un perfil discreto.
Tener el atributo OPERATIONS a nivel de sistema y no cumplir simultáneamente:
- Estar conectado al grupo dado por el HLQ con nivel USE
- Tener autoridad menor que ALTER sobre el perfil genérico que lo protegerá.
Tener el atributo OPERATIONS a nivel de grupo, el HLQ del archivo ser un grupo dentro del
campo de acción y no cumplir simultáneamente:
- Estar conectado al grupo dado por el HLQ con nivel USE
- Tener autoridad menor que ALTER sobre el perfil genérico que lo protegerá.
Es importante recalcar que si se pretende que el dataset se catalogue, el usuario que lo define debe
asimismo tener autoridad UPDATE sobre el catálogo correspondiente (USERCAT o MASTERCAT,
dependiendo de la existencia o no del ALIAS apropiado).
Cantidad de veces que RACF verificó la identidad del usuario para cada grupo a los que se
encuentra conectado (campo CONNECTS en la salida del comando LISTUSER).
Recordemos que los campos LAST-CONNECT y CONNECTS solo se actualizan para el grupo default,
salvo que se especifique uno distinto en la pantalla de logon de la aplicación –si lo permitiera-.
Varias otras opciones de la SETROPTS solo funcionan si INITSTATS está vigente (INACTIVE,
REVOKE, HISTORY, WARNING). Es absolutamente recomendable tener la opción INITSTATS, que
por otro lado es la que viene por defecto en una base recién inicializada.
NOINITSTATS establece que RACF no guardará la información detallada previamente.
SAUDIT, que significa special audit, indica que para todos los usuarios con atributo SPECIAL (tanto a
nivel de sistema como a nivel de grupo) se grabarán registros tipo 80 de SMF cada vez que ejecuten
exitosamente comandos de RACF (con excepción de los comandos LISTUSER, LISTGROUP,
LISTDSD, RLIST y SEARCH, que nunca se registran ya que no se consideran críticos pues no realizan
ninguna modificación).
SAUDIT es la opción en efecto en una base recién inicializada. Como los usuarios con atributo
SPECIAL tienen un enorme poder dentro de la organización, y deben ser pocos, resulta aconsejable
monitorear detalladamente su actividad, por lo cual aconsejamos especificar SAUDIT.
- Si ni USUA ni ninguno de los grupos a los que está conectado figura en la lista de acceso de
PROD.** (ni existe una regla en la GLOBAL que posibilite el acceso), entonces el acceso
resultará exitoso debido a la autoridad ALTER que otorga implícitamente el atributo
OPERATIONS sobre el perfil PROD.**. Por lo tanto, el parámetro OPERAUDIT provocará la
grabación de un registro de auditoría reflejando el evento.
NOOPERAUDIT es la opción en efecto en una base recién inicializada. Como ya hemos señalado, no
es aconsejable tener en la base usuarios con el atributo OPERATIONS. Sin embargo, si la organización
decide lo contrario, debe tenerse en cuenta que un usuario con este atributo y una intensa actividad (por
ejemplo, el usuario asociado al DFHSM), puede generar un volumen enorme de registros de SMF. En
tal caso, NOOPERAUDIT sería lo más apropiado. En cambio, si existen pocos usuarios con el atributo
OPERATIONS y su actividad es reducida, monitorearlos a través de la opción OPERAUDIT puede ser
una buena idea.
información). También grabarán registros las solicitudes de DEFINE para esa clase (por ejemplo, si está
la clase DATASET bajo AUDIT, toda alocación de un nuevo archivo).
Para los usuarios con atributo SPECIAL, el ya mencionado parámetro SAUDIT provoca la generación
de registros de SMF toda vez que ejecutan comandos de RACF. Si la clase a la que pertenece el perfil
afectado está bajo AUDIT, no se generarán dos registros distintos por el mismo evento, sino que se
grabará un único registro. No debe pues temerse la redundancia que pueden presentar los parámetros
SAUDIT, OPERAUDIT y AUDIT usados conjuntamente, ya que no aumentan la cantidad de registros
de grabados.
Los operandos AUDIT y NOAUDIT afectan no solo a la clase especificada sino también a todas
aquellas otras que eventualmente compartan el mismo posit value.
Recomendamos tener bajo AUDIT a todas las clases de RACF. Recordemos que, si una determinada
clase no se encuentra activa, RACF no la utiliza para controlar accesos a recursos, pero ello no significa
de ninguna manera que no se puedan definir, modificar o borrar perfiles. Por lo tanto, con el objeto de
monitorear toda modificación sobre la base de RACF, es conveniente auditar todas las clases, lo cual se
logra de manera sencilla ejecutando el comando:
SETROPTS AUDIT(*)
La única excepción que creemos debería valorarse es el caso de las clases relacionadas con auditoría de
actividad en z/OS USS (Unix System Services), pues pueden generar un gran volumen de registros de
poca utilidad (Ej: FSOBJ, IPCOBJ y PROCESS). Para ellas, luego de ejecutado el comando anterior,
puede sacárselas de la categoría AUDIT mediante el comando “SETROPTS NOAUDIT(clase)”.
En una base de RACF recién inicializada, está en efecto la opción NOAUDIT(*), lo cual significa que
ninguna clase está bajo AUDIT. Esto debería modificarse antes de empezar a utilizar el sistema para
tareas productivas.
acceso. Siempre que sea posible utilizarlos, los perfiles genéricos facilitan la administración. Por lo
tanto, se aconseja especificar GENERIC para todas las clases activas que admitan perfiles genéricos.
Los operandos GENLIST y NOGENLIST afectan no solo a la clase especificada, sino también a todas
las otras que tengan el mismo posit value y sean pasibles de ser GENLISTeadas.
En una base de RACF recién inicializada, está en efecto la opción NOGENLIST(*), es decir que
ninguna clase se encuentra bajo GENLIST.
Los operandos RACLIST y NORACLIST afectan no solo a la clase especificada, sino también a todas
las otras que eventualmente compartan el mismo posit value (y sean pasibles de ser RACLISTeadas).
Las siguientes clases provistas por IBM, en caso de estar activas, deben obligatoriamente estar
RACLISTeadas:
Adicionalmente, IBM recomienda RACLISTear las siguientes clases, suponiendo que estén activas:
En cuanto al resto de las clases activas y factibles de ser RACLISTeadas, el hacerlo o no es una
decisión que debe tomar cada organización. Si se trata de una clase con muy poca actividad, no se gana
demasiado RACLISTeándola (aunque tampoco resultaría perjudicial hacerlo, de no ser por la necesidad
de refrescar los perfiles cada vez que se efectúa alguna modificación). En cambio, si se trata de una
clase con perfiles utilizados con relativa frecuencia, resulta sin duda conveniente RACLISTearla.
En una base de RACF recién inicializada ninguna clase está RACLISTeada. Esta configuración inicial
debe cambiarse de acuerdo a lo señalado en el párrafo anterior.
ponerlas bajo AUDIT, y en otros mediante LOGOPTIONS). Por ejemplo, la clase FSSEC permite
auditar las modificaciones sobre los permisos de archivos y directorios del z/OS USS. Especificar
LOGOPTIONS(ALLWAYS) para FSSEC podría ser, por lo tanto, una opción a considerar.
protegidos para los cuales ni la GLOBAL ni el UACC del perfil protector son suficientes para otorgar el
acceso solicitado.
EARLYVERIFY hace referencia a un control de usuario, password y grupo que efectúa JES invocando
a la SAF en caso de no recibir información propagada. Con las versiones actuales de JES esto se realiza
siempre, independientemente de la codificación de este parámetro en la SETROPTS. Por lo tanto,
EARLYVERIFY|NOEARLYVERIFY se ha convertido en una opción irrelevante.
XBMALLRACF es idéntico a BATCHALLRACF pero para jobs que se ejecutan bajo el Execution
Batch Monitor.
La opción NJEUSERID define el usuario que se asignará a los jobs o sysouts que reciba el sistema y no
tengan RTOKEN u UTOKEN. El valor por defecto en una base recién inicializada es ????????, el cual
sugerimos conservar. En cualquier caso, si se desea cambiarlo, el usuario que se especifique no debe
existir en la base de RACF.
La opción UNDEFINEDUSER establece el usuario que se asignará a los jobs locales que ingresen al
sistema sin un usuario asociado. El valor por defecto en una base recién inicializada es ++++++++, el
cual sugerimos conservar. En cualquier caso, si se desea cambiarlo, el usuario que se especifique no
debe existir en la base de RACF.
En una base recién inicializada, se encuentran en efecto las opciones NOBATCHALLRACF,
NOEARLYVERIFY y NOXBMALLRACF. Recomendamos activar los 3 tipos de control (aunque en el
caso de EARLYVERIFY, es actualmente irrelevante). En el listado de la SETROPTS, las leyendas:
JES-BATCHALLRACF OPTION IS ACTIVE
JES-XBMALLRACF OPTION IS ACTIVE
JES-EARLYVERIFY OPTION IS ACTIVE
USER-ID FOR JES NJEUSERID IS : ????????
USER-ID FOR JES UNDEFINEDUSER IS : ++++++++
indican que los 3 tipos de control se encuentran activos y que se mantuvo el valor default para ambos
usuarios.
5.24 - Protect-all
Sintaxis:
SETROPTS|SETR PROTECTALL(FAILURES|WARNING)|NOPROTECTALL
Autoridad requerida: SPECIAL a nivel de sistema
Opción sugerida: PROTECTALL(FAILURES)
Se trata de una opción sumamente importante, que establece cómo se comportará RACF cuando se
pretenda definir o acceder a archivos no protegidos por ningún perfil de dataset. Este parámetro solo
afecta a la clase DATASET. Existen 3 seteos posibles, que describimos a continuación:
PROTECTALL en FAILURES indica que RACF no permitirá definir ni acceder a archivos que no se
encuentre protegidos por algún perfil de dataset (los archivos temporarios generados por el sistema
quedan exceptuados). Con esta configuración, los datasets “no protegidos” resultan inaccesibles, salvo
en alguna de las situaciones siguientes:
El usuario tiene el atributo SPECIAL a nivel de sistema. En este caso, si bien se autoriza el
acceso, se envía un mensaje al usuario informando que el archivo se encuentra desprotegido. El
usuario no puede, sin embargo, definir archivos desprotegidos.
El acceso lo solicita una started task que está marcada como TRUSTED o PRIVILEGED. En
este caso, se autoriza el acceso pero no se envía ningún mensaje informativo.
Existe una entrada en la GLOBAL que autoriza el acceso.
PROTECTALL en WARNING funciona de manera similar al modo FAILURES, pero con una
diferencia fundamental. RACF, en lugar de rechazar el pedido, lo autoriza y remite, tanto al usuario
como al SYSLOG, un mensaje informando que archivo no se encuentra protegido.
Se debe ser cuidadoso, ya que mientras RACF tiene PROTECTALL en modo WARNING, los archivos
“no protegidos” pueden ser accedidos por cualquier usuario con el máximo nivel de autoridad. Sin
embargo, esta opción resulta sumamente útil en las etapas iniciales de la construcción de la base de
RACF, pues permite identificar e ir protegiendo paulatinamente los archivos en uso que se encuentran
desprotegidos, sin causar interrupciones en las tareas. Luego de un tiempo prudencial, pasado el cual se
estima que ya se han identificado todos los archivos en uso, se debe cambiar al modo FAILURES.
NOPROTECTALL implica que cualquier usuario puede acceder a archivos “no protegidos” con el
máximo nivel de autoridad, así como también definir nuevos archivos desprotegidos. A diferencia del
modo WARNING, ningún mensaje de alerta es generado. Esta opción es totalmente desaconsejada para
un entorno productivo.
En nuestro ejemplo, la leyenda:
PROTECT-ALL IS ACTIVE, CURRENT OPTIONS:
PROTECT-ALL FAIL OPTION IS IN EFFECT
indica que está activa la opción PROTECTALL en modo FAILURES.
En una base recién inicializada, se encuentra vigente la opción NOPROTECTALL. Se recomienda la
opción PROTECTALL en modo FAILURES, que robustece notablemente la seguridad del sistema.
El período de retención, solo aplicable a datasets en cartucho, determina la cantidad de días en que la
protección permanecerá vigente, contados desde el día de creación del archivo. El valor establecido en
la SETROPTS se aplicará por defecto, siempre que no se establezca un valor específico para el archivo.
Se puede codificar cualquier valor comprendido entre 0 y 65533, o el valor reservado 99999 que indica
que la protección nunca expira.
El RETPD especificado en la SETROPTS solo actúa si se encuentra activa la opción TAPEDSN. En
caso contrario, resulta irrelevante. Si se activa TAPEDSN, y no se especifica un RETPD, el valor por
defecto es 0.
NOERASE indica que en ningún caso se procederá al borrado físico de los archivos,
independientemente del valor del campo ERASE del perfil protector. NOERASE es el valor que se
encuentra vigente en una base de RACF recién inicializada.
MODEL(NOGROUP) indica que no se aplicarán modelos para “perfiles de dataset de grupo”, aún
cuando el perfil del grupo correspondiente tenga un perfil modelo especificado.
MODEL(USER) indica que cada vez que se defina un “perfil de dataset de usuario”, RACF examinará
el perfil del usuario para ver si tiene especificado un perfil modelo. En tal caso, el nuevo perfil de
dataset será creado en base al modelo existente.
MODEL(NOUSER) indica que no se aplicarán modelos para “perfiles de dataset de usuario”, aún
cuando el perfil del usuario correspondiente tenga un perfil modelo especificado.
En nuestro ejemplo, establecimos que únicamente se aplique la modelización para “perfiles de dataset
de usuario”, tal cual indica la leyenda siguiente:
DATA SET MODELLING NOT BEING DONE FOR GDGS.
USER DATA SET MODELLING IS BEING DONE.
GROUP DATA SET MODELLING NOT BEING DONE.
NOMODEL establece que no se aplicará modelización de perfiles de dataset en ninguno de los 3 casos
(GDG, GROUP y USER). Esta es la opción en efecto en una base recién inicializada.
La password de un usuario se almacena en su perfil, no en texto claro sino encriptado. Este campo no es
visible en la salida del comando LISTUSER. Tampoco está presente en la bajada plana de la base que se
obtiene a través del utilitario IRRDBU00. Sin embargo, debe destacarse que RACF no encripta la
password propiamente dicha. El valor guardado es el resultado de encriptar, vía DES (Data Encryption
Standard), el identificador de usuario, usando como clave de encriptación su password. En el momento
de autenticación, RACF reencripta el usuario con la password recibida, y si el valor resultante coincide
con el almacenado la autenticación es exitosa. Este mecanismo tiene una consecuencia interesante: 2
usuarios con idéntica password tendrán distintos valores guardados en la base de RACF. Por lo tanto,
crackear la password de un usuario no significa que se haya igualmente crackeado a otros que puedan
eventualmente tener su misma password.
Vamos a describir a continuación en detalle el significado de cada uno de los suboperandos del
operando PASSWORD.
Historial
HISTORY establece la cantidad de passwords previas del usuario que se almacenan en la base con el
objeto de que no las pueda reusar. Esto es -suponiendo que se tenga esta opción en 15, como en nuestro
ejemplo-, un usuario, al cambiar su password (ya sea voluntariamente, o porque RACF se lo exige), no
podrá especificar, ni la actual, ni ninguna de las últimas 15 que haya utilizado. El valor del operando
HISTORY debe estar comprendido entre 1 y 32.
Por una cuestión de seguridad, es importante utilizar esta opción con el objeto de evitar que los usuarios
mantengan siempre una misma password. Sugerimos un valor relativamente alto. Muchas
organizaciones usan incluso 32 (el valor máximo).
En nuestro ejemplo el HISTORY se fijó en 15, como se desprende de la siguiente leyenda del listado de
la SETROPTS:
15 GENERATIONS OF PREVIOUS PASSWORDS BEING MAINTAINED.
De todos modos, para que este control no sea fácilmente burlado, es importante establecer asimismo un
valor apropiado para el operando MINCHANGE, que analizamos más adelante. En caso contrario,
RACF no impedirá que un usuario, al verse forzado a cambiar su password, lo haga intencionalmente en
forma consecutiva tantas veces como sea necesario para poder volver a usar su favorita. Por ejemplo, si
se guardan 15 en el historial, basta con que el usuario cambie su password 17 veces para poder volver a
especificar la actual.
Es importante hacer notar la siguiente sutileza. Supongamos que se tiene HISTORY en 15, y se decide
reducir el valor a 10. En tal caso, las passwords almacenadas entre la 11 y la 15 seguirán utilizándose en
la comparación con la nueva, aún cuando el HISTORY se encuentre en 10. Por lo tanto, como nunca
serán descartadas, quedarán eternamente prohibidas para el usuario. Existen, de todos modos,
herramientas desarrolladas para limpiar esta historia residual. Una de ellas es el utilitario CUTPWHIS,
que si bien no está oficialmente soportado por IBM, puede descargarse de su página y funciona
correctamente.
Una password “no expirada” otorgada por un usuario con capacidad administrativa mediante el
comando ALTUSER no está sujeta al chequeo contra el historial.
NOHISTORY establece que la nueva password solo será comparada con la actual. El usuario puede
entonces especificar cualquier password con la única condición de que sea diferente de la vigente. Por
lo tanto, con esta opción en efecto, un usuario podría alternar permanentemente entre 2 passwords.
NOHISTORY es la opción en efecto en una base recién inicializada. Como ya señalamos, esto no es
satisfactorio desde el punto de vista de seguridad. En nuestro ejemplo, seteamos el valor en 15, como se
observa en la siguiente leyenda del listado de la SETROPTS:
15 GENERATIONS OF PREVIOUS PASSWORDS BEING MAINTAINED.
Validez máxima
INTERVAL establece la cantidad máxima de días en que la password del usuario permanecerá válida.
Superada esa cantidad, RACF fuerza al usuario a cambiarla. El valor especificado globalmente en la
SETROPTS, de mínimo 1 y máximo 254, en realidad fija un límite superior. En efecto, para cada
usuario, el intervalo pasado el cual estará obligado a cambiar su password surge del mínimo entre el
INTERVAL de su perfil y el INTERVAL a nivel de la SETROPTS (salvo que el usuario tenga
NOINTERVAL especificado en su perfil, en cuyo caso su password nunca vencerá,
independientemente del INTERVAL de la SETROPTS). Cada vez que un usuario se loguea al sistema,
RACF compara la fecha actual con la fecha del campo PASSDATE del perfil. Si la diferencia entre
ambas excede el mínimo anteriormente mencionado, se obliga al usuario a cambiar su password.
El valor por defecto en una base recién inicializada es 30, que consideramos razonable y coincide con el
fijado en nuestro ejemplo, como se sigue de la siguiente leyenda del listado de la SETROPTS:
PASSWORD CHANGE INTERVAL IS 30 DAYS.
Validez mínima
MINCHANGE establece el tiempo de vida mínimo, medido en días, que debe regir la password. El
usuario no podrá cambiarla hasta tanto hayan transcurrido, como mínimo y contados desde la fecha del
último cambio (almacenada en el campo PASSDATE del perfil), la cantidad de días especificados. El
valor debe estar comprendido entre 0 y 254. 0 indica que los usuarios podrán cambiar su password
tantas veces como quieran, sin restricción alguna. Como ya señalamos, no se trata de un seteo
recomendable pues permite burlar el control dado por el historial. Consideramos que 1 es un valor
razonable, pues evita el reciclaje de password a la vez que permite al usuario cambiarla con la
frecuencia que estime apropiada. Recordemos que un usuario debería cambiar inmediatamente su
password si supone que está en conocimiento de un tercero, razón por la cual un valor alto del
MINCHANGE sería contraproducente.
Es importante observar que la restricción fijada por el parámetro MINCHANGE no aplica para usuarios
con capacidad administrativa que cambian la password de otro mediante el comando ALTUSER. Por
ejemplo, aún cuando el MINCHANGE esté seteado en 1, un usuario con atributo SPECIAL a nivel de
sistema podrá cambiar la password de cualquier otro tantas veces al día como considere necesario.
El valor por defecto en una base recién inicializada es 0, que consideramos inapropiado. En nuestro
ejemplo lo establecimos en 1, como muestra la siguiente leyenda del listado de la SETROPTS:
PASSWORD MINIMUM CHANGE INTERVAL IS 1 DAYS.
Passwords sensitivas
Desde el z/OS 1.7, RACF soporta la posibilidad de distinguir entre mayúsculas y minúsculas en los
caracteres de una password. Esta opción, de implementarse, amplía enormemente el universo de
posibles passwords, tornando un intento de crackeo por fuerza bruta prácticamente inviable. En
cualquier caso, es de suma importancia proteger adecuadamente las bases activas de RACF (primaria y
backup) y todos sus resguardos –tanto en disco como en cartucho– de modo que estos intentos de
cracking ni siquiera puedan ocurrir.
MIXEDCASE indica que RACF efectivamente distinguirá entre mayúsculas y minúsculas. Es
fundamental comprender que el soporte de passwords sensitivas tiene dos puntas, por un lado la
aplicación dónde se loguea el usuario (CICS, TSO, FTP, etc.) y por otro RACF. No alcanza con que se
habilite en RACF esta opción si la aplicación no la soporta (por ejemplo, convirtiendo a mayúsculas la
password antes de presentársela a RACF). En la actualidad, todas las aplicaciones de IBM para z/OS
soportan passwords sensitivas, pero es posible que la organización use algún aplicativo propio, o de un
tercero, que no lo haga. En tal caso, hay que proceder muy cuidadosamente antes de setear
MIXEDCASE, evaluando detenidamente el impacto que puede ocasionar sobre la correspondiente
aplicación.
NOMIXEDCASE establece que RACF no distinguirá entre mayúsculas y minúsculas.
Independientemente de cómo reciba la password, RACF la convertirá a mayúsculas antes de verificarla.
Con esta opción se logra un comportamiento análogo al existente antes del z/OS 1.7, y es la que está en
efecto en una base recién inicializada.
Advertencia:
Una vez que se habilita la opción MIXEDCASE, la vuelta atrás es problemática y debe evitarse. Si esto
sucediera, aquellos usuarios cuya password contenga algún carácter en minúscula no podrán loguearse.
En efecto, al tener por un lado RACF almacenada la versión con minúsculas y por otro convertir a
mayúsculas la password recibida antes de proceder a su verificación – producto del seteo
NOMIXEDCASE -, ésta siempre resultará fallida. La única salida, en esta situación, es que el usuario
solicite a un administrador una nueva password.
En nuestro ejemplo está habilitada la opción MIXEDCASE, tal como se observa en la siguiente leyenda
del listado de la SETROPTS:
MIXED CASE PASSWORD SUPPORT IS IN EFFECT.
El valor especificado debe hallarse comprendido entre 1 y 255. Recomendamos un valor bajo, para
desalentar intentos maliciosos de adivinar la password de otro usuario. Sin embargo, un valor muy bajo
(1 o 2, por ejemplo), ocasiona problemas operativos, ya que es frecuente que un usuario tipee
involuntariamente mal su password. En nuestra opinión, 5 resulta un valor razonable, vigente en nuestro
ejemplo, como indica la leyenda:
AFTER 5 CONSECUTIVE UNSUCCESSFUL PASSWORD ATTEMPTS,
A USERID WILL BE REVOKED.
NOREVOKE indica que RACF no revocará automáticamente a los usuarios por intentos consecutivos
de ingreso con passwords incorrectas (o sea, no hay límite para la cantidad de intentos). Esta es la
opción en efecto en una base recién inicializada. Resulta, sin embargo, inadmisible desde el punto de
vista de la seguridad.
Reglas sintácticas
Con el suboperando RULE se establecen las reglas sintácticas que deben cumplir las passwords. Se
puede especificar hasta un máximo de 8 reglas, que se denominan RULEx, dónde x varía de 1 a 8. Una
password resulta sintácticamente admisible si cumple con alguna de las reglas establecidas. Para cada
regla debe definirse la longitud (mínima y máxima) y el tipo de caracteres permitidos en cada posición.
Los posibles tipos de caracteres son:
Los tipos c, m y v, que involucran caracteres alfabéticos en minúsculas, solo deben usarse si la opción
MIXEDNUM está en efecto.
La longitud admisible de la password para cada regla se establece a través del parámetro
LENGHT(min:max), dónde min indica la longitud mínima y max la máxima (max puede ser a lo sumo
igual a 8). Naturalmente, min debe ser menor o igual a max. Si se omite max, se asume max=min por lo
que la regla impone una longitud exacta.
Asimismo, para cada regla, se establece qué tipo de carácter es admisible en cada posición. La sintaxis
quedará clara a través del siguiente ejemplo:
RULE1(LENGTH(6:8) CONSONANT(1) ALPHANUM(2:6) NOVOWEL(8)
Esta regla establece que la password debe: tener una longitud mínima de 6 y máxima de 8; empezar con
una consonante; tener caracteres alfanuméricos de la posición 2 a la 6 inclusive, y un carácter “no
vocal” en la última posición. En la posición 7, no existiendo ninguna exigencia explícita, cualquier
carácter alfanumérico es aceptado. Por ejemplo, la password T4RUJY4@ cumple con la regla
establecida. Por el contrario, YHGTRF8 no la satisface, ya que entre las posiciones 2 y 6 no hay ningún
carácter numérico y ALPHANUM(2:6) exige que haya por lo menos un carácter alfabético y uno
numérico en el rango.
De todos modos, no recomendamos complicarse fijando reglas sofisticadas que seguramente serán
frecuentemente olvidadas por lo usuarios. Es conveniente, en la medida de lo posible, habilitar la opción
MIXEDCASE. En caso de no poner en práctica esta opción, la única regla establecida en nuestra
SETROPTS de ejemplo suele ser satisfactoria desde el punto de vista de seguridad.
INSTALLATION PASSWORD SYNTAX RULES:
RULE 1 LENGTH(6:8) LLLLLLLL
Observaciones:
Cuando se otorga una password expirada (lo cual sucede siempre que un administrador la otorga,
salvo que especifique explícitamente lo contrario), la misma no tiene necesidad de satisfacer las
reglas sintácticas. En cambio, si se otorga una clave no expirada, entonces debe cumplir con las
reglas globales de la organización fijadas en la SETROPTS.
Los eventuales cambio en las reglas para passwords de la SETROPTS toman efecto
inmediatamente. Sin embargo, esto no significa que un usuario cuya password vigente no
cumple con las nuevas reglas esté forzado a cambiarla de inmediato. Solo cuando cambie
voluntariamente su password, o sea forzado por RACF a hacerlo por haberse excedido el tiempo
de validez, deberá establecer una nueva que cumpla con las reglas actuales.
En una base recién inicializada no hay ninguna regla establecida. Como ya indicáramos, una única regla
estableciendo passwords de 6 a 8 caracteres alfanuméricos es una opción simple y por lo general
satisfactoria.
Warning
Existe la posibilidad de informar con determinada anticipación a un usuario de TSO (en el momento del
logon), o en el log del job en el caso de un trabajo batch, que su password está próxima a vencer y
tendrá que cambiarla. La cantidad de días antes del vencimiento en que el usuario recibirá los mensajes
se establece con el parámetro WARNING. El valor especificado debe estar comprendido entre 1 y 255.
En la práctica, no resulta una opción de gran utilidad. De todos modos, ya que está disponible,
recomendamos usarla. No debe fijarse un valor superior al especificado en INTERVAL, ya que ello
provocaría mensajes de advertencia al inicio de cada sesión, lo cual sería sumamente molesto. Un valor
de 5 días resulta razonable, como tenemos en nuestro ejemplo, tal cual indica la siguiente leyenda:
PASSWORD EXPIRATION WARNING LEVEL IS 5 DAYS.
NOWARNING, que es la opción por defecto en una base recién inicializada, indica que no se avisará
anticipadamente a los usuarios sobre el vencimiento de su password.
5.35 - Restricción para la creación de perfiles más específicos que perfiles existentes
Sintaxis:
SETROPTS|SETR GENERICOWNER|NOGENERICOWNER
Autoridad requerida: SPECIAL a nivel de sistema
Opción sugerida: depende de la organización
GENERICOWNER limita la posibilidad de crear perfiles más específicos que otros ya existentes, en
cualquier clase de recursos generales, con excepción de la clase PROGRAM.
Si la opción GENERICOWNER está en efecto, un usuario solo puede crear un perfil más específico que
uno existente si, además de tener autoridad para definir perfiles en la clase (ver atributo CLAUTH),
cumple alguna de las siguientes condiciones:
Tiene el atributo SPECIAL a nivel de sistema.
Es el owner del perfil inmediatamente superior.
Tiene el atributo SPECIAL a nivel de un grupo que tenga al perfil inmediatamente superior
dentro de su campo de acción.
GENERICOWNER solo limita la creación de perfiles cuando existe un perfil menos específico que el
que se pretende definir. Tengamos presente que esta opción tampoco limita la creación de una
protección más específica a través de un perfil en una clase agrupadora, suponiendo que la clase en
cuestión la tenga.
A modo de ejemplo, supongamos la siguiente situación:
o El usuario JEF2574 tiene el atributo CLAUTH(OPERCMDS) y no tiene el atributo SPECIAL,
ni a nivel de sistema ni a “nivel de ningún grupo”.
o OPERA es un grupo de RACF.
o Los perfiles existentes en la clase OPERCMDS, con sus respectivos owner, están dados por la
siguiente tabla:
Perfil Owner
MVS.** OPERA
MVS.START.** JEF2574
JES2.** JEF2574
5.41 - Lenguaje
Sintaxis:
SETROPTS|SETR LANGUAJE([PRIMARY(lenguaje)] [SECONDARY(lenguaje)])
Autoridad requerida: SPECIAL a nivel de sistema
Opción sugerida: ENU para ambos
A nivel de la SETROPTS, pueden establecerse los lenguajes globales que usará el sistema (uno
primario y otro secundario, que pueden coincidir o ser diferentes). Naturalmente, solo pueden
especificarse lenguajes que estén disponibles en la instalación, para lo cual debe consultarse a los
responsables del sistema operativo.
El valor por defecto para ambos lenguajes, en una base recién inicializada, viene identificado por la
sigla ENU, que significa inglés americano. Esta es la opción vigente en nuestro ejemplo, tal cual
muestra la leyenda:
PRIMARY LANGUAGE DEFAULT : ENU
SECONDARY LANGUAGE DEFAULT : ENU
Clases RACLISTeadas
Una clase puede estar RACLISTeada mediante alguna de las siguientes maneras:
• A través del comando “SETROPTS RACLIST(clase)”, en cuyo caso aparece bajo RACLIST en
el listado de la SETROPTS.
• Por una aplicación, en cuyo caso aparece bajo “GLOBAL=YES RACLIST ONLY” en el listado
de la SETROPTS.
En ambos casos, RACF carga en un data space en memoria la información de todos los perfiles
(discretos y genéricos) de la clase. La información de este data space es consultada toda vez que una
aplicación requiera que RACF resuelva una solicitud de acceso que involucre a esta clase.
Si la clase RACLISTeada tiene una clase agrupadora, RACF realiza una operación de merge cuando
carga en memoria los perfiles, con el objeto de combinar adecuadamente la información de ambas
clases –la de miembros y la agrupadora–. En estos casos, por lo tanto, la información en el data space
es una versión procesada de los perfiles existentes en la base.
Toda modificación que se efectúe sobre perfiles (discretos o genéricos) de una clase RACLISTeada, o
sobre aquellos de su eventual clase agrupadora, solo tomarán efecto una vez que se haya refrescado la
información del data space, para lo cual es necesario ejecutar el comando:
SETROPTS RACLIST(clase) REFRESH
La clase especificada no debe ser una clase agrupadora. Si se modificó información de perfiles de una
clase agrupadora (y la clase de miembros asociada se encuentra RACLISTeada), el comando de
REFRESH debe ejecutarse siempre sobre la clase de miembros.
Este comando genera un nuevo data space. Hasta tanto concluya su creación, las aplicaciones seguirán
usando la información del antiguo. Una vez que el comando se complete exitosamente, las distintas
aplicaciones empezarán inmediatamente a apuntar al nuevo data space, y el antiguo es borrado.
Es importante destacar que no solo se refresca la información de los perfiles de la clase especificada,
sino también de todas aquellas otras clases que eventualmente compartan el mismo posit value.
Autoridad requerida
Para ejecutar el comando anterior sobre una determinada clase, el usuario debe satisfacer alguna de las
siguientes condiciones:
Tener el atributo SPECIAL a nivel de sistema
Tener el atributo AUDITOR a nivel de sistema
Tener CLAUTH sobre la clase
Autoridad requerida
Para poder ejecutar el comando anterior sobre una determinada clase, el usuario debe satisfacer alguna
de las siguientes condiciones:
Observación:
Para una clase no GENLISTeada, el comando “SETROPTS GENERIC(clase) REFRESH” se ejecuta
casi instantáneamente. Esto se debe a que RACF simplemente modifica un contador, residente en
memoria y específico de la clase. Sin embargo, su efecto concreto es el de invalidar todas las copias de
perfiles genéricos de la clase que puedan existir en los distintos address space. En efecto, éstos saben
qué valor tenía el contador la última vez que se cargaron en su memoria de perfiles de la clase y, antes
de reusarlos, verifican que el contador no haya cambiado. Si lo hizo, los perfiles son invalidados y será
necesario volver a cargarlos. En consecuencia, se trata de un comando de ejecución inmediata pero que
puede resultar costoso en términos de procesamiento, si muchos address space tienen almacenados
perfiles de la clase.
Un ejemplo típico es la clase DATASET. El comando “SETROPTS GENERIC(DATASET)
REFRESH” finaliza inmediatamente, pero su impacto negativo en la performance puede ser importante.
Si un usuario de TSO reporta que intentó acceder a un dataset y no pudo por falta de autoridad, en caso
de que se le otorgue la autorización, será normalmente preferible pedirle que vuelva iniciar sesión antes
que ejecutar el comando de REFRESH.
Clase GLOBAL
La información de las tablas de la clase GLOBAL se encuentra siempre cargada en memoria. Toda
modificación, para tomar efecto, requiere la ejecución de un comando de REFRESH. Si se tiene una
clase bajo GLOBAL en la SETROPTS, y se modifica información de la correspondiente tabla, los
cambios solo quedarán vigentes si se ejecuta el comando:
SETROPTS GLOBAL(clase) REFRESH
Este comando no solo afecta la clase especificada sino también a todas aquellas otras que eventualmente
compartan el mismo posit value (y estén bajo GLOBAL en la SETROPTS)
Autoridad requerida
Para ejecutar el comando anterior sobre una clase, el usuario debe satisfacer alguna de las siguientes
condiciones:
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de sistema.
Tener CLAUTH sobre la clase.
Clase PROGRAM
La clase PROGRAM es muy particular en varios aspectos, y la forma de refrescarla es uno de ellos. Si
se efectúan modificaciones en sus perfiles, los cambios solo tomarán efecto una vez que se haya
ejecutado el comando:
SETROPTS WHEN(PROGRAM) REFRESH
Autoridad requerida
Para ejecutar el comando anterior, el usuario debe satisfacer alguna de las siguientes condiciones:
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de sistema.
Tener CLAUTH en la clase PROGRAM.
Dentro de la clase de miembros, todo recurso tiene (a lo sumo) un único perfil que más se le ajusta, que
puede ser discreto o genérico. En nuestro ejemplo, para la transacción ABC1 sería el perfil discreto de
idéntico nombre, mientras que para la transacción ABFT, el perfil más ajustado sería el genérico AB*.
La transacción RY54, por otro lado, no estaría cubierta por ningún perfil de la clase TCICSTRN.
En cualquier caso, la protección de un determinado recurso surge de combinar la información
almacenada en ambas clases, la de miembros y la agrupadora, tal cual veremos a continuación.
Los perfiles en la clase agrupadora, a diferencia de lo que sucede con los de la clase de miembros,
tienen nombres de libre elección. Pero poseen una “lista de miembros” cuyos nombres deben matchear
con el nombre del recurso que pretendan proteger. En consecuencia, estos perfiles permiten proteger
recursos de nombres disímiles pero con idéntica necesidad de acceso. No se permiten perfiles genéricos,
aunque sí pueden los perfiles tener “miembros genéricos”. Un mismo miembro puede existir en varios
perfiles.
Ejemplo:
Supongamos que los perfiles definidos en la clase GCICSTRN son los siguientes:
miembros pero encontró 2 o más en la clase agrupadora. Sería el caso, en nuestro ejemplo, de las
transacciones ABC1 (perfil de igual nombre en la clase TCICSTRN junto con perfiles SISTAB y
SISTCONT en la clase GCICSTRN) y ABC2 (perfiles SISTAB y SISTCONT en la clase
GCICSTRN). En este caso, la protección efectiva del recurso surge de combinar la información de
todos los perfiles que lo cubren discretamente, proceso conocido como merge. No describiremos en
detalle este algoritmo, pero mencionaremos los aspectos más relevantes:
Para determinar la lista de acceso del recurso, RACF combina las listas de acceso de todos los
perfiles involucrados, manejándose, en caso de repeticiones, en base al criterio del “nivel más
permisivo”. Esto significa que si un grupo (o usuario) figura en más de una de las listas de acceso,
su nivel de autorización efectivo sobre recurso será el más alto de todos.
En lo que se refiere al UACC del recurso, RACF opera de manera opuesta. El UACC efectivo será
el más restrictivo de los UACC de los perfiles involucrados.
Si RACF no encuentra al recurso cubierto de manera discreta, entonces busca en ambas clases perfiles
que lo cubran de forma genérica. En tal caso, siguiendo un criterio análogo al empleado para perfiles
genéricos de dataset, los compara hasta determinar los que más se ajustan al nombre del recurso.
Si RACF llega a establecer un único perfil que cubre genéricamente al recurso de la manera más
ajustada posible, entonces éste perfil será el protector. Es el caso, en nuestro ejemplo, de la transacción
ABC3. En efecto, si bien tanto el perfil ABC% en la clase TCICSTRN como los perfiles GRUPOA y
SISTAB en la clase GCICSTRN cubren genéricamente al recurso, el más ajustado es el perfil ABC%
(pues tanto A* como AB* son menos específicos).
Si RACF encuentra más de un perfil que cubre genéricamente al recurso de la manera más ajustada
posible, entonces la protección efectiva surge de un proceso de merge idéntico al mencionado en el caso
discreto. Este sería el caso, siempre en nuestro ejemplo, de la transacción ABX9. Tanto el perfil AB* en
la clase TCICSTRN como el perfil SISTAB en la clase GCICSTRN cubren lo más ajustadamente
posible al recurso ABX9 (GRUPOA no entra en juego ya que A* es menos específico). Por lo tanto, la
protección de la transacción ABX9 se establece combinando los perfiles AB* y SISTAB.
Finalmente, si RACF no encuentra al recurso cubierto ni discreta ni genéricamente en ninguna de ambas
clases, entonces concluye que no lo tiene protegido y devuelve a la aplicación solicitante el DFTRETC
especificado para la clase en la CDT. Tal sería el caso, en nuestro ejemplo, para la transacción MKL7.
En el caso concreto de CICS, cabe señalar que el producto deniega el acceso si la transacción no está
protegida, suponiendo que CICS esté efectivamente configurado para que se controle la ejecución de
transacciones.
Recomendaciones:
En virtud de lo expuesto, y con el objetivo de establecer una protección clara de los recursos en el caso
de clases de miembros y agrupadoras, aconsejamos lo siguiente:
No utilizar ambas clases, dentro de lo posible. Esto es, usar solo la clase de miembros o, mejor
aún, solo la clase agrupadora.
No definir el mismo recurso en más de un perfil.
No definir miembros genéricos en perfiles de la clase agrupadora. Es preferible, si fuese
necesario, crear un perfil genérico en la clase de miembros.
recursos generales admite perfiles genéricos, el uso del ** está permitido independientemente del seteo
de la opción EGN de la SETROPTS (que solo afecta a la clase DATASET).
Otras diferencias importantes son las siguientes:
Los perfiles genéricos de recursos generales admiten caracteres comodín en cualquier
calificador, incluso en el primero.
El * al final de un perfil indica la presencia de 0 o mas caracteres, incluyendo eventuales
“puntos”, por lo cual contempla la existencia de calificadores enteros.
Siempre que resulte posible, conviene usar perfiles genéricos, ya que una poca cantidad permite
proteger un gran número de recursos. Valen consideraciones similares a las que se hicieron respecto a
perfiles de dataset. Un abuso en la cantidad de perfiles genéricos, dónde exista casi una relación
biunívoca con los recursos, desvirtúa su naturaleza y puede ocasionar problemas de performance. Los
recursos que necesiten un tratamiento de seguridad particular deben ser protegidos mediante un perfil
discreto. En cualquier caso, a diferencia de la clase DATASET, el uso de perfiles discretos en clases de
recursos generales es muy frecuente (incluso, a veces, obligatorio) y está perfectamente justificado.
En caso contrario, o sea para recursos no relacionados con clases de miembros y agrupadoras, RACF
determina a lo sumo un único perfil -discreto o genérico- que protege al recurso, de manera análoga a
como lo hace en el caso de archivos. RACF procede del siguiente modo:
Si el recurso está protegido discretamente, entonces este perfil discreto será su perfil protector.
Si no está protegido discretamente, RACF busca todos los perfiles genéricos que lo alcanzan (si no
existiera ninguno, el recurso simplemente no estaría protegido) y procede a compararlos, de izquierda a
derecha. En el primer carácter en que encuentre alguna diferencia, se descartan aquellos más genéricos,
de acuerdo al siguiente criterio:
- Los caracteres “no genéricos” son más específicos que los genéricos.
- Para las genéricos, el orden, desde el menos al más genérico, es %, * y **.
corto de tiempo. Si se omite WARNING, el perfil queda definido como NOWARNING, que llamamos
modo fail. Este es el modo en que deben encontrarse normalmente todos los perfiles de la base. Las
clases PROGRAM y NODES no admiten perfiles en modo warning.
NOTIFY especifica un usuario a ser notificado cada vez que el perfil sea usado para denegar el acceso a
un recurso. Si el usuario especificado se encuentra con una sesión de TSO activa, recibirá las
notificaciones en tiempo real. En caso contrario las recibirá en el momento de su próximo logon (no se
pierden). Si la cantidad de notificaciones esperadas es elevada, el usuario debería loguearse
frecuentemente a TSO afín de liberar el espacio que ocupan sus mensajes pendientes en el archivo
SYS1.BRODCAST. De todos modos, no es conveniente tener en forma permanente un usuario en el
NOTIFY de un perfil, si se supone que rechazará gran cantidad de accesos. NOTIFY no admite más de
un usuario ni un grupo de RACF. Si se lo codifica sin especificar usuario, queda como usuario a ser
notificado quien ejecutó el comando RDEFINE. Si se lo omite, ningún usuario será notificado y el
campo muestra, en la salida del comando RLIST, la leyenda “NO USER TO BE NOTIFIED”.
Con el operando ADDMEM se agregan miembros al perfil, siempre y cuando se trate de una clase
cuyos perfiles los admitan (clases agrupadoras o GLOBAL y PROGRAM, por ejemplo). El significado
y formato de estos miembros varía según la clase.
El operando AUDIT indica a qué nivel se quiere auditar el uso del perfil. La información se graba en
registros tipo 80 del SMF. Se distinguen 2 conceptos diferentes: tipo de acceso y nivel de acceso.
Los posibles tipos de acceso son:
o NONE ningún intento de acceso será grabado.
o SUCCESS se grabarán accesos exitosos.
o FAILURES se grabarán intentos de acceso fallidos.
o ALL se grabará todo intento de acceso, sea fallido o exitoso.
Los posibles niveles de acceso son:
o READ
o UPDATE
o CONTROL
o ALTER
En el operando AUDIT se pueden especificar uno (o más) tipos de acceso acompañados del nivel de
acceso correspondiente. Naturalmente, NONE no requiere un nivel de acceso asociado.
FAILURES(READ) es el valor por defecto, y establece que se registre todo intento de acceso denegado
por el perfil. Intentos de acceso superiores a READ que resulten fallidos son también registrados.
El operando FROM especifica el nombre de un perfil (discreto o genérico) en el cual se va a basar
RACF para la creación del nuevo. Todas las características del perfil especificado en el operando
FROM son replicadas en el nuevo (OWNER, UACC, WARNING, AUDITING, NOTIFY, DATA,
Listas de acceso, etc.), excepto que se codifique explícitamente un valor distinto para alguno de estos
operandos en el comando RDEFINE. Si el perfil modelo tiene miembros, éstos no son copiados al
nuevo perfil. En cuanto a las listas de acceso, puede existir una mínima diferencia en las del nuevo
perfil con respecto al tomado como modelo, en el caso siguiente:
Si la opción ADDCREATOR está activa en la SETROPTS, el usuario que crea el nuevo perfil se agrega
a la lista de acceso estándar con autoridad ALTER, independientemente de que figure o no en la lista de
acceso del perfil modelo.
FCLASS indica la clase de RACF a la que pertenece el perfil especificado en el operando FROM
(DATASET o cualquier clase definida en la CDT son admisibles). Si se omite, RACF asume que el
perfil modelo pertenece a la misma clase que el que se está definiendo.
FGENERIC indica a RACF que el perfil especificado en el operando FROM es genérico, aún cuando no
contenga caracteres genéricos. Sólo es necesario si FCLASS es DATASET y perfil2 es un “genérico
completo”. RACF ignora el operando FGENERIC si no se codificó FROM.
Si el operando FROM especifica un perfil discreto de DATASET, el operando FVOLUME debe indicar
el volumen correspondiente del perfil modelo. Si se codifica FVOLUME con un valor distinto al que
corresponde, o si se omite y existe más de un perfil discreto con ese nombre, el comando falla. Si no se
especificó el operando FROM, o se codificó con un perfil genérico, o con un perfil de una clase que no
sea DATASET, el operando FVOLUME es ignorado.
Autoridad requerida
La autoridad requerida depende de varios factores, como ser:
o Clase a la que pertenece el perfil
o Operandos especificados en el comando RDEFINE
o Seteo de la opción GENERICOWNER de la SETROPTS
No vamos a efectuar un análisis detallado y exhaustivo de todas las situaciones que se pueden presentar.
A grandes rasgos, digamos que los usuarios autorizados a definir nuevos perfiles son aquellos con el
atributo SPECIAL o con CLAUTH sobre la clase.
Autoridad requerida
Para modificar un perfil de recursos generales, quien ejecuta el comando debe, básicamente, cumplir
alguno de los siguientes requisitos:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga al perfil dentro de su campo de acción.
Ser el owner del perfil.
Si el perfil es discreto, tener autoridad ALTER sobre el perfil.
Para ciertos operandos, como ADDMEM, existen restricciones adicionales, pero no entraremos en
detalle sobre las mismas.
Autoridad requerida
Para deletear un perfil de recursos generales, quien ejecuta el comando debe, básicamente, cumplir
alguno de los siguientes requisitos:
Tener el atributo SPECIAL a nivel de sistema.
Tener el atributo SPECIAL a nivel de un grupo que tenga al perfil dentro de su campo de acción.
Ser el owner del perfil.
Si el perfil es discreto, tener autoridad ALTER sobre el perfil.
AUTHUSER indica que se debe incluir en la salida del comando la siguiente información:
o Security level, categories y security label
o Lista de acceso estándar
o Lista de acceso condicional
ALL establece que se liste toda la información del segmento base. Si no se especifica, el listado no
muestra ni las estadísticas ni las listas de acceso. Para listar los eventuales segmentos no base, debe
especificarse el parámetro correspondiente.
Si la clase tiene una clase agrupadora, RESGROUP indica que se genere una lista de todos los perfiles
de la clase que tengan al recurso especificado dentro de sus miembros. En caso contrario, el operando
RESGROUP es ignorado.
Autoridad requerida
Para listar un perfil de recursos generales, quien ejecuta el comando debe, básicamente, cumplir con
alguno de los siguientes requisitos:
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de sistema.
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de un grupo que tenga al perfil
dentro de su campo de acción.
Ser el owner del perfil.
Tener autoridad READ (o superior) sobre el perfil.
Existir una entrada en la GLOBAL para el perfil que otorgue autoridad READ (o superior).
Para que se liste el campo GLOBALAUDIT, quien ejecuta el comando debe tener el atributo
AUDITOR (ya sea a nivel de sistema, o a nivel de un grupo que tenga al perfil dentro de su campo de
acción).
Para ver las listas de acceso, se debe satisfacer alguna de las siguientes condiciones:
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de sistema.
Tener el atributo SPECIAL, AUDITOR u OPERATIONS a nivel de un grupo que tenga al perfil
de su campo de acción.
Ser el owner del perfil.
Existir una entrada en la GLOBAL para el perfil que otorgue autoridad ALTER.
Si el perfil es discreto, tener autoridad ALTER sobre el perfil.
ID indica el usuario o grupo cuya entrada en la lista de acceso se desea agregar, modificar o eliminar.
Separados por espacios pueden ingresarse más de un usuario/grupo. También se acepta el valor *, que
representa un usuario cualquiera existente en la base de RACF.
ACCESS establece el nivel de autoridad que se quiere otorgar al usuario/grupo especificado en el
operando ID. Los posibles valores son NONE, EXECUTE, READ, UPDATE, CONTROL y ALTER.
Si se codifica ACCESS sin poner ningún valor, se asume READ.
DELETE indica que se pretende borrar de la lista de acceso la entrada correspondiente al usuario/grupo
codificado en el operando ID.
En ambos casos, ya sea con ACCESS o DELETE, RACF actúa sobre la lista de acceso estándar,
excepto que se codifique explícitamente el operando WHEN, que indica que se pretende modificar la
lista de acceso condicional. Si se especificó ID, pero se omitió tanto ACCESS como DELETE, se
asume por defecto ACCESS(READ).
FROM especifica el nombre de otro perfil (discreto o genérico) del cual se quieren copiar las listas de
acceso (estándar y condicional). Las entradas en las listas de acceso del perfil2 son agregadas a las listas
de acceso correspondientes. Es decir, el operando FROM no convierte en idénticas las listas de acceso
de ambos perfiles. Más aún, si una entrada que figura en la lista de acceso del perfil2 ya se encuentra en
la del perfil en cuestión, entonces la misma no se modifica.
FCLASS indica la clase a la que pertenece el perfil especificado en el operando FROM. Si omite
FCLASS y se codificó FROM, se asume por defecto que perfil2 pertenece a la misma clase que el perfil
en cuestión.
FGENERIC indica a RACF que el perfil especificado en el operando FROM es genérico, aún cuando no
contenga caracteres genéricos. Por lo tanto, solo tiene sentido si perfil2 es un perfil de dataset. RACF
ignora el operando FGENERIC si no se codificó FROM.
Si el operando FROM especifica un perfil discreto de DATASET, el operando FVOLUME debe indicar
el volumen correspondiente. Si se codificara FVOLUME con un valor distinto al que corresponde al
perfil2, o si se omite y existe más de un perfil discreto con ese nombre, el comando falla. Si no se
especificó el operando FROM, o se codificó con un perfil genérico, o con un perfil de una clase que no
sea DATASET, el operando FVOLUME es ignorado.
El operando RESET indica que se pretende vaciar una o ambas listas de acceso (es decir, eliminar todas
las entradas). RESET(STANDARD) vacía únicamente la lista de acceso estándar, en tanto que
RESET(WHEN) hace lo propio con la condicional. RESET(ALL) vacía ambas. Si se codifica RESET
sin ningún valor, se asume por defecto ALL.
El operando WHEN indica que se quiere modificar la lista de acceso condicional. No describiremos los
distintos suboperandos que admite. Si se omite WHEN, las modificaciones se efectúan sobre la lista de
acceso estándar (aunque los operandos FROM o RESET pueden impactar igualmente sobre la lista de
acceso condicional).
CLASS especifica la clase dentro de la cual se buscan los perfiles. Se puede codificar DATASET,
USER, GROUP o cualquier otra clase definida en la CDT. Si se omite, el valor por defecto es
DATASET.
ALL indica que se listen todos los perfiles –genéricos o discretos- que satisfagan los demás criterios
fijados por los restantes parámetros del comando SEARCH. GENERIC restringe la búsqueda a perfiles
genéricos, mientras que NOGENERIC la limita a perfiles discretos. Las opciones
MODEL|TAPE|VSAM|NOVSAM solo tienen sentido para la clase DATASET (son directamente
ignoradas si la clase especificada es otra). El valor por defecto es ALL.
CATEGORY|EXPIRES|LEVEL|SECLABEL|SECLEVEL|WARNING
Mediante estos operandos se establecen criterios de búsqueda. No nos ocuparemos de CATEGORY,
SECLABEL y SECLEVEL.
o EXPIRES solo se aplica a la clase TAPEVOL. El valor debe estar comprendido entre 0 y 65533,
o bien ser 99999 (archivos que nunca expiran). Si se codifica, solo se listarán los volúmenes
tales que todos sus archivos, o bien ya se encuentren expirados, o bien lo harán dentro de la
cantidad de días especificados.
o LEVEL establece que se listen los perfiles cuyo LEVEL coincida con el especificado.
Recordemos que se trata de un campo de uso administrativo, cuyo valor está comprendido entre
00 y 99. Si la clase es USER o GROUP, este operando es ignorado.
o WARNING indica que se listen los perfiles que se encuentre en modo warning. Si la clase es
USER o GROUP, este operando es ignorado.
FILTER permite indicar una cadena de caracteres (incluyendo los caracteres comodín %, * y **), de
modo que sean listados únicamente los perfiles cuyos nombres estén alcanzados por el patrón
establecido. El significado de los caracteres genéricos es similar al que tienen en el caso de perfiles, y
pueden codificarse en cualquier calificador (incluso en el primero):
- % indica un único carácter cualquiera (inclusive % y *)
- * indica la presencia de 0 más caracteres (inclusive genéricos) hasta concluir el calificador. Si es
usado como un calificador completo, exige la existencia de ese calificador en los nombres que
abarca.
- ** indica la presencia de 0 o más calificadores. Sólo puede usarse como un calificador completo.
Ejemplo:
FILTER(a%%.xy*.*.**) alcanzaría a los siguientes nombres de perfiles:
a21.xyzw.asdf.qwe.fin
aa*.xyz%%%.qwe
Sin embargo, no alcanzaría a:
ab23.xyz.efgh.qwe (tiene 4 caracteres en el primer calificador)
a21.xyw* (no tiene un tercer calificador, que es exigido)
El operando MASK, excluyente con el operando FILTER, brinda un medio alternativo para filtrar
perfiles:
o Cadena1 indica una secuencia de caracteres con la que deben empezar los nombres de los
perfiles buscados. Se admiten caracteres genéricos, pero pierden su significado comodín y son
exigidos literalmente. Si se codifica * y la clase es DATASET, el identificador del usuario que
ejecuta el comando se toma como máscara.
o Cadena2 establece, opcionalmente, una segunda cadena de caracteres que debe contener el
nombre del perfil en cualquier lugar a continuación de cadena1. También en este caso se
admiten caracteres genéricos, pero no tienen su significado usual sino que son tomados
literalmente.
NOMASK establece que se listen todos los perfiles de la clase que cumplan con el resto de los criterios.
En realidad, solo son listados aquellos que el usuario está autorizado a ver.
Si no se codifica MASK|NOMASK (ni FILTER), entonces el defecto es MASK(*). Notemos que para
todas las clases excepto DATASET, NOMASK y MASK(*) son equivalentes, ya que no fijan
restricciones sobre los nombres de los perfiles.
El operando FILTER es más flexible que MASK, pues permite criterios de búsqueda más sofisticados.
El operando USER(usuario) indica que se deben listar los perfiles que cumplan con los criterios de
selección establecidos y sobre los cuales el usuario codificado tenga autoridad READ o superior, o bien
sea el owner. Si la clase especificada es GROUP, serán listados los grupos para los cuales el usuario
codificado esté conectado con autoridad CONNECT o JOIN, esté conectado con atributo SPECIAL o
AUDITOR, o sea el owner.
AGE establece que se listen únicamente los perfiles que no han sido referenciados dentro de la cantidad
de días especificados (contados hacia atrás desde el actual). El valor codificado debe estar comprendido
entre 0 y 99999. Esta opción funciona únicamente para perfiles discretos de clases para las cuales se
mantengan estadísticas.
Si la clase es USER, se listarán los usuarios cuyo LAST-ACCESS sea anterior a la fecha que resulte de
sustraer a la actual la cantidad de días especificados. En el caso en que LAST-ACCESS tenga el valor
UNKNOWN, se toma la fecha de creación del usuario como referencia.
Si la clase es GROUP, se listarán los grupos que hayan sido creados con anterioridad a la fecha que
resulte de sustraer a la actual la cantidad de días especificados.
El operando CLIST determina que se genere una CLIST (command list) con los nombres de los perfiles
que resulten de la búsqueda (1 registro por cada perfil encontrado). La lista se graba en un archivo de
nombre PREFIX.EXEC.RACF.CLIST, dónde PREFIX indica el prefix de TSO del usuario que ejecuta
el comando SEARCH (si tuviera noprefix en su profile de TSO, su identificador de usuario se usaría
como HLQ del dataset). Es importante recalcar que el comando solo genera la CLIST. No la ejecuta.
o Cadena1, que debe codificarse entre apóstrofes simples, establece el texto que se antepondrá en
cada registro al nombre del perfil.
o Cadena2, que debe estar igualmente entre apóstrofes simples, establece el texto que se agregará
en cada registro inmediatamente a continuación del nombre del perfil.
Adicionalmente, un número de secuencia de 8 posiciones es colocado al principio de cada registro. El
operando CLIST es útil cuando se quiere ejecutar idénticos comandos de RACF sobre los perfiles que
resulten de la búsqueda.
Ejemplo:
Supongamos que se pretende listar la información completa de todos los perfiles de la clase FACILITY
cuyo nombre empiece con la cadena de caracteres STGADMIN. Para ello, debería ejecutarse el
comando:
SEARCH CLASS(facility) MASK(stgadmin) CLIST(‘rlist facility ’‘ all’)
Intencionalmente se han especificado espacios al final de cadena1 y al principio de cadena2, de modo
que los comandos resulten sintácticamente correctos. El archivo grabado podría tener los siguientes
registros:
00000010RLIST FACILITY STGADMIN.ADR.** ALL
00000020RLIST FACILITY STGADMIN.IDC.** ALL
00000030RLIST FACILITY STGADMIN.IGG.** ALL
00000040RLIST FACILITY STGADMIN.** ALL
Autoridad requerida
Todo usuario está autorizado a ejecutar el comando SEARCH, solo que únicamente le serán mostrados
los nombres de los perfiles que este autorizado a ver. Básicamente, para poder ver el nombre de un
perfil, quien ejecuta el comando debe cumplir con alguna de las condiciones siguientes:
Tener el atributo SPECIAL o AUDITOR a nivel de sistema o a nivel de un grupo que tenga al
perfil dentro de su campo de acción.
Tener el atributo OPERATIONS a nivel de sistema o a nivel de un grupo que tenga al perfil
dentro de su campo de acción y la clase estar alcanzada por este atributo.
Tener autoridad READ (o superior) sobre el perfil.
Para poder usar SEARCH con el operando USER, quien ejecuta el comando debe cumplir con alguna
de las condiciones siguientes:
Tener el atributo SPECIAL o AUDITOR a nivel de sistema o a nivel de un grupo que tenga al
usuario del operando USER dentro de su campo de acción.
Ser el owner del usuario codificado en el operando USER
El usuario codificado en el operando USER debe coincidir con el propio.
7 - CLASES PARTICULARES
Ejemplo:
Vamos a mostrar una secuencia de comandos que define una serie de reglas en la GAC para la clase
DATASET. En este ejemplo, se pretende que todos los archivos cuyo HLQ es SYS1 sean accedidos por
todos los usuarios con autoridad READ, con excepción del dataset SYS1.UADS. Asimismo, se pretende
otorgar UPDATE a todos los usuarios a los catálogos de usuario, cuyos nombres suponemos tienen
HLQ igual a USRCAT (y son los únicos con este HLQ). Asumimos que en la SETROPTS la clase
DATASET está bajo GENCMD y que la opción EGN está activa. Asimismo, suponemos que no existe
el perfil DATASET en la clase GLOBAL y que la misma no está bajo GLOBAL en la SETROPTS.
1) SETROPTS GLOBAL(dataset)
2) RDEFINE GLOBAL DATASET
3) RALTER GLOBAL DATASET ADDMEM(‘sys1.**’/read)
4) RALTER GLOBAL DATASET ADDMEM(‘sys1.uads’/none)
5) RALTER GLOBAL DATASET ADDMEM(‘usrcat.**’/update)
6) SETROPTS GLOBAL(dataset) REFRESH
Cuando RACF analiza el contenido de la GAC para resolver sobre una solicitud de acceso, procede de
manera similar a como lo hace con perfiles. Esto es, RACF detecta la entrada que mas se ajusta al
recurso solicitado y en base a ella decide si debe otorgar el acceso inmediatamente, o bien debe seguir
con el proceso de chequeo habitual. En nuestro ejemplo, si un usuario intenta leer el archivo
SYS1.UADS, RACF consulta las reglas para la clase DATASET en la GAC (ya que DATASET está
bajo GLOBAL en la SETROPTS), y encuentra que la entrada que más se ajusta es SYS1.UADS, cuyo
nivel de acceso asociado es NONE. Por lo tanto, la GAC no permite otorgar el acceso solicitado, y
RACF continúa con el análisis de los perfiles correspondientes (recordemos que la GAC nunca rechaza
por sí misma un requerimiento de acceso).
Consideraciones:
Los usuarios con el atributo RESTRICTED son los únicos que no pueden obtener acceso a un
recurso a través de la GAC.
Aún cuando exista en la GAC una regla que permita acceder a un recurso bajo cierto nivel de
autoridad, es conveniente garantizar idéntico acceso a través del UACC del perfil protector. Esto
evita problemas si involuntariamente se borra la regla de la GAC, o se inhabilita en la
SETROPTS la opción GLOBAL para la clase. Por ejemplo, si tenemos la siguiente regla en la
GAC:
USRCAT.**/UPDATE
resulta conveniente tener asimismo un perfil de dataset ‘USRCAT.**’ con UACC(UPDATE).
Consideraciones:
Si una started task no adquiere una identidad válida, corre bajo un usuario indefinido, y solo
puede acceder a los recursos cuyo UACC sea lo suficientemente permisivo. Estando la clase
STARTED activa –como es absolutamente recomendable-, solo en los casos siguientes RACF
consultará la ICHRIN03:
o No existe un perfil en la clase STARTED
o Existe un perfil pero sin segmento STDATA.
o Existe un perfil con segmento STDATA pero sin usuario especificado.
En cambio, en cualquiera de los casos siguientes, no se consultará la ICHRIN03 y la STC
ejecutará con usuario indefinido:
o Existe un perfil con segmento STDATA pero el usuario especificado no existe en la base.
o Existe un perfil con segmento STDATA pero el grupo especificado no existe en la base.
o Existe un perfil con segmento STDATA, con usuario y grupo válidos, pero el usuario no está
conectado al grupo.
En el inicio de una STC, RACF no chequea la eventual revocación del usuario asignado. Esto
determina que el procedimiento efectivamente arrancará, aún cuando el usuario se encuentre
revocado. Sin embargo, es probable que la tarea tenga problemas posteriormente, si alguna
acción que lleve a cabo controle efectivamente esta condición (por ejemplo, si la STC submite
un job al internal reader). Por lo tanto, es aconsejable verificar regularmente que los usuarios
asociados con las STC no se encuentren revocados.
Si un usuario es utilizado exclusivamente para ser asignado a una started task, entonces es un
excelente candidato para otorgarle el atributo PROTECTED. De esta manera se evitan usos
indebidos del usuario, así como también revocaciones maliciosas por intentos de logon fallidos
ingresando passwords incorrectas.
La asignación del usuario a la STC se realiza en el momento de su inicio. En consecuencia, tanto
si se cambia el usuario asignado como si se le otorga (o quita) algún atributo, la modificación
solo tomará efecto una vez que se recicle la STC (es decir, que se pare y reinicie).
Con el objeto de mantener un adecuado control de las STC en el sistema, recomendamos definir
un perfil de contención ** en la clase STARTED, cuyo usuario asignado no tenga ninguna
autorización explícita sobre ningún perfil. De este modo, toda STC que no tenga un perfil más
específico solo podrá acceder a recursos vía UACC (o * en la lista de acceso), lo cual no debería
ser peligroso desde la perspectiva de la seguridad. Una opción aún más radical consistiría en
otorgarle a tal usuario el atributo RESTRICTED, en cuyo caso el procedimiento no podría
acceder a ningún recurso protegido. Es de destacar que estando correctamente definido este
backstop en la clase STARTED, RACF nunca revertirá a la ICHRIN03 en su proceso de
asignación de identidad.
En cualquier caso, lo realmente importante es que toda STC se encuentre perfectamente
identificada y con un usuario debidamente asignado a través de la clase STARTED, que detente
únicamente las autorizaciones necesarias para sus tareas. Asimismo, y de manera
complementaria, deben estar adecuadamente protegidas las bibliotecas de procedimientos
declaradas en JES.
La clase STARTED debe necesariamente estar RACLITeada. Sin embargo, en este caso
particular, RACF no carga en memoria toda la información de sus perfiles sino solo sus
nombres. Una vez que determina el perfil que usará para asignar identidad (operación rápida,
pues tiene los nombres en memoria virtual) hará un I/O sobre la base para extraer el segmento
STDATA correspondiente. Una consecuencia de esto es que, si solo se modifica un campo del
segmento STDATA de un perfil existente, no será normalmente necesario ejecutar el comando
de REFRESH.
IBM recomienda que los siguientes procedimientos se ejecuten como TRUSTED:
CATALOG, DUMPSRV, DFHSM, DFS, GPMSERVE, IEEVMPCR, IOSAS, IXGLOGR, JES2
o JES3, JESXCF, LLA, NFS, OMVSKERN, RACF, RMF, RMFGAT, SMSVSAM, SMF,
TCPIP, VLF, VTAM, XCFAS.
Aconsejo fuertemente seguir las recomendaciones de IBM y asignar TRUSTED siempre que se
lo sugiera.
Protección de programas
Todo programa reside en una biblioteca particionada, que puede ser pública, como aquellas que figuran
en la LINKLIST, o de uso privado. Es posible, y realmente frecuente aunque poco recomendable, que el
mismo nombre de programa exista en más de una biblioteca, pudiendo tratarse de distintas o idénticas
versiones, o bien de programas francamente diferentes.
Un programa que se encuentra protegido por un perfil en la clase PROGRAM se denomina programa
controlado. RACF solo permite proteger un programa dentro de una biblioteca específica. El nombre
del perfil debe matchear con el nombre del programa a proteger, mientras que la biblioteca dónde reside
específicamente la versión en cuestión debe definirse como miembro del perfil.
Un programa puede controlarse bajo RACF con diversos objetivos, entre los que podemos mencionar:
Para controlar qué usuarios/grupos están autorizados a ejecutarlo.
Porque es una exigencia del sistema que el programa esté controlado (usualmente, para mantener
lo que se conoce como “entorno limpio”).
Para hacer uso de la funcionalidad PADS.
En lo referente al segundo punto, es altamente recomendable, tal cual veremos en los ejemplos
subsiguientes, definir un perfil ** en la clase PROGRAM con UACC=READ y una lista de bibliotecas
asociadas cuyos programas necesiten estar controlados.
posible usar el caracter * al final del nombre del perfil, que indica la presencia de 0 o más caracteres
(hasta una longitud máxima de 8). También es posible definir un perfil **. Sin embargo, al listarlos,
como se trata realmente de perfiles discretos, no aparecerá la característica (G) a continuación del
nombre del perfil, como sí sucede con los perfiles genéricos genuinos.
A través del operando ADDMEM se especifica la biblioteca dónde reside el programa a controlar, junto
con ciertos parámetros adicionales. Con posterioridad a la creación del perfil, pueden agregarse o
eliminarse bibliotecas de la lista usando el comando RALTER con los operandos ADDMEM o
DELMEM, según corresponda.
El nombre de la biblioteca debe ponerse entre apóstrofes simples, ya que en caso contrario RACF
antepone automáticamente como HLQ el PREFIX de TSO del usuario que ejecuta el comando.
El volumen es opcional, y especifica el disco dónde reside la biblioteca. Existe la posibilidad de
codificar el valor ‘******’ (incluidos los apóstrofes), lo cual indica que la biblioteca se encuentra
alocada en el SYSRES (disco residente). En caso de no especificarse volumen, que es lo más habitual,
la biblioteca puede existir en cualquier disco.
La opción PADCHK|NOPADCHK hace referencia a la funcionalidad PADS, que no trataremos en esta
guía. Si no se utiliza PADS, es conveniente codificar explícitamente NOPADCHK (el valor por defecto
es PADCHK).
Ejemplos:
1. RDEFINE PROGRAM adrdssu UACC(none) ADDMEM(‘sys1.linklib’//NOPADCHK)
2. RDEFINE PROGRAM fin* UACC(none) ADDMEN(‘finanzas.loadlib’//NOPADCHK)
3. RDEFINE PROGRAM ** UACC(read) ADDMEN(‘sys1.linklib’//NOPADCHK)
En ningún caso se codificó volumen, con lo cual la biblioteca especificada puede residir en cualquiera.
El perfil definido en (1) protege exclusivamente al programa ADRDSSU residente en la biblioteca
SYS1.LINKLIB. Este perfil no protege a otros programas de nombre ADRDSSU que pudieran existir
en otras bibliotecas. Como el UACC del perfil es NONE, solo estarían en condición de ejecutarlo
aquellos usuarios o grupos autorizados vía la lista de acceso correspondiente.
El perfil definido en (2) protege todos los programas cuyo nombre empiece con la cadena FIN y residan
en la biblioteca FINANZAS.LOADLIB, con excepción de aquellos que pudieran estar protegidos por
un perfil más específico.
El perfil definido en (3) es, como ya señalamos, sumamente útil para simplemente controlar –sin
restringir su ejecución- los programas de determinadas bibliotecas (generalmente, del sistema
operativo). Como ya hemos comentamos, conviene definirlo como ** en lugar de *, de modo de poder
listarlo individualmente. En este caso particular, el perfil protege a todos los programas de la biblioteca
SYS1.LINKLIB, con excepción de aquellos que pudieran estar protegidos por un perfil más específico
(como sería el caso de ADRDSSU, en nuestro ejemplo). Obsérvese que este perfil se definió con
UACC=READ, lo cual muestra que su objetivo no es restringir la ejecución de los respectivos
programas sino simplemente convertirlos en controlados. Se le pueden agregar más bibliotecas a través
del comando RALTER, que mencionamos a continuación.
En la lista de datasets del perfil pueden eventualmente existir varias entradas con el mismo nombre de
archivo pero con distintos volúmenes asociados.
Para eliminar una biblioteca de la lista, basta con usar el operando DELMEM especificando el nombre y
el volumen correspondiente (no hace falta codificar PADCHK|NOPADCHK). Si se especifica
únicamente el nombre de la biblioteca, se borrará la entrada que no tenga volumen especificado, si ésta
existiese (en caso contrario, se informa que no existe).
Ejemplo:
RALTER PROGRAM ** ADDMEN(‘tcpip.sezalink’//NOPADCHK)
Este comando agrega a la lista de datasets del perfil ** la biblioteca TCPIP.SEZALINK. En
consecuencia, todos los programas de esta biblioteca pasan a ser programas controlados -pero
ejecutables por todos los usuarios en virtud del UACC(READ) del perfil.
Observaciones:
Por motivos de seguridad, están explícitamente excluidos del alcance de la autoridad dada por el
recurso IRR.LISTUSER los usuarios con atributo SPECIAL, AUDITOR u OPERATIONS a
nivel de sistema.
Con excepción de los usuarios mencionados en el ítem anterior, la autorización sobre este
recurso permite listar cualquier usuario de la base de RACF. Existe, desde la versión 1.10 del
z/OS, la posibilidad de darle mucha más granularidad a esta facilidad. Por ejemplo, es factible
otorgar a un usuario la posibilidad de listar únicamente aquellos que tengan un determinado
owner, o que se encuentren dentro del campo de acción de determinado grupo. E incluso la
posibilidad de excluir, de este universo, ciertos usuarios específicos. No ahondaremos, sin
embargo, en los detalles de una implementación de este tipo en el presente texto, no por
considerarla innecesaria, sino por estimar que excede los objetivos planteados.
Si el perfil IRR.LISTUSER existe, solo agrega una posibilidad adicional en relación a la
autoridad necesaria para listar perfiles de usuario. Los privilegios habituales siguen siendo
suficientes. Por ejemplo, un usuario con atributo AUDITOR a nivel de sistema no requiere estar
autorizado a este perfil.
Si el perfil IRR.LISTUSER no se encuentra definido, rigen los chequeos de autoridad habituales
para el uso del comando LISTUSER.
En lugar del perfil discreto mencionado, sería posible definir un perfil genérico que proteja al
recurso (ej: IRR.**). Sin embargo, esto no me parece recomendable, ya que este perfil estaría
abarcando a otros recursos que pueden tener una necesidad de acceso diferente (ver ejemplo
posterior).
UACC=NONE es apropiado, ya que solo los usuarios cuyas tareas lo justifiquen deben contar
con esta facilidad.
Niveles de autoridad superiores a READ son equivalentes a READ, y por lo tanto totalmente
innecesarios, con la siguiente salvedad: si el perfil es discreto, autoridad ALTER otorga
privilegios administrativos sobre el perfil, lo cual probablemente constituya un efecto no
buscado.
Este recurso no autoriza a listar segmentos no base (TSO, OMVS, etc.). Para ello, deben
definirse perfiles adecuados en la clase FIELDS.
Observaciones:
Por motivos de seguridad, están explícitamente excluidos del alcance de la autoridad dada por el
recurso IRR.PASSWORD.RESET los usuarios con atributo SPECIAL, AUDITOR u
OPERATIONS a nivel de sistema.
Con excepción de los usuarios mencionados en el ítem anterior, la autorización sobre este
recurso permite actuar sobre cualquier usuario de la base de RACF. Existe también en este caso
la posibilidad de darle mucha más granularidad a esta facilidad. Por ejemplo, es factible otorgar
a un usuario la posibilidad de rehabilitar únicamente aquellos que tengan un determinado owner,
o que se encuentren dentro del campo de acción de determinado grupo. E incluso la posibilidad
de excluir, de este universo, ciertos usuarios específicos. No ahondaremos, sin embargo, en los
detalles de una implementación de este tipo.
Si el perfil IRR.PASSWORD.RESET existe, solo agrega una posibilidad extra respecto a la
autoridad necesaria para la rehabilitación de usuarios. Los privilegios habituales siguen siendo
suficientes. Por ejemplo, un usuario con atributo SPECIAL a nivel de sistema no necesita
autorización sobre este perfil.
Si el perfil IRR.PASSWORD.RESET no se encuentra definido, rigen los chequeos de autoridad
habituales para el uso del comando ALTUSER.
El nivel de autoridad ALTER resulta equivalente a CONTROL, con la siguiente salvedad: si el
perfil es discreto, otorga privilegios administrativos sobre el perfil, lo cual probablemente
constituya un efecto no deseado.
depende obviamente del tipo de operación que se pretende realizar). Naturalmente, sortear el chequeo
de “no catalogado” no elimina de ninguna manera los habituales chequeos posteriores (normalmente, en
la clase DATASET).
Ejemplo:
Supongamos que el usuario SYSPRG1 debe acceder a datasets no catalogados cuyos nombres son de la
forma TEST.CONFIG.**, y que éstos están protegidos por perfiles de dataset sobre los cuales el usuario
tiene suficiente autoridad. Para ello, basta definir el perfil genérico ICHUNCAT.TEST.CONFIG.** en
la clase FACILITY y otorgarle al usuario SYSPRG1 autoridad READ.
Si no es requerido este nivel de granularidad, puede definirse únicamente el perfil genérico
ICHUNCAT.**, que brinda a los usuarios autorizados la posibilidad de acceder a cualquier archivo no
catalogado. Sin que ello exceptúe, recalquémoslo nuevamente, los chequeos usuales de acceso a
archivos.
3. Si la clase debería estar RACLISTeada de acuerdo a lo que especifica la CDT, pero no lo está,
RACF devuelve el código de “no protegido”.
5. Si la clase está bajo GLOBAL en la SETROPTS, y la información de la GAC indica que debe
accederse a la solicitud, se autoriza el acceso, excepto que el usuario tenga el atributo
RESTRICTED, en cuyo caso el proceso continúa.
6. RACF busca el perfil protector del recurso. Si no encuentra al recurso protegido y se trata de una
clase de recursos generales, devuelve como código de retorno el DEFRETC de la clase
especificado en la CDT. Si la clase es DATASET y no existe perfil protector, continúa en el
paso 19.
8. RACF busca el identificador del usuario en la lista de acceso estándar del perfil protector del
recurso. Si el usuario figura en ella con un nivel igual o superior al solicitado, RACF autoriza el
requerimiento. Si el usuario figura en ella pero con un nivel inferior al solicitado, RACF
continúa en el paso 14 (por lo tanto, ID(*), UACC y atributo OPERATIONS no cuentan).
10. Si la opción GRPLIST está activa en la SETROPTS, RACF busca en la lista de acceso estándar
del perfil protector del recurso la presencia de los eventuales grupos a los que el usuario está
conectado. Si uno o más de estos grupos figuran en ella, RACF selecciona el nivel de autoridad
más elevado. Si tal nivel es igual o superior al solicitado, RACF autoriza el requerimiento. Si,
por el contrario, el nivel resultante es inferior, RACF continúa en el paso 14 (por lo tanto, ID(*),
UACC y atributo OPERATIONS no cuentan).
11. RACF busca si existe una entrada * en la lista de acceso estándar del perfil protector. En caso
afirmativo, si el nivel de autoridad asociado es igual o superior al solicitado, y el usuario existe
en la base de RACF y no tiene el atributo RESTRICTED, RACF autoriza el requerimiento. Si el
nivel asociado a la entrada * es, en cambio, inferior al solicitado, RACF continúa en el paso 13
(por lo tanto el UACC no cuenta en este caso).
12. Si el UACC del perfil protector es igual o superior al nivel solicitado, y el usuario no tiene el
atributo RESTRICTED, RACF autoriza el requerimiento.
13. Si la clase está alcanzada por el atributo OPERATIONS y el usuario lo posee, ya sea a nivel de
sistema o a nivel de un grupo que tenga al perfil protector dentro de su campo de acción,
entonces RACF autoriza el requerimiento.
14. RACF busca el identificador del usuario en la lista de acceso condicional del perfil protector del
recurso. Si el usuario figura en ella con un nivel igual o superior al solicitado y se cumple la
condición correspondiente, RACF autoriza el requerimiento.
15. Si la opción GRPLIST no está activa en la SETROPTS, RACF busca el “actual grupo de
conexión” del usuario en la lista de acceso condicional del perfil protector. Si el grupo figura en
ella con un nivel igual o superior al solicitado y se cumple la condición correspondiente, RACF
autoriza el requerimiento.
16. Si la opción GRPLIST está activa en la SETROPTS, RACF busca en la lista de acceso
condicional del perfil protector la presencia de los eventuales grupos a los que el usuario está
conectado. Si uno o más de estos grupos figuran en ella para la condición dada, RACF
selecciona el nivel de autoridad más elevado. Si tal nivel es igual o superior al solicitado, RACF
autoriza el requerimiento.
17. RACF busca si existe una entrada * en la lista de acceso condicional del perfil protector. En caso
afirmativo, si el nivel de autoridad asociado es igual o superior al solicitado, se cumple la
condición correspondiente, el usuario existe en la base de RACF y no tiene el atributo
RESTRICTED, RACF autoriza el requerimiento.
19. Si se está intentando acceder a un archivo no protegido y la opción PROTECT-ALL está activa
en la SETROPTS en modo FAILURES, RACF rechaza el requerimiento, excepto que el usuario
tenga el atributo SPECIAL a nivel de sistema, en cuyo caso lo autoriza. Si la opción PROTECT-
ALL no está activa, o lo está pero en modo WARNING, RACF autoriza el requerimiento.
Observaciones:
Si la solicitud de acceso es sobre un dataset no catalogado, RACF toma en cuenta además el
seteo de la opción CATDSNS en la SETROPTS, que ya analizamos en el capítulo
correspondiente.
La lista de acceso estándar se chequea siempre antes que la condicional.
La presencia del usuario, o de alguno de sus grupos de conexión (suponiendo que la opción
GRPLIST está activa en la SETROPTS) en la lista de acceso estándar del perfil protector del
recurso previene el eventual acceso que se pueda obtener vía UACC, ID(*) o atributo
OPERATIONS.
Salvo casos puntuales (acceso a archivos “no catalogados” o “no protegidos”), el atributo
SPECIAL no es chequeado en ningún paso durante el proceso. Esto es coherente con lo que ya
hemos señalado, en el sentido de que tal atributo no otorga acceso a recursos.
9 - PROGRAMAS UTILITARIOS
9.2 - IRRUT100
Este utilitario permite localizar en la base todas las ocurrencias de un usuario o grupo dado. Al ser un
programa que debe examinar todos los perfiles de la base, es recomendable ejecutarlo fuera de horarios
pico de actividad, para no impactar negativamente en la performance del sistema.
Hacemos notar que no existe un comando de RACF que permita, dado un usuario o grupo, listar todos
los perfiles dónde figure en las listas de acceso. El utilitario IRRUT100 puede ser usado para obtener
esta información (aunque también existen otros métodos, que mencionaremos más adelante).
Este utilitario siempre toma la información de la base de RACF activa en la LPAR dónde se ejecuta. No
es posible correr el IRRUT100 especificando una base de RACF distinta de la activa.
Ejemplo de IRRUT100:
//REFX100 JOB cuenta,programmer,
// MSGLEVEL=(1,1),MSGCLASS=clase,CLASS=clase,PRTY=valor
//**********************************************************************
//PASO1 EXEC PGM=IRRUT100
//SYSPRINT DD DSN=RACF.IRRUT100.SALIDA,DISP=OLD
//SYSUT1 DD UNIT=SYSDA,SPACE=(TRK,(20,4))
//SYSIN DD *
jef2514 conta
/*
//
Occurrences of CONTA
In standard access list of general resource profile ACCTNUM CONTABILIDAD
In standard access list of general resource profile TSOPROC IKJCONTA
In standard access list of general resource profile TERMINAL FINA* (G)
In standard access list of general resource profile TAPEVOL CON* (G)
In standard access list of dataset profile CONTA.** (G)
First qualifier of profile CONTA.** (G)
In standard access list of dataset profile CONTA.A200%.** (G)
First qualifier of profile CONTA.A200%.** (G)
In standard access list of dataset profile PAGOS.PROVEE.** (G)
In standard access list of dataset profile PUBLIC.** (G)
Group name exists
In subgroup list of group FINANZAS
Connect group for user CONJF01
Default group for user CONJF01
Connect group for user CONJF02
Default group for user CONJF02
Connect group for user JEF2514
(G) - Entity name is generic.
Observemos que la salida no solo muestra la presencia del usuario o grupo en las listas de acceso, sino
también en cualquier otro campo de los perfiles, como ser OWNER o NOTIFY. Incluso informa si el
usuario o grupo especificado es el HLQ de algún perfil de dataset.
Una desventaja importante de la información que brinda el IRRUT100 es que no especifica el nivel de
autoridad con que figura el usuario/grupo en las listas de acceso del los perfiles. Por ejemplo, nos
informa, en nuestro caso, que el usuario JEF2514 está en la lista de acceso estándar del perfil de dataset
CONTA.**, pero no especifica si figura con nivel de autoridad NONE, EXECUTE, READ, UPDATE,
CONTROL o ALTER. En consecuencia, si se pretende definir un nuevo usuario o grupo que tenga
exactamente las mismas autorizaciones que otro existente, no es suficiente la información suministrada
por el IRRUT100.
Autoridad requerida
Para ejecutar el IRRUT100 especificando un determinado usuario o grupo, se debe tener el atributo
SPECIAL o AUDITOR a nivel de sistema o a nivel de un grupo que tenga al usuario o grupo en
cuestión dentro de su campo de acción.
9.3 - IRRUT200
Este utilitario tiene los siguientes usos básicos:
Identifica inconsistencias en la organización interna de la base de RACF. Es solo una
herramienta de diagnóstico, ya que en caso de detectar errores no realiza ninguna reparación.
Informa el porcentaje de utilización efectiva del espacio en la base de RACF. Esta información
es útil para decidir si es necesario un redimensionamiento.
Permite realizar una copia exacta (bloque a bloque) de la base de RACF. Es pues una
herramienta extremadamente útil para realizar un backup en disco de la base.
Permite sincronizar las bases de uso primario y backup.
Observemos, como dato importante, que se informa que el dataset está ocupado en un 41%. Esta es la
única forma de determinar el porcentaje de ocupación efectivo de una base de RACF. Los datasets de
RACF están formateados íntegramente. Por lo tanto, si se listaran sus características de alocación (por
ejemplo, con el comando S en la opción 3.4 Dslist del ISPF), se vería un uso del 100%, que de ninguna
manera refleja su ocupación real.
En este ejemplo el programa utilitario IRRUT200 se emplea para realizar una copia exacta, bloque a
bloque, del dataset de RACF especificado en la DD SYSRACF. La copia se generará en el dataset
RACF.COPIA especificado en SYSUT1, que suponemos prealocado y con idénticas características y
tamaño que la entrada SYS1.BASERACF.
La DD SYSIN definida como DUMMY en este ejemplo establece que no se lleve a cabo ninguna
función de diagnóstico.
En su uso como herramienta de backup, el IRRUT200 solo sirve para realizar una copia de la base a una
que resida en un disco de igual geometría que la original y tenga igual tamaño. El dataset especificado
en SYSUT1 no debe ser nunca una base de RACF activa (en este u otro sistema), ya que el utilitario
podría corromperlo durante la copia. Si se pretende copiar una base a otra de distinto tamaño, debe
usarse el utilitario IRRUT400, que veremos más adelante.
El parámetro PARM=ACTIVATE indica que se quiere copiar la base primaria sobre la de backup (o a
nivel de un dataset específico, si la base estuviera distribuida en más de uno). RACF verificará que
SYSRACF especifique efectivamente la base primaria de RACF y SYSUT1 la de backup. Se
comprobará asimismo que el backup se encuentre inactivo (recordemos que nunca el destino de una
copia debe ser un dataset de RACF activo). Finalizada la copia de SYSRACF (base primaria activa)
sobre SYSUT1 (base de backup inactiva), se activará la base de backup antes de liberarse la base
primaria. Solo de este modo queda garantizado que la base de backup resulte idéntica a la primaria. En
efecto, si en lugar de activar el backup el mismo IRRUT200 lo hiciera un administrador con el comando
RVARY, las eventuales modificaciones sobre la base primaria ocurridas entre la finalización del job y
la ejecución del comando de activación no se verían replicadas el backup.
Con PARM=ACTIVATE, las DD SYSPRINT y SYSIN, si estuvieran presentes, son ignoradas.
Autoridad requerida
Para ejecutar el utilitario IRRUT200, basta con tener autoridad READ sobre el dataset especificado en
SYSRACF y UPDATE sobre el dado por SYSUT1 (o ALTER, si es alocado dinámicamente por el job
como archivo permanente). Naturalmente, si los programas IRRUT200 o IEBGENER estuviesen
protegidos en la clase PROGRAM, se necesita asimismo autoridad para ejecutarlos.
9.4 - IRRUT400
Este utilitario tiene varias funciones:
Permite copiar la base de RACF a otra de tamaño distinto, que puede incluso residir en un disco
de distinta geometría.
Permite distribuir un dataset de la base de RACF en varios datasets. Asimismo, también puede
utilizarse para consolidar varios datasets de la base en una menor cantidad. Recordemos que
RACF admite un máximo de 90 datasets para su base primaria, e idéntica cantidad para la base
de backup.
Identifica cierto tipo de inconsistencias en los datasets de la base, como ser la presencia de
perfiles duplicados.
Reorganiza físicamente la base, juntando los eventuales segmentos de un mismo perfil.
En cualquiera de sus usos, es recomendable ejecutar este utilitario fuera de los horarios pico de
actividad, de modo de no afectar negativamente la performance del sistema.
En la presente guía no analizaremos la funcionalidad del IRRUT400 respecto a la posibilidad de
distribuir (split) o consolidar (merge) los datasets que conforman la base. Nos ocuparemos
exclusivamente del uso del utilitario como herramienta de copia y reorganización. Tampoco
describiremos todos los parámetros que admite el programa, sino el único cuya especificación es
obligatoria.
Si se quiere obtener una copia idéntica, es preferible emplear el utilitario IRRUT200 pues se encarga de
serializar adecuadamente el uso de la base de origen, garantizando una copia completamente fiel de la
original. En cambio, si la copia desea hacerse a una base de distinto tamaño, o residente en un disco de
distinta geometría (de 3380 a 3390, por ejemplo), entonces debe necesariamente utilizarse el
IRRUT400.
El IRRUT400, a diferencia del IRRUT200, no solo copia sino que reorganiza la base. Para comprender
exactamente el alcance del proceso de reorganización, es necesario tener un conocimiento acabado de la
estructura interna de la base de RACF, lo cual excede los objetivos de esta guía. Mencionemos
simplemente que se trata, esencialmente, de una especie de desfragmentación, consistente en reubicar
físicamente contiguos aquellos segmentos correspondientes a un mismo perfil. Si la base se encuentra
muy fragmentada (lo cual puede diagnosticarse a través del IRRUT200), esta reorganización puede
mejorar la performance de RACF, al disminuir la cantidad de lecturas de bloques que RACF debe
realizar para obtener la información completa de un determinado perfil.
Del mismo modo que para el IRRUT200, la base de destino no debe nunca estar activa en ningún
sistema. Más aún, si estuviera activa en el mismo sistema dónde se ejecuta el job, el utilitario falla. En
cambio, la base de origen (esto es, la que se pretende copiar) puede o no estar activa. Si se encuentra
activa, el IRRUT400 permite manejar el bit de lockeo de la base, que establece si la misma se encuentra
lockeada o no-lockeada.
Base lockeada
En este estado, no se permite ninguna actualización sobre la base, con excepción de cierta información
estadística. En consecuencia, no pueden definirse, modificarse o deletearse perfiles, así como tampoco
modificarse opciones de la SETROPTS. Más aún, algunos usuarios no podrán loguearse. Esto sucederá,
por ejemplo, si se trata de su primer logon del día, si intentan cambiar su password, o si han ingresado
su password correcta luego de algún intento inválido.
Estando la base lockeada, el chequeo de autoridad de usuarios sobre recursos se lleva a cabo
normalmente. Por lo tanto, los usuarios que se encuentran logueados a alguna aplicación no deberían
notar ninguna diferencia, excepto naturalmente que intenten modificar información de la base de RACF.
En cualquier caso, solo se justifica tener la base lockeada durante alguna tarea de mantenimiento
específica y por un período muy breve.
Base no-lockeada
Se trata del estado natural de la base, en el cual todas las actualizaciones están permitidas. Las bases de
RACF, tanto la primaria como la backup, deben estar no-lockeadas, salvo que exista una situación que
requiera explícitamente lo contrario, lo cual es poco frecuente y por un período corto de tiempo.
El IRRUT400 permite manejar el bit de lockeo de la base a través de un parámetro obligatorio que debe
tomar alguno de los valores siguientes: LOCKINPUT/NOLOCKINPUT/UNLOCKINPUT. No existe
ningún valor por defecto, por lo cual debe necesariamente codificarse alguna de las 3 opciones, cuyo
significado analizamos a continuación.
LOCKINPUT lockea la base de origen antes de iniciar el proceso de copia. De este modo, se garantiza
que la copia tenga idéntica información que la original, al no permitirse actualizaciones durante el
proceso. Se trata de la opción más recomendable, aunque tiene la desventaja de mantener lockeada la
base de origen durante el tiempo que insume el utilitario, lo cual puede, si se trata de una base activa,
acarrear ciertas dificultades operativas. Si se especificó LOCKINPUT, la base de origen quedará
lockeada aún luego de terminado el proceso de copiado. Si se trata de una base activa que se seguirá
utilizando, es imprescindible deslockearla. Para ello basta con agregar al job un paso adicional, que
invoque nuevamente el programa IRRUT400 pero con el parámetro UNLOCKINPUT.
NOLOCKINPUT no modifica el estado de lockeo de la base de origen. Esto significa que, si estaba
lockeada, permanecerá de este modo, y si no lo estaba (como es de esperar si se trata de una base
activa) permanecerá no-lockeada durante el proceso de copia. En este caso, si se produjeran
modificaciones en la base de origen durante la copia, es posible que la base de destino difiera de la
original, e incluso que resulte corrupta. No se trata, por lo tanto, de una opción aconsejable cuando la
base de origen está activa, excepto que se tenga la seguridad de que la actividad de actualización es
nula. Si la base de origen no está activa en ningún sistema, entonces no es pasible de ser modificada,
por lo cual la opción NOLOCKINPUT sería perfectamente apropiada.
UNLOCKINPUT deslockea la base de origen. Como ya mencionamos, si se ejecutó el IRRUT400 con
el parámetro LOCKINPUT y se pretende seguir usando como base activa a la base de origen, debe
necesariamente deslockearse invocando nuevamente el mismo utilitario con el parámetro
UNLOCKINPUT, tal cual mostramos en el ejemplo siguiente.
Autoridad requerida
Para ejecutar el utilitario IRRUT400 se debe tener autoridad UPDATE sobre el dataset especificado en
INDD1 y UPDATE sobre el definido por OUTDD1 (o ALTER, si es alocado dinámicamente por el
job). Se requiere nivel de autoridad UPDATE sobre la base de origen pues el utilitario permite
eventualmente alterar el bit de lockeo, lo cual es efectivamente una modificación. Aún si se especificó
NOLOCKINPUT, se requiere UPDATE pues RACF chequea por este nivel de autoridad
independientemente del valor puntual del parámetro.
9.5 - IRRDBU00
La base de RACF tiene un formato propio, bastante complejo, que solo interpreta RACF. Si se intenta
mirar directamente la base, se observarán datos distribuidos de manera aparentemente caótica, no
interpretables. Se presenta entonces la necesidad de contar con un programa utilitario que convierta la
información de la base a un formato plano, factible de ser fácilmente interpretado y explotado
programáticamente.
El utilitario IRRDBU00 (DBU viene de Data Base Unload.) permite justamente esto. Transfiere, a un
archivo secuencial, la información de todos los perfiles de la base. El archivo plano generado puede
usarse con diversos fines:
Se puede leer directamente, ya que el diseño de sus registros se encuentra plenamente
documentado en la bibliografía de IBM, más precisamente en el libro “Security Server RACF
Macros and Interfaces”.
Se puede formatear con algún programa propio, para extraer y organizar la información de una
forma conveniente.
Se puede usar para cargar tablas de DB2, para luego poder usar este motor de base de datos para
extraer información.
Se puede transferir a PC y formatearlo con algún programa de este entorno.
Sirve como archivo de entrada a otro utilitario importante que veremos más adelante, llamado
IRRRID00.
El IRRDBU00 puede ejecutarse sobre una base de RACF activa (primaria o backup) o inactiva. Cuando
lee un perfil de la base, el IRRDBU00 serializa el acceso al perfil y recién lo libera al finalizar la
transferencia al archivo secuencial. Naturalmente, debe hacer esto para todos los perfiles de la base. Por
este motivo, resulta aconsejable ejecutarlo tomando como entrada una copia de la base activa, de modo
a no afectar la performance de RACF. Una buena idea sería obtener una copia actual de la base usando
IRRUT200 y a continuación ejecutar el IRRDBU00 sobre la copia recién obtenida. La gran ventaja de
este método en 2 pasos radica en el hecho de que la reserva del IRRUT200 sobre la base activa es
mucho más breve y de menor impacto que la que demanda el IRRDBU00.
Los campos encriptados de la base de RACF, como las passwords, no son transferidos por el
IRRDBU00. Tampoco se copia al archivo secuencial generado la información de la SETROPTS, ni
ningún otro dato de la base que no exista directamente en los perfiles.
Ejemplo de IRRDBU00
//BAJARACF JOB cuenta,programmer,
// MSGLEVEL=(1,1),MSGCLASS=clase,CLASS=clase,PRTY=valor
//**********************************************************************
//BAJADA EXEC PGM=IRRDBU00,PARM=’NOLOCKINPUT’
//INDD1 DD DSN=SYS1.BASERACF.COPIA,DISP=SHR
//OUTDD DD DSN=RACF.PLANO,DISP=OLD
//SYSPRINT DD SYSOUT=clase
//
La DD INDD1 define el dataset de la base de RACF que se quiere bajar a un archivo secuencial. Si se
quiere volcar toda la información de una base particionada en varios datasets, se deben usar
subsiguientes DD de nombre INDDn (n=2, 3, etc).
La DD OUTDD especifica el dataset secuencial de salida dónde se transferirá la información de los
perfiles de los archivos definidos en las INDDn. Debe tener las siguientes características:
RECFM=VB (registros de longitud variable y bloqueados)
LRECL=4096 (longitud de registro sugerida)
Con respecto al tamaño, una estimación inicial consiste en calcular el doble del espacio efectivamente
utilizado en la base de entrada. Por ejemplo, si la base de entrada tiene un tamaño de 50 cilindros y se
encuentra ocupada en un 40% (este porcentaje se puede obtener con el utilitario IRRUT200), esto
significa que hay efectivamente usados 20 cilindros. Por lo tanto, el archivo de salida del IRRDBU00
debería ocupar aproximadamente el doble, es decir 40 cilindros.
En nuestro caso, se supone que el dataset RACF.PLANO se encuentra prealocado.
La DD SYSPRINT establece dónde el utilitario grabará los mensajes de salida. Puede tratarse de un
archivo secuencial (en disco o en cartucho), o bien puede especificarse un dispositivo de salida.
El IRRDBU00 requiere obligatoriamente, al igual que el IRRUT400, la codificación del parámetro que
indica cómo se pretende que el utilitario maneje el bit de lockeo de la base. El significado de las
opciones LOCKINPUT, NOLOCKINPUT y UNLOCKINPUT es análogo al visto en el caso del
IRRUT400, con la siguiente importante diferencia: si se especifica LOCKINPUT y la base de entrada
no se encontraba lockeada, el IRRDBU00 la deslockeará automáticamente al finalizar (contrariamente a
lo que hace el IRRUT400, que la mantiene lockeada).
UNLOCKINPUT tiene por único objeto deslockear el dataset especificado en INDD1. No se hace en
este caso ninguna bajada de información. Cumple, en este punto, una función idéntica al IRRUT400 con
UNLOCKINPUT.
Sugerimos siempre ejecutar el IRRDBU00 sobre una base que no se encuentre activa. En tal caso, el
parámetro de lockeo resulta irrelevante.
Autoridad requerida
Para ejecutar el utilitario IRRDBU00 se necesita autoridad UPDATE sobre el dataset especificado en
INDD1, y UPDATE sobre el definido por OUTDD (o ALTER, si es alocado dinámicamente por el job).
Se requiere nivel de autoridad UPDATE sobre la base de origen debido a que el utilitario permite
eventualmente alterar el bit de lockeo.
9.6 - IRRRID00
Como ya vimos en el capítulo correspondiente, los comandos DELUSER o DELGROUP no eliminan
de la base las referencias que pudieran existir en otros perfiles respecto al usuario o grupo que se borra.
Por ejemplo, un usuario que se pretende eliminar podría existir en listas de acceso, en campos NOTIFY
o ser el OWNER de perfiles. El utilitario IRRRID00 es un buscador de referencias residuales, que no
solo localiza las referencias en la base de un usuario o grupo dado, sino que se encarga de generar los
comandos de RACF necesarios para su eliminación. Se trata de una herramienta fundamental para el
administrador de RACF, ya que posibilita la baja de usuarios y grupos en forma prolija.
Es importante señalar que el IRRRID00 no ejecuta ningún comando. Simplemente genera, en un
archivo de salida, los comandos necesarios para la eliminación de las referencias residuales. Es tarea del
administrador de RACF examinar cuidadosamente (y eventualmente editar) los comandos respectivos,
para luego decidir cuáles de ellos se ejecutaran.
El IRRRID00 utiliza como entrada la bajada plana de la base de RACF generada por el IRRDBU00. Es
pues necesario ejecutar el utilitario IRRDBU00 como paso previo a la utilización del IRRRID00, salvo
que ya se disponga de una bajada plana de la base suficientemente actualizada.
Ejemplo de IRRRID00
//IRRRID JOB cuenta,programmer,
// MSGLEVEL=(1,1),MSGCLASS=clase,CLASS=clase,PRTY=valor
//**********************************************************************
//PASO EXEC PGM=IRRRID00,REGION=25M
//SYSPRINT DD SYSOUT=clase
//SYSOUT DD SYSOUT=clase
//SORTOUT DD UNIT=SYSDA,SPACE=(CYL,(10,2))
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(10,2))
//INDD DD DSN=RACF.PLANO,DISP=SHR
//OUTDD DD DSN=RACF.IRRRID.SALIDA,DISP=OLD
//SYSIN DD *
jef2514
/*
//
Si el usuario o grupo del cual se buscan referencias figura en un campo del cual no puede eliminarse,
como es el caso si es el owner de un perfil, entonces el utilitario generará en la salida el comando
necesario para cambiar esta ocurrencia por el ID de reemplazo especificado. En caso de no codificarse
un “ID de reemplazo”, en el comando de salida figurará en tal caso el usuario/grupo precedido de un ?,
de modo que pueda editarse con un valor apropiado.
Si no se define SYSIN, o bien se aloca como DUMMY o vacía de contenido, el utilitario busca todas las
referencias en la base de usuarios y grupos que ya no existen. Es saludable ejecutar regularmente el
IRRRID00 de esta manera, de modo a detectar y borrar información residual que pueda haber quedado
al no borrarse adecuadamente un usuario o grupo de la base.
En nuestro ejemplo, la SYSIN está inserta dentro del jobstream y establece que se busque toda
referencia en la base respecto al usuario JEF2514.
La salida podría tener el siguiente aspecto:
/****************************************************************************************/
/* */
/* The RACF Remove ID Utility (IRRRID00) was executed on */
/* 2011-09-10 at 14:05:03. */
/* */
/* This file contains RACF commands that can be used to */
/* identify references to user IDs and group IDs. Residual */
/* references on an access list are deleted with the PERMIT */
/* command. For all other references, commands are created to */
/* change the reference to another value. The default value */
/* is ?id. This allows all references to a particular ID to */
/* be easily changed to another value using a text editor. */
/* */
/* Commands to alter ROLE definitions will be created within */
/* comments for informational purposes, though the actual */
/* updates should be made from TME. The ROLE will not be */
/* updated with a replacement value for a group name. */
/* */
/****************************************************************************************/
CONNECT CONJF01 GROUP(CONTA) OWNER(?JEF2514 )
PERMIT 'CONTA.**' GENERIC ID(JEF2514) DELETE
PERMIT 'FINAN.**' GENERIC ID(JEF2514) DELETE
PERMIT FTPDNS CLASS(PROGRAM) ID(JEF2514) DELETE
RALTER PROGRAM FTPDNS NONOTIFY
RALTER PROGRAM FTPDNS OWNER(?JEF2514 )
*****************************************************************************************/
* The following commands delete profiles. You must review */
* these commands, editing them if necessary, and then remove */
* the EXIT statement to allow the execution of the commands. */
*****************************************************************************************/
EXIT
DELDSD 'JEF2514.** '
DELUSER JEF2514
*****************************************************************************************/
* IRRRID00 has successfully completed */
*****************************************************************************************/
Observaciones:
De acuerdo a la información generada, el usuario JEF2514 figura como owner de 1 perfil y de la
conexión de un usuario a un grupo. Por lo tanto, el IRRRID00 genera los correspondientes comandos de
cambio de owner, debiéndose reemplazar ?JEF2514 por el nuevo owner elegido. Si se hubiese
codificado en la SYSIN in “ID de reemplazo” para JEF2514, este ID aparecería en la salida en lugar de
?JEF2514.
Si el usuario figura en el campo NOTIFY de un perfil, como es el caso en nuestro ejemplo, el utilitario
genera directamente el comando de eliminación. No se ofrece reemplazo en este caso, pues se trata de
un campo opcional.
Los comandos que borran perfiles están agrupados al final del archivo de salida, a continuación de una
sentencia EXIT que corta el procesamiento en caso de ejecutarse la Clist generada. Esto es intencional,
ya que al tratarse de comandos más críticos, se evita de esta manera que la ejecución inmediata del
archivo de salida los ejecute. Una vez revisado y editado adecuadamente el archivo de salida, basta con
borrar la sentencia EXIT para que también sean ejecutados estos comandos.
Como uso marginal, puede ejecutarse el IRRRID00 solo con el objeto de hallar todas las referencias en
la base de un determinado usuario/grupo, sin tener la intención de borrarlo. En este caso, el archivo de
salida se usa únicamente como fuente de consulta, y no se ejecuta ninguno de los comandos generados.
La información recabada es similar a la que brinda el IRRUT100. Tampoco se tiene, al igual que sucede
con el IRRUT100, el nivel de autoridad del usuario/grupo sobre los perfiles en cuyas listas de acceso
figura. Aunque esto es perfectamente entendible en el caso del IRRRID00, pues se trata de un uso del
utilitario para el que no fue específicamente desarrollado. No perdamos de vista, sin embargo, que
existe una diferencia importante: mientras que el IRRUT100 lee la base de RACF activa, el IRRRID00
extrae la información de una bajada plana (que puede estar desactualizada respecto de la base real).
Ambos métodos presentan pues ventajas y desventajas, debiendo decidir el administrador cual es el más
apropiado para cada situación.
Autoridad requerida
Para ejecutar el utilitario IRRRID00, basta con tener autoridad READ sobre el dataset especificado en
INDD y UPDATE sobre el definido por OUTDD (o ALTER, si es alocado dinámicamente por el job).
Naturalmente, para poder ejecutar los comandos generados se requiere la autoridad administrativa
correspondiente. De todos modos, el IRRRID00 es básicamente una herramienta para los
administradores de RACF, que deberían tener la autoridad suficiente para ejecutar exitosamente estos
comandos.
9.7 - IRRMIN00
Este utilitario tiene los siguientes posibles usos:
Inicializar un dataset en disco para ser usado como base de RACF
Actualizar los templates de una base de RACF
Reemplazar los templates residentes en memoria por los de la base
Toda base de RACF tiene grabado un cierto tipo de información -de uso interno por parte de RACF-
denominada templates. Se trata, básicamente, de una descripción de los distintos campos de cada tipo de
perfil. La información de los templates, indispensable para el funcionamiento de RACF, es cargada en
memoria en tiempo de IPL. Por lo tanto, aún si se actualizan los templates de la base, solo entrarán en
vigencia luego del próximo IPL o si explícitamente se los activa mediante la opción
PARM=ACTIVATE del IRRMIN00.
Con cada release del z/OS se distribuye una nueva versión del programa utilitario IRRMIN00, residente
en SYS1.LINKLIB. Como una CSECT del programa figuran los templates. En consecuencia, si se
actualizan los templates de una base usando –por ejemplo- el IRRMIN00 del z/OS 1.11, entonces se
grabarán en la base los templates correspondientes a este release del sistema operativo.
A tiempo de IPL, cuando se cargan los templates en memoria, el sistema determina el nivel de los
templates de la base primaria. Si se trata de templates anteriores a los propios del release del sistema
operativo, entonces no se cargan en memoria los de la base sino los que efectivamente corresponden. En
tal caso, en el SYSLOG se graba el mensaje ICH579E, informando que los templates de la base están
downlevel (desactualizados). No se trata de un error serio pues RACF va a funcionar sin problemas.
Conviene, sin embargo, seguir la sugerencia dada en el mensaje y actualizar los templates de la base.
Si una base de RACF es compartida por varias LPAR con distintas versiones del z/OS, se le deben
instalar los templates que correspondan a la versión más actualizada. Por ejemplo, si una base es
compartida por 3 LPAR, 2 de las cuales tienen z/OS 1.9 y la restante z/OS 1.11, la base debe tener los
templates del release 1.11 (las particiones que tienen 1.9 funcionarán sin problemas, ya que RACF
mantiene compatibilidad hacia atrás).
uno de ellos. La base puede estar activa en el sistema cuando se usa PARM=UPDATE, en cuyo caso
RACF obtiene una “reserva exclusiva” sobre ella durante el tiempo que insume la ejecución (mínimo).
Autoridad requerida
Para ejecutar el utilitario IRRMIN00 se debe tener autoridad UPDATE sobre el dataset especificado en
SYSRACF (o ALTER, si se lo está alocando dinámicamente, como en nuestro primer ejemplo). Si el
programa IRRMIN00 se encontrara protegido en la clase PROGRAM, el usuario necesitaría asimismo
estar autorizado para su ejecución.
Nombre Función
BLKUPD Su nombre proviene de Block Update. Se trata de un comando que permite
manipular directamente la base de RACF, con el objeto de resolver problemas
internos. Sólo debe emplearse en situaciones dónde no sea posible reparar los errores
mediante comandos de RACF. Antes de ejecutarlo, es necesario tener un acabado
conocimiento de la estructura interna de la base, ya que un mal uso puede dañarla
irreparablemente. En el libro “Security Server RACF Diagnosis Guide” se puede
encontrar toda la información necesaria sobre el BLKUPD.
IRRADU00 Este utilitario formatea amigablemente los registros de SMF relevantes para la tarea
de auditoría de RACF (tipos 30, 80, 81 y 83). Reemplaza al ya obsoleto, aunque aún
soportado, RACFRW (RACF Report Writer). Técnicamente, este programa funciona
como una exit del IFASMFDP, utilitario estándar de IBM para el resguardo de los
registros de SMF. En el libro “Security Server RACF Auditor’s Guide” se puede
encontrar información detallada sobre este utilitario.
10 - COMANDO RVARY
Los nombres de los datasets de las bases de RACF (primaria y backup) se definen en el módulo de
nombre ICHRDSNT (Data Set Name Table). El orden en que están definidos determina su número de
secuencia. Si las bases estuvieran divididas en varios datasets, será necesario indicar de qué manera se
quiere distribuir la información entre los distintos archivos. Para ello es necesario configurar una tabla
de rangos, que reside en el módulo de nombre ICHRRNG (Range Table). Ambas tablas deben
compilarse y linkeditarse a partir de un módulo fuente en lenguaje assembler. No describiremos en esta
guía su configuración. Solo destacamos que, al no tener instrucciones sino simplemente definiciones de
constantes, no es necesario recompilarlos al migrar el sistema operativo. Son compatibles hacia arriba, y
se pueden simplemente copiar. En cualquier caso, toda la información necesaria sobre ambas tablas está
en el libro “Security Server RACF System Programmer’s Guide”.
Observación:
Aún cuando la organización haya definido passwords para ambas funciones del RVARY, el sistema
seguirá aceptando la password por defecto YES para los operandos ACTIVE, SWITCH y
DATASHARE|NODATASHARE, siempre y cuando se ejecute el comando desde una consola con
autoridad MASTER (notemos que el operando INACTIVE está expresamente excluido de esta
posibilidad). En tal caso, la respuesta YES puede ingresarse desde cualquier consola (lo fundamental es
que tenga autoridad MASTER aquella dónde se ejecuta el comando RVARY). Esta flexibilización tiene
por objeto permitir una recuperación de emergencia, aún si no se dispone de las passwords del RVARY.
De todos modos, un usuario con atributo SPECIAL tiene siempre la posibilidad de cambiar ambas
passwords, aún sin conocer sus valores actuales.
Resulta por lo tanto de suma importancia controlar adecuadamente todas las consolas del sistema con
autoridad MASTER, de modo que solo usuarios debidamente autorizados estén en condiciones de
ejecutar comandos en ellas. Sobre este punto, conviene recalcar que los usuarios con acceso a TSO
pueden habitualmente, desde el SDSF, acceder a una consola con autoridad MASTER a través del
comando ULOG. Resulta pues fundamental limitar la posibilidad de ejecutar comandos de operador
desde SDSF, controlando el uso de la “/” mediante un perfil apropiado en la clase SDSF (o GSDSF, su
correspondiente clase agrupadora).
Autoridad requerida: requiere ingreso por consola de la password para la función SWITCH
Este comando intercambia el uso de los datasets de la base primaria especificados en el operando
DATASET con sus correspondientes archivos de bakup. En efecto, los datasets pertinentes de la base de
backup pasan a tener uso primario, mientras que los originalmente primarios pasan a ser de uso backup,
siendo también inactivados y desalocados.
Si se codifica DATASET(*), o se omite el operando DATASET, el switch actúa para todos los datasets
que conforman la base primaria.
Observaciones:
Para poder switchear, el dataset de backup, que pasará a tener uso primario, debe necesariamente estar
activo. En caso contrario, RACF ignora el comando y emite un mensaje de error.
Como la función de SWITCH intercambia y deja inactivo el nuevo backup, si se pretende volver a la
configuración original mediante la ejecución de un nuevo SWITCH, es necesario previamente reactivar
el backup.
El comando RVARY SWITCH actúa siempre sobre datasets de uso primario. Si se codifica en el
operando DATASET un archivo cuyo uso es de backup, RACF ignora el comando y emite un mensaje
de error.
Ejemplo:
Supongamos que, en el sistema con la configuración dada en el ejemplo anterior, el dataset de nombre
SYS1.BASERACF.PRIM2 se encuentra dañado, por lo cual es necesario trasladar el procesamiento a su
correspondiente dataset de backup. Para ello, debe ejecutarse el siguiente comando:
RVARY SWITCH DATASET(sys1.baseracf.prim2)
Completada la ejecución exitosa del comando, el listado de la nueva configuración arrojaría el siguiente
resultado:
ICH15013I RACF DATABASE STATUS:
ACTIVE USE NUMBER VOLUME DATASET
YES PRIM 1 MVSRES SYS1.BASERACF.PRIM1
YES BACK 1 MVSPR1 SYS1.BASERACF.BACK1
NO BACK 2 *DEALLOC SYS1.BASERACF.PRIM2
YES PRIM 2 MVSPR1 SYS1.BASERACF.BACK2
ICH15020I RVARY COMMAND HAS FINISHED PROCESSING.
En esta situación, debería repararse lo antes posible el dataset dañado (al estar desalocado, es posible
manipularlo), activarlo, switchear nuevamente y finalmente activar el backup para retornar a la
configuración normal.
situación, es de esperar que se produzcan errores (abends). El correspondiente dataset de backup, aún
cuando se encontrara activo, no reemplaza automáticamente al primario. Para ello, debe ejecutarse el
comando de switch adecuado. Solamente ocurre un switch automático a la base de backup si un error de
I/O sobre la base primaria pone offline el disco dónde reside.
Cuando todos los datasets de la base primaria se encuentran inactivos, se produce una situación,
bastante molesta por cierto, conocida como failsoft processing. En estas condiciones, el sistema resulta
prácticamente inoperable, ya que el operador debe aprobar por consola todo intento de acceso a
datasets. Para otro tipo de recursos, el otorgamiento o el rechazo de un requerimiento de acceso queda
en manos de la aplicación o subsistema que lo requiera. Son de esperar, de todos modos, innumerables
inconvenientes. Si el sistema se encuentra en failsoft processing, situación por cierto de emergencia,
debe disminuirse la actividad al mínimo indispensable y tomarse inmediatamente las acciones
necesarias para volver a la normalidad.
Si un dataset de la base de backup está inactivo, RACF continúa procesando de manera normal, solo
que eventualmente no podrá replicar en la base de backup las modificaciones que involucren al
correspondiente dataset primario. Si bien esto no origina ninguna situación crítica, en tanto no impacta
directamente en la seguridad del sistema, tener desactualizada la base de backup no es en absoluto
aconsejable. Si fuera el caso, se debe proceder cuanto antes a resincronizarla con la base primaria,
usando el IRRUT200.
El operando ACTIVE indica que se quiere reactivar los datasets especificados en DATASET. Si se
codifica ACTIVE y se omite DATASET, RACF activará todos los datasets de la base primaria.
El operando INACTIVE indica que se quiere inactivar (y desalocar) los datasets especificados en
DATASET. Si se codifica INACTIVE y se omite DATASET, RACF inactivará todos los datasets de la
base primaria, provocando la entrada del sistema en failsoft processing.
La opción NOCLASSACT del operando INACTIVE permite establecer una lista de clases de la CDT (o
todas, si se codifica *) para las cuales la protección de RACF no estará en efecto mientras se encuentre
la base inactiva.
La opción NOTAPE del operando INACTIVE indica que la protección para cartuchos establecida en la
clase TAPEVOL no estará en efecto mientras se encuentre la base inactiva.
En cualquier caso, la protección vuelve a tomar efecto inmediatamente al reactivar la base. No debe
confundirse esta “inactivación de clases” al momento de inactivar la base con la inactivación habitual de
clases que se establece a nivel de la SETROPTS.