☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

quarta-feira, 9 de outubro de 2019

UMINEKO NO NAKU KORO NI — O ANIME QUE TRANSFORMOU UM CRIME IMPOSSÍVEL EM UMA GUERRA ENTRE LÓGICA, MAGIA E VERDADE

 

Bellacosa Mainframe e o operador louco em Umineko no Naku Koro Ni

☕💣🦋 OPERADOR, A BRUXA ACABOU DE ALTERAR O LOG DO SISTEMA!

UMINEKO NO NAKU KORO NI — O ANIME QUE TRANSFORMOU UM CRIME IMPOSSÍVEL EM UMA GUERRA ENTRE LÓGICA, MAGIA E VERDADE

"Sem amor, a verdade não pode ser vista."

Poucas obras conseguem dividir tanto o público quanto Umineko no Naku Koro ni.

Para alguns, é um anime de mistério.

Para outros, é uma história sobre assassinatos em uma ilha isolada.

Para os fãs mais dedicados, é uma das narrativas mais inteligentes já criadas na cultura pop japonesa.

E para quem vem do mundo Mainframe?

É como analisar um dump onde existem simultaneamente duas causas-raiz válidas para o mesmo abend.


Ficha Técnica

Título Original

うみねこのなく頃に
(Umineko no Naku Koro ni)

Tradução

Quando as Gaivotas Choram

Autor

Ryukishi07

Estúdio

Studio DEEN

Diretor

Chiaki Kon

Exibição Original

Julho de 2009 a dezembro de 2009

Episódios

26 episódios

Origem

Visual Novel da 07th Expansion

Gêneros

  • Mistério

  • Terror Psicológico

  • Suspense

  • Drama

  • Sobrenatural

  • Metaficção

  • Thriller Intelectual

Classificação

16+


O Que é Umineko?

Imagine uma mistura de:

  • Agatha Christie

  • Sherlock Holmes

  • Higurashi

  • Xadrez

  • Filosofia

  • Computação Quântica

Tudo isso dentro de uma mansão isolada durante uma tempestade.

Esse é o ponto de partida.


A Sinopse

Em 1986, a poderosa família Ushiromiya reúne-se na ilha privada de Rokkenjima.

O patriarca Kinzo está morrendo.

Sua fortuna é gigantesca.

A herança precisa ser decidida.

Mas então algo acontece.

Uma sequência de assassinatos impossíveis começa.

Corpos aparecem.

Salas trancadas surgem.

Pessoas desaparecem.

E uma figura misteriosa reivindica a autoria:

Beatrice

A Bruxa Dourada.

A partir desse momento surge a grande pergunta:

Foi um humano?

ou

Foi magia?


O Mainframe de Rokkenjima

No estilo Bellacosa Mainframe:

Imagine que existe um JOB.

O output diz:

STEP001 COMPLETED RC=0000

Mas o SYSLOG informa:

JOB CANCELADO POR EVENTO SOBRENATURAL

Os dois logs parecem corretos.

Os dois possuem evidências.

Os dois possuem timestamps válidos.

A partir daí começa Umineko.


Quem Foi Ryukishi07?

Antes de virar escritor, Ryukishi07 trabalhava no setor público japonês.

Ele observava conflitos familiares, dramas humanos e problemas sociais.

Essas experiências influenciaram profundamente sua escrita.

Diferente de muitos autores de mistério:

Ele não queria apenas responder perguntas.

Ele queria questionar a própria natureza da verdade.


Os Personagens Principais

Battler Ushiromiya

Representa a lógica.

Seu papel é provar que:

  • Bruxas não existem

  • Magia não existe

  • Tudo possui explicação racional

É praticamente um auditor investigando inconsistências no sistema.


Beatrice

A Bruxa Dourada.

Representa:

  • Fantasia

  • Emoções

  • Narrativas

  • Interpretações

Ela desafia constantemente a visão racional de Battler.


Kinzo Ushiromiya

O patriarca.

Obcecado por ocultismo.

Sua presença influencia todos os acontecimentos da ilha.


Maria Ushiromiya

Uma das personagens mais importantes da obra.

Apesar da aparência infantil, é uma das chaves para compreender a filosofia da história.


O Grande Diferencial

A maioria dos mistérios faz a pergunta:

Quem matou?

Umineko faz outra pergunta:

Como você sabe que sabe?

É uma diferença gigantesca.

A obra ataca diretamente conceitos como:

  • Verdade

  • Memória

  • Narrativa

  • Testemunho

  • Interpretação

  • Realidade


O Sistema de Verdades

Uma das mecânicas mais famosas.

Verdade Vermelha

Quando algo é dito em vermelho:

É absolutamente verdadeiro.

Não pode ser contestado.


Verdade Azul

Hipóteses lógicas.

Tentativas de desmontar a narrativa.


Verdade Dourada

Introduzida posteriormente na obra original.

Relacionada à aceitação de determinadas interpretações.


O Xadrez Narrativo

Umineko funciona como uma partida de xadrez.

Beatrice move uma peça.

Battler responde.

Nova jogada.

Nova teoria.

Novo contra-ataque.

Cada arco é uma partida diferente.


As Mensagens Ocultas

Aqui encontramos a genialidade da obra.

Na superfície:

É um mistério.

Debaixo da superfície:

É uma análise sobre:

Empatia

Nem toda verdade deve ser observada friamente.


Família

Os Ushiromiya representam décadas de ressentimentos acumulados.


Ganância

A herança move praticamente todos os personagens.


Solidão

Um dos temas centrais da obra.

Muitos personagens estão desesperadamente tentando ser compreendidos.


A Necessidade de Narrativas

O ser humano cria histórias para suportar a realidade.


Sem Amor, a Verdade Não Pode Ser Vista

Essa frase é o coração de Umineko.

Ela não significa ignorar fatos.

Ela significa:

Fatos sem contexto humano podem produzir conclusões incorretas.

É uma crítica poderosa ao excesso de racionalidade.


O Anime Tem Problemas?

Sim.

E muitos.

O anime cobre apenas os arcos conhecidos como:

Question Arcs

Ele nunca adaptou completamente os:

Answer Arcs

Ou seja:

Muitas respostas simplesmente não aparecem.

Por isso diversos espectadores terminam a série confusos.


O Studio DEEN Acertou ou Errou?

Os dois.

Acertos

  • Atmosfera gótica

  • Trilha sonora

  • Visual da Beatrice

  • Clima de mistério

Problemas

  • Ritmo acelerado

  • Cortes importantes

  • Explicações ausentes

  • Simplificação excessiva

Por isso a Visual Novel continua sendo considerada a experiência definitiva.


Houve Censura?

Sim, em certo nível.

Não exatamente censura governamental.

Mas adaptação.

Diversas cenas violentas da Visual Novel foram suavizadas.

Além disso:

Muitas explicações complexas foram removidas para caber em 26 episódios.

O resultado foi uma versão menos brutal e menos detalhada.


Impacto Cultural

Embora não tenha sido um sucesso gigantesco na TV, Umineko tornou-se cult.

Sua influência aparece em:

  • Discussões sobre metaficção

  • Comunidades de mistério

  • Visual Novels modernas

  • Teorias narrativas

  • Jogos investigativos

Até hoje existem fóruns debatendo detalhes da história.

Mais de quinze anos depois.


Por Que Os Fãs São Tão Obcecados?

Porque Umineko não entrega tudo.

Ela obriga você a participar.

Você deixa de ser espectador.

Você vira investigador.

Cada detalhe pode esconder uma pista.

Cada frase pode ter dois significados.

Cada cena pode ser:

  • literal

  • simbólica

  • emocional

  • metafórica

ou tudo ao mesmo tempo.


A Grande Curiosidade Bellacosa Mainframe

Se Higurashi é um sistema travando repetidamente por causa de um bug oculto...

Umineko é o auditor tentando descobrir se o bug realmente existe ou se alguém alterou os logs para que você acreditasse nisso.

E o mais assustador:

Às vezes as duas explicações funcionam.


Veredito Final

Anime: 8/10

Visual Novel: 10/10

Complexidade Narrativa: 10/10

Mistério: 10/10

Acessibilidade para iniciantes: 5/10

Capacidade de explodir sua mente: 11/10

☕☕☕☕☕ Classificação Bellacosa Mainframe

Umineko no Naku Koro ni não é apenas um anime.

É um gigantesco processo de auditoria da verdade humana.

E quando você finalmente entende o que aconteceu em Rokkenjima, descobre que a questão nunca foi descobrir quem era a bruxa.

A questão era descobrir por que alguém precisou criá-la. ☕💣🦋


terça-feira, 8 de outubro de 2019

☕💥 A Jornada do Padawan COBOL – Parte 10 Desvendando o Universo dos CALLs no Mainframe

 

Brellacosa Mainframe apresenta call em cobol parte X

☕💥 A Jornada do Padawan COBOL – Parte 10

Desvendando o Universo dos CALLs no Mainframe

Telum II, Spyre AI Accelerator, Quantum-Safe Cryptography, OpenTelemetry, Zowe, Ansible, DevOps e a Nova Ordem dos Arquitetos IBM Z

Ou como descobrir que o Mainframe não apenas sobreviveu ao futuro, mas decidiu construí-lo

Por Vagner Bellacosa – Bellacosa Mainframe


O dia em que o Padawan descobre que o Mainframe virou plataforma de IA

Após nove capítulos, nosso Padawan acredita finalmente ter dominado os mistérios do CALL.

Ele conhece:

✅ Binder

✅ LE

✅ JES2

✅ RMF

✅ SMF

✅ Crypto Express

✅ CICS

✅ Cross Memory

Então surge uma pergunta.


O Mainframe consegue executar IA?

Resposta curta.

Sim.

Resposta longa.

Muito melhor do que muita gente imagina.


Telum II

Pouca gente percebeu.

IBM mudou o jogo.

Novamente.


Telum II é a evolução do processador Telum.

Possui:

Mais cache

Mais aceleração IA

Inferência em tempo real

Maior largura de banda


Visualmente

CALL AUTORIZA

↓

Modelo IA

↓

Avalia fraude

↓

Retorna Score

↓

Autoriza PIX

↓

Cliente feliz

Tempo total?

Milissegundos.


Spyre Accelerator

Território dos arquitetos.


É um acelerador dedicado.

Projetado para IA.


Objetivos:

LLM

Fraude

AML

Detecção anomalias

Predição


Imagine:

CALL 'ANTI-FRAUDE'

Internamente.

Pode ocorrer:

COBOL

↓

CICS

↓

Modelo IA

↓

Spyre

↓

Score

↓

DB2

↓

Resposta

Quantum Safe Cryptography

IBM pensa décadas à frente.


Hoje.

RSA.

ECC.


Amanhã.

Computadores quânticos.


IBM já trabalha com:

CRYSTALS-Kyber

CRYSTALS-Dilithium


Objetivo.

Preparar bancos.

Antes do problema existir.


OpenTelemetry

Padawan conhece.

Prometheus.

Grafana.

Jaeger.

IBM respondeu.


OpenTelemetry no zOS.


Podemos rastrear.

CALL.

SQL.

MQ.

REST.

CICS.


Visualmente

COBOL

↓

OpenTelemetry

↓

Collector

↓

Grafana

↓

Dashboard

Exemplo

Antes.

Problema misterioso.


Depois.

Dashboard.

Mostra.

Tempo.

CPU.

MQ.

DB2.

API.


Zowe

A revolução silenciosa.


Padawan antigo.

ISPF.

TSO.


Padawan moderno.

VSCode.

Git.

CLI.

REST.


Exemplo

zowe jobs list jobs

Ou.

zowe files upload

VSCode

Pode editar.

COBOL.

JCL.

Assembler.

REXX.


Com autocomplete.

Lint.

Debug.


Git no Mainframe

Veteranos estranham.

Jovens adoram.


Hoje temos.

Git.

GitLab.

GitHub.

IDz.

DBB.


DBB

Dependency Based Build


Praticamente.

Maven.

Do Mainframe.


Automatiza.

Compile.

Bind.

Linkedit.

Testes.

Deploy.


Ansible

Padawan sorri.

Sysprog também.


Exemplo.

Provisionar.

CICS.

MQ.

USS.


Playbook.

---
hosts: zos

tasks:

- start_cics

DevOps IBM Z

Pipeline moderna.


Visualmente

Git

↓

Commit

↓

Jenkins

↓

DBB

↓

Compile

↓

Unit Test

↓

Deploy

↓

Production

Galasa

Poucos conhecem.


Fantástico.


Testes automatizados.

CICS.

Batch.

MQ.

DB2.


OpenAPI

Hoje.

COBOL pode gerar.

Swagger.


Cliente.

Nem imagina.

Que existe COBOL.


Ele apenas vê.

POST

/api/pix

Observabilidade

Palavra bonita.

Muito importante.


Métricas.

Logs.

Traces.


Exemplo.

CALL CPFVAL


32 ms



SQL


8 ms



MQ


2 ms



API


15 ms

Problema resolvido.

Rapidamente.


Platform Engineering

Nova moda.

IBM já fazia.

Há décadas.


Sysplex.

WLM.

Automation.

Provisioning.


Hoje ganhou.

Nome bonito.


IA para Mainframe

Já existe.


Watsonx.

Copilot.

Assistentes.

Análise código.


Exemplo.

Perguntar.

Por que este COBOL deu S0C7?

IA responde.

Sugere correção.


Easter Egg IBM

Existe um grupo.

De profissionais.

Que conseguem.

Usar.

COBOL.

Git.

Zowe.

Ansible.

Terraform.

Kubernetes.

OpenTelemetry.

IA.

MQ.

DB2.

Assembler.


E ainda.

Conseguem.

Explicar tudo.

Em um café.


São conhecidos.

Como.

Arquitetos da Nova Ordem IBM Z


Checklist Jedi

✅ Estudar Telum II

✅ Conhecer Spyre

✅ Aprender OpenTelemetry

✅ Instalar Zowe

✅ Conhecer DBB

✅ Automatizar com Ansible

✅ Explorar Galasa

✅ Entender Quantum Safe

✅ Aprender Git

✅ Integrar APIs

✅ Testar IA


A Filosofia Jedi da Parte 10

O Padawan iniciante acredita:

Mainframe é legado.

O desenvolvedor intermediário pensa:

Mainframe é estável.

O especialista compreende:

Mainframe é uma plataforma moderna.

O Arquiteto IBM Z entende algo ainda maior:

O Mainframe nunca foi uma tecnologia presa ao passado.

Ele apenas teve a rara capacidade de continuar evoluindo sem descartar aquilo que funciona.

Enquanto muitas plataformas nasceram, cresceram e desapareceram em poucas décadas, o IBM Z continuou refinando sua arquitetura, incorporando criptografia avançada, IA embarcada, observabilidade, DevOps, APIs, automação e aceleração de inferência, mantendo a mesma promessa feita há mais de cinquenta anos:

Processar o trabalho mais importante do planeta com segurança, disponibilidade e eficiência.


Próxima aventura do Padawan COBOL – Parte 11

"As Crônicas Perdidas do IBM Z: GRS, ENQ/DEQ, RESERVE, Catalog Internals, VVDS, VTOC, UCB, IOS, Channel Subsystem, FICON, PDFs, PIDB e os mistérios que poucos Sysprogs ousam explorar."


segunda-feira, 7 de outubro de 2019

🕯️ John Constantine e a API dos Condenados Requests, Responses, HTTP, JSON, autenticação, autorização, Test Data, ambientes, segurança, automação e aquele 200 OK

 

Bellacosa Mainframe e as APIs

☕ Um Café no Bellacosa Mainframe

🕯️ John Constantine e a API dos Condenados

Requests, Responses, HTTP, JSON, autenticação, autorização, Test Data, ambientes, segurança, automação e aquele 200 OK que jurava que estava tudo bem

Há uma regra que aprendi depois de muitos anos diante de terminais verdes, JCLs, CICS, dumps, arquivos VSAM e bancos de dados:

quando um sistema diz que está tudo bem depressa demais, comece a desconfiar.

John Constantine provavelmente concordaria.

Constantine não é exatamente o sujeito que você chama quando a torneira está vazando. Ele aparece quando a torneira começa a falar latim, o encanador desaparece e alguém encontra um pentagrama desenhado atrás da caixa-d'água.

Com APIs acontece algo semelhante.

Você manda:

GET /customers/42

e recebe:

HTTP/1.1 200 OK

O programador iniciante sorri.

Constantine acende um cigarro imaginário, olha para o monitor e pergunta:

— OK para quem?

Essa é a pergunta que guiará nossa investigação.

Porque uma API pode responder 200 OK enquanto devolve os dados errados. Pode autenticar João e entregar os registros de Maria. Pode registrar uma compra duas vezes. Pode diminuir o estoque três vezes. Pode devolver um CPF que jamais deveria estar naquela resposta.

E existe algo ainda mais diabólico.

Às vezes o sistema está certo...

...e o teste é que está errado.

Bem-vindo ao submundo de API Testing.



🕯️ CAPÍTULO 1 — O que diabos é uma API?

API significa:

Application Programming Interface.

Uma definição simples seria:

uma interface que permite que dois componentes de software se comuniquem seguindo regras previamente estabelecidas.

O exemplo clássico é o restaurante.

Temos:

CLIENTE
   ↓
GARÇOM
   ↓
COZINHA

O cliente não entra na cozinha para preparar o prato.

Ele faz um pedido.

O garçom leva esse pedido à cozinha.

A cozinha trabalha.

O garçom retorna com o resultado.

No mundo computacional:

APLICAÇÃO
    ↓
   API
    ↓
SERVIDOR

Uma aplicação meteorológica poderia solicitar:

GET /weather?city=Itatiba

e receber:

{
  "temp": 28,
  "condition": "Cloudy"
}

A aplicação não precisa saber como o servidor calculou aquilo.

Pode haver Python lá atrás.

Java.

Node.js.

Ou algo bem mais interessante para nós:

APP
 │
 ▼
REST API
 │
 ▼
API Gateway
 │
 ▼
z/OS Connect
 │
 ▼
CICS
 │
 ▼
COBOL
 │
 ├── Db2
 ├── VSAM
 ├── IMS
 └── MQ

Para quem chamou a API, isso deveria ser transparente.

Esse é o primeiro princípio importante:

a API oferece um contrato, não uma visita guiada à implementação.



🔮 CAPÍTULO 2 — O contrato

Constantine conhece contratos.

Normalmente os dele envolvem demônios, almas e cláusulas que ninguém deveria assinar sem ler as letras pequenas.

APIs também possuem contratos.

Se estabelecemos:

GET /users/42

podemos definir que a resposta bem-sucedida será:

200 OK
Content-Type: application/json

com:

{
  "id": 42,
  "name": "Asha",
  "active": true
}

Isso estabelece expectativas.

id deve existir.

id deve ser numérico.

name deve ser texto.

active deve ser booleano.

Portanto:

"id": 42

e:

"id": "42"

não são necessariamente equivalentes.

Um frontend permissivo talvez converta silenciosamente um para o outro.

O contrato não deveria depender dessa benevolência.

É justamente aí que entram schemas e especificações como OpenAPI: eles tornam parte dessas expectativas formalmente verificáveis.



🩸 CAPÍTULO 3 — Request e Response

Toda invocação começa com um pedido.

Por exemplo:

POST /users
Content-Type: application/json

Body:

{
  "name": "Asha",
  "role": "Tester"
}

O servidor poderia responder:

201 Created

e:

{
  "id": 42,
  "name": "Asha",
  "role": "Tester"
}

Temos então:

REQUEST
   ↓
API
   ↓
PROCESSAMENTO
   ↓
RESPONSE

O REQUEST é a pergunta.

O RESPONSE é a resposta.

Mas o investigador competente guarda ambos quando alguma coisa dá errado.

Porque perguntar:

"Por que a API falhou?"

sem saber exatamente qual request foi enviado é quase tão produtivo quanto perguntar a Constantine:

"Alguma coisa sobrenatural aconteceu ontem. Descubra."



🪦 CAPÍTULO 4 — Os cinco rituais HTTP

Os métodos mais comuns são:

GET     → consultar
POST    → criar/processar
PUT     → substituir
PATCH   → alterar parcialmente
DELETE  → remover

Uma sequência CRUD poderia ser:

POST   /users
GET    /users/42
PATCH  /users/42
DELETE /users/42

Mas cuidado com uma simplificação comum.

HTTP não é CRUD.

Podemos perfeitamente encontrar:

POST /payments/123/capture

Nesse caso não estamos simplesmente dizendo "CREATE".

Estamos solicitando uma operação de negócio.

Existem ainda métodos como HEAD e OPTIONS, e os métodos permitidos também fazem parte da superfície que merece testes de segurança. A OWASP recomenda verificar métodos HTTP disponíveis e controles de acesso associados, inclusive tentando operações com métodos alternativos quando apropriado.



🚪 CAPÍTULO 5 — URL: o endereço da casa assombrada

Considere:

https://api.shop.com/v1/products/42?currency=BRL

Podemos desmontá-la:

https://api.shop.com
        │
        └── Base URL

/v1/products/42
        │
        └── endpoint/recurso

42
│
└── path parameter

currency=BRL
│
└── query parameter

E imediatamente surgem testes.

Produto existente:

42

Produto inexistente:

999999999

Valor estranho:

-1

Moeda válida:

BRL

Moeda inválida:

MORDOR

Campo ausente.

Campo vazio.

Valor enorme.

Caracteres especiais.

É aqui que o QA começa a se comportar como Constantine:

não pergunta somente o que deveria funcionar; pergunta também o que acontece quando alguém faz aquilo que não deveria.


🔑 CAPÍTULO 6 — Headers: símbolos desenhados na porta

Uma requisição pode carregar informações adicionais:

Content-Type: application/json
Accept: application/json
Authorization: Bearer eyJ...
X-Request-ID: abc-123

Cada header possui uma função.

Content-Type informa o formato enviado.

Accept pode expressar o formato desejado.

Authorization transporta informações necessárias à autenticação/autorização conforme o mecanismo adotado.

E X-Request-ID, ou outro correlation ID equivalente, pode ser extremamente útil.

Imagine:

Browser
   ↓ abc-123
API Gateway
   ↓ abc-123
z/OS Connect
   ↓ abc-123
CICS
   ↓ abc-123
COBOL
   ↓ abc-123
MQ

Quando tudo explode às 03:17, você procura:

abc-123

e consegue reconstruir a passagem daquela transação pelos diversos componentes.

Nos sistemas distribuídos, correlação é praticamente trabalho de detetive.


👹 CAPÍTULO 7 — Os números da besta... HTTP

Não é exatamente 666.

Temos famílias:

1xx → informacional
2xx → sucesso
3xx → redirecionamento
4xx → problema relacionado à requisição/cliente
5xx → falha do lado servidor

Alguns velhos conhecidos:

200 OK
201 Created
204 No Content
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
409 Conflict
429 Too Many Requests
500 Internal Server Error
503 Service Unavailable

Mas existe uma distinção especialmente importante:

401 ≠ 403

Simplificando:

401 — você não está adequadamente autenticado.

403 — sabemos quem você é, mas você não pode fazer aquilo.

É a diferença entre Constantine chegar à porta sem a chave e chegar com a chave correta de uma sala para a qual ele continua não tendo autorização.


🧿 CAPÍTULO 8 — Authentication não é Authorization

Temos duas perguntas:

AUTHENTICATION
Quem é você?

AUTHORIZATION
O que você pode fazer?

Considere:

João → autenticado
Maria → autenticada

Isso não significa:

João → pode consultar dados privados de Maria

Teste:

GET /users/43
Authorization: Bearer TOKEN_DO_JOAO

Se 43 pertence a Maria e João não possui autorização para acessar aquele objeto, a aplicação precisa impedir o acesso.

Esse tipo de vulnerabilidade é importante o bastante para aparecer como Broken Object Level Authorization — BOLA no OWASP API Security Top 10.

O teste profissional, portanto, não pergunta apenas:

Tenho token?

Pergunta:

TOKEN A pode acessar RECURSO A?
TOKEN A pode acessar RECURSO B?
TOKEN B pode acessar RECURSO A?

USER pode executar operação ADMIN?
ADMIN pode?

GET é permitido?
DELETE também?
PATCH?

É uma matriz.

ATOR × RECURSO × AÇÃO

A OWASP descreve justamente esse modelo ator–recurso–ação como uma forma útil de representar e automatizar testes de autorização.


🧪 CAPÍTULO 9 — Positive, Negative e Boundary Testing

Suponha:

idade permitida = 18 até 60

Teste positivo:

25 → ACCEPT

Teste negativo:

"CONSTANTINE" → REJECT

Agora vêm os limites:

17
18
60
61

Por quê?

Porque um humilde:

IF WS-AGE > 18

em vez de:

IF WS-AGE >= 18

pode mandar o jovem de exatamente 18 anos diretamente para o purgatório da regra de negócio.

Os bugs adoram morar nas fronteiras.

Isso vale para:

quantidade
tamanho de senha
valor financeiro
número de itens
datas
paginação
strings
limites de crédito

Sempre pergunte:

o que acontece exatamente antes, exatamente no limite e exatamente depois?


🧟 CAPÍTULO 10 — Um erro correto também é PASS

Esta é deliciosa.

Mandamos:

{}

para uma operação que exige email.

Esperamos:

400

ou talvez 422, conforme o contrato adotado.

E algo como:

{
  "code": "EMAIL_REQUIRED",
  "message": "Email is required",
  "field": "email"
}

Se a aplicação rejeitar corretamente a requisição inválida...

o teste passou.

Parece contraditório somente enquanto confundimos:

API retornou erro

com:

TESTE falhou

Um teste negativo pode perfeitamente produzir:

HTTP ERROR + TEST PASS

O que seria ruim?

Enviar uma requisição inválida e receber:

500 Internal Server Error

quando o contrato previa uma rejeição controlada.

Ou pior:

400 Bad Request

mas metade da transação já foi gravada.

Constantine abre o banco de dados.

E encontra o demônio escondido lá.


🏦 CAPÍTULO 11 — COMMIT e ROLLBACK entram no exorcismo

Agora o mainframeiro começa a sorrir.

Imagine:

Criar pedido
   ↓
Debitar limite
   ↓
Diminuir estoque
   ↓
Criar pagamento

A terceira etapa falha.

O que acontece?

Se o sistema deveria tratar tudo como uma unidade lógica de trabalho, talvez esperemos:

ROLLBACK

e não:

pedido criado
limite debitado
estoque inalterado
pagamento inexistente

Esse é o tipo de criatura que aparece quando testamos apenas o status HTTP.

Recebemos:

500

e pensamos:

"Certo, falhou."

Não.

A investigação ainda não terminou.

Precisamos verificar o estado persistente.


💳 CAPÍTULO 12 — O demônio da duplicidade

Nosso BELLACARD recebe:

COMPRA = R$ 100

O cliente chama a API.

Timeout.

Não sabe se a compra aconteceu.

Tenta novamente.

Agora imagine:

REQUEST #1 → R$100
REQUEST #2 → R$100

Resultado:

R$200

Temos um problema gigantesco.

Em sistemas financeiros, retries, idempotência e mecanismos de deduplicação precisam ser considerados seriamente.

O teste não deveria perguntar somente:

A compra funcionou?

Mas:

O que acontece se a mesma operação chegar novamente?

Em determinadas APIs podemos encontrar mecanismos como:

Idempotency-Key: 8d937...

permitindo reconhecer repetições da mesma intenção.

A pergunta Constantine seria:

Quantas vezes o ritual foi executado quando o cliente jurava tê-lo invocado uma vez?


🪜 CAPÍTULO 13 — A escada dos ambientes

Agora chegamos à nova peça do quebra-cabeça:

LOCAL
  ↓
 QA
  ↓
STAGE
  ↓
PRODUCTION-LIKE

Em organizações reais podemos encontrar inúmeras variações:

DEV
INTEGRATION
QA
SIT
UAT
STAGING
PRE-PROD
PROD

Os nomes são menos importantes que o princípio.

Queremos promover software por ambientes controlados até chegarmos à produção.

No mundo mainframe isso não deveria causar nenhum choque.

Temos há décadas coisas como:

CICSD
CICST
CICSQ
CICSP

ou:

DB2D
DB2T
DB2Q
DB2P

e datasets:

BELLACOSA.DEV.CLIENTES
BELLACOSA.QA.CLIENTES
BELLACOSA.PROD.CLIENTES

DevOps não inventou a separação de ambientes.

Só mudou boa parte do vocabulário e das ferramentas.


🧙 CAPÍTULO 14 — BASE_URL: o DDNAME das APIs

Podemos ter:

BASE_URL=https://qa.api.example.com
TOKEN=***
USER_ID=42

e o teste:

await request.get(
    `${BASE_URL}/users/${USER_ID}`
);

Em Stage:

BASE_URL=https://stage.api.example.com

Em QA:

BASE_URL=https://qa.api.example.com

O teste permanece essencialmente igual.

Isso deveria soar familiar ao programador COBOL.

Em vez de amarrar recursos diretamente ao programa, usamos mecanismos externos de configuração.

No JCL:

//CLIENTE DD DSN=BELLACOSA.QA.CLIENTES,DISP=SHR

e posteriormente:

//CLIENTE DD DSN=BELLACOSA.PROD.CLIENTES,DISP=SHR

O programa não precisa ser recompilado porque mudamos de dataset.

O mesmo princípio reaparece no mundo moderno:

separe código de configuração.


☠️ CAPÍTULO 15 — .env não é um círculo mágico

Um arquivo:

.env.qa

pode conter configuração de QA.

Ótimo.

Mas cuidado:

.env ≠ Secret Vault

Colocar:

PASSWORD=123456
TOKEN=abc123

fora do source principal não torna magicamente esses valores seguros.

Segredos exigem tratamento apropriado durante armazenamento, distribuição, utilização, logging e rotação. A OWASP recomenda evitar segredos hardcoded, minimizar sua exposição e usar soluções adequadas de gestão de segredos conforme a arquitetura.

E jamais faça:

console.log(token);

e depois mande o log inteiro para:

CI REPORT
LOG SERVER
EMAIL
SLACK
ARQUIVO

Você acabou de transformar observabilidade em distribuição de credenciais.


👥 CAPÍTULO 16 — O fantasma chamado USER_ID=42

Suponha que todos os testes utilizem:

USER_ID=42

Pipeline A:

altera usuário 42

Pipeline B:

remove usuário 42

Pipeline C:

consulta usuário 42

Agora temos:

A ──┐
B ──┼── USER 42
C ──┘

Resultado?

Caos.

Um teste passa.

Outro falha.

Executamos novamente.

Passa.

Executamos amanhã.

Falha.

Nasceu o:

👻 FLAKY TEST

E então surge a frase mais perigosa do departamento de QA:

"Roda de novo."

Quando a segunda execução passa, todos vão embora.

Pouco a pouco ninguém acredita mais na suíte automatizada.

Isso destrói o valor do CI/CD.


🧬 CAPÍTULO 17 — Dê uma identidade própria para cada criatura

Uma alternativa é gerar dados únicos:

email = bellacosa+timestamp@example.test

ou utilizar:

UUID

Assim:

TEST A → USER A
TEST B → USER B
TEST C → USER C

Em vez de:

TEST A ─┐
TEST B ─┼── USER 42
TEST C ─┘

Isso aumenta isolamento e reduz colisões.

Mas abre outra porta.


🧹 CAPÍTULO 18 — Quem limpa o pentagrama depois?

Imagine 10.000 execuções criando:

USERS
CARTS
ORDERS
PAYMENTS
SESSIONS

Depois de meses:

TEST-0000001
TEST-0000002
TEST-0000003
...
TEST-9827719

QA virou um cemitério.

Por isso:

SETUP
  ↓
CREATE DATA
  ↓
EXECUTE
  ↓
ASSERT
  ↓
CLEANUP

E há um detalhe crítico:

FAIL
 ↓
CLEANUP

também.

Se a limpeza ocorrer somente quando o teste termina normalmente, justamente os testes problemáticos deixarão mais sujeira.

Constantine jamais abandonaria o pentagrama aberto no chão.

O QA também não deveria abandonar seus registros temporários.


🕵️ CAPÍTULO 19 — Nunca use o cadáver verdadeiro

A regra:

Never use real customer data.

merece atenção especial.

Copiar produção indiscriminadamente:

PROD DATABASE
      ↓
     COPY
      ↓
 QA DATABASE

pode transportar:

nomes
documentos
endereços
telefones
emails
informações financeiras
dados pessoais

para um ambiente que talvez possua controles diferentes de produção.

Dependendo da necessidade, estratégias podem envolver dados sintéticos, mascaramento, anonimização ou tokenização, considerando requisitos técnicos e regulatórios aplicáveis.

E há outro teste maravilhoso:

compare aquilo que a interface mostra com aquilo que a API realmente devolve.

A tela mostra:

Nome: João
Cidade: Itatiba

Mas o JSON devolve:

{
  "name": "João",
  "city": "Itatiba",
  "internalSalary": 12345,
  "cpf": "...",
  "internalRiskScore": 972,
  "passwordResetToken": "..."
}

A interface simplesmente ignorou os campos extras.

O atacante não ignora.

A OWASP recomenda examinar respostas brutas procurando informações sensíveis ou dados desnecessariamente expostos.


🔥 CAPÍTULO 20 — Não teste somente o Response

Chegamos à maior armadilha de todas.

O teste faz:

POST /orders

Recebe:

201 Created

e declara:

PASS

Constantine pergunta:

— Cadê o pedido?

Verificamos.

Existe.

— E o total?

Errado.

— E o estoque?

Diminuiu duas vezes.

— E o pagamento?

Foi criado três vezes.

— E o MQ?

Duas mensagens.

— E o banco?

COMMIT realizado.

O nosso glorioso:

201 CREATED

acabou de virar:

FAIL

Por isso um teste robusto pode precisar validar:

STATUS
HEADERS
BODY
SCHEMA
BUSINESS RULE
SIDE EFFECT
PERSISTENCE
SECURITY
PERFORMANCE

Estamos deixando de testar HTTP.

Estamos testando o sistema através do HTTP.

Essa diferença é gigantesca.


⏱️ CAPÍTULO 21 — Performance e o demônio da média

Imagine:

média = 200 ms

Parece excelente.

Só que:

90 usuários → 100 ms
10 usuários → 1.100 ms

A média esconde sofrimento.

Por isso aparecem medidas como:

p50
p95
p99

Se p95 = 800 ms, aproximadamente 95% das observações ficaram nesse valor ou abaixo, segundo a metodologia empregada.

Isso nos ajuda a enxergar a cauda.

Também podemos observar:

throughput
timeouts
error rate
CPU
memory
disk I/O
database locks
connection pools
queues
threads
retries

E retries merecem carinho especial.

Um servidor começa a ficar lento.

Clientes repetem chamadas.

O servidor recebe ainda mais trabalho.

Fica mais lento.

Clientes repetem ainda mais.

Temos:

SLOW
 ↓
RETRY
 ↓
MORE LOAD
 ↓
SLOWER
 ↓
MORE RETRIES
 ↓
☠️

O inferno distribuído encontrou seu próprio mecanismo de escala.


🤖 CAPÍTULO 22 — Automatizando o exorcismo

Podemos começar com algo pequeno em Playwright:

test('create user', async ({ request }) => {

  const response = await request.post('/users', {
    data: {
      name: 'Asha'
    }
  });

  expect(response.status()).toBe(201);

  const body = await response.json();

  expect(body.name).toBe('Asha');
});

Já é melhor do que testar manualmente toda vez.

Mas podemos evoluir:

status
+
headers
+
schema
+
body
+
business rules
+
authorization
+
side effects
+
cleanup

E executar automaticamente:

COMMIT
  ↓
BUILD
  ↓
UNIT TEST
  ↓
DEPLOY QA
  ↓
API TEST
  ↓
CONTRACT TEST
  ↓
AUTHORIZATION TEST
  ↓
INTEGRATION TEST
  ↓
SECURITY TEST
  ↓
REPORT
  ↓
QUALITY GATE

A OWASP também descreve a automação de testes de autorização como útil para detectar regressões durante o desenvolvimento e os releases.


🖥️ CAPÍTULO 23 — Constantine entra na LPAR

Agora traduzimos tudo para a língua ancestral.

APIMainframe — analogia conceitual
Requestentrada da transação
JSONestrutura de dados
Endpointponto de entrada
HTTP Methodoperação solicitada
HTTP Statusretorno técnico
Tokencontexto de segurança
AuthorizationRACF/controle de acesso conceitualmente
Request IDcorrelation ID
Side Effectresultado transacional
DatabaseDb2/IMS/VSAM
QueueMQ
Rollbackdesfazer LUW
Environmentregião/subsistema/configuração
BASE_URLconfiguração externa/endereço do destino
Test Datamassa de testes

Não são equivalências tecnológicas perfeitas.

São pontes mentais.

E elas mostram uma coisa fascinante:

muito daquilo que o mercado chama hoje de arquitetura moderna possui problemas que mainframeiros conhecem há décadas.

Estado.

Concorrência.

Segurança.

Transações.

Auditoria.

Ambientes.

Configuração.

Recuperação.

Integridade.


🕯️ CAPÍTULO 24 — O exorcismo final

Constantine está diante do monitor.

O teste apresenta:

HTTP/1.1 200 OK

Todo mundo comemora.

Ele não.

Primeira pergunta:

O usuário correto recebeu os dados?

Sim.

O schema está correto?

Sim.

A autorização foi verificada?

Sim.

Existe informação sensível extra?

Não.

O banco ficou consistente?

Sim.

A operação aconteceu uma única vez?

Sim.

As mensagens corretas foram produzidas?

Sim.

O tempo ficou dentro do objetivo definido?

Sim.

O teste utilizou dados isolados?

Sim.

O ambiente era realmente QA?

Sim.

Os segredos ficaram protegidos?

Sim.

A massa criada foi limpa?

Sim.

Agora Constantine olha novamente:

200 OK

E finalmente diz:

— Agora talvez esteja OK.


☕ EPÍLOGO — CC 0000 também pode mentir

Aqui está a lição que une o velho mainframe às APIs modernas.

Nós já aprendemos há décadas que:

CC 0000

não significa necessariamente:

NEGÓCIO CORRETO

Um batch COBOL pode terminar lindamente com:

MAXCC=0000

e ter atualizado 50.000 clientes com a tarifa errada.

Tecnicamente terminou.

Funcionalmente foi uma catástrofe.

Da mesma maneira:

HTTP 200 OK

não significa:

TEST PASSED

Nosso verdadeiro ritual é:

REQUEST VÁLIDO
       +
CONTRATO CORRETO
       +
AUTENTICAÇÃO
       +
AUTORIZAÇÃO
       +
DADOS CORRETOS
       +
REGRA DE NEGÓCIO
       +
SIDE EFFECT CORRETO
       +
ESTADO CONSISTENTE
       +
ISOLAMENTO
       +
SEGURANÇA
       +
PERFORMANCE
       +
CLEANUP
       =
       PASS

E existe ainda uma última possibilidade, aquela que faria Constantine sorrir.

O sistema está correto.

O endpoint está correto.

O banco está correto.

A autorização está correta.

O COMMIT está correto.

Mas o pipeline acusa:

FAILED

Porque dois testes resolveram utilizar simultaneamente:

USER_ID=42

Nesse momento o verdadeiro monstro não está na API.

Está na suíte de testes.

E é por isso que o bom investigador nunca pergunta apenas:

“A API falhou?”

Ele pergunta:

“O que exatamente falhou: o request, o contrato, a autenticação, a autorização, a aplicação, a regra de negócio, a persistência, o ambiente, a configuração, a massa de dados... ou o próprio teste?”

Essa é a diferença entre apertar SEND no Postman e realmente compreender API Testing.

Às 03:17, quando o dashboard fica vermelho e alguém aparece no War Room dizendo “mas estava retornando 200!”, talvez seja tarde demais para chamar John Constantine.

Mas ainda dá tempo de chamar um velho programador COBOL.

Ele provavelmente olhará para aquele 200 OK, lembrará de todos os CC 0000 que já viu mentirem durante a carreira e fará a única pergunta que realmente importa:

— Certo. Mas o que foi gravado no banco? ☕🕯️



domingo, 6 de outubro de 2019

🌀 DOUTOR ESTRANHO E AS 15 PORTAS INVISÍVEIS DO MAINFRAME

 

Bellacosa Mainframe e os riscos ocultos no mainframe

☕ Um Café no Bellacosa Mainframe

🌀 DOUTOR ESTRANHO E AS 15 PORTAS INVISÍVEIS DO MAINFRAME

RACF, SMF, TCP/IP, CICS, Db2, IMS, MFA, TLS, phishing, DDoS, malware, SQL Injection, Zero Trust, Red Team — e o dia em que Stephen Strange descobriu que o invasor mais perigoso não precisava quebrar a porta porque alguém já havia lhe emprestado a chave.

Sob a tutela do Doutor Estranho, Mestre das Artes Místicas — e, por algumas horas, improvável instrutor de segurança do z/OS.



🎬 PRÓLOGO — O PORTAL QUE APARECEU NO MEIO DO ISPF

Nosso jovem programador COBOL estava diante de uma tela ISPF.

Nada particularmente emocionante.

OPTION ===> 3.4

Datasets.

Copybooks.

JCL.

COBOL.

Aquele universo confortável onde um programa começa educadamente com:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PAYROLL.

Até que surgiu um círculo dourado no meio da sala.

Faíscas.

O programador recuou.

Do portal saiu o Doutor Estranho.

— Você é o programador COBOL?

— Sim.

— Então temos um problema.

— ABEND?

— Pior.

Strange abriu outro portal.

Do outro lado havia uma arquitetura inteira:

Internet
   │
Firewall
   │
API Gateway
   │
TCP/IP
   │
IBM Z
   │
 ┌─┼──────────────┐
 │ │              │
CICS             IMS
 │                │
COBOL            COBOL
 │                │
Db2              Db2
 │
RACF

O jovem ficou aliviado.

— Ah! Mainframe. Estamos seguros.

Strange fechou o portal.

— É exatamente por isso que estou aqui.

☕



🏰 CAPÍTULO 1 — MAINFRAME NÃO É UMA DIMENSÃO FORA DA INTERNET

Existe uma imagem clássica do mainframe:

uma máquina enorme, fechada, isolada, protegida por paredes invisíveis e administrada por pessoas misteriosas que falam coisas como:

APF
LPAR
RACF
SMF
VTAM
IPL
PARMLIB

Durante décadas, parte dessa percepção fez algum sentido porque muitos ambientes mainframe eram extremamente controlados.

Mas o IBM Z moderno participa de arquiteturas distribuídas.

Ele conversa com:

  • aplicações web;

  • dispositivos móveis;

  • parceiros;

  • cloud;

  • APIs;

  • MQ;

  • Kafka;

  • Linux;

  • OpenShift;

  • bancos distribuídos;

  • sistemas corporativos;

  • ferramentas DevOps.

Portanto, nossa primeira regra é:

Mainframe não é sinônimo de isolamento.

 


O IBM Z pode possuir dezenas ou centenas de caminhos de comunicação com o restante da organização.

O Doutor Estranho desenharia isso como vários portais:

             ☁ CLOUD
                │
                ▼
 MOBILE ──► API ─────────┐
                         │
 PARTNER ─► MQ ──────────┤
                         ▼
                    ┌─────────┐
 INTERNET ─────────►│  IBM Z  │
                    └─────────┘
                         ▲
 DEVOPS ─► PIPELINE ─────┤
                         │
 USERS ──► TN3270 ───────┘

Cada portal é útil.

E cada portal também precisa ser protegido.



🌐 CAPÍTULO 2 — SIM, EXISTE TCP/IP NO MAINFRAME

O iniciante COBOL frequentemente conhece:

COBOL
JCL
CICS
Db2
VSAM

mas esquece que existe uma enorme infraestrutura embaixo disso.

z/OS possui Communications Server, incluindo uma implementação completa da pilha TCP/IP.

Consequentemente, conceitos tradicionais de segurança de redes continuam importantes:

IP
TCP
UDP
DNS
TLS
certificados
sockets
portas
firewall
IPSec

Isso significa que um atacante interessado em reconhecer um ambiente pode procurar serviços acessíveis.

Não precisa começar pensando:

“Vou atacar COBOL.”

Ele pode pensar:

“O que existe neste endereço?”

Essa diferença é enorme.



🔭 CAPÍTULO 3 — O OLHO DE AGAMOTTO FAZ PORT SCANNING?

Imagine Strange olhando para uma máquina:

HOST
 │
 ├── porta A
 ├── porta B
 ├── porta C
 └── porta D

O atacante faz algo conceitualmente semelhante.

Ele tenta entender:

HOST
 ↓
PORTAS
 ↓
SERVIÇOS
 ↓
TECNOLOGIAS
 ↓
SUPERFÍCIE DE ATAQUE

Isso é reconhecimento.

Uma porta acessível pode indicar a presença de um determinado serviço.

E aqui aparece uma mudança importante na mentalidade do programador:

Segurança começa muito antes do COBOL.

Seu programa pode estar impecável.

Mas existe toda uma cadeia até alguém chegar nele.

CLIENTE
   ↓
REDE
   ↓
FIREWALL
   ↓
TLS
   ↓
API
   ↓
CICS
   ↓
COBOL
   ↓
Db2

Qualquer elo merece atenção.



💥 CAPÍTULO 4 — DDoS E O FEITIÇO DOS DEZ MIL PEDIDOS

Suponha que Wong diga:

— Mestre, nosso CICS consegue processar uma quantidade absurda de transações.

Strange responde:

— Excelente.

Wong continua:

— Então somos imunes a DDoS.

Silêncio constrangedor.

DDoS significa Distributed Denial of Service.

O objetivo não precisa ser “quebrar o mainframe”.

Pode ser simplesmente tornar determinado serviço indisponível.

Imagine:

           Bot
            │
Bot ────────┼──────── Bot
            │
Bot ────────┼──────── Bot
            │
            ▼
       API Gateway
            │
            X
            │
           CICS

Curiosamente, CICS pode estar saudável.

CPU pode estar normal.

Db2 pode estar normal.

COBOL pode estar esperando trabalho.

Mas o gateway ficou saturado.

Para o cliente:

“O mainframe caiu.”

Para o sysprog:

“O mainframe nem percebeu.”

Essa diferença é importantíssima em incidentes.

Disponibilidade precisa ser analisada fim a fim.


🕵️ CAPÍTULO 5 — MAN-IN-THE-MIDDLE: DORMAMMU NO MEIO DA CONVERSA

Temos:

CLIENTE ─────────────────► SERVIDOR

Tudo parece perfeito.

Mas imaginemos:

CLIENTE ──► ATACANTE ──► SERVIDOR

O intermediário tenta observar ou manipular a comunicação.

É o princípio do Man-in-the-Middle.

No mundo empresarial entram mecanismos como:

TLS
certificados digitais
IPSec
AT-TLS

E aqui existe uma característica muito interessante do z/OS: Application Transparent TLS — AT-TLS.

A ideia é poderosa porque permite aplicar proteção TLS através da infraestrutura TCP/IP para aplicações adequadamente configuradas, reduzindo a necessidade de cada aplicação implementar diretamente toda a lógica TLS.

É quase um feitiço de Strange:

Aplicação antiga
      │
      ▼
   AT-TLS
      │
      ▼
Comunicação protegida

O programa pode continuar fazendo aquilo que sabe fazer.

A infraestrutura acrescenta proteção ao redor dele.

Essa capacidade de modernizar ao redor do legado é uma das características fascinantes do ecossistema mainframe.


🔑 CAPÍTULO 6 — RACF NÃO É UM CAMPO DE FORÇA

Agora Strange chega diante de uma porta.

Nela está escrito:

RACF

O jovem programador sorri.

— Pronto. Ninguém passa.

Strange pergunta:

— O que é RACF?

— Segurança.

— Resposta perigosa.

RACF é muito mais precisamente parte fundamental da infraestrutura responsável por identidades, autenticação, autorização e proteção de recursos em muitos ambientes z/OS.

Simplificando:

QUEM É VOCÊ?
      │
      ▼
AUTENTICAÇÃO
      │
      ▼
O QUE VOCÊ PODE FAZER?
      │
      ▼
AUTORIZAÇÃO

Essas duas perguntas não são iguais.

Um usuário pode ser realmente:

USER123

mas USER123 não deveria necessariamente acessar:

PROD.PAYROLL.MASTER

Identidade não significa autorização universal.


🔨 CAPÍTULO 7 — FORÇA BRUTA CONTRA O PORTAL

O infográfico original apresenta brute force.

Conceitualmente:

USER01
  │
  ├── senha1
  ├── senha2
  ├── senha3
  ├── senha4
  ├── senha5
  └── ...

O atacante tenta inúmeras possibilidades.

Por isso políticas de autenticação, bloqueios, monitoramento, MFA e outros controles são importantes.

Mas surgiu uma alternativa mais sutil.


🌧️ CAPÍTULO 8 — PASSWORD SPRAYING

Em vez de tentar mil senhas contra um usuário:

ADMIN
senha001
senha002
senha003
...

a ideia do password spraying é tentar poucas senhas contra muitos usuários:

              Welcome2026

USER001 ─────────┤
USER002 ─────────┤
USER003 ─────────┤
USER004 ─────────┤
USER005 ─────────┘

Isso procura explorar senhas previsíveis evitando produzir a mesma sequência óbvia de falhas contra uma única conta.

A lição defensiva é preciosa:

Uma senha tecnicamente aceita pelo sistema não significa necessariamente uma boa credencial.

E aqui MFA ganha enorme importância.


🧙 CAPÍTULO 9 — MFA: VOCÊ TEM A CHAVE, MAS CADÊ O SEGUNDO ARTEFATO?

Imagine que Mordo roube sua senha.

Sem MFA:

USER
 +
PASSWORD
    │
    ▼
 acesso

Com autenticação multifator, existe outra prova de identidade.

Conceitualmente:

algo que você sabe
        +
algo que você possui/obtém
        │
        ▼
     identidade

Isso muda dramaticamente o valor de uma senha roubada.

Não significa invulnerabilidade.

Significa mais uma camada.

E segurança madura funciona exatamente assim.


🎣 CAPÍTULO 10 — PHISHING: O FEITIÇO QUE NÃO PRECISA INVADIR O RACF

Talvez Strange pudesse passar uma semana tentando quebrar uma fortaleza.

Ou poderia simplesmente bater à porta:

— Olá. Sou da equipe de suporte. Preciso da sua senha.

Essa é a essência da engenharia social.

Considere:

Assunto:
URGENTE - SUA CONTA SERÁ BLOQUEADA

Clique para validar sua identidade.

O usuário acessa uma página falsa e entrega:

USERID
PASSWORD

Observe o que não aconteceu:

Nenhum RACF foi “hackeado”.

Nenhum CICS foi explorado.

Nenhum COBOL foi modificado.

Nenhum Db2 sofreu SQL Injection.

A pessoa entregou a credencial.

Por isso phishing é tão poderoso.

Ele ataca algo extremamente complexo:

o ser humano.


🐳 CAPÍTULO 11 — WHALING: POR QUE ATACAR O APRENDIZ SE POSSO ATACAR O FEITICEIRO SUPREMO?

Whaling é phishing direcionado a pessoas particularmente valiosas.

No contexto mainframe, imagine alguém com capacidade de:

administrar segurança
alterar produção
gerenciar certificados
alterar pipelines
administrar banco
gerenciar CICS
administrar sistemas

Agora compare:

1.000 usuários comuns

com:

1 administrador extremamente privilegiado

Do ponto de vista de risco, essa identidade privilegiada merece proteção extraordinária.

Daí conceitos como:

least privilege, separation of duties, privileged access management, MFA e auditoria.

Nunca dê uma Infinity Stone quando a pessoa só precisa de uma chave de fenda.


🎟️ CAPÍTULO 12 — PASSTICKET: UMA CREDENCIAL QUE NÃO QUER SER UMA SENHA ETERNA

O ecossistema RACF possui outro conceito interessante: PassTicket.

De maneira simplificada, podemos imaginá-lo como uma credencial temporária associada ao usuário e aplicação.

Em vez de espalhar uma senha permanente por diversas integrações:

PASSWORD
   │
   ├── sistema A
   ├── sistema B
   ├── sistema C
   └── sistema D

podemos ter arquiteturas de autenticação mais adequadas nas quais a credencial reutilizável não precisa viajar dessa maneira.

É uma boa oportunidade para o iniciante aprender um princípio maior:

Credenciais são segredos. Quanto menos lugares precisarem conhecê-las, melhor.


🦠 CAPÍTULO 13 — EXISTE MALWARE NO MULTIVERSO MAINFRAME?

O infográfico lista:

vírus, worms, Trojan, ransomware, spyware, rootkits, keyloggers, botnets, backdoors, loaders e malware sem arquivo.

Devemos evitar dois extremos.

O primeiro:

“Tudo funciona exatamente como num PC Windows.”

Errado.

O segundo:

“Mainframe não pode ter malware.”

Também é uma simplificação perigosa.

Primeiro precisamos perguntar:

qual ambiente?

Um IBM Z pode hospedar:

IBM Z
 │
 ├── z/OS
 │    └── UNIX System Services
 │
 ├── Linux on Z
 │
 └── múltiplas LPARs

Linux on Z é Linux executando na arquitetura IBM Z.

USS fornece um ambiente UNIX dentro do z/OS.

Portanto, a superfície de segurança moderna é muito maior que:

COBOL + JCL

🚪 CAPÍTULO 14 — A BACKDOOR QUE NÃO PARECIA BACKDOOR

Agora chegamos a algo especialmente interessante para programadores.

Imagine código como:

       IF CUSTOMER-ID = '99999999'
           MOVE 'Y' TO AUTHORIZED
       END-IF.

Se isso tivesse sido deliberadamente colocado para contornar controles, teríamos uma porta lógica escondida.

Não precisamos de um vírus cinematográfico.

Uma backdoor pode ser:

código escondido
conta esquecida
permissão excessiva
biblioteca inadequadamente protegida
configuração insegura
script
procedimento operacional
integração confiável demais

Esse é um dos pontos mais importantes deste artigo.

Cybersecurity não é caça a malware.

É caça a caminhos de abuso.


💉 CAPÍTULO 15 — SQL INJECTION CHEGA AO Db2?

Imagine:

Aplicação Web
      │
      ▼
     API
      │
      ▼
z/OS Connect
      │
      ▼
    CICS
      │
      ▼
    COBOL
      │
      ▼
     Db2

O atacante talvez nem saiba que existe um IBM Z.

Ele só encontrou uma aplicação.

Se dados externos forem utilizados inadequadamente na construção de comandos SQL, podemos criar vulnerabilidades na camada da aplicação.

Isso nos dá outra máxima:

Hardware seguro não transforma automaticamente software inseguro em software seguro.

O programa precisa respeitar práticas de desenvolvimento seguro.


🧬 CAPÍTULO 16 — O MULTIVERSO DEVOPS E O ATAQUE À SUPPLY CHAIN

Strange abre outro portal.

Não há hacker.

Há Git.

Developer
    │
    ▼
   Git
    │
    ▼
Pipeline
    │
    ▼
 Build
    │
    ▼
Artifact
    │
    ▼
 Deploy
    │
    ▼
Production

O jovem pergunta:

— Onde está o atacante?

Strange responde:

— Essa é a pergunta errada. Pergunte onde ele poderia interferir.

Agora tudo muda.

Developer ── credencial?
Git ───────── proteção?
Pipeline ─── segredo?
Build ─────── integridade?
Artifact ─── adulteração?
Deploy ───── autorização?
Production ─ segregação?

O programa malicioso não precisa chegar como:

VIRUS.EXE

Pode chegar como:

PAYROLL.CBL

passar pelo build e transformar-se em um load module perfeitamente executável.

Esse é o perigo da supply chain.


📜 CAPÍTULO 17 — SMF: O LIVRO DE VISHANTI DO z/OS

Depois de um incidente surge a pergunta mais importante:

O que aconteceu?

Precisamos reconstruir eventos.

QUEM?
 ↓
QUANDO?
 ↓
ONDE?
 ↓
QUAL RECURSO?
 ↓
QUAL AÇÃO?
 ↓
QUAL RESULTADO?

É aqui que SMF — System Management Facilities — se torna extremamente importante.

O z/OS produz uma riqueza extraordinária de registros operacionais.

Quando combinamos diferentes fontes:

SMF
 │
RACF
 │
TCP/IP
 │
CICS
 │
Db2
 │
IMS
 │
MQ
 │
USS
 ▼
SIEM
 ▼
SOC

podemos construir uma visão muito mais completa.

O objetivo não é apenas descobrir:

“Houve ACCESS DENIED?”

Queremos descobrir:

“Esse comportamento faz sentido?”

Essa é uma pergunta muito mais poderosa.


⚠️ CAPÍTULO 18 — O EVENTO MAIS ASSUSTADOR PODE SER “ACCESS ALLOWED”

Imagine um log:

USERA
RESOURCE: PAYROLL
ACCESS: ALLOWED

Tudo certo?

Talvez.

Mas e se USERA tiver sido vítima de phishing?

Então:

credencial válida
+
autorização válida
+
operação válida

pode produzir:

atividade maliciosa

E essa é uma das grandes lições da segurança moderna.

Um sistema tradicional procura:

ACCESS DENIED

Uma investigação moderna também pergunta:

Por que este ACCESS ALLOWED aconteceu?

🔎 CAPÍTULO 19 — RED TEAM: STRANGE PROCURA CAMINHOS, NÃO PAREDES

Agora Strange coloca nosso Padawan diante da arquitetura.

— Encontre a vulnerabilidade.

O garoto começa:

— Vou quebrar o RACF.

— Não.

— Explorar o z/OS?

— Não necessariamente.

— Então o quê?

Strange desenha:

                  DADO CRÍTICO
                       ▲
                       │
              ┌────────┼────────┐
              │        │        │
             Db2      VSAM     IMS
              ▲        ▲        ▲
              └────────┼────────┘
                       │
                     CICS
                       ▲
                       │
                      API
                       ▲
                       │
                 aplicação web

E pergunta:

“Qual é o caminho mais fraco até o objetivo?”

Essa é uma forma muito melhor de pensar em Red Team defensivo e threat modeling.

O objetivo não é demonstrar que “mainframe é inseguro”.

É descobrir onde nossas suposições sobre segurança estão erradas.


🧱 CAPÍTULO 20 — DEFENSE IN DEPTH: AS MÚLTIPLAS DIMENSÕES DA DEFESA

A arquitetura madura não aposta tudo em RACF.

Ela cria camadas:

                 USUÁRIO
                    │
                   MFA
                    │
                 REDE
                    │
                TLS/IPSec
                    │
              FIREWALL/IDS
                    │
                  IBM Z
                    │
                  RACF
                    │
        ┌───────────┼───────────┐
       CICS        IMS         Db2
        │           │           │
        └───────────┼───────────┘
                    │
                APLICAÇÃO
                    │
                  DADOS
                    │
               LOGS / SMF
                    │
                   SIEM
                    │
                   SOC

Isso é Defense in Depth.

Se uma camada falhar, outra continua existindo.

Senha roubada?

MFA.

Comunicação interceptada?

TLS.

Conta comprometida?

Privilégio mínimo reduz o alcance.

Comportamento estranho?

Monitoramento.

Incidente ocorreu?

Auditoria permite investigação.

A pergunta deixa de ser:

“Temos segurança?”

e passa a ser:

“Quantas coisas precisam dar errado para alguém chegar ao ativo crítico?”

Essa é uma pergunta muito melhor.


🧪 CAPÍTULO 21 — LABORATÓRIO MENTAL PARA O PROGRAMADOR COBOL

Quando receber um programa para manutenção, faça este exercício.

Comece desenhando:

ENTRADA
   │
   ▼
PROGRAMA
   │
   ▼
DADOS

Depois expanda:

Quem chama?
    │
Como autentica?
    │
Por onde entra?
    │
Quem autoriza?
    │
Que programa executa?
    │
Que dados acessa?
    │
Que sistema externo chama?
    │
O que fica registrado?

Agora você não está mais apenas lendo COBOL.

Está fazendo threat modeling.

Por exemplo:

Mobile
  │
 API
  │
 CICS
  │
 COBOL
  │
 Db2
  │
 MQ
  │
 parceiro

Pergunte em cada seta:

Quem confia em quem?
Como prova identidade?
Existe criptografia?
Existe autorização?
Existe validação?
Existe auditoria?

A seta é tão importante quanto a caixa.


💡 CAPÍTULO 22 — 10 DICAS PARA O PADAWAN DA SEGURANÇA MAINFRAME

  1. Não confunda RACF com toda a segurança do mainframe. Ele é uma peça fundamental, mas existe uma arquitetura inteira ao redor.

  2. Aprenda TCP/IP. Um programador COBOL moderno ganha muito entendendo portas, TLS, certificados, DNS e sockets.

  3. Entenda identidade e autorização separadamente. Saber quem alguém é não responde ao que essa pessoa deveria fazer.

  4. Conheça SMF. Segurança sem evidência vira opinião.

  5. Aprenda CICS e Db2 pensando também em segurança. Não apenas em funcionalidade.

  6. Entenda APIs. O COBOL pode estar cinco camadas atrás de uma chamada proveniente da Internet.

  7. Estude USS. Existe um universo UNIX dentro do z/OS que muitos desenvolvedores tradicionais quase nunca exploraram.

  8. Entenda DevSecOps. Git, pipeline, build e deploy fazem parte da superfície de confiança.

  9. Nunca pense “ninguém sabe que isso existe”. Obscuridade não deve ser o principal controle.

  10. Pergunte sempre: “E se essa identidade legítima estiver comprometida?” Essa pergunta revela problemas que muitos checklists não encontram.


🥚 EASTER EGG — 03:17 E A DIMENSÃO DO ACCESS ALLOWED

São exatamente:

03:17:04

O SOC recebe um evento.

USER: PRODADM
AUTHENTICATION: SUCCESS

03:17:09:

RESOURCE: PROD.PAYROLL.MASTER
ACCESS: ALLOWED

03:17:14:

PROGRAM: EXECUTED
RESULT: SUCCESS

03:17:31:

TRANSFER: COMPLETED

O jovem programador corre até Strange.

— Mestre! Encontrei o problema!

— Qual?

— RACF falhou!

Strange olha os registros.

— Onde?

— O usuário acessou o arquivo!

— Ele tinha autorização?

— Tinha.

— A autenticação funcionou?

— Sim.

— O programa executou normalmente?

— Sim.

— Então onde está a falha do RACF?

O garoto permanece em silêncio.

Strange abre o Olho de Agamotto e volta alguns minutos no tempo.

03:02.

Um administrador abre um e-mail.

03:04.

Clica num link.

03:05.

Digita suas credenciais.

03:17.

Alguém do outro lado do mundo entra usando uma identidade válida.

Strange congela o tempo.

Na tela não aparece:

ICH408I
ACCESS DENIED

Aparece:

ACCESS ALLOWED

O jovem finalmente entende.

— Estávamos procurando alguém tentando arrombar a porta...

Strange sorri.

— ...quando deveríamos procurar quem roubou a chave.

☕


🌀 EPÍLOGO — O MAIOR FEITIÇO DO MAINFRAME É A CONFIANÇA

Quando começamos esta jornada, tínhamos cinco infográficos mostrando dezenas de ameaças:

DDoS, DoS, Man-in-the-Middle, DNS spoofing, ARP spoofing, sniffing, session hijacking, Evil Twin, port scanning, IP spoofing, brute force, dictionary attacks, credential stuffing, password spraying, phishing, engenharia social, malware, ransomware, spyware, rootkits, botnets, backdoors, SQL Injection, XSS, zero-days e muitas outras.

Transportá-las mecanicamente para o IBM Z seria um erro.

O aprendizado importante é outro.

O mainframe moderno faz parte de um ecossistema.

PESSOA
   │
IDENTIDADE
   │
REDE
   │
INTEGRAÇÃO
   │
APLICAÇÃO
   │
MAINFRAME
   │
DADOS

Segurança precisa acompanhar todo o caminho.

E aqui está talvez a maior evolução mental para um programador COBOL iniciante.

Quando você começou, enxergava:

       IDENTIFICATION DIVISION.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       PROCEDURE DIVISION.

Depois passou a enxergar:

COBOL
CICS
Db2
VSAM
JCL

Mais tarde:

RACF
SMF
TCP/IP
MQ
USS
APIs
DevOps

Até finalmente perceber:

                  NEGÓCIO
                     │
                   DADOS
                     │
                 APLICAÇÃO
                     │
                  ACESSO
                     │
                IDENTIDADE
                     │
                 CONFIANÇA

E confiança é justamente aquilo que cybersecurity tenta administrar.

Zero Trust não significa desconfiar paranoicamente de tudo.

Significa não transformar uma suposição em autorização eterna.

Autentique.

Autorize.

Proteja.

Registre.

Observe.

Correlacione.

Questione.

E principalmente:

não procure apenas portas quebradas. Procure portas que alguém conseguiu abrir normalmente quando não deveria estar ali.

O Doutor Estranho abre seu último portal.

Antes de desaparecer, olha para o jovem programador COBOL e aponta para a tela.

USER PRODADM
ACCESS ALLOWED
03:17

— Strange?

— Sim?

— Afinal, quantas ameaças existem contra um mainframe?

Ele pensa por alguns segundos.

— Em quantos futuros?

— Sim.

— Eu examinei 14.000.605.

— E em quantos estávamos completamente seguros?

Strange atravessa o portal.

— Em nenhum. Segurança não é um estado. É um processo.

O portal fecha.

O programador olha novamente para o ISPF.

OPTION ===>

E percebe que aquela mesma tela de sempre parece diferente.

Não porque o mainframe tenha mudado.

Mas porque agora ele consegue enxergar os portais invisíveis ao redor dele.

☕ Um Café no Bellacosa Mainframe

Porque antes de proteger 60 anos de legado, precisamos compreender por que ele continua funcionando — e por onde alguém tentaria fazê-lo parar.

segunda-feira, 30 de setembro de 2019

🔥 JCL no z/OS V2R4 — o clássico absoluto em plena era do híbrido e do automático

 

Bellacosa Mainframe apresenta JCL V2R4 Job Control Language

🔥 JCL no z/OS V2R4 — o clássico absoluto em plena era do híbrido e do automático



📅 Datas importantes

  • Release (GA): setembro de 2019

  • Final de suporte IBM: 30 de setembro de 2024

O z/OS V2R4 não trouxe um “novo JCL”.
Ele consolidou o JCL como a linguagem mais estável do data center híbrido moderno.


🧬 Contexto histórico

Quando o z/OS V2R4 chegou, o jogo já estava claro:

  • Cloud híbrida não era mais tendência — era realidade

  • APIs já chamavam batch

  • DevOps já convivia com JES

  • Linux on Z crescia sem pedir desculpa

E no meio disso tudo…

👉 o JCL seguia intacto, confiável, previsível.

Bellacosa resumiria assim:

“Todo mundo muda a fachada. O JCL segura a fundação.”


Job Control Language JCL V2R4


✨ O que há de novo no JCL do V2R4 (sem mudar a linguagem)

A IBM foi inteligente: não mexeu no que não precisa ser mexido.

🆕 1. JCL totalmente integrado à automação moderna

No V2R4, o normal passou a ser:

  • JCL disparado por:

    • APIs REST

    • schedulers inteligentes

    • eventos externos

  • JCL funcionando como backend confiável do mundo digital

👉 O job batch deixou de ser “coisa da madrugada”.


🆕 2. JES2 ainda mais estável e previsível

  • Melhor gerenciamento de spool

  • Ambientes com milhares de jobs simultâneos

  • Restart e recovery mais confiáveis

Menos “rezar pro job terminar”
Mais “sabemos exatamente o que vai acontecer”.


🆕 3. DFSMS maduro para volumes gigantes

  • Convivência natural com:

    • EAV

    • datasets enormes

    • políticas automáticas

  • Menos tuning manual de SPACE e UNIT

O JCL ficou mais simples, porque o sistema ficou mais inteligente.


🔧 Melhorias sentidas no dia a dia do mainframer

✔ Batch previsível em ambientes híbridos
✔ Menos ajustes manuais
✔ Mais padronização de jobs
✔ JCL tratado como ativo corporativo

Nada mudou na sintaxe.
Tudo mudou na confiança operacional.


🥚 Easter Eggs (para quem viveu o V2R4)

  • 🥚 Jobs escritos no MVS rodando felizes no V2R4

  • 🥚 IEFBR14 ainda presente em ambientes “cloud first” 😅

  • 🥚 Comentários no JCL mais antigos que ferramentas DevOps

  • 🥚 O erro nº 1 continuava sendo:

    • DISP errado

    • dataset em uso

    • RC ignorado


💡 Dicas Bellacosa para JCL no z/OS V2R4

🔹 Pense no JCL como infraestrutura crítica, não script
🔹 Documente o porquê do job
🔹 Use:

  • IF / THEN / ELSE

  • RC bem tratados

  • nomes de passos claros

🔹 Lembre-se:

Esse job pode rodar quando você não estiver mais na empresa.


📈 Evolução do JCL até o V2R4

EraPapel do JCL
OS/360Controle de jobs
MVSAutomação batch
OS/390Base corporativa
z/OS V1.xOrquestração total
z/OS V2R2/V2R3Mundo híbrido
z/OS V2R4Maturidade absoluta

👉 No V2R4, o JCL já não precisa provar nada.


📜 Exemplo de JCL “cara de V2R4”

//BELLV24 JOB (ACCT),'JCL z/OS V2R4', // CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //* JOB ORQUESTRADO POR SCHEDULER / API //* //STEP01 EXEC PGM=MYBATCH //STEPLIB DD DSN=BELLACOSA.LOADLIB,DISP=SHR //SYSOUT DD SYSOUT=* //* //IF (STEP01.RC = 0) THEN //STEP02 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE BELLACOSA.ARQ.TEMP SET MAXCC = 0 /* //ENDIF

💬 Comentário Bellacosa:

“Não importa quem disparou esse job —
operador, scheduler ou API.
O JCL entrega do mesmo jeito.”


🧠 Comentário final

O JCL no z/OS V2R4 é o ponto onde tudo fica claro:

  • Ele não é antigo

  • Ele não é obsoleto

  • Ele não é moda

Ele é confiável.

Enquanto o mundo corre atrás de estabilidade,
o JCL já está lá há décadas —
garantindo que o digital funcione quando ninguém está olhando.

🔥 JCL não é legado morto.
É legado que sustenta o presente.

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...