← Infraestrutura bancária: fundamentos e decisões de produção
09 / 10 · 60 MIN

Acessos, segredos e manutenção controlada

Define acesso por tarefa, acompanha consumidores de segredos e verifica manutenção até ao resultado funcional.

Traduzir a tarefa numa concessão

Num projeto fictício de fundos, um operador precisa de reiniciar uma instância durante uma mudança. O pedido de acesso deve indicar pessoa ou workload, ação, recurso, janela e referência da decisão. Uma função de leitura não implica exportação, e reiniciar uma aplicação não concede administração de todo o ambiente. O modelo desta aula compara exatamente esses campos e usa expiração exclusiva. É um contrato didático, não um avaliador AWS IAM. Numa plataforma real, políticas, sessões, delegação e condições podem interagir; a aceitação precisa de observar o caminho efetivamente usado pelo operador.

Demonstrar concessão e retirada

A matriz deve incluir um caso permitido e casos recusados. No exercício, o operador A reinicia funds-1 dentro da janela; outra ação, recurso, pessoa ou referência é recusada. Um pedido no instante de expiração também falha. Depois da mudança, pedir revogação não é o mesmo que demonstrar perda de capacidade. Se a ação continua possível, investiga concessões alternativas, sessões e o mecanismo da plataforma. Regista os resultados e a identidade usada. Não partilhes uma conta mais privilegiada para ultrapassar a recusa: isso altera o âmbito e prejudica a atribuição do que aconteceu.

Gerir todos os consumidores de um segredo

Um segredo pode ser usado pelo serviço online, um batch e uma ferramenta de suporte. Criar o valor novo no cofre é apenas um passo. Identifica consumidores, atualiza o mecanismo previsto, demonstra funcionamento e trata o valor anterior segundo o plano de rotação. Se houve exposição, a resposta precisa de contenção e análise de utilização, não apenas de apagar o ficheiro onde apareceu. A sobreposição, quando aplicável e autorizada, tem limites e critérios de saída. Em AWS, roles com credenciais temporárias são uma alternativa recomendada para workloads compatíveis; não assumas que uma chave pessoal é uma dependência sustentável.

Preparar emergência e evidência atribuível

A recuperação do serviço de identidade pode depender de um segredo que só esse serviço entrega. Esse ciclo precisa de um caminho de emergência concebido antes do incidente, com custódia, cobertura, autorização e revisão. O exercício não define passwords de emergência nem autoriza acesso real. O relatório deve ligar ator, ação, recurso, instante, referência e decisão. O valor do segredo fica fora da evidência partilhada. Usa dados sintéticos na formação e distingue autenticação, autorização e auditoria: provar quem fez o pedido não concede a ação, e guardar um log não comprova que a política foi corretamente aplicada.

Verificar manutenção até à utilização

O inventário didático tem três aplicações. App1 recebeu v2 mas executa v1. App2 executa v2 mas falha o fluxo funcional. App3 executa v2 e passa esse fluxo. Só app3 satisfaz os critérios declarados. Regista instalação, ativação e aceitação como marcos distintos. Para obsolescência, inclui versão suportada, compatibilidade, esforço, janela e contingência no âmbito financiado. Uma exceção temporária exige proprietário, mitigação e revisão; não transforma software antigo em corrigido. A prioridade deve considerar exposição e impacto, além da facilidade de instalar ou de fechar rapidamente uma tarefa no dashboard.

Executar o contrato fictício e discutir limites

Guarda o código como run.py e executa python3 run.py --output evidence.json. O programa não contacta serviços nem usa credenciais. Compara concessões exatas, estados de manutenção, custos e condições de retirada com dados inventados. O resultado é repetível porque não mede uma infraestrutura variável. Explica quais observações precisariam de ser reproduzidas num ambiente autorizado e quem as aceitaria. Para um handover APS, entrega a matriz de ações, o inventário de consumidores, os resultados funcionais e as pendências com prazo. A execução do programa não substitui formação do turno ou revisão especializada independente.

"""Original offline decision model. No IAM engine, cloud invoice, or supplier exit.
Run: python3 run.py --output evidence.json
"""
import argparse
import hashlib
import json
import math
import platform
from fractions import Fraction
from pathlib import Path


def allowed(grant, request, now):
    # Explicit fictional contract: exact action/resource, exclusive expiry.
    return bool(grant['active'] and grant['start'] <= now < grant['expires']
                and request['actor'] == grant['actor']
                and request['action'] in grant['actions']
                and request['resource'] in grant['resources']
                and request['ticket'] == grant['ticket'])


def allocate(direct, shared, weights):
    if set(direct) != set(weights) or shared < 0 or min(direct.values()) < 0 or min(weights.values()) < 0 or sum(weights.values()) <= 0:
        raise ValueError('invalid allocation inputs')
    total = sum(weights.values())
    return {k: Fraction(v) + Fraction(shared * weights[k], total) for k, v in direct.items()}


def run():
    checks = []
    def check(name, actual, expected):
        assert actual == expected, (name, actual, expected)
        checks.append(dict(name=name, actual=actual, expected=expected, passed=True))
    grant = dict(actor='operator-A', actions=['restart'], resources=['prod-funds-1'], ticket='CHG-DEMO', start=10, expires=20, active=True)
    request = dict(actor='operator-A', action='restart', resource='prod-funds-1', ticket='CHG-DEMO')
    check('scoped action inside window', allowed(grant, request, 15), True)
    check('before approved window', allowed(grant, request, 9), False)
    check('exclusive expiry boundary', allowed(grant, request, 20), False)
    for field, value in [('actor','operator-B'), ('action','export'), ('resource','prod-other-1'), ('ticket','CHG-OTHER')]:
        check('different ' + field + ' denied', allowed(grant, {**request, field:value}, 15), False)
    check('revoked grant is denied before expiry', allowed({**grant,'active':False}, request, 15), False)
    check('unapproved extension remains denied', allowed(grant, request, 21), False)
    evidence = dict(actor=request['actor'], action=request['action'], resource=request['resource'], ticket=request['ticket'], decision='allow', timestamp=15)
    check('attributable audit fields', sorted(evidence), ['action','actor','decision','resource','ticket','timestamp'])
    check('no secret value in audit contract', any(k in evidence for k in ['password','token','secret']), False)
    inventory = [dict(id='app1', expected='v2', installed='v2', running='v1', functional=True), dict(id='app2', expected='v2', installed='v2', running='v2', functional=False), dict(id='app3', expected='v2', installed='v2', running='v2', functional=True)]
    complete = lambda x: x['installed'] == x['expected'] == x['running'] and x['functional']
    check('installed package alone insufficient', complete(inventory[0]), False)
    check('running version alone insufficient', complete(inventory[1]), False)
    check('version and function evidence align', complete(inventory[2]), True)
    check('unfinished maintenance inventory', [x['id'] for x in inventory if not complete(x)], ['app1','app2'])
    direct = {'A':6000,'B':3000}
    proportional = allocate(direct, 3000, {'A':2,'B':1})
    check('proportional service allocation', {k:int(v) for k,v in proportional.items()}, {'A':8000,'B':4000})
    check('allocation preserves invoice total', int(sum(proportional.values())), 12000)
    equal = allocate(direct, 3000, {'A':1,'B':1})
    check('equal policy changes attribution', {k:int(v) for k,v in equal.items()}, {'A':7500,'B':4500})
    check('equal policy does not change invoice', int(sum(equal.values())), 12000)
    check('new full recurring cost', 9000+500+700, 10200)
    check('net recurring saving', 12000-(9000+500+700), 1800)
    check('simple break even excludes overlap', 21600//1800, 12)
    check('old annual cost', 12000*12, 144000)
    check('first year with transition and overlap', 10200*12+21600+6000, 150000)
    check('first year benefit includes all stated costs', 144000-150000, -6000)
    check('whole months to recover transition plus overlap', math.ceil(Fraction(21600+6000,1800)), 16)
    check('old cost per successful item in cents', int(Fraction(12000*100,600000)), 2)
    check('new cost per successful item in cents', int(Fraction(9000*100,300000)), 3)
    check('lower invoice can raise unit cost percent', int((Fraction(3,2)-1)*100), 50)
    check('export duration hours', 600//50, 12)
    check('parallel rebuild and export plus validation', max(600//50,5)+3, 15)
    check('exit margin before sixteen hour target', 16-(max(600//50,5)+3), 1)
    check('half export throughput misses target', max(600//25,5)+3, 27)
    required = ['consumer_release','retention_decision','readability','key_access','access_withdrawal','billing_closed']
    gate = dict.fromkeys(required, True)
    gate['key_access'] = False
    check('archive without keys blocks fictional retirement gate', all(gate.values()), False)
    gate['key_access'] = True
    check('complete fictional retirement evidence set', all(gate[k] for k in required), True)
    check('missing billing evidence is not success', all({k:v for k,v in gate.items() if k != 'billing_closed'}.get(k,False) for k in required), False)
    return dict(runtime=platform.python_version(),scope='Offline exact-match permission contract, inventory predicates and deterministic cost/exit arithmetic with fictional inputs. Not AWS IAM, a measured migration, a real invoice, a supplier contract or human authorization.',passed=len(checks),checks=checks,runnerSha256=hashlib.sha256(Path(__file__).read_bytes()).hexdigest())


if __name__ == '__main__':
    parser=argparse.ArgumentParser();parser.add_argument('--output');args=parser.parse_args()
    result=json.dumps(run(),indent=2)+'\n'
    if args.output:Path(args.output).write_text(result)
    else:print(result,end='')
NA PRÁTICA

App1: instalada v2, ativa v1. App2: ativa v2, fluxo falhado. App3: ativa v2, fluxo aceite. O modelo só considera app3 concluída.

Armadilhas comuns

Aprovação como privilégio ilimitado, segredo novo como rotação completa, revogação pedida como capacidade retirada ou pacote copiado como correção ativa.

Tópicos relacionados: Identidade, conectividade e proteção · Alteração, obsolescência e desativação · Cloud, custos e autonomia RUN

Leva esta ideia contigo

Cada acesso e alteração precisa de âmbito, proprietário e resultado observado; a documentação deve refletir o estado efetivo.

Criar conta

Referência: Security best practices in IAM · DR banking infrastructure professional assessment2026.10