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
-
EX004 — Direito oculto. Que conta ganhou direitos sobre tarifas indiretamente no laboratório, e por quantos níveis? Rubrica: 3 = contractor-07, por uma cadeia de quatro grupos que termina em fare-admins;; 2 = a conta;; 1 = vago;; 0 = nenhuma.
-
EX005 — Teste de SoD. Como a segregação de funções é expressa com conjuntos? Rubrica: 3 = os conjuntos de criadores e de aprovadores devem ser disjuntos; interseção vazia;; 2 = disjuntos;; 1 = união;; 0 = nenhuma.
-
EX006 — Lacuna do conluio. O que uma verificação de conjuntos disjuntos não consegue impedir? Rubrica: 3 = o conluio entre duas pessoas diferentes;; 2 = conluio;; 1 = vago;; 0 = nenhuma.
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.