Introdução ao Open Policy Agent (OPA)

O que é OPA?



Iniciado em 2016, é um projeto que visa unificar a aplicação de políticas em tecnologias e sistemas. OPA é usado por empresas gigantes na indústria de tecnologia hoje. Por exemplo, a Netflix usa OPA para controlar o acesso aos recursos internos da API. Chef usa isso para fornecer recursos de IAM em seus produtos para usuários finais. Além disso, muitas outras empresas como Cloudflare, Pinterest e outras usam OPA para aplicar políticas em suas plataformas (como clusters Kubernetes). A OPA atualmente faz parte do CNCF como um projeto de incubação.







O que a OPA oferece?



Como surgiu a OPA, você pode perguntar? Que problemas ele está tentando resolver? Na verdade, a aplicação de políticas para APIs e microsserviços é tão antiga quanto os próprios microsserviços. Nunca houve um aplicativo de nível de produção que não fornecesse nenhum tipo de controle de acesso, autorização e aplicação de política. Para entender a função da OPA, considere o seguinte caso de uso: Sua empresa vende laptops por meio de um portal online. Como todos os outros aplicativos semelhantes, o portal consiste em uma página inicial onde os clientes veem as últimas ofertas, possivelmente algumas promoções por tempo limitado. Se os clientes desejam comprar algo, eles precisam fazer login ou criar uma conta. Em seguida, eles fazem pagamentos usando seus cartões de crédito ou outros meios. Para garantir que seus clientes visitem você constantemente,você os convida a assinar o seu boletim informativo, que pode conter descontos especiais. Como alternativa, eles podem optar por receber notificações do navegador assim que novos produtos forem anunciados. Aplicativo típico de compras online, não é? Agora vamos descrever como esse fluxo de trabalho será semelhante em um diagrama para visualizar o processo:













, . , . , . , ( ) S3, , API . ? , , . ? , ( ) API- , ? , , ? , . , . , , AWS IAM. . , :







  • — . , , . , S3, MySQL, MongoDB , , API, .
  • . , , : .
  • , , , .
  • , ? , HR.
  • , , , . .
  • , . , , Kubernetes, API-, , Java, Ruby PHP. .


Kubernetes . , , :







  • .
  • , , .
  • Ingress TLS, .
  • - .


, RBAC Pod . , . Kubernetes RBAC , Kubernetes.







Open Policy Agent (OPA). OPA .







OPA?



, OPA , — , «». , «».







, . . API, . , . , , , , , GET API / payment / jane. . JSON . , , -, , Payments API , . OPA :







  1. Payments API OPA. , HTTP, , , . .
  2. OPA .
  3. OPA API .


, OPA . OPA :













OPA — , . API, SSH Linux, , CEPH, . . OPA - . , . JSON , . , OPA, JSON. , , . , , OPA JSON True False, , .







OPA



OPA , . , .







: Rego



Rego — , OPA. , : GET- /api/v1/products



? ?









OPA, :







  • Go: Golang, OPA .
  • : Go, OPA, , . . , . , OPA, Kubernetes , , , . , , OPA , , , OPA. .








OPA?



, , OPA . , OPA . OPA API, :







  • API Bundle: OPA. OPA API Bundle . .
  • API : . , OPA.
  • API : , OPA , . API . .
  • , : , , , opa test, opa run, opa check . . VS Code.


OPA



, OPA, , , . , — Rego. — . :







« . ».







Rego. Rego. , , , :







package play

# Customers should be able to view their own payments
allow = true {
    input.method = "GET"
      input.path = ["payments", customer_id]
      input.user = customer_id
}
      
      





:







  1. , (#), . , , , .
  2. allow = true



    , , «» .
  3. — GET. HTTP (POST, PUT . .) .
  4. : /payments/customer_id



    . , customer_id



    , , , .
  5. customer_id



    .


, :

« , GET, — /payments/customer_id



, — customer_id



. ».







Rego , . INPUT , :







{
    "method": "GET",
    "path": ["payments","bob"],
    "user": "bob"
}
      
      





, INPUT JSON. , . , OPA , Evaluate. OUTPUT :







{
    "allow": true
}
      
      





:













alice, , . Evaluate, , JSON {}. , OPA , , . , :







default allow = false
      
      





, :







package play

# Customers should be able to view their own payments
default allow = false
allow = true {
    input.method = "GET"
      input.path = ["payments", customer_id]
      input.user = customer_id
}
      
      





, Evaluate, :







{
    "allow": false
}
      
      





, Rego , . , , , . , .







, , , : .







, :













allow = true {
    input.method = "GET"
    input.path = ["payments", customer_id]
    finance[input.user]
}

finance = {"john","mary","peter","vivian"}
      
      





, 4. , , , JSON. Rego , , . , , . JSON INPUT . , (, bob). . john ( ) . , . , , (, ), false.







Rego , , .







OPA



, OPA . , OPA :







Kubernetes:



  • , .
  • , , Docker.
  • , .


API:



  • OPA Envoy, Istio IAM. , .


Linux PAM:



  • (PAM) Linux , SSH sudo. OPA PAM, PAM . , SSH , .


, OPA, . , Kafka, ElasticSearch, SQLite CEPH .







TL; DR



  • , .
  • , , . , API- , , . , .
  • OPA , , . OPA, OPA .
  • OPA . , - , . JSON.
  • Rego, , OPA. JavaScript, OPA OPA.
  • «Rego» — .
  • OPA Go, , .
  • API, OPA . , Kubernetes , . .
  • OPA API-, , .
  • , Rego . , Rego « ».
  • O OPA pode se integrar a muitos sistemas e plataformas modernos, como Kubernetes, Kafka, SQLite, CEPH e Terraform. Com o plug-in PAM, ele também pode se integrar ao Linux PAM para fornecer controle de política avançado em daemons Linux usando PAM (como sshd e sudo).



All Articles