Introducción al Open Policy Agent (OPA)

¿Qué es la OPA?



Iniciado en 2016, es un proyecto destinado a unificar la aplicación de políticas en todas las tecnologías y sistemas. En la actualidad, los jugadores gigantes de la industria tecnológica utilizan OPA. Por ejemplo, Netflix usa OPA para controlar el acceso a sus recursos API internos. Chef lo usa para proporcionar capacidades de IAM en sus productos para los usuarios finales. Además, muchas otras empresas como Cloudflare, Pinterest y otras utilizan OPA para hacer cumplir las políticas en sus plataformas (como los clústeres de Kubernetes). Actualmente OPA forma parte del CNCF como proyecto de incubación.







¿Qué ofrece OPA?



¿Cómo surgió la OPA? ¿Qué problemas está tratando de resolver? De hecho, la aplicación de políticas para API y microservicios es tan antigua como los propios microservicios. Nunca ha habido una aplicación de nivel de producción que no proporcione ningún tipo de control de acceso, autorización y aplicación de políticas. Para comprender el papel de OPA, considere el siguiente caso de uso: Su empresa vende computadoras portátiles a través de un portal en línea. Como todas las demás aplicaciones similares, el portal consta de una página de inicio donde los clientes ven las últimas ofertas, posiblemente algunas promociones por tiempo limitado. Si los clientes quieren comprar algo, deben iniciar sesión o crear una cuenta. Luego, realizan pagos con sus tarjetas de crédito u otros medios. Para asegurarse de que sus clientes lo visiten constantemente,los invita a suscribirse a su newsletter, que puede contener descuentos especiales. Alternativamente, pueden optar por recibir notificaciones del navegador tan pronto como se anuncien nuevos productos. Aplicación típica de compras en línea, ¿no? Ahora describamos cómo se verá este flujo de trabajo en un diagrama para visualizar el proceso:













, . , . , . , ( ) 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 « ».
  • OPA puede integrarse con muchos sistemas y plataformas modernos como Kubernetes, Kafka, SQLite, CEPH y Terraform. Con el complemento PAM, también se puede integrar con Linux PAM para proporcionar un control avanzado de políticas en demonios de Linux que utilizan PAM (como sshd y sudo).



All Articles