[docs] Update integrations, organisations and softwares to have pages (#6158)

This PR makes it possible to browse integrations, organizations and related softwares. Previously, these details were only available as modals on the ecosystem page.

There are also some changes to the policy enforcement on the docs content, the validation rules are much the same but have been updated to reflect that the content is stored in a new place. I have used some generated JSON in Hugo rather than using GitHub api requests to validate the files since it's A) faster, B) I think more simple, and C) easier to get Hugo to process the markdown frontmatter.

Much of the hackery in this PR (Hugo function partials to look up sets of files and get the data from them) is due to the fact that we can't use Hugo's native sections feature. All of our content is nested under docs, this means that all our pages are in the same section so custom lookups have been implemented as function partials instead to work around this.

Signed-off-by: Charlie Egan <charlie@styra.com>
This commit is contained in:
Charlie Egan
2023-08-17 16:09:33 +01:00
committed by GitHub
parent adc7288174
commit 1e4f120beb
277 changed files with 4163 additions and 3356 deletions
+17 -2
View File
@@ -311,11 +311,12 @@ jobs:
- name: Ensure proper formatting
run: opa fmt --list --fail build/policy
- name: Run policy checks on changed files
- name: Run file policy checks on changed files
run: |
curl --silent --fail --header 'Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -o files.json \
https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files
opa eval --bundle build/policy/ --format values --input files.json \
opa eval -d build/policy/files.rego -d build/policy/helpers.rego --format values --input files.json \
--fail-defined 'data.files.deny[message]'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -323,3 +324,17 @@ jobs:
- name: Show input on failure
run: opa eval --input files.json --format pretty input
if: ${{ failure() }}
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
# keep this version in sync with the version in netlify.toml
hugo-version: '0.113.0'
extended: true
- name: Build docs site and test integrations data
run: |
cd docs
make dev-generate hugo-production-build
cd -
opa eval 'data.integrations.deny[message]' -i docs/website/public/index.json -d build/policy/integrations.rego --format=values --fail-defined
+1 -68
View File
@@ -2,7 +2,7 @@
# https://api.github.com/repos/open-policy-agent/opa/pulls/${PR_ID}/files
#
# Note that the "filename" here refers to the full path of the file, like
# docs/website/data/integrations.yaml - since that's how it's named in the
# docs/foo/bar.yaml - since that's how it's named in the
# input we'll use the same convention here.
package files
@@ -17,8 +17,6 @@ import data.helpers.extension
filenames := {f.filename | some f in input}
logo_exts := {"png", "svg"}
changes[filename] := attributes if {
some change in input
filename := change.filename
@@ -45,69 +43,6 @@ get_file_in_pr(filename) := dump_response_on_error(http.send({
"raise_error": false,
})).raw_body
deny contains "Logo must be placed in docs/website/static/img/logos/integrations" if {
"docs/website/data/integrations.yaml" in filenames
some filename in filenames
extension(filename) in logo_exts
changes[filename].status == "added"
directory(filename) != "docs/website/static/img/logos/integrations"
}
deny contains "Logo must be a .png or .svg file" if {
"docs/website/data/integrations.yaml" in filenames
some filename in filenames
changes[filename].status == "added"
directory(filename) == "docs/website/static/img/logos/integrations"
not extension(filename) in logo_exts
}
deny contains "Logo name must match integration" if {
"docs/website/data/integrations.yaml" in filenames
some filename in filenames
ext := extension(filename)
ext in logo_exts
changes[filename].status == "added"
logo_name := trim_suffix(basename(filename), concat("", [".", ext]))
integrations := {integration | some integration, _ in yaml.unmarshal(integrations_file).integrations}
not logo_name in integrations
}
deny contains sprintf("Integration '%v' missing required attribute '%v'", [name, attr]) if {
"docs/website/data/integrations.yaml" in filenames
file := yaml.unmarshal(integrations_file)
required := {"title", "description"}
some name, item in file.integrations
some attr in (required - {key | some key, _ in item})
}
deny contains sprintf("Integration '%v' references unknown software '%v' (i.e. not in 'software' object)", [name, software]) if {
"docs/website/data/integrations.yaml" in filenames
file := yaml.unmarshal(integrations_file)
software_list := object.keys(file.software)
some name, item in file.integrations
some software in item.software
not software in software_list
}
deny contains sprintf("Integration '%v' references unknown organization '%v' (i.e. not in 'organizations' object)", [name, organization]) if {
"docs/website/data/integrations.yaml" in filenames
file := yaml.unmarshal(integrations_file)
organizations_list := object.keys(file.organizations)
some name, item in file.integrations
some organization in item.inventors
not organization in organizations_list
}
deny contains sprintf("%s is an invalid YAML file: %s", [filename, content]) if {
some filename, content in yaml_file_contents
changes[filename].status in {"added", "modified"}
@@ -120,8 +55,6 @@ deny contains sprintf("%s is an invalid JSON file: %s", [filename, content]) if
not json.is_valid(content)
}
integrations_file := get_file_in_pr("docs/website/data/integrations.yaml")
yaml_file_contents[filename] := get_file_in_pr(filename) if {
some filename in filenames
extension(filename) in {"yml", "yaml"}
-177
View File
@@ -4,183 +4,6 @@ import future.keywords.in
import data.files.deny
test_deny_logo_if_added_in_wrong_directory {
expected := "Logo must be placed in docs/website/static/img/logos/integrations"
expected in deny with input as [
{
"filename": "docs/website/data/integrations.yaml",
"status": "modified",
},
{
"filename": "docs/website/static/img/logos/example.png",
"status": "added",
},
]
}
test_allow_logo_if_added_in_correct_directory {
integrations := yaml.marshal({"integrations": {"example": {
"title": "My test integration",
"description": "Testing",
}}})
count(deny) == 0 with data.files.integrations_file as integrations with input as [
{
"filename": "docs/website/data/integrations.yaml",
"status": "modified",
},
{
"filename": "docs/website/static/img/logos/integrations/example.png",
"status": "added",
},
]
}
test_deny_logo_if_not_png_file {
expected := "Logo must be a .png or .svg file"
expected in deny with input as [
{
"filename": "docs/website/data/integrations.yaml",
"status": "modified",
},
{
"filename": "docs/website/static/img/logos/integrations/example.jpg",
"status": "added",
},
]
}
test_deny_logo_if_no_matching_integration {
integrations := yaml.marshal({"integrations": {"my-integration": {
"title": "My test integration",
"description": "Testing",
}}})
files := [
{
"filename": "docs/website/data/integrations.yaml",
"status": "modified",
},
{
"filename": "docs/website/static/img/logos/integrations/example.png",
"status": "added",
},
]
expected := "Logo name must match integration"
expected in deny with data.files.integrations_file as integrations with input as files
}
test_allow_logo_if_no_matching_integration {
integrations := yaml.marshal({"integrations": {"my-integration": {
"title": "My test integration",
"description": "Testing",
}}})
files := [
{
"filename": "docs/website/data/integrations.yaml",
"status": "modified",
},
{
"filename": "docs/website/static/img/logos/integrations/my-integration.png",
"status": "added",
},
]
count(deny) == 0 with data.files.integrations_file as integrations with input as files
}
test_deny_integration_if_missing_required_attribute {
expected := "Integration 'my-integration' missing required attribute 'description'"
files := [{"filename": "docs/website/data/integrations.yaml"}]
integrations := yaml.marshal({"integrations": {"my-integration": {
"title": "My test integration",
"inventors": ["acmecorp"],
}}})
expected in deny with data.files.integrations_file as integrations with input as files
}
test_deny_integration_allowed_with_required_attributes {
files := [{"filename": "docs/website/data/integrations.yaml"}]
integrations := yaml.marshal({
"integrations": {"my-integration": {
"title": "My test integration",
"description": "This is a test integration",
"inventors": ["acmecorp"],
}},
"organizations": {"acmecorp": {"name": "AcmeCorp", "link": "https://acmecorp.example.org"}},
})
count(deny) == 0 with data.files.integrations_file as integrations with input as files
}
test_deny_unlisted_software {
files := [{"filename": "docs/website/data/integrations.yaml"}]
integrations := yaml.marshal({
"integrations": {"my-integration": {
"title": "My test integration",
"description": "This is a test integration",
"software": ["bitcoin-miner"],
}},
"software": {"kubernetes": {"name": "Kubernetes"}},
})
expected := "Integration 'my-integration' references unknown software 'bitcoin-miner' (i.e. not in 'software' object)"
expected in deny with data.files.integrations_file as integrations with input as files
}
test_allow_listed_software {
files := [{"filename": "docs/website/data/integrations.yaml"}]
integrations := yaml.marshal({
"integrations": {"my-integration": {
"title": "My test integration",
"description": "This is a test integration",
"software": ["kubernetes"],
}},
"software": {"kubernetes": {"name": "Kubernetes"}},
})
count(deny) == 0 with data.files.integrations_file as integrations with input as files
}
test_deny_unlisted_organization {
files := [{"filename": "docs/website/data/integrations.yaml"}]
integrations := yaml.marshal({
"integrations": {"my-integration": {
"title": "My test integration",
"description": "This is a test integration",
"software": ["kubernetes"],
"inventors": ["acmecorp"],
}},
"software": {"kubernetes": {"name": "Kubernetes"}},
"organizations": {"foobar": {"name": "FooBar", "link": "https://foobar.example.org"}},
})
expected := "Integration 'my-integration' references unknown organization 'acmecorp' (i.e. not in 'organizations' object)"
expected in deny with data.files.integrations_file as integrations with input as files
}
test_allow_listed_organization {
files := [{"filename": "docs/website/data/integrations.yaml"}]
integrations := yaml.marshal({
"integrations": {"my-integration": {
"title": "My test integration",
"description": "This is a test integration",
"software": ["kubernetes"],
"inventors": ["acmecorp"],
}},
"software": {"kubernetes": {"name": "Kubernetes"}},
"organizations": {"acmecorp": {"name": "AcmeCorp", "link": "https://acmecorp.example.org"}},
})
count(deny) == 0 with data.files.integrations_file as integrations with input as files
}
test_deny_invalid_yaml_file {
expected := "invalid.yaml is an invalid YAML file: {null{}}"
expected in deny with data.files.yaml_file_contents as {"invalid.yaml": "{null{}}"}
+189
View File
@@ -0,0 +1,189 @@
package integrations
import future.keywords.contains
import future.keywords.if
import future.keywords.in
allowed_image_extensions := ["png", "svg"]
# check that all integrations have an image
deny contains result if {
some id, integration in input.integrations
# some integrations are allowed to have a missing image as no suitable image is available
not integration.allow_missing_image == true
some _, ext in allowed_image_extensions
possible_filenames := {e |
some i
ext := allowed_image_extensions[i]
e := sprintf("%s.%s", [id, ext])
}
possible_filenames - {i | i := input.images[_]} == possible_filenames
result := {
"key": "integration_image",
"message": sprintf("integration %s missing image in 'static/img/logos/integrations' with extension of: %v", [id, concat(",", allowed_image_extensions)]),
}
}
# check that all images have an integration
deny contains result if {
some _, image in input.images
id := split(image, ".")[0]
not id in object.keys(input.integrations)
result := {
"key": "image_integration",
"message": sprintf("image %s is not used by any integration page", [image]),
}
}
# check that all integrations have the required fields
deny contains result if {
some id, integration in input.integrations
missing_fields := {"title", "layout"} - object.keys(integration)
count(missing_fields) > 0
result := {
"key": "fields",
"message": sprintf("integration %s missing required fields: %v", [id, concat(", ", sort(missing_fields))]),
}
}
# check that all integrations have content
deny contains result if {
some id, integration in input.integrations
content := trim_space(object.get(integration, "content", ""))
content == ""
result := {
"key": "content",
"message": sprintf("integration %s has no content", [id]),
}
}
# check that all integrations have a layout set to integration-single
deny contains result if {
some id, integration in input.integrations
layout := object.get(integration, "layout", "")
layout != "integration-single"
result := {
"key": "layout",
"message": sprintf("integration %s does not have layout set to: integration-single", [id]),
}
}
# check that all integrations reference an existing organization
deny contains result if {
some id, integration in input.integrations
inventors := object.get(integration, "inventors", [])
some _, inventor in inventors
not inventor in object.keys(input.organizations)
result := {
"key": "inventors",
"message": sprintf("integration %s references organization %s which does not exist", [id, inventor]),
}
}
# check that all integrations reference existing software
deny contains result if {
some id, integration in input.integrations
softwares := object.get(integration, "software", [])
some _, software in softwares
not software in object.keys(input.softwares)
result := {
"key": "software",
"message": sprintf("integration %s references software %s which does not exist", [id, software]),
}
}
# check that softwares have required fields
deny contains result if {
some id, software in input.softwares
missing_fields := {"title", "layout", "link"} - object.keys(software)
count(missing_fields) > 0
result := {
"key": "fields",
"message": sprintf("software %s missing required fields: %v", [id, concat(", ", sort(missing_fields))]),
}
}
# check that organizations have required fields
deny contains result if {
some id, organization in input.organizations
missing_fields := {"title", "layout", "link"} - object.keys(organization)
count(missing_fields) > 0
result := {
"key": "fields",
"message": sprintf("organization %s missing required fields: %v", [id, concat(", ", sort(missing_fields))]),
}
}
# check that each organization has at least one integration
deny contains result if {
some id, organization in input.organizations
inventor_integrations := {i |
some i, integration in input.integrations
id in integration.inventors
}
speaker_integrations := {i |
some i, integration in input.integrations
some _, video in integration.videos
some _, speaker in video.speakers
speaker.organization == id
}
count(inventor_integrations) + count(speaker_integrations) == 0
result := {
"key": "orphaned_org",
"message": sprintf("organization %s has no integrations", [id]),
}
}
# check that each software has at least one integration
deny contains result if {
some id, software in input.softwares
integrations := {i |
some i, integration in input.integrations
id in integration.software
}
count(integrations) == 0
result := {
"key": "orphaned_software",
"message": sprintf("software %s has no integrations", [id]),
}
}
+372
View File
@@ -0,0 +1,372 @@
package integrations_test
import future.keywords.in
messages_for_key(key, output) = messages {
messages := {m |
some e
output[e]
key in e
m := e.message
}
}
print_if(true, _, _, _) = true
print_if(false, key, false, output) := false {
print("Exp:", {})
print("Got: ", messages_for_key(key, output))
}
print_if(false, key, expected, output) := false {
is_string(expected)
print("Exp:", expected)
print("Got:", messages_for_key(key, output))
}
test_integration_has_required_fields_missing {
output := data.integrations.deny with input as {"integrations": {"regal": {}}}
key := "fields"
message := "integration regal missing required fields: layout, title"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_integration_has_required_fields_present {
output := data.integrations.deny with input as {"integrations": {"regal": {"title": "Regal", "layout": "integration"}}}
key := "fields"
message := "integration regal missing required fields: layout, title"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_integration_has_layout_missing {
output := data.integrations.deny with input as {"integrations": {"regal": {}}}
key := "layout"
message := "integration regal does not have layout set to: integration-single"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_integration_has_layout_missing {
output := data.integrations.deny with input as {"integrations": {"regal": {"layout": "wrong"}}}
key := "layout"
message := "integration regal does not have layout set to: integration-single"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_integration_has_layout_present {
output := data.integrations.deny with input as {"integrations": {"regal": {"layout": "integration-single"}}}
key := "layout"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_integration_has_content_missing {
output := data.integrations.deny with input as {"integrations": {"regal": {}}}
key := "content"
message := "integration regal has no content"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_integration_has_content_blank {
output := data.integrations.deny with input as {"integrations": {"regal": {"content": "\t\t\n "}}}
key := "content"
message := "integration regal has no content"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_integration_has_content_present {
output := data.integrations.deny with input as {"integrations": {"regal": {"content": "foobar"}}}
key := "content"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_every_integration_has_image_missing {
output := data.integrations.deny with input as {
"images": ["reegal.png"],
"integrations": {"regal": {}},
}
key := "integration_image"
message := "integration regal missing image in 'static/img/logos/integrations' with extension of: png,svg"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_every_integration_has_image_present {
output := data.integrations.deny with input as {
"images": ["regal.png"],
"integrations": {"regal": {}},
}
key := "integration_image"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_every_integration_has_image_missing_but_permitted {
output := data.integrations.deny with input as {
"images": ["reegal.png"],
"integrations": {"regal": {"allow_missing_image": true}},
}
key := "integration_image"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_every_image_has_integration_missing {
output := data.integrations.deny with input as {
"images": ["regal.png"],
"integrations": {"foobar": {}},
}
key := "image_integration"
message := "image regal.png is not used by any integration page"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_every_image_has_integration_present {
output := data.integrations.deny with input as {
"images": ["regal.png"],
"integrations": {"regal": {}},
}
key := "image_integration"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_integration_organizations_missing {
output := data.integrations.deny with input as {
"organizations": {"stira": {}},
"integrations": {"regal": {"inventors": ["styra"]}},
}
key := "inventors"
message := "integration regal references organization styra which does not exist"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_integration_organizations_present {
output := data.integrations.deny with input as {
"organizations": {"styra": {}},
"integrations": {"regal": {"inventors": ["styra"]}},
}
key := "inventors"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_integration_softwares_missing {
output := data.integrations.deny with input as {
"softwares": {"mars": {}},
"integrations": {"regal": {"software": ["terraform"]}},
}
key := "software"
message := "integration regal references software terraform which does not exist"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_integration_softwares_present {
output := data.integrations.deny with input as {
"softwares": {"terraform": {}},
"integrations": {"regal": {"software": ["terraform"]}},
}
key := "software"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_software_has_required_fields_missing {
output := data.integrations.deny with input as {"softwares": {"terraform": {}}}
key := "fields"
message := "software terraform missing required fields: layout, link, title"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_software_has_required_fields_present {
output := data.integrations.deny with input as {"softwares": {"terraform": {"layout": "software-single", "link": "https://www.terraform.io/", "title": "Terraform"}}}
key := "fields"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_organization_has_required_labels {
output := data.integrations.deny with input as {"organizations": {"styra": {}}}
key := "fields"
message := "organization styra missing required fields: layout, link, title"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_organization_has_required_fields_present {
output := data.integrations.deny with input as {"organizations": {"styra": {"layout": "organization-single", "link": "https://styra.com/", "title": "Styra"}}}
key := "fields"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_organization_has_one_or_more_integrations_none {
output := data.integrations.deny with input as {"organizations": {"foobar": {}}, "integrations": {}}
key := "orphaned_org"
message := "organization foobar has no integrations"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_organization_has_one_or_more_integrations_one {
output := data.integrations.deny with input as {"organizations": {"foobaz": {}}, "integrations": {"foobar": {"inventors": ["foobaz"]}}}
key := "orphaned_org"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_organization_has_one_or_more_integrations_speaker {
output := data.integrations.deny with input as {"organizations": {"foobaz": {}}, "integrations": {"foobar": {"videos": [{"speakers": [{"organization": "foobaz"}]}]}}}
key := "orphaned_org"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
test_software_has_one_or_more_integrations_none {
output := data.integrations.deny with input as {"softwares": {"foobar": {}}, "integrations": {}}
key := "orphaned_software"
message := "software foobar has no integrations"
got := messages_for_key(key, output)
result := message in got
print_if(result, key, message, output)
}
test_software_has_one_or_more_integrations_one {
output := data.integrations.deny with input as {"softwares": {"foobaz": {}}, "integrations": {"foobar": {"software": ["foobaz"]}}}
key := "orphaned_software"
got := messages_for_key(key, output)
result := got == set()
print_if(result, key, false, output)
}
+64 -51
View File
@@ -14,8 +14,8 @@ the website.
directory. This content is versioned for each release and should have all images
and code snippets alongside the markdown content files.
[website/data/integrations.yaml](./website/data/integrations.yaml) - Source for the
integrations index. See [Integration Index](#integration-index) below for more details.
[content/integrations/](./content/integrations) - Source for the
OPA Ecosystem page. See [OPA Ecosystem](#opa-ecosystem) below for more details.
## Website Components
@@ -287,73 +287,86 @@ another group's module when evaluating (e.g. so that they can be imported).
> If a query isn't specified for the output's group, when other modules are included the default becomes `data` instead of `data.<package name>`.
# Integration Index
# OPA Ecosystem
The integration index makes it easy to find either a specific integration with OPA
or to browse the integrations with OPA within a particular category. And it pulls
information about that integration (e.g. blogs, videos, tutorials, code) into a
single place while allowing integration authors to maintain the code wherever they like.
The [OPA Ecosystem](https://www.openpolicyagent.org/docs/latest/ecosystem/)
makes it easy to find either a specific integration with OPA
or to browse the integrations with OPA within a particular category. It pulls
information about different integrations (e.g. blogs, videos, tutorials, code) into a
single place while allowing integration authors to update the docs content as needed.
## Schema
The schema of integrations.yaml has the following highlevel entries, each of which is self-explanatory.
- integrations
- organizations
- software
Source information for the OPA Ecosystem is stored in the following places:
Each entry is an object where keys are unique identifiers for each subentry.
Organizations and Software are self-explanatory by inspection. The schema for integrations is as follows.
- [content/integrations/](./content/integrations) - each file creates a page in the OPA Ecosystem for a particular integration.
- [content/organizations/](./content/organizations) - each file is a page for organizations and companies associated with integrations.
- [content/softwares/](./content/softwares) - each file is for software categories related to integrations.
- title: string
- description: string
- software: array of strings
- labels: collection of key/value pairs.
- tutorials: array of links
- code: array of links
- inventors: array of either
- string (organization name)
- object with fields
- name: string
- organization: string
- videos: array of either
- link
- object with fields
- title: string
- speakers: array of name/organization objects
- venue: string
- link: string
- blogs: array of links
Integrations should have a file in `content/integrations/` with the following schema:
The UI for this is currently hosted at [https://openpolicyagent.org/docs/latest/ecosystem/](https://openpolicyagent.org/docs/latest/ecosystem/)
```md
---
layout: integration-single # required to be set and to this value
title: <integration name>
software:
- <related software>
- <related software>
inventors:
- <inventor name>
- <inventor name>
tutorials: # optional, links to tutorials for the integration
- https://example.com/tutorial
code: # optional, links to code for the integration
- https://github.com/...
blogs: # optional, links to blog posts for the integration
- https://example.com/blog/1
videos: # optional, links to videos for the integration
- title: <video title>
speakers:
- name: <speaker name>
organization: <speaker organization>
venue: <venue>
link: <link>
---
Description of the integration (required)
```
The future plan is to use the following labels to generate categories of integrations.
Any `inventor` that is not already in `content/organizations/` will need to be added too in `content/organizations/`.
Organizations have the following format:
- layer: which layer of the stack does this belong to
- category: which kind of component within that layer is this
- type: what kind of integration this is. Either `enforcement` or `poweredbyopa`. `enforcement` is the default
if `type` is missing. `poweredbyopa` is intended to be integrations built using OPA that are not tied to a
particular layer of the stack. This distinction is the most ambiguous and may change.
```md
---
link: https://example.com
title: <organization name>
layout: organization-single # required to be set and to this value
---
```
As of now the labels are only displayed for each entry.
Any `software` that is not already in `content/softwares/` will need to be added too in `content/softwares/`.
Software categories have the following format:
```md
---
link: https://example.com
title: <software name>
layout: software-single # required to be set and to this value
---
```
## Logos
For each entry in the [integrations.yaml](./website/data/integrations.yaml)
integrations section the UI will use a PNG or SVG logo with the same name as the key from
[./website/static/img/logos/integrations](./website/static/img/logos/integrations)
For each file in under [content/integrations/](./website/content/integrations)
a png or svg logo with the same name must be placed in `./website/static/img/logos/integrations`.
For example:
```yaml
integrations:
my-cool-integration:
...
```md
# content/integrations/my-cool-integration.md
```
Would need a file called `my-cool-integration.png` at `./website/static/img/logos/integrations/my-cool-integration.png`
(or `my-cool-integration.svg` in the same location).
If it doesn't exist the OPA logo will be shown by default.
Would need a file called `my-cool-integration.(png|svg)` at
`./website/static/img/logos/integrations/my-cool-integration.(png|svg)`.
## Google Analytics
+1 -1
View File
@@ -19,7 +19,7 @@ Docs for the OPA sub-projects each have their own home. Check out their docs to
- [devel/](https://github.com/open-policy-agent/opa/blob/main/docs/devel) - Developer documentation for OPA (not part of the website)
- [website/](https://github.com/open-policy-agent/opa/blob/main/docs/website) - This directory contains all of the Markdown, HTML, Sass/CSS, and other assets needed to build the [openpolicyagent.org](https://openpolicyagent.org) website. See the section below for steps to build the site and test documentation changes locally. This content is not versioned for each release, it is common scaffolding for the website.
- [content/](https://github.com/open-policy-agent/opa/blob/main/docs/content) - The raw OPA documentation can be found under the directory. This content is versioned for each release and should have all images and code snippets alongside the markdown content files.
- [website/data/integrations.yaml](https://github.com/open-policy-agent/opa/blob/main/docs/website/data/integrations.yaml) - Source for the integrations index. See [Integration Index](https://github.com/open-policy-agent/opa/blob/main/docs/README.md#integration-index) below for more details.
- [content/integrations, content/organizations, content/softwares](https://github.com/open-policy-agent/opa/blob/main/docs/content) - the source for data used to generate the [OPA Ecosystem](https://www.openpolicyagent.org/docs/latest/ecosystem/)
## Markdown Page Structure
+1 -1
View File
@@ -2,7 +2,7 @@
title: "OPA Ecosystem"
layout: ecosystem-section
kind: support
edit_link: https://github.com/open-policy-agent/opa/edit/main/docs/website/data/integrations.yaml
edit_link: https://github.com/open-policy-agent/opa/tree/main/docs#opa-ecosystem
categories:
- key: rego
title: Rego Language
+23
View File
@@ -0,0 +1,23 @@
---
title: Alfred
subtitle: Self-hosted OPA playground
labels:
layer: network
category: application
software:
- alfred
inventors:
- dolevf
code:
- https://github.com/dolevf/Open-Policy-Agent-Alfred
docs_features:
learning-rego:
note: |
Similar to the public [OPA Playground](https://play.openpolicyagent.org/),
Alfred can be used to learn Rego interactively in an environment that
can't use the public playground. Read about
[installation](https://github.com/dolevf/Open-Policy-Agent-Alfred#how-to-install).
layout: integration-single
---
Alfred introduces a local graphical user interface to interact with Open Policy Agent and acts as an alternative to OPA's playground, allowing the user to keep information related to policy testing locally.
+12
View File
@@ -0,0 +1,12 @@
---
title: Alluxio
labels:
category: authorization
type: poweredbyopa
tutorials:
- https://docs.alluxio.io/ee/user/2.10.0/en/security/OpenPolicyAgent-Integration.html
inventors:
- alluxio
layout: integration-single
---
Alluxio is an open source data orchestration technology for analytics and AI for the cloud. Alluxio can integrate with OPA and delegate all permission checks to OPA.
+12
View File
@@ -0,0 +1,12 @@
---
title: ANTLR Grammar
labels:
category: utilities
layer: rego
code:
- https://github.com/antlr/grammars-v4
inventors:
- independent
layout: integration-single
---
ANTLR4 grammar for Rego.
@@ -0,0 +1,22 @@
---
title: Authorization Integration with Apache APISIX
software:
- apache-apisix
labels:
category: gateway
layer: network
code:
- https://github.com/apache/apisix
blogs:
- https://apisix.apache.org/blog/2021/12/24/open-policy-agent
- https://medium.com/@ApacheAPISIX/apache-apisix-integrates-with-open-policy-agent-to-enrich-its-ecosystem-15569fe3ab9c
docs_features:
rest-api-integration:
note: |
Apache APISIX routes can be configured to call an OPA instance over
the REST API.
[This blog post](https://apisix.apache.org/blog/2021/12/24/open-policy-agent/)
explains how such a configuration can be achieved.
layout: integration-single
---
Apache APISIX provides a plugin for delegating fine-grained authorization decisions to OPA.
+25
View File
@@ -0,0 +1,25 @@
---
title: Aserto
labels:
category: authorization
layer: application
type: poweredbyopa
inventors:
- aserto
code:
- https://github.com/aserto-dev
- https://github.com/opcr-io
tutorials:
- https://docs.aserto.com/docs
blogs:
- https://www.aserto.com/blog/how-do-aserto-rego-policies-work
- https://www.aserto.com/blog/testing-rego-policies
- https://www.aserto.com/blog/aserto-on-aserto-an-opa-authorization-policy-for-aserto-tenants
- https://www.aserto.com/blog/rego-getting-started
videos:
- https://www.youtube.com/watch?v=RJkgmdjJn_w
layout: integration-single
---
Aserto is a cloud-native authorization service that makes it easy to add permissions and RBAC to your SaaS applications and APIs.
Aserto is based on the Open Policy Agent.
@@ -0,0 +1,14 @@
---
title: ASP.NET Core
labels:
category: application
layer: network
code:
- https://github.com/build-security/OPA-AspDotNetCore-Middleware
inventors:
- build.security
layout: integration-single
---
Use ASP.NET Core to create web apps and services that are fast, secure, cross-platform, and cloud-based.
OPA can be used to implement authorization policies for APIs used in the ASP.NET Core framework.
+25
View File
@@ -0,0 +1,25 @@
---
title: Atmos
software:
- aws
- gcp
- terraform
- helm
inventors:
- cloudposse
labels:
category: Infrastructure as Code
type: poweredbyopa
tutorials:
- https://atmos.tools/core-concepts/components/validation/#open-policy-agent-opa
code:
- https://github.com/cloudposse/atmos
docs_features:
terraform:
note: |
Atmos can validate Terraform stack before applying them. This is done
using the `validate component` command
[documented here](https://atmos.tools/cli/commands/validate/component).
layout: integration-single
---
Workflow automation tool for DevOps. Keep configuration DRY with hierarchical imports of configurations, inheritance, and WAY more.
+21
View File
@@ -0,0 +1,21 @@
---
title: Awesome OPA List
software: []
labels:
category: learning
type: poweredbyopa
code:
- https://github.com/StyraInc/awesome-opa
inventors:
- styra
docs_features:
learning-rego:
note: |
The Awesome OPA project maintains a list of
[policy packages](https://github.com/StyraInc/awesome-opa#policy-packages),
and [editor integrations](https://github.com/StyraInc/awesome-opa#ide-and-editor-integrations)
which can be helpful references for learning Rego.
layout: integration-single
allow_missing_image: true
---
A curated list of awesome OPA related tools, frameworks and articles.
@@ -0,0 +1,10 @@
---
title: AWS API Gateway
labels:
category: servicemesh
layer: gateway
code:
- https://github.com/zotoio/sls-lambda-opa
layout: integration-single
---
The AWS API Gateway controls API traffic for your application running on AWS. OPA can be configured as an external authorizer for that Gateway to implement authorization policies on APIs.
@@ -0,0 +1,26 @@
---
title: AWS CloudFormation Hook
software:
- aws
- cloudformation
labels:
type: poweredbyopa
tutorials:
- https://www.openpolicyagent.org/docs/latest/aws-cloudformation-hooks/
code:
- https://github.com/StyraInc/opa-aws-cloudformation-hook
blogs:
- https://blog.styra.com/blog/the-opa-aws-cloudformation-hook
inventors:
- styra
docs_features:
rest-api-integration:
note: |
The OPA CloudFormation Hook uses AWS Lambda to consult an OPA instance
using the REST API before allowing a CloudFormation stack to be created.
Read [the tutorial](https://www.openpolicyagent.org/docs/latest/aws-cloudformation-hooks/)
here in the OPA documentation.
layout: integration-single
---
AWS CloudFormation Hook that uses OPA to make policy decisions on infrastructure provisioned via AWS CloudFormation
@@ -0,0 +1,21 @@
---
title: Boomerang Bosun Policy Gating
labels:
type: poweredbyopa
layer: application
code:
- https://www.useboomerang.io/
- https://github.com/boomerang-io
inventors:
- ibm
- boomerang
docs_features:
rest-api-integration:
note: |
The
[Boomerang Bosun Service](https://github.com/boomerang-io/bosun.service.policy)
component interacts with an OPA instance over the REST API to evaluate
policy during CICD runs.
layout: integration-single
---
Boomerang Bosun is a policy-based gating system that combines Policy Templates with Rules and data to validate Gates.
+24
View File
@@ -0,0 +1,24 @@
---
title: Bottle Application Authorization
labels:
layer: network
category: application
inventors:
- dolevf
software:
- bottle
code:
- https://github.com/dolevf/bottle-acl-openpolicyagent
blogs:
- https://blog.lethalbit.com/open-policy-agent-for-bottle-web-framework/
docs_features:
rest-api-integration:
note: |
This sample python application calls has a middleware to call OPA
before processing each request. See the
[example code](https://github.com/dolevf/bottle-acl-openpolicyagent/blob/00a4336/main.py#L37).
layout: integration-single
---
This integration demonstrates using Open Policy Agent to perform API authorization for a Python application backed by Bottle.
Bottle is a fast, simple and lightweight WSGI micro web-framework for Python.
+16
View File
@@ -0,0 +1,16 @@
---
title: Carbonetes - BrainIAC
software:
- github
- brainiac
labels:
layer: Infrastructure
category: security
type: poweredbyopa
code:
- https://github.com/carbonetes/brainiac
inventors:
- carbonetes
layout: integration-single
---
BrainIAC uses static code analysis to analyze IAC code to detect security issues before deployment. This tool can scan for issues like security policy misconfigurations, insecure cloud-based services, and compliance issues. The BrainIAC tool performs a comprehensive code scan and generates reports containing detailed insights into the identified issues..
+25
View File
@@ -0,0 +1,25 @@
---
title: Ceph Object Storage Authorization
software:
- ceph
labels:
category: object
layer: data
tutorials:
- https://docs.ceph.com/docs/master/radosgw/opa/
- https://www.katacoda.com/styra/scenarios/opa-ceph
inventors:
- styra
- redhat
videos:
- https://www.youtube.com/watch?v=9m4FymEvOqM&feature=share
docs_feature:
rest-api-integration:
note: |
The Ceph Object Gateway implements a native integration with OPA using
the REST API.
The [integration is documented](https://docs.ceph.com/en/latest/radosgw/opa/)
in the Ceph docs.
layout: integration-single
---
Ceph is a highly scalable distributed storage solution that uniquely delivers object, block, and file storage in one unified system. OPA provides fine-grained, context-aware authorization of the information stored within Ceph.
@@ -0,0 +1,26 @@
---
title: Chef Automate
subtitle: Operational Visibility Dashboard
tutorials:
- https://github.com/chef/automate/tree/master/components/authz-service#authz-with-opa
videos:
- title: 'OPA in Practice: From Angular to OPA in Chef Automate'
speakers:
- name: Michael Sorens
organization: chef
venue: OPA Summit at Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=jrrW855xL3s
docs_features:
go-integration:
note: |
Chef Automate uses the Go Rego API to evaluate authorization policies
controlling access to its own API endpoints. The feature is
[documented here](https://github.com/chef/automate/tree/master/components/authz-service#authz-with-opa).
layout: integration-single
allow_missing_image: true
---
Application require authorization decisions made at the API gateway, frontend, backend, and database.
OPA helps developers decouple authorization logic from application code, define a custom authorization model
that enables end-users to control tenant permissions, and enforce that policy across the different components of the
application (gateway, frontend, backend, database).
+13
View File
@@ -0,0 +1,13 @@
---
title: CircleCI
labels:
category: tooling
layer: cicd
type: poweredbyopa
tutorials:
- https://circleci.com/docs/config-policy-management-overview/
inventors:
- circleci
layout: integration-single
---
Use config policy management to create organization-level policies to impose rules and scopes around which configuration elements are required, allowed, not allowed etc.
@@ -0,0 +1,32 @@
---
title: Kubernetes Admission Control using Vulnerability Scanning
software:
- kubernetes
- clair
labels:
layer: orchestration
category: containers
datasource: clair
code:
- https://github.com/open-policy-agent/contrib/tree/master/image_enforcer
tutorials:
- https://github.com/open-policy-agent/contrib/blob/master/image_enforcer/README.md
docs_features:
rest-api-integration:
note: |
This example project in
[OPA contrib](https://github.com/open-policy-agent/contrib/tree/main/image_enforcer)
uses OPA over the REST API to enforce admission policy based on
vulnerability scanning results.
kubernetes:
note: |
This example project in
[OPA contrib](https://github.com/open-policy-agent/contrib/tree/main/image_enforcer)
uses OPA to enforce admission policy in Kubernetes.
layout: integration-single
---
Admission control policies in Kubernetes can be augmented with
vulnerability scanning results to make more informed decisions.
This integration demonstrates how to integrate CoreOS Clair with OPA and
run it as an admission controller.
+14
View File
@@ -0,0 +1,14 @@
---
title: App authorization for Clojure
software:
- clojure
labels:
layer: network
category: application
code:
- https://github.com/anderseknert/clj-opa
inventors:
- styra
layout: integration-single
---
Authorization middleware for Ring based apps and other utilities for working with OPA in Clojure.
@@ -0,0 +1,24 @@
---
title: Cloudflare Worker Enforcement of OPA Policies Using Wasm
software:
- cloudflare
labels:
layer: application
category: serverless
code:
- https://github.com/open-policy-agent/contrib/tree/master/wasm/cloudflare-worker
tutorials:
- https://github.com/open-policy-agent/contrib/blob/master/wasm/cloudflare-worker/README.md
docs_features:
wasm-integration:
note: |
This example project in
[OPA contrib](https://github.com/open-policy-agent/contrib/tree/main/wasm/cloudflare-worker)
uses the
[NodeJS OPA Wasm Module](https://github.com/open-policy-agent/npm-opa-wasm)
to enforce policy at the edge of Cloudflare's network.
layout: integration-single
---
Cloudflare Workers are a serverless platform that supports Wasm.
This integration uses OPA's Wasm compiler to generate code enforced at the edge of Cloudflare's network.
+52
View File
@@ -0,0 +1,52 @@
---
title: Conftest
subtitle: Rego policy for configuration files
labels:
type: poweredbyopa
layer: configuration
code:
- https://github.com/open-policy-agent/conftest
software:
- kustomize
- terraform
- aws
- toml
- docker
tutorials:
- https://www.conftest.dev
- https://www.conftest.dev/examples/
videos:
- title: Applying Policy Throughout the Application Lifecycle with Open Policy Agent
speakers:
- name: Gareth Rushgrove
organization: snyk
venue: Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=cXfsaE6RKfc
- title: 'Terraform Code Reviews: Supercharged with Conftest'
speakers:
- name: Jay Wallace
organization: doordash
venue: Hashitalks 2020
link: https://www.youtube.com/watch?v=ziKT-ZjZ7mM
docs_features:
policy-testing:
note: |
Conftest supports unit testing of policy and has a number of extra language
features for working with configuration files. The functionality is
[documented here](https://www.conftest.dev/#testingverifying-policies).
go-integration:
note: |
Conftest is written in Go and uses the
[Rego Go API](https://www.openpolicyagent.org/docs/latest/integration/#integrating-with-the-go-api).
opa-bundles:
note: |
Conftest supports the loading of policy in a bundle format. The feature
is [documented here](https://www.conftest.dev/sharing/).
terraform:
note: |
Conftest has generic support for Terraform source files defined in HCL.
There is an example provided here on
[GitHub](https://github.com/open-policy-agent/conftest/tree/master/examples/hcl2).
layout: integration-single
---
Conftest is a utility built on top of OPA to help you write tests against structured configuration data.
@@ -0,0 +1,14 @@
---
title: CoreDNS Authorization
labels:
layer: network
category: dns
software:
- coredns
code:
- https://github.com/coredns/policy
inventors:
- infoblox
layout: integration-single
---
CoreDNS is a cloud-native DNS server written in Go. OPA can be used as a plugin to filter queries and responses.
+26
View File
@@ -0,0 +1,26 @@
---
title: Container Signing, Verification and Storage in an OCI registry
labels:
category: security
layer: application
software:
- cosign
inventors:
- sigstore
code:
- https://docs.sigstore.dev/cosign/attestation#validate-in-toto-attestations
- https://github.com/sigstore/cosign-gatekeeper-provider
vides:
- https://www.youtube.com/watch?v=gCi9_4NYyR0
docs_features:
go-integration:
note: |
Cosign In-Toto attestations can be
[written in Rego](https://docs.sigstore.dev/cosign/attestation/#cosign-custom-predicate-type-and-rego-policy),
these are evaluated in the Cosign binary using the Go API.
layout: integration-single
---
Cosign is a tool for container image signing and verifying maintained under the Project Sigstore
in collaboration with the Linux Foundation. Among other features, Cosign supports KMS signing,
built-in binary transparency, and timestamping service with Rekor and Kubernetes policy enforcement.
@@ -0,0 +1,18 @@
---
title: Library-based Microservice Authorization
labels:
category: servicemesh
layer: library
videos:
- title: How Netflix is Solving Authorization Across Their Cloud
speakers:
- name: Manish Mehta
organization: netflix
- name: Torin Sandall
organization: styra
venue: Kubecon Austin 2017
link: https://www.youtube.com/watch?v=R6tUNpRpdnY
layout: integration-single
allow_missing_image: true
---
Microservice authorization can be enforced through a network proxy like Envoy/Istio/Linkerd/... or can be enforced by modifying the microservice code to use a common library. In both cases OPA makes the authorization decision that the network proxy or the library enforce.
+22
View File
@@ -0,0 +1,22 @@
---
title: Dapr
software:
- dapr
labels:
category: application
layer: network
tutorials:
- https://docs.dapr.io/reference/components-reference/supported-middleware/middleware-opa/
code:
- https://github.com/dapr/dapr
- https://github.com/dapr/components-contrib/blob/master/middleware/http/opa/middleware.go
docs_features:
go-integration:
note: |
Dapr's contrib middleware include an OPA integration built on the Go
API.
[This tutorial](https://docs.dapr.io/reference/components-reference/supported-middleware/middleware-opa/)
explains how to configure it.
layout: integration-single
---
Middleware to apply Open Policy Agent policies on incoming requests
@@ -0,0 +1,16 @@
---
title: HTTP API Authorization in Dart
labels:
layer: network
category: application
software:
- dart
tutorials:
- https://github.com/adaptant-labs/opa-api-authz-dart/README.md
code:
- https://github.com/adaptant-labs/opa-api-authz-dart
inventors:
- adaptant
layout: integration-single
---
This integration demonstrates how to leverage OPA to perform basic HTTP API authorization in a simple Dart microservice. OPA makes it possible to provide fine-grained context-aware authorization for each REST endpoint and access method.
@@ -0,0 +1,16 @@
---
title: Docker controls via OPA Policies
software:
- docker
labels:
layer: server
category: container
code:
- https://github.com/open-policy-agent/opa-docker-authz
tutorials:
- https://www.openpolicyagent.org/docs/latest/docker-authorization/
inventors:
- styra
layout: integration-single
---
Docker's out of the box authorization model is all or nothing. This integration demonstrates how to use OPA's context-aware policies to exert fine-grained control over Docker.
+14
View File
@@ -0,0 +1,14 @@
---
title: Easegress
labels:
category: gateway
layer: network
code:
- https://github.com/megaease/easegress
inventors:
- megaease
layout: integration-single
---
Easegress is a Cloud Native API orchestration system.
OPA can be configured as a filter(plugin) to implement authorization policies for the APIs.
@@ -0,0 +1,16 @@
---
title: Elasticsearch Data Filtering
labels:
layer: data
category: filtering
software:
- elasticsearch
code:
- https://github.com/open-policy-agent/contrib/tree/master/data_filter_elasticsearch
tutorials:
- https://github.com/open-policy-agent/contrib/blob/master/data_filter_elasticsearch/README.md
inventors:
- styra
layout: integration-single
---
Elasticsearch is a distributed, open source search and analytics engine. This OPA integration lets an elasticsearch client construct queries so that the data returned by elasticsearch obeys OPA-defined policies.
@@ -0,0 +1,14 @@
---
title: Emissary-Ingress
labels:
category: network
layer: gateway
software:
- emissary-ingress
blogs:
- https://www.infracloud.io/blogs/emissary-ingress-opa-integration/
layout: integration-single
---
Emissary-Ingress is an open-source Kubernetes-native API Gateway, Layer 7 load balancer and Kubernetes Ingress built on Envoy Proxy.
OPA can be integrated with Emissary as an external authorization service to enforce authorization policies over APIs.
@@ -0,0 +1,79 @@
---
title: Styra Enterprise OPA
software:
- enterprise-opa
labels:
category: authorization
type: poweredbyopa
tutorials:
- https://docs.styra.com/enterprise-opa/tutorials
- https://docs.styra.com/enterprise-opa/tutorials/performance-testing
- https://docs.styra.com/enterprise-opa/tutorials/grpc-basic-tutorial
- https://docs.styra.com/enterprise-opa/tutorials/grpc-go-tutorial
- https://docs.styra.com/enterprise-opa/tutorials/lia
- https://docs.styra.com/enterprise-opa/tutorials/decision-logs/
- https://docs.styra.com/enterprise-opa/tutorials/kafka
- https://docs.styra.com/enterprise-opa/tutorials/abac-with-sql
code:
- https://github.com/StyraInc/enterprise-opa
inventors:
- styra
blogs:
- https://www.styra.com/blog/introducing-styra-load-enterprise-opa-distribution-for-data-heavy-authorization/
videos:
- title: Start Loving Your Data-heavy Authorization
speakers:
- name: Torin Sandall
organization: styra
- name: Chris Hendrix
organization: styra
venue: online
link: https://www.youtube.com/watch?v=Is1iBPr1YVs
docs_features:
opa-bundles:
note: |
Its possible to configure bundles for both
[policy](https://docs.styra.com/enterprise-opa/reference/configuration/policy/bundle-api)
and
[data](https://docs.styra.com/enterprise-opa/reference/configuration/data/bundle-api)
in Enterprise OPA.
external-data:
note: |
[Enterprise OPA](https://docs.styra.com/enterprise-opa/)
supports various external data sources, including:
[Kafka](https://docs.styra.com/enterprise-opa/reference/configuration/data/kafka),
[Okta](https://docs.styra.com/enterprise-opa/reference/configuration/data/okta),
[LDAP](https://docs.styra.com/enterprise-opa/reference/configuration/data/ldap),
[HTTP](https://docs.styra.com/enterprise-opa/reference/configuration/data/http),
[Git](https://docs.styra.com/enterprise-opa/reference/configuration/data/git)
and
[S3](https://docs.styra.com/enterprise-opa/reference/configuration/data/s3).
Runtime support for
[SQL](https://docs.styra.com/enterprise-opa/tutorials/abac-with-sql)
is also available.
external-data-runtime:
note: |
[Enterprise OPA](https://docs.styra.com/enterprise-opa/)
can load data from SQL sources at runtime. The feature
[is documented](https://docs.styra.com/enterprise-opa/tutorials/abac-with-sql)
here with an ABAC example.
external-data-realtime-push:
note: |
It's possible to steam data updates to
[Enterprise OPA](https://docs.styra.com/enterprise-opa/)
using Kafka. The Kafka integration is
[documented](https://docs.styra.com/enterprise-opa/tutorials/kafka)
here.
policy-testing:
note: |
[Enterprise OPA's](https://docs.styra.com/enterprise-opa/)
[Live Impact Analysis (LIA) feature](https://docs.styra.com/enterprise-opa/tutorials/lia)
allows you to test changes to Rego policy on running instances.
decision-logging:
note: |
It's possible to send decision logs to a enterprise tools like Splunk,
and Kafka. This enhanced decision logging functionality is
[documented here](https://docs.styra.com/enterprise-opa/tutorials/decision-logs/).
layout: integration-single
---
An enterprise-grade drop-in replacement for the Open Policy Agent with improved performance and out of the box enterprise integrations
@@ -0,0 +1,59 @@
---
title: Container Network Authorization with Envoy
subtitle: Official OPA Envoy Integration
labels:
category: servicemesh
layer: network
software:
- envoy
tutorials:
- https://github.com/tsandall/minimal-opa-envoy-example/blob/master/README.md
- https://www.openpolicyagent.org/docs/latest/envoy-introduction/
code:
- https://github.com/open-policy-agent/opa-envoy-plugin
- https://github.com/tsandall/minimal-opa-envoy-example
inventors:
- styra
blogs:
- https://blog.openpolicyagent.org/envoy-external-authorization-with-opa-578213ed567c
videos:
- title: 'OPA at Scale: How Pinterest Manages Policy Distribution'
speakers:
- name: Will Fu
organization: pinterest
- name: Jeremy Krach
organization: pinterest
venue: OPA Summit at Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=LhgxFICWsA8
- title: Deploying Open Policy Agent at Atlassian
speakers:
- name: Chris Stivers
organization: atlassian
- name: Nicholas Higgins
organization: atlassian
venue: OPA Summit at Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=nvRTO8xjmrg
- title: How Yelp Moved Security From the App to the Mesh with Envoy and OPA
speakers:
- name: Daniel Popescu
organization: yelp
- name: Ben Plotnick
organization: yelp
venue: Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=Z6aN3Smt-9M
docs_features:
envoy:
note: |
The
[opa-envoy-plugin](https://github.com/open-policy-agent/opa-envoy-plugin)
project is the official integration for OPA and Envoy.
rest-api-integration:
note: |
The [opa-envoy-plugin](https://github.com/open-policy-agent/opa-envoy-plugin)
project uses the REST API to allow and deny requests routed via an Envoy proxy.
Read about this integration in the
[OPA Docs](https://www.openpolicyagent.org/docs/latest/envoy-introduction/).
layout: integration-single
---
Envoy is a networking abstraction for cloud-native applications. OPA hooks into Envoys external authorization filter to provide fine-grained, context-aware authorization for network or HTTP requests.
@@ -0,0 +1,36 @@
---
title: Fairwinds Insights Configuration Validation Software
labels:
category: kubernetes
layer: cicd
inventors:
- fairwinds
software:
- kubernetes
- docker
- helm
tutorials:
- https://insights.docs.fairwinds.com/features/policy/
- https://insights.docs.fairwinds.com/reports/opa/
- https://insights.docs.fairwinds.com/features/admission-controller/
- https://insights.docs.fairwinds.com/features/continuous-integration/
videos:
- https://youtu.be/kmvPYjx1bpU
- https://youtu.be/gxE_Tkj6d40
blogs:
- https://www.fairwinds.com/blog/managing-opa-policies-with-fairwinds-insights
- https://www.fairwinds.com/blog/manage-open-policy-agent-opa-consistently
- https://www.fairwinds.com/blog/kubernetes-multi-cluster-visibility-why-how-to-get-it
- https://www.fairwinds.com/blog/what-is-kubernetes-policy-as-code
- https://www.fairwinds.com/blog/why-kubernetes-policy-enforcement
- https://www.fairwinds.com/blog/an-interview-with-flatfile-on-why-fairwinds-insights-kubernetes-configuration-validation
docs_features:
kubernetes:
note: |
Implements auditing and admission checking of Kubernetes resources
using Rego policy using
[Polaris](https://github.com/FairwindsOps/Polaris).
layout: integration-single
allow_missing_image: true
---
Automate, monitor and enforce OPA policies with visibility across multiple clusters and multiple teams. It ensures the same policies are applied across all your clusters and gives some flexibility if you want certain policies to apply to only certain workloads. Run the same policies in CI/CD, Admission Control, and In-cluster scanning to apply policy consistently throughout the development and deployment process.
+16
View File
@@ -0,0 +1,16 @@
---
title: fiber
labels:
category: application
layer: library
software:
- golang
- fiber
code:
- https://github.com/gofiber/contrib/tree/main/opafiber
layout: integration-single
---
Fiber is an Express inspired web framework built on top of Fasthttp, the fastest HTTP engine for Go.
Designed to ease things up for fast development with zero memory allocation and performance in mind.
With Open Policy Agent integration, you can run your Rego policies as part of the request lifecycle in the middleware.
+13
View File
@@ -0,0 +1,13 @@
---
title: fig
labels:
category: utilities
layer: shell
code:
- https://github.com/open-policy-agent/contrib/tree/main/opa_fig_autocomplete
- https://github.com/withfig/autocomplete/blob/master/src/opa.ts
inventors:
- fig
layout: integration-single
---
Beautiful shell autocompletion for OPA and many other commands, for Mac OS
+14
View File
@@ -0,0 +1,14 @@
---
title: Flask-OPA
labels:
category: flask
layer: library
software:
- flask
code:
- https://github.com/EliuX/flask-opa
blogs:
- https://github.com/EliuX/flask-opa/tree/master/examples
layout: integration-single
---
Simple to use Flask extension that lets you secure your projects with OPA. It allows HTTP API Authorization and Policy Enforcement Point (AOP using decorators on methods).
+31
View File
@@ -0,0 +1,31 @@
---
title: OPA Gatekeeper
subtitle: Rego Policy Controller for Kubernetes
labels:
type: poweredbyopa
layer: configuration
code:
- https://github.com/open-policy-agent/gatekeeper
software:
- kubernetes
tutorials:
- https://open-policy-agent.github.io/gatekeeper/website/docs/howto
videos:
- https://youtu.be/RMiovzGGCfI?t=1049
- https://youtu.be/6RNp3m_THw4?t=864
docs_features:
go-integration:
note: |
OPA Gatekeeper is written in Go and uses the
[Rego Go API](https://www.openpolicyagent.org/docs/latest/integration/#integrating-with-the-go-api)
to evaluate policies loaded from Custom Resources.
kubernetes:
note: |
OPA Gatekeeper integrates with
[Kubernetes Admission](https://open-policy-agent.github.io/gatekeeper/website/docs/customize-admission/)
and also uses Custom Resources and the Kubernetes API server to
store policy state.
layout: integration-single
allow_missing_image: true
---
Manage Rego Kubernetes admission policies using Custom Resources.
+22
View File
@@ -0,0 +1,22 @@
---
title: GCP audit with Forseti
labels:
category: publiccloud
inventors:
- google
code:
- https://forsetisecurity.org
videos:
- title: Repeatable GCP Environments at Scale with Cloud Build Infra-as-Code Pipelines
speakers:
- name: Morgante Pell
organization: google
- name: Andrew Phillips
organization: google
venue: Cloud Next 2019
link: https://www.youtube.com/watch?v=3vfXQxWJazM&feature=youtu.be&t=2054
layout: integration-single
---
Google cloud provides a plethora of software as a service.
Forseti, built using OPA, lets you run policy checks against the software resources on Google cloud and remediate violations.
@@ -0,0 +1,13 @@
---
title: Gloo API Gateway
labels:
category: servicemesh
layer: gateway
blogs:
- https://medium.com/solo-io/5-min-with-gloo-api-gateway-configuration-with-open-policy-agent-53da276a6534
- https://docs.solo.io/gloo/latest/security/auth/opa/
layout: integration-single
---
Gloo is an open-source Kubernetes-native ingress controller, and next-generation API gateway.
OPA can be used to implement authorization policies for those APIs.
@@ -0,0 +1,13 @@
---
title: Gluu Gateway Authorization
labels:
layer: network
category: gateway
software:
- gluu
- kong
code:
- https://github.com/GluuFederation/gluu-gateway
layout: integration-single
---
Gluu Gateway provides API authentication and authorization for websites built on Kong. Gluu provides an OPA plugin to handle API authorization.
@@ -0,0 +1,16 @@
---
title: Google Calendar
labels:
category: data
layer: rego
software:
- google-calendar
inventors:
- styra
code:
- https://github.com/anderseknert/opa-google-calendar
blogs:
- https://blog.styra.com/blog/the-power-of-data-calendar-based-policy-enforcement
layout: integration-single
---
Using the Google Calendar API with OPA for calendar powered policy decisions
@@ -0,0 +1,23 @@
---
title: GKE Policy Automation
software:
- kubernetes
- google-kubernetes-engine
labels:
category: containers
layer: orchestration
code:
- https://github.com/google/gke-policy-automation
tutorials:
- https://github.com/google/gke-policy-automation/tree/main/gke-policies
inventors:
- google
docs_features:
kubernetes:
note: |
The GKE Policy Automation project provides a set of policies for
validating Kubernetes clusters running on GKE. Review the
[policy library here](https://github.com/google/gke-policy-automation/tree/main/gke-policies-v2)
layout: integration-single
---
Tool and policy library for reviewing Google Kubernetes Engine clusters against best practices
@@ -0,0 +1,19 @@
---
title: Gradle Build Plugin
labels:
layer: cicd
category: cicdplugin
type: poweredbyopa
software:
- gradle
- java
- groovy
- kotlin
code:
- https://github.com/Bisnode/opa-gradle-plugin
- https://plugins.gradle.org/plugin/com.bisnode.opa
inventors:
- bisnode
layout: integration-single
---
Build plugin adding various tasks to support using OPA as part of Gradle builds
@@ -0,0 +1,13 @@
---
title: Custom Application with Field-level Authorization in Graphene GraphQL
labels:
layer: network
category: application
software:
- graphene-graphql
code:
- https://github.com/dolevf/graphql-open-policy-agent
layout: integration-single
---
This integration demonstrates using Open Policy Agent to perform field-level Authorization with GraphQL for a custom Python application backed by Graphene.
+15
View File
@@ -0,0 +1,15 @@
---
title: GraphQL
labels:
category: network
layer: application
software:
- graphql
code:
- https://github.com/StyraInc/graphql-apollo-example
tutorials:
- https://www.openpolicyagent.org/docs/graphql-api-authorization/
layout: integration-single
---
GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.
+26
View File
@@ -0,0 +1,26 @@
---
title: i2scim.io SCIM Restful User/Group Provisioning API
labels:
category: security
layer: application
software:
- i2scim
code:
- https://github.com/i2-open/i2scim
- https://i2scim.io
inventors:
- i2
tutorials:
- https://i2scim.io/OPA_AccessControl.html
docs_features:
rest-api-integration:
note: |
i2scim supports externalized access control decisions using OPA's REST API.
The integration is described in the [i2scim documentation](https://i2scim.io/OPA_AccessControl.html).
layout: integration-single
---
i2scim.io is an open source, Apache 2 Licensed, implementation of SCIM (System for Cross-domain Identity Management RFC7643/7644) for use
cloud-native kubernetes platforms. i2scim supports externalized access control decisions through OPA. SCIM is a RESTful HTTP API that can be
used to provide a standardized way to provision accounts from Azure, Okta, PingIdentity and other providers and tools. SCIM can also be used
as a backing identity store for OAuth and other authentication services.
+18
View File
@@ -0,0 +1,18 @@
---
title: IPTables
labels:
layer: network
category: linux
software:
- linux
tutorials:
- https://github.com/open-policy-agent/contrib/blob/master/opa-iptables/docs/tutorial.md
code:
- https://github.com/open-policy-agent/contrib/tree/master/opa-iptables
inventors:
- gsoc
- cisco
- styra
layout: integration-single
---
IPTables is a useful tool available to Linux kernel for filtering network packets. OPA makes it possible to manage IPTables rules using context-aware policy.
@@ -0,0 +1,16 @@
---
title: Container Network Authorization with Istio (as part of Mixer)
labels:
category: servicemesh
layer: network
software:
- istio
tutorials:
- https://istio.io/docs/reference/config/policy-and-telemetry/adapters/opa/
code:
- https://github.com/istio/istio/tree/master/mixer/adapter/opa
inventors:
- google
layout: integration-single
---
Istio is a networking abstraction for cloud-native applications. In this Istio integration OPA hooks into the centralized Mixer component of Istio, to provide fine-grained, context-aware authorization for network or HTTP requests.
+14
View File
@@ -0,0 +1,14 @@
---
title: Authorization for Java
labels:
layer: network
category: application
software:
- java
code:
- https://github.com/Bisnode/opa-java-client
inventors:
- bisnode
layout: integration-single
---
Integrations for interacting with OPA from Java
@@ -0,0 +1,20 @@
---
title: Jenkins Job Trigger Policy Enforcement
labels:
layer: cicd
software:
- jenkins
inventors:
- pinterest
videos:
- title: 'OPA at Scale: How Pinterest Manages Policy Distribution'
speakers:
- name: Will Fu
organization: pinterest
- name: Jeremy Krach
organization: pinterest
venue: OPA Summit at Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=LhgxFICWsA8
layout: integration-single
---
Jenkins automates software development processes. OPA lets you control which people and which machines can run which Jenkins jobs.
@@ -0,0 +1,39 @@
---
title: Kafka Topic Authorization
software:
- kafka
labels:
category: streaming
layer: data
blogs:
- https://opencredo.com/blogs/controlling-kafka-data-flows-using-open-policy-agent/
tutorials:
- https://www.openpolicyagent.org/docs/latest/kafka-authorization/
code:
- https://github.com/StyraInc/opa-kafka-plugin
- https://github.com/llofberg/kafka-authorizer-opa
- https://github.com/opencredo/opa-single-message-transformer
inventors:
- ticketmaster
- styra
videos:
- title: 'OPA at Scale: How Pinterest Manages Policy Distribution'
speakers:
- name: Will Fu
organization: pinterest
- name: Jeremy Krach
organization: pinterest
venue: OPA Summit at Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=LhgxFICWsA8
docs_features:
rest-api-integration:
note: |
This project implements a custom
[Kafka authorizer](https://docs.confluent.io/platform/current/kafka/authorization.html#authorizer)
that uses OPA to make authorization decisions by calling the REST API.
Installation and configuration instructions are available in the
project's [README](https://github.com/StyraInc/opa-kafka-plugin#installation).
layout: integration-single
---
Apache Kafka is a high-performance distributed streaming platform deployed by thousands of companies. OPA provides fine-grained, context-aware access control of which users can read/write which Kafka topics to enforce important requirements around confidentiality and integrity.
@@ -0,0 +1,16 @@
---
title: API Gateway Authorization with Kong
labels:
layer: network
category: gateway
software:
- kong
code:
- https://github.com/TravelNest/kong-authorization-opa
- https://github.com/open-policy-agent/contrib/tree/master/kong_api_authz
inventors:
- travelnest
- wada-ama
layout: integration-single
---
Kong is a microservice API Gateway. OPA provides fine-grained, context-aware control over the requests that Kong receives.
@@ -0,0 +1,28 @@
---
title: Kubernetes Authorization
code:
- https://github.com/open-policy-agent/contrib/tree/main/k8s_authorization
blogs:
- https://blog.styra.com/blog/kubernetes-authorization-webhook
- https://itnext.io/kubernetes-authorization-via-open-policy-agent-a9455d9d5ceb
- https://itnext.io/optimizing-open-policy-agent-based-kubernetes-authorization-via-go-execution-tracer-7b439bb5dc5b
inventors:
- styra
docs_features:
rest-api-integration:
note: |
The Kubernetes API server can be configured to use OPA as an
authorization webhook. Such an integration can be configured by
following [the documentation](https://github.com/open-policy-agent/contrib/tree/main/k8s_authorization)
in the contrib repo.
kubernetes:
note: |
View
[an example project](https://github.com/open-policy-agent/contrib/tree/main/k8s_authorization)
showing how it's possible to integrate OPA with Kubernetes User Authorization.
layout: integration-single
---
Kubernetes Authorization is a pluggable mechanism that lets administrators control which users can run which APIs and
is often handled by builtin RBAC. OPA's policy language is more flexible than the RBAC, for example,
writing policy using a prohibited list of APIs instead of the usual RBAC style of listing the permitted APIs.
@@ -0,0 +1,21 @@
---
title: Kubernetes Provisioning
software:
- kubernetes
labels:
category: containers
layer: orchestration
inventors:
- goldmansachs
videos:
- title: Kubernetes Policy Enforcement Using OPA at Goldman Sachs
speakers:
- name: Miguel Uzcategui
organization: goldmansachs
- name: Tim Hinrichs
organization: styra
venue: Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=lYHr_UaHsYQ&list=PLj6h78yzYM2NDs-iu8WU5fMxINxHXlien&index=140&t=0s
layout: integration-single
---
Kubernetes automates deployment, scaling, and management of containerized applications. OPA decides which resources need to be created on k8s in response to a namespace being created.
@@ -0,0 +1,98 @@
---
title: Kubernetes Admission Control
software:
- kubernetes
labels:
category: containers
layer: orchestration
tutorials:
- https://www.openpolicyagent.org/docs/kubernetes-admission-control.html
- https://katacoda.com/austinheiman/scenarios/open-policy-agent-gatekeeper
code:
- https://github.com/open-policy-agent/kube-mgmt
- https://github.com/open-policy-agent/gatekeeper
inventors:
- styra
- microsoft
- google
videos:
- title: Securing Kubernetes With Admission Controllers
speakers:
- name: Dave Strebel
organization: microsoft
venue: Kubecon Seattle 2018
link: https://sched.co/GrZQ
- title: Using OPA for Admission Control in Production
speakers:
- name: Zach Abrahamson
organization: Capital One
- name: Todd Ekenstam
organization: Intuit
venue: Kubecon Seattle 2018
link: https://sched.co/Grbn
- title: Liz Rice Keynote
speakers:
- name: Liz Rice
organization: AquaSecurity
venue: Kubecon Seattle 2018
link: https://youtu.be/McDzaTnUVWs?t=418
- title: Intro to Open Policy Agent Gatekeeper
speakers:
- name: Rita Zhang
organization: microsoft
- name: Max Smythe
organization: google
venue: Kubecon Barcelona 2019
link: https://kccnceu19.sched.com/event/MPiM/intro-open-policy-agent-rita-zhang-microsoft-max-smythe-google
- title: Policy Enabled Kubernetes and CICD
speakers:
- name: Jimmy Ray
organization: capitalone
venue: OPA Summit at Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=vkvWZuqSk5M
- title: 'TripAdvisor: Building a Testing Framework for Integrating OPA into K8s'
speakers:
- name: Luke Massa
organization: tripadvisor
venue: OPA Summit at Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=X09c1eXvCFM
- title: Enforcing automatic mTLS with Linkerd and OPA Gatekeeper
speakers:
- name: Ivan Sim
organization: buoyant
- name: Rita Zhang
organization: microsoft
venue: Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=gMaGVHnvNfs
- title: Enforcing Service Mesh Structure using OPA Gatekeeper
speakers:
- name: Sandeep Parikh
organization: google
venue: Kubecon San Diego 2019
link: https://www.youtube.com/watch?v=90RHTBinAFU
- title: 'TGIK: Exploring the Open Policy Agent'
speakers:
- name: Joe Beda
organization: VMware
link: https://www.youtube.com/watch?v=QU9BGPf0hBw
blogs:
- https://medium.com/@sbueringer/kubernetes-authorization-via-open-policy-agent-a9455d9d5ceb
- https://medium.com/@jimmy.ray/policy-enabled-kubernetes-with-open-policy-agent-3b612b3f0203
- https://blog.openpolicyagent.org/securing-the-kubernetes-api-with-open-policy-agent-ce93af0552c3
- https://itnext.io/kubernetes-authorization-via-open-policy-agent-a9455d9d5ceb
- https://medium.com/capital-one-tech/policy-enabled-kubernetes-with-open-policy-agent-3b612b3f0203
- https://blog.openshift.com/fine-grained-policy-enforcement-in-openshift-with-open-policy-agent/
docs_features:
rest-api-integration:
note: |
The Kubernetes API server can be configured to use OPA as an
admission controller. Creating a
[ValidatingWebhookConfiguration](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#validatingwebhookconfiguration)
resource can be used to query OPA for policy decisions.
kubernetes:
note: |
View a selection of projects and talks about integrating OPA with
Kubernetes.
layout: integration-single
---
Kubernetes automates deployment, scaling, and management of containerized applications. OPA provides fine-grained, context-aware authorization for which application component configuration.
+25
View File
@@ -0,0 +1,25 @@
---
title: Kubescape
subtitle: Kubernetes security posture scanner
labels:
category: security
layer: application
software:
- kubescape
code:
- https://github.com/kubescape/kubescape
- https://github.com/kubescape/regolibrary
inventors:
- armo
tutorials:
- https://hub.armosec.io/docs
docs_features:
go-integration:
note: |
Kubescape uses the Go Repo API to test Kubernetes objects against
a range of posture controls.
layout: integration-single
---
This integration uses OPA for defining security controls over Kubernetes clusters. Kubescape is a simple extensible tool
finding security problems in your environment. OPA enables Kubescape to implement and extend very fast to answer new problems.
+24
View File
@@ -0,0 +1,24 @@
---
title: KubeShield
subtitle: Secure Kubernetes using eBPF & Open Policy Agent
software:
- linux
- kubernetes
- ebpf
labels:
layer: application
category: filtering
code:
- https://github.com/kubeshield/bpf-opa-demo
blogs:
- https://blog.byte.builders/post/bpf-opa/
docs_features:
kubernetes:
note: |
KubeShield implements runtime policy for containers in a Kubernetes
cluster using eBPF. Follow the
[tutorial here](https://github.com/kubeshield/bpf-opa-demo#usage)
to get up and running.
layout: integration-single
---
Ensure runtime security in any linux machine by combining Extended Berkeley Packet Filter(eBPF) and Open Policy Agent.
+15
View File
@@ -0,0 +1,15 @@
---
title: SSH and Sudo Authorization with Linux
software:
- linuxpam
labels:
layer: server
tutorials:
- https://www.openpolicyagent.org/docs/ssh-and-sudo-authorization.html
code:
- https://github.com/open-policy-agent/contrib/tree/master/pam_opa
inventors:
- styra
layout: integration-single
---
Host-level access controls are an important part of every organization's security strategy. OPA provides fine-grained, context-aware controls for SSH and sudo using Linux-PAM.
+18
View File
@@ -0,0 +1,18 @@
---
title: Magda
labels:
type: poweredbyopa
category: application
layer: application
software:
- magda
code:
- https://github.com/magda-io/magda
blogs:
- https://github.com/magda-io/magda/blob/master/docs/docs/architecture/Guide%20to%20Magda%20Internals.md#authorization-authz
layout: integration-single
---
Magda is a federated, Kubernetes-based, open-source data catalog system.
Working as Magda's central authorisation policy engine, OPA helps not only the API endpoint authorisation.
Magda also uses its partial evaluation feature to translate datasets authorisation decisions to other database-specific DSLs (e.g. SQL or Elasticsearch DSL) and use them for dataset authorisation enforcement in different databases.
+19
View File
@@ -0,0 +1,19 @@
---
title: Minio API Authorization
labels:
layer: data
category: authorization
tutorials:
- https://github.com/minio/minio/blob/master/docs/iam/opa.md
inventors:
- minio
- styra
docs_features:
rest-api-integration:
note: |
Minio implements a native integration with OPA using the REST API.
The [integration is documented](https://github.com/minio/minio/blob/master/docs/iam/opa.md)
in the Minio docs.
layout: integration-single
---
Minio is an open source, on-premise object database compatible with the Amazon S3 API. This integration lets OPA enforce policies on Minio's API.
+12
View File
@@ -0,0 +1,12 @@
---
title: Nginx
labels:
category: gateway
layer: network
software:
- nginx
code:
- https://github.com/summerwind/opa-nginx-rbac
layout: integration-single
---
OPA Authorization for Nginx
@@ -0,0 +1,23 @@
---
title: NodeJS express
labels:
category: application
layer: network
code:
- https://github.com/build-security/opa-express-middleware
inventors:
- build.security
software:
- nodejsexpress
docs_features:
rest-api-integration:
note: |
This project provides a middleware that can query an OPA server for
policy decisions. See the project's
[README](https://github.com/build-security/opa-express-middleware#simple-usage)
for a js simple example.
layout: integration-single
---
Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications.
OPA can be used to implement authorization policies for APIs used in the express framework.
+13
View File
@@ -0,0 +1,13 @@
---
title: OAuth2
software:
- oauth
labels:
category: security
tutorials:
- https://www.openpolicyagent.org/docs/latest/oauth-oidc/
blogs:
- https://blog.styra.com/blog/integrating-identity-oauth2-and-openid-connect-in-open-policy-agent
layout: integration-single
---
Integrating OAuth2 with Open Policy Agent
+14
View File
@@ -0,0 +1,14 @@
---
title: OpenID Connect (OIDC)
software:
- oauth
- oidc
labels:
category: security
tutorials:
- https://www.openpolicyagent.org/docs/latest/oauth-oidc/
blogs:
- https://blog.styra.com/blog/integrating-identity-oauth2-and-openid-connect-in-open-policy-agent
layout: integration-single
---
Integrating OpenID Connect (OIDC) with Open Policy Agent
@@ -0,0 +1,29 @@
---
title: OPA Playground
subtitle: Online Rego Playground
software: []
inventors:
- styra
labels:
category: tooling
layer: rego
code:
- https://play.openpolicyagent.org/
blogs:
- https://blog.openpolicyagent.org/the-rego-playground-977566855cec
- https://blog.openpolicyagent.org/rego-playground-new-features-ec0345a73b9e
docs_features:
learning-rego:
note: |
Sometimes if you're working on a Rego policy in an integrated system
it can help to debug it in isolation first. The playground is a great
place to do that. Get started with a [hello world example](https://play.openpolicyagent.org/).
language-tooling:
note: |
The playground is a great place to get started with writing and testing
your first policies. You can also share links if you're asking for
help in the community Slack. Get started with a simple
[RBAC example](https://play.openpolicyagent.org/p/Bb9FqBvauC).
layout: integration-single
---
Interactive online Rego playground for writing and sharing policies
@@ -0,0 +1,23 @@
---
title: OPA Wasm .NET package
software:
- csharp
inventors:
- christophwille
labels:
category: wasm
type: poweredbyopa
tutorials:
- https://github.com/christophwille/dotnet-opa-wasm
code:
- https://github.com/christophwille/dotnet-opa-wasm
- https://www.nuget.org/packages/Opa.Wasm/
docs_features:
wasm-integration:
note: 'This project implements the OPA Wasm module interface in C#.
'
layout: integration-single
---
Call Rego policies in Wasm from C# .NET Core
@@ -0,0 +1,22 @@
---
title: OPA Wasm Java Gradle SDK
software:
- java
inventors:
- sangkeon
labels:
category: wasm
type: poweredbyopa
tutorials:
- https://github.com/sangkeon/java-opa-wasm#usage
code:
- https://github.com/sangkeon/java-opa-wasm
docs_features:
wasm-integration:
note: 'This project implements the OPA Wasm module interface in Java.
'
layout: integration-single
---
SDK to illustrate how to use Wasm compiled Rego policies from a Java application
+29
View File
@@ -0,0 +1,29 @@
---
title: OPA Wasm Javascript Module
software:
- javascript
inventors:
- styra
labels:
category: wasm
type: poweredbyopa
tutorials:
- https://github.com/open-policy-agent/npm-opa-wasm/blob/main/README.md
code:
- https://github.com/open-policy-agent/npm-opa-wasm/
- https://www.npmjs.com/package/@open-policy-agent/opa-wasm?activeTab=readme
videos:
- title: 'Scratching an Itch: Running Policy in Hard to Reach Places with Wasm & OPA'
speakers:
- name: Charlie Egan
organization: styra
link: https://www.youtube.com/watch?v=BdeBhukLwt4
docs_features:
wasm-integration:
note: 'This project implements the OPA Wasm module interface in JavaScript.
'
layout: integration-single
---
A small SDK for using WebAssembly (Wasm) compiled Rego policies
@@ -0,0 +1,23 @@
---
title: OPA Wasm Rust Crate
software:
- rust
inventors:
- matrix
labels:
category: wasm
type: poweredbyopa
tutorials:
- https://github.com/matrix-org/rust-opa-wasm#try-it-out
- https://docs.rs/opa/latest/opa/wasm/index.html
code:
- https://github.com/matrix-org/rust-opa-wasm
docs_features:
wasm-integration:
note: 'This project implements the OPA Wasm module interface in Rust.
'
layout: integration-single
---
A crate to use OPA policies compiled to WASM.
+38
View File
@@ -0,0 +1,38 @@
---
title: OPAL
subtitle: Open Policy Administration Layer
labels:
category: updates
layer: application
inventors:
- permitio
software:
- opal
code:
- https://github.com/permitio/opal
tutorials:
- https://github.com/permitio/opal/tree/master/documentation/docs/tutorials
videos:
- https://www.youtube.com/watch?v=K1Zm2FPfrh8
docs_features:
rest-api-integration:
note: |
OPAL uses the OPA REST API to update the policy and data pushed down
from the OPAL server.
See [how this works](https://docs.opal.ac/overview/architecture).
external-data:
note: |
The OPAL Client uses the OPA REST API to update the state pushed down
from the OPAL server.
See [how this works](https://docs.opal.ac/overview/architecture).
external-data-realtime-push:
note: |
OPAL is able to deliver real-time data updates to OPA instances.
See
[how this works](https://docs.opal.ac/getting-started/quickstart/opal-playground/publishing-data-update)
in the OPAL docs.
layout: integration-single
---
OPAL is an administration layer for Open Policy Agent (OPA), detecting changes in realtime to both policy and policy data and pushing live updates to your agents.
OPAL brings open-policy up to the speed needed by live applications. As your application state changes (whether it's via your APIs, DBs, git, S3 or 3rd-party SaaS services), OPAL will make sure your services are always in sync with the authorization data and policy they need (and only those they need).
@@ -0,0 +1,45 @@
---
title: Open Policy Registry
subtitle: A Docker-inspired workflow for OPA policies
labels:
category: containers
layer: application
inventors:
- aserto
software:
- open-policy-registry
code:
- https://github.com/opcr-io/policy
tutorials:
- https://www.openpolicyregistry.io/docs/tutorial
blogs:
- https://www.openpolicyregistry.io/blog/docker-workflow-for-opa
docs_features:
go-integration:
note: |
Makes use of the
[OPA Repl package](https://pkg.go.dev/github.com/open-policy-agent/opa/repl)
to interact with an OPA instance.
opa-bundles:
note: |
OPCR policy images can be loaded in over the Bundle API. The feature
it documented in the
[OPCR docs](https://openpolicycontainers.com/docs/opa).
opa-bundles-discovery:
note: |
OPCR images can be loaded in over the Bundle API and contain
discovery bundles. The feature it documented in the
[OPCR docs](https://openpolicycontainers.com/docs/opa).
external-data:
note: |
OPCR policy images can contain data as well as policy. If you need to
distribute data to OPA from an OCI registry, OPCR can build and push
such images. See the docs for
[building images here](https://openpolicycontainers.com/docs/cli/build).
layout: integration-single
---
The Open Policy Registry project provides a docker-style workflow for OPA policies.
The policy CLI can be used to build, tag, sign, push, and pull OPA policies as OCIv2 container images,
in conjunction with any container registry.
The Open Policy Registry (OPCR) is a reference implementation of a policy registry, built and hosted on GCP.
@@ -0,0 +1,17 @@
---
title: Open Service Mesh (OSM)
software:
- osm
labels:
category: servicemesh
layer: network
tutorials:
- https://release-v1-2.docs.openservicemesh.io/docs/guides/integrations/external_auth_opa/
docs_features:
envoy:
note: |
External Authorization supports OPA and is documented
[here](https://release-v1-2.docs.openservicemesh.io/docs/guides/integrations/external_auth_opa/)
layout: integration-single
---
Open Service Mesh is a lightweight and extensible cloud native service mesh.
@@ -0,0 +1,16 @@
---
title: OpenFaaS Serverless Function Authorization
labels:
layer: application
category: serverless
software:
- openfaas
code:
- https://github.com/adaptant-labs/openfaas-function-auth-opa
tutorials:
- https://github.com/adaptant-labs/openfaas-function-auth-opa/blob/master/README.md
inventors:
- adaptant
layout: integration-single
---
OpenFaaS is a serverless function framework that runs on Docker Swarm and Kubernetes. OPA makes it possible to provide fine-grained context-aware authorization on a per-function basis.
+17
View File
@@ -0,0 +1,17 @@
---
title: OPToggles (Open Policy Toggles)
labels:
category: updates
layer: application
inventors:
- permitio
code:
- https://github.com/permitio/OPToggles
tutorials:
- https://optoggles.opal.ac/tutorials/demo
layout: integration-single
---
OPToggles uses OPA and OPAL to sync open-policy to your frontend with the help of feature flag solutions.
OPToggles creates user-targeted feature flags based on the policy rules you defined in OPA and keeps the users updated in real-time with OPAL's real-time policy and policy-data change detection.
OPToggles already supports launchdarkly.com and a generic REST API.
+22
View File
@@ -0,0 +1,22 @@
---
title: Permit.io
labels:
category: authorization
layer: application
inventors:
- permitio
code:
- https://github.com/permitio
tutorials:
- https://docs.permit.io/
videos:
- https://docs.permit.io/tutorials/onboarding_demo
blogs:
- https://www.permit.io/blog/introduction-to-opa
- https://www.permit.io/blog/implement-abac-using-opa
- https://www.permit.io/blog/implement-rbac-using-opa
layout: integration-single
---
Permit.io empowers developers to bake in permissions and access-control into any product in minutes and takes away the pain of constantly rebuilding them.
Permit is based on OPA.
@@ -0,0 +1,25 @@
---
title: PHP OPA Library
labels:
layer: network
category: application
software:
- php
tutorials:
- https://coil.com/p/segra/OPA-for-API-Authorization-with-Slim-PHP/H-7YsQL2m
code:
- https://github.com/segrax/opa-php-examples
- https://github.com/segrax/openpolicyagent
- https://github.com/build-security/opa-symfony-middleware
inventors:
- build.security
docs_features:
rest-api-integration:
note: |
This library provides a PHP wrapper around the OPA REST API. It can
update policies and query for decisions. See the
[project README](https://github.com/segrax/openpolicyagent)
for various examples.
layout: integration-single
---
These integrations demonstrate using OPA to perform API authorization in PSR-15 and Symfony compliant frameworks.
@@ -0,0 +1,14 @@
---
title: Pomerium Access Proxy
labels:
layer: network
category: proxy
software:
- pomerium
blogs:
- https://www.pomerium.io/posts/2020/04/16/release-0-7/
code:
- https://github.com/pomerium/pomerium
layout: integration-single
---
Pomerium is an identity-aware proxy that enables secure access to internal applications. OPA implements authorization under the hood.
@@ -0,0 +1,17 @@
---
title: Pre-commit hooks
labels:
category: tooling
layer: cicd
software:
- git
- pre-commit
code:
- https://github.com/anderseknert/pre-commit-opa
blogs:
- https://www.eknert.com/tech/2020/08/31/pre-commit-hooks-for-opa
inventors:
- independent
layout: integration-single
---
Pre-commit git hooks for OPA and Rego development
+31
View File
@@ -0,0 +1,31 @@
---
title: Pulumi
software:
- pulumi
- aws
- gcp
- azure
labels:
category: publiccloud
layer: orchestration
code:
- https://github.com/pulumi/pulumi-policy-opa
blogs:
- https://www.pulumi.com/blog/opa-support-for-crossguard/
videos:
- title: Testing Configuration with Open Policy Agent
speakers:
- name: Gareth Rushgrove
organization: snyk
venue: Cloud Engineering Summit 2020
link: https://www.pulumi.com/resources/testing-configuration-with-open-policy-agent/
inventors:
- pulumi
docs_features:
go-integration:
note: |
The Pulumi OPA bridge uses the Rego API to evaluate policies in a
policy pack. View the [docs and code](https://github.com/pulumi/pulumi-policy-opa).
layout: integration-single
---
Build infrastructure as code in familiar languages. CrossGuard is Pulumi's policy as code offering, providing OPA as one of the options to use for defining policy.
+44
View File
@@ -0,0 +1,44 @@
---
title: Regal
subtitle: The Linter of Rego Language
labels:
category: tooling
layer: shell
inventors:
- styra
blogs:
- https://www.styra.com/blog/guarding-the-guardrails-introducing-regal-the-rego-linter/
code:
- https://github.com/StyraInc/regal
videos:
- https://www.youtube.com/live/Xx8npd2TQJ0?feature=share&t=2567
tutorials:
- https://github.com/StyraInc/regal#try-it-out
docs_features:
learning-rego:
note: |
Regal can automatically check for common Rego mistakes as you code.
Each violation is accompanied by a detailed explanation which can be a
great learning tool for new Rego users. See the
[Supported Rules](https://github.com/StyraInc/regal/tree/main#rules).
go-integration:
note: |
Regal is built using the Go Rego API. Regal evaluates linting rules
defined in Rego against the Rego AST of policy files. The
[linter package](https://github.com/StyraInc/regal/blob/main/pkg/linter/linter.go)
is a good place to see how OPA is used in the project.
policy-testing:
note: |
Regal is a useful step to use when testing Rego policies to ensure
code is correct and free of common errors. See
[the README](https://github.com/StyraInc/regal#try-it-out)
to get started.
layout: integration-single
---
Regal is a linter for Rego, with the goal of making your Rego magnificent!
Regal can:
* Identify common mistakes, bugs and inefficiencies in Rego policies, and suggest better approaches
* Provide advice on best practices, coding style, and tooling
* Allow users, teams and organizations to enforce custom rules on their policy code
+18
View File
@@ -0,0 +1,18 @@
---
title: Rekor transparency log monitoring and alerting
labels:
category: security
layer: application
software:
- rekor
inventors:
- sigstore
code:
- https://github.com/nsmith5/rekor-sidekick
videos:
- https://www.youtube.com/watch?v=lHSLPIo1pz8
layout: integration-single
---
Rekor Sidekick monitors a Rekor signature transparency log and forwards events of interest where ever you like.
Alert policies written in Rego determine if an event is of interest.
+16
View File
@@ -0,0 +1,16 @@
---
title: Reposaur
software:
- github
labels:
category: security
type: poweredbyopa
tutorials:
- https://docs.reposaur.com/guides/writing-your-first-policy
code:
- https://github.com/reposaur/reposaur
inventors:
- reposaur
layout: integration-single
---
Audit, verify and report on development platforms (GitHub and others) easily with pre-defined and/or custom policies.
+34
View File
@@ -0,0 +1,34 @@
---
title: Rönd
software:
- rond
labels:
category: authorization
layer: application
code:
- https://github.com/rond-authz/rond
tutorials:
- https://github.com/rond-authz/example
videos:
- title: Rönd - The Open Source K8s sidecar that defines security policies over your
APIs
speakers:
- name: Federico Maggi
organization: mia-platform
link: https://youtu.be/ubT31NtHV8w
inventors:
- mia-platform
blogs:
- https://blog.mia-platform.eu/en/announcing-rond-new-open-source-security-enforcement-over-your-apis
- https://blog.mia-platform.eu/en/how-why-adopted-role-based-access-control-rbac
docs_features:
go-integration:
note: |
The Rönd sidecar uses the OPA Rego API to make API-access
authorization decisions. See the
[OPA evaluator](https://github.com/rond-authz/rond/blob/4c27fa6a127f68b8670a39c792b0e40dac52dafa/core/opaevaluator.go#L173)
code.
layout: integration-single
---
Rönd is a lightweight container that distributes security policy enforcement throughout your application.
+18
View File
@@ -0,0 +1,18 @@
---
title: Sansshell
software:
- sansshell
labels:
category: management
layer: server
type: poweredbyopa
code:
- https://github.com/Snowflake-Labs/sansshell
blogs:
- https://www.snowflake.com/blog/sansshell-local-host-agent/
inventors:
- snowflake
layout: integration-single
allow_missing_image: true
---
A non-interactive daemon for host management
+32
View File
@@ -0,0 +1,32 @@
---
title: Scalr
subtitle: Policy enforcement for Terraform
labels:
category: Infrastructure as Code
layer: cicd
software:
- terraform
tutorials:
- https://iacp.docs.scalr.com/en/latest/working-with-iacp/opa.html#creating-the-opa-policy
code:
- https://github.com/Scalr/sample-tf-opa-policies
inventors:
- scalr
blogs:
- https://www.scalr.com/blog/opa-is-to-policy-automation-as-terraform-is-to-iac/
docs_features:
cli-integration:
note: |
These policies can be run using OPA at the command line against a
Terraform plan JSON. See
[the example](https://github.com/Scalr/sample-tf-opa-policies#policy-evaluation)
in the README.
terraform:
note: |
These policies can be run using OPA at the command line against a
Terraform plan JSON. See
[the example](https://github.com/Scalr/sample-tf-opa-policies#policy-evaluation)
in the README.
layout: integration-single
---
Scalr allows teams to easily collaborate on Terraform through its pipeline that runs all Terraform operations, policy checks, and stores state. Scalr uses OPA to check the auto-generated Terraform JSON plan to ensure that it meets your organization standards prior to an apply.
+43
View File
@@ -0,0 +1,43 @@
---
title: Spacelift
labels:
category: Infrastructure as Code
layer: cicd
software:
- terraform
- pulumi
- cloudformation
- kubernetes
- ansible
- aws
- gcp
- azure
tutorials:
- https://docs.spacelift.io/concepts/policy
code:
- https://github.com/spacelift-io/spacelift-policies-example-library
inventors:
- spacelift
blogs:
- https://spacelift.io/blog/what-is-open-policy-agent-and-how-it-works
docs_features:
rego-language-embedding:
note: |
Spacelift supports Rego as a language to describe policies for IaC
resources. View the docs on
[creating Rego policies](https://docs.spacelift.io/concepts/policy/).
terraform:
note: |
Spacelift supports Rego as a language to describe policies for Terraform
JSON plans.
[This blog](https://spacelift.io/blog/what-is-open-policy-agent-and-how-it-works)
outlines how the integration works.
kubernetes:
note: |
Spacelift supports Rego as a language to describe policies for various
resource types, including Kubernetes. View the
[policy documentation](https://docs.spacelift.io/concepts/policy/) for
more information.
layout: integration-single
---
Spacelift is a sophisticated CI/CD platform for Infrastructure as Code including Terraform, Pulumi, CloudFormation, Kubernetes, and Ansible. Spacelift utilizes Open Policy Agent to support a variety of policy types within the platform and Policy as Code for secure and compliance Infrastructure as Code.
+14
View File
@@ -0,0 +1,14 @@
---
title: Automatically document Rego policies
software:
- sphinx-doc
code:
- https://github.com/zenitysec/sphinx-rego
inventors:
- zenity
labels:
category: tooling
layer: cicd
layout: integration-single
---
Sphinx extension that automatically documents Open Policy Agent Rego policies using meta properties.
@@ -0,0 +1,15 @@
---
title: Spinnaker Pipeline Policy Enforcment
labels:
layer: cicd
software:
- spinnaker
blogs:
- https://blog.armory.io/deployment-policies-with-spinnaker/
tutorials:
- https://docs.armory.io/spinnaker/policy_engine/
inventors:
- armory
layout: integration-single
---
Spinnaker is a Continuous Delivery and Deployment tool started by Netflix. OPA lets you configure policies that dictate what kinds of Spinnaker pipelines developers can create.
+29
View File
@@ -0,0 +1,29 @@
---
title: SPIRE
labels:
layer: network
category: application
software:
- spiffe
- spire
blogs:
- https://www.styra.com/blog/zero-trust-with-envoy-spire-and-open-policy-agent-opa/
code:
- https://github.com/spiffe/spire/blob/v1.0.2/doc/authorization_policy_engine.md
tutorials:
- https://spiffe.io/docs/latest/microservices/envoy-opa/readme/
- https://spiffe.io/docs/latest/microservices/envoy-jwt-opa/readme/
docs_features:
envoy:
note: |
SPIRE can be used to integrate with Envoy and OPA. See a
[blog here](https://www.styra.com/blog/zero-trust-with-envoy-spire-and-open-policy-agent-opa/)
to learn more.
rest-api-integration:
note: |
SPIRE can work in tandem with the Envoy proxy to integrate with the OPA
REST API. See the
[tutorial here](https://spiffe.io/docs/latest/microservices/envoy-jwt-opa/readme/).
layout: integration-single
---
SPIRE is a production-ready implementation of the SPIFFE APIs that performs node and workload attestation in order to securely issue SPIFFE Verifiable Identity Documents (SVIDs) to workloads, and verify the SVIDs of other workloads, based on a predefined set of conditions.
@@ -0,0 +1,31 @@
---
title: Authorization for Java Spring Security
labels:
layer: network
category: application
software:
- javaspringsecurity
code:
- https://github.com/open-policy-agent/contrib/tree/master/spring_authz
- https://github.com/Bisnode/opa-spring-security
- https://github.com/build-security/opa-java-spring-client
- https://github.com/massenz/jwt-opa
- https://github.com/eugenp/tutorials/tree/master/spring-security-modules/spring-security-opa
tutorials:
- https://github.com/open-policy-agent/contrib/blob/master/spring_authz/README.md
- https://github.com/massenz/jwt-opa#web-server-demo-app
- https://www.baeldung.com/spring-security-authorization-opa
inventors:
- styra
- build.security
- bisnode
- alertavert
docs_features:
rest-api-integration:
note: |
OPA Spring Security uses the REST API to query OPA about authz decisions.
See an example application in OPA's
[contrib repo](https://github.com/open-policy-agent/contrib/tree/main/spring_authz).
layout: integration-single
---
Spring Security provides a framework for securing Java applications. These integrations provide simple implementations for Spring Security that use OPA for making API authorization decisions. They provide support for both traditional Spring Security (MVC), as well as an implementation for Spring Reactive (Web Flux).
@@ -0,0 +1,16 @@
---
title: SQL Database Data Filtering
labels:
layer: data
category: filtering
software:
- sqlite
code:
- https://github.com/open-policy-agent/contrib/tree/master/data_filter_example
blogs:
- https://blog.openpolicyagent.org/write-policy-in-opa-enforce-policy-in-sql-d9d24db93bf4
inventors:
- styra
layout: integration-single
---
This integration enables the client of a SQL database to enhance a SQL query so that the results obey an OPA-defined policy.
+25
View File
@@ -0,0 +1,25 @@
---
title: Strimzi (Apache Kafka on Kubernetes)
software:
- kafka
- strimzi
labels:
category: streaming
layer: data
blogs:
- https://strimzi.io/blog/2020/08/05/using-open-policy-agent-with-strimzi-and-apache-kafka/
- https://strimzi.io/blog/2020/09/01/enforce-custom-resource-policies-with-opa-gatekeeper/
code:
- https://github.com/strimzi/strimzi-kafka-operator
- https://github.com/scholzj/demo-opa-kafka-authorization
- https://github.com/StyraInc/opa-kafka-plugin
inventors:
- redhat
docs_features:
rest-api-integration:
note: |
Strimzi can be configured to use OPA via the REST API as the Kafka
authorizer using [this project](https://github.com/scholzj/demo-opa-kafka-authorization).
layout: integration-single
---
Strimzi provides a way to run an Apache Kafka cluster on Kubernetes in various deployment configurations. Strimzi ships with the OPA authorizer plugin right out of the box, and supports OPA as an option for Kafka authorization.
@@ -0,0 +1,27 @@
---
title: Styra Academy
subtitle: OPA Learning Portal
software: []
inventors:
- styra
labels:
category: learning
type: poweredbyopa
tutorials:
- https://academy.styra.com
- https://academy.styra.com/courses/opa-by-example
- https://academy.styra.com/courses/opa-rego
- https://academy.styra.com/courses/opa-k8s-admission-control
- https://academy.styra.com/courses/opa-performance
code:
- https://github.com/StyraInc/academy-samples
docs_features:
learning-rego:
note: |
['OPA Policy Authoring'](https://academy.styra.com/courses/opa-rego)
is a free course that teaches the fundamentals of writing Rego policies.
layout: integration-single
---
Styra Academy is a free, self-paced learning portal for OPA and Styra Products.
It includes a series of courses on a range of topics from beginner to advanced.

Some files were not shown because too many files have changed in this diff Show More