◇ OpenCyber Academy
Engenharia · Capítulo 2 · Português

Capítulo 2 — Matemática discreta

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Capítulo 2 — Matemática discreta

Mapa da aula

Aula 02 publicada. Mapa, exemplo, EX004.

flowchart TD
  N0["2.1 Acesso como relação"]
  N1["2.2 Fecho transitivo"]
  N2["Laboratório — Direitos indiretos via fecho transitiv"]
  N3["2.3 Segregação de funções como conjuntos"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX004"]

Desenho lógico

flowchart LR
  N0["2.1 Acesso como relação"]
  N1["2.2 Fecho transitivo"]
  N2["Laboratório — Direitos indiretos via fecho transitiv"]
  N3["2.3 Segregação de funções como conjuntos"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX004"]
[2.1 Acesso como relação]
    |
    v
[2.2 Fecho transitivo]
    |
    v
[Laboratório — Direitos indiretos via fecho transitiv]
    |
    v
[2.3 Segregação de funções como conjuntos]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX004]

Objetivos de aprendizagem

Você vai (1) representar direitos de acesso como relações e grafos; (2) calcular o fecho transitivo para encontrar acessos indiretos; (3) usar operações de conjuntos para verificar a segregação de funções.

2.1 Acesso como relação

Daniel mostra a Sofia que uma lista de controle de acesso é uma relação: um conjunto de pares (sujeito, objeto). A participação em grupos é outra relação: (usuário, grupo). Grupos podem conter grupos. Escrever isso como conjuntos permite que Sofia raciocine com precisão. Se a usuária ana está no grupo fare-ops, e fare-ops está no grupo fare-admins, e fare-admins pode modificar as tabelas de tarifas, então ana pode modificar tarifas, embora nenhuma entrada isolada diga isso. A matemática discreta fornece a ferramenta para isso: a composição de relações e o fecho transitivo, que tornam visíveis os direitos indiretos em vez de deixá-los enterrados em grupos aninhados que ninguém lê.

2.2 Fecho transitivo

O fecho transitivo de uma relação acrescenta todo par alcançável por meio de uma cadeia. Sofia escreve um pequeno programa em Python que recebe as participações aninhadas e sintéticas em grupos da Corvia e calcula, para cada usuário, todos os grupos aos quais ele pertence direta ou indiretamente, e depois os objetos que esses grupos podem acessar. O laboratório abaixo roda sobre um diretório sintético e mostra uma conta de terceirizado herdando direitos de modificação de tarifas por três níveis de aninhamento. A auditoria não havia percebido isso porque os revisores olharam apenas as participações diretas. Cálculos de fecho desse tipo estão por trás de muitas ferramentas comerciais de revisão de acessos, mas entendê-los permite que um engenheiro confira as ferramentas.

Laboratório — Direitos indiretos via fecho transitivo

# Transitive closure of synthetic nested groups; find indirect tariff rights and SoD conflicts.
member = {"ana": {"fare-ops"}, "ben": {"tariff-approvers"}, "contractor-07": {"vendor-support"},
          "vendor-support": {"field-tech"}, "field-tech": {"fare-ops"}, "fare-ops": {"fare-admins"},
          "dina": {"tariff-approvers", "fare-ops"}}
rights = {"fare-admins": {"tariff:create"}, "tariff-approvers": {"tariff:approve"}}
def closure(x, seen=None):
    seen = seen or set()
    for g in member.get(x, ()):
        if g not in seen: seen.add(g); closure(g, seen)
    return seen
users = ["ana", "ben", "contractor-07", "dina"]
eff = {u: set().union(*(rights.get(g, set()) for g in closure(u))) for u in users}
for u in users: print(f"{u:14} groups={len(closure(u))} rights={sorted(eff[u])}")
create = {u for u in users if "tariff:create" in eff[u]}; approve = {u for u in users if "tariff:approve" in eff[u]}
print("create & approve conflict:", sorted(create & approve))

Execute com python3 lab_closure.py. Saída verificada:

ana            groups=2 rights=['tariff:create']
ben            groups=1 rights=['tariff:approve']
contractor-07  groups=4 rights=['tariff:create']
dina           groups=3 rights=['tariff:approve', 'tariff:create']
create & approve conflict: ['dina']

2.3 Segregação de funções como conjuntos

A Corvia exige que ninguém possa ao mesmo tempo criar uma alteração de tarifa e aprová-la. Em termos de conjuntos, o conjunto de usuários capazes de criar e o conjunto capaz de aprovar precisam ser disjuntos. Sofia calcula os dois conjuntos a partir do fecho e sua interseção. Uma interseção não vazia é uma violação. Esse é o princípio da separação de privilégios de Saltzer e Schroeder (1975), expresso como um simples teste de conjuntos. Ela observa que o raciocínio com conjuntos capta violações estruturais, mas não o conluio entre duas pessoas, que exige controles de processo como registro em log e revisão.

Exemplo resolvido

Sofia calcula o fecho de grupos aninhados sintéticos, encontra um terceirizado com direitos indiretos sobre tarifas e testa os conjuntos de criação e aprovação, encontrando dina nos dois.

Caso sintético. Os usuários, grupos e direitos são sintéticos; Saltzer e Schroeder (1975) é real.

Erros e limites

O fecho supõe que as participações estão atualizadas; dados desatualizados escondem ou inventam direitos. Conjuntos disjuntos não impedem o conluio.

Exercícios

Síntese

Relações, fechamento e testes de conjuntos transformam regras de acesso emaranhadas em enunciados precisos e verificáveis.

Continue estudando — aula 02 (capítulo 02 de 50)

← Capítulo 01 · Índice das aulas · Capítulo 03 →

Continue para a próxima aula já escrita.