1. Perfis de dataset — discreto vs genérico

O RACF oferece dois tipos de perfil para datasets:

TipoExemploCobre
Discreto PRODUCAO.CLIENTES.DADOS Exatamente um dataset
Genérico com * PRODUCAO.CLIENTES.* Qualquer dataset com esse HLQ.MLQ
Genérico com ** PRODUCAO.** Qualquer dataset a partir desse HLQ

Um perfil genérico PRODUCAO.** cobre todos os datasets que começam com PRODUCAO.. Se existir também um perfil discreto PRODUCAO.CLIENTES.DADOS, o RACF aplica o perfil mais específico que cobre o dataset.

💡 Ordem de precedência de perfis

O RACF sempre aplica o perfil mais específico encontrado: perfil discreto bate genérico com *, que bate genérico com **. Isso permite criar uma regra geral com PRODUCAO.** UACC(NONE) e abrir exceções com perfis mais específicos para datasets específicos.

2. ADDSD — criando perfis

O ADDSD (ADD dataset profile) cria um perfil de proteção:

ADDSD 'dataset.name' UACC(NONE) OWNER(owner) AUDIT(SUCCESS(READ) FAILURES(READ))

Exemplos:

/* Proteger todos os datasets de produção de clientes */ ADDSD 'PRODUCAO.CLIENTES.**' UACC(NONE) OWNER(RACFADM1) /* Proteger dataset de referência (leitura pública) */ ADDSD 'TABELAS.CODIGOS.*' UACC(READ) OWNER(RACFADM1) /* Perfil discreto — dataset específico com auditoria */ ADDSD 'PRODUCAO.SENHAS.MASTER' UACC(NONE) OWNER(SECADMIN) AUDIT(ALL(READ))

O parâmetro AUDIT controla o que é registrado no SMF (System Management Facilities):

Opção AUDITO que registra
NONENada é registrado
SUCCESS(nível)Acessos bem-sucedidos com nível ≥ nível especificado
FAILURES(nível)Acessos negados com nível ≥ nível especificado
ALL(nível)Tudo — sucesso e falha

3. PERMIT — gerenciando a access list

O PERMIT adiciona ou modifica entradas na access list de um perfil:

PERMIT 'dataset.name' ID(userid-ou-grupo) ACCESS(nível)

Exemplos práticos:

/* Dar READ para analistas, UPDATE para DBA */ PERMIT 'PRODUCAO.CLIENTES.**' ID(GRPDESENV) ACCESS(READ) PERMIT 'PRODUCAO.CLIENTES.**' ID(GRPDBA) ACCESS(UPDATE) PERMIT 'PRODUCAO.CLIENTES.**' ID(RACFADM1) ACCESS(ALTER) /* Remover acesso de um usuário específico */ PERMIT 'PRODUCAO.CLIENTES.**' ID(JSILVA) DELETE /* Negar explicitamente um usuário (acesso = NONE) */ PERMIT 'PRODUCAO.CLIENTES.**' ID(CONTRATADO1) ACCESS(NONE)

⚠️ PERMIT ACCESS(NONE) vs DELETE da access list

PERMIT ... ACCESS(NONE) cria uma entrada explícita de negação na access list — o usuário é bloqueado mesmo que seu grupo tenha acesso. Já PERMIT ... DELETE remove o usuário da access list, fazendo o RACF cair para a verificação do grupo e depois o UACC. Essas duas operações têm comportamentos distintos e importantes.

4. LISTDSD — consultando perfis

O LISTDSD exibe os detalhes de um perfil de dataset:

LISTDSD 'PRODUCAO.CLIENTES.**' ALL Saída típica: INFORMATION FOR DATASET PRODUCAO.CLIENTES.** LEVEL OWNER UNIVERSAL ACCESS YOUR ACCESS WARNING 00 RACFADM1 NONE ALTER NO AUDIT=FAILURES(READ) DATA SET NAME=PRODUCAO.CLIENTES.** USER ACCESS LIST: USER ACCESS RACFADM1 ALTER GROUP ACCESS LIST: GROUP ACCESS GRPDESENV READ GRPDBA UPDATE

Para listar todos os perfis que cobrem um dataset específico:

/* Quais perfis cobrem PRODUCAO.CLIENTES.DADOS? */ LISTDSD 'PRODUCAO.CLIENTES.DADOS' GENERIC /* Listar todos os perfis com HLQ PRODUCAO */ LISTDSD 'PRODUCAO.**' GENERIC ALL

5. ALTDSD e DELDSD

O ALTDSD altera um perfil existente — útil para mudar UACC, owner ou configurações de auditoria:

/* Mudar UACC de READ para NONE em dataset de referência */ ALTDSD 'TABELAS.CODIGOS.*' UACC(NONE) /* Ativar auditoria total em dataset sensível */ ALTDSD 'PRODUCAO.SENHAS.MASTER' AUDIT(ALL(READ)) /* Transferir ownership */ ALTDSD 'PRODUCAO.CLIENTES.**' OWNER(GRPDBA) /* Ativar WARNING mode (avisa mas não nega) */ ALTDSD 'NOVOSISTEMA.**' WARNING

O WARNING mode é útil durante implantações: o RACF registra os acessos que seriam negados, mas não os bloqueia — permite mapear as permissões necessárias antes de ativar a proteção real.

O DELDSD remove o perfil:

DELDSD 'TABELAS.CODIGOS.*' /* Atenção: datasets cobertos pelo perfil ficam sem proteção! */

6. Cenários práticos

Dois cenários completos que aparecem em ambientes reais:

Cenário A — Implantar novo sistema de folha de pagamento:

/* 1. Criar perfil genérico bloqueando tudo */ ADDSD 'FOLHA.**' UACC(NONE) OWNER(RACFADM1) /* 2. Dar acesso aos grupos */ PERMIT 'FOLHA.**' ID(GRPFOLHA) ACCESS(UPDATE) PERMIT 'FOLHA.**' ID(GRPCONTAB) ACCESS(READ) PERMIT 'FOLHA.**' ID(GRPAUDIT) ACCESS(READ) /* 3. Perfil discreto mais restrito para arquivo de senhas */ ADDSD 'FOLHA.SENHAS.MASTER' UACC(NONE) OWNER(SECADMIN) AUDIT(ALL(READ)) PERMIT 'FOLHA.SENHAS.MASTER' ID(SECADMIN) ACCESS(ALTER)

Cenário B — Investigar quem tem acesso a um dataset:

/* Verificar o perfil mais específico que cobre o dataset */ LISTDSD 'FOLHA.PAGAMENTO.DEZEMBRO' GENERIC ALL /* Verificar acesso de um usuário específico */ LISTDSD 'FOLHA.**' ALL AUTH(JSILVA) /* Ver todos os datasets protegidos no HLQ FOLHA */ LISTDSD 'FOLHA.**' GENERIC