Datasets são o ativo mais protegido do mainframe. O RACF protege datasets por meio de perfis de dataset — regras que definem quem pode ler, atualizar ou deletar cada dataset. Aqui você aprende a criar perfis discretos e genéricos com ADDSD, gerenciar a access list com PERMIT, consultar com LISTDSD e remover com DELDSD.
1. Perfis de dataset — discreto vs genérico
O RACF oferece dois tipos de perfil para datasets:
| Tipo | Exemplo | Cobre |
| 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 AUDIT | O que registra |
NONE | Nada é 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