Jesum Yip
12/15/2021, 4:01 AMJesum Yip
12/15/2021, 4:04 AMapiVersion: api.cerbos.dev/v1
resourcePolicy:
version: "1"
importDerivedRoles:
- hm_employee
resource: "businessassets"
rules:
- actions: ['read']
effect: EFFECT_ALLOW
derivedRoles:
- internal_user
- actions: ['read']
effect: EFFECT_ALLOW
condition:
match:
expr: "read:businessassets" in request.aux_data.jwt.scope.split(" ")
Dennis (Cerbos)
Dennis (Cerbos)
Jesum Yip
12/15/2021, 4:09 AMJesum Yip
12/15/2021, 4:09 AMJesum Yip
12/15/2021, 4:10 AMJesum Yip
12/15/2021, 4:10 AMJesum Yip
12/15/2021, 4:12 AMJesum Yip
12/15/2021, 4:12 AMcurl -POST -H "Content-type: application/json" -d '{
"requestId": "1",
"actions": ["read"],
"resource": {
"policyVersion": "1",
"kind": "businessassets",
"instances": {
"prod": {}
}
},
"principal": {
"id": "user01",
"policyVersion": "1",
"roles": ["valid_user"]
},
"includeMeta": true,
"aux_Data": {
"jwt": {
"token": "myjwt....redacted"
}
}
}' 'theurl'
if i submit the aboveDennis (Cerbos)
Jesum Yip
12/15/2021, 4:13 AMapiVersion: api.cerbos.dev/v1
resourcePolicy:
version: "1"
importDerivedRoles:
- hm_employee
resource: "businessassets"
rules:
- actions: ['read']
effect: EFFECT_ALLOW
derivedRoles:
- internal_user
- actions: ['read']
effect: EFFECT_ALLOW
condition:
match:
expr: "read:businessassets" in request.aux_data.jwt.scope.split(" ")
Jesum Yip
12/15/2021, 4:13 AMDennis (Cerbos)
scope
or internal_user
claimJesum Yip
12/15/2021, 4:15 AMJesum Yip
12/15/2021, 4:15 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:15 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:16 AM{
"requestId": "1",
"resourceInstances": {
"prod": {
"actions": {
"read": "EFFECT_DENY"
}
}
},
"meta": {
"resourceInstances": {
"prod": {
"actions": {
"read": {
"matchedPolicy": "NO_MATCH"
}
},
"effectiveDerivedRoles": []
}
}
}
}
Jesum Yip
12/15/2021, 4:16 AMJesum Yip
12/15/2021, 4:16 AMJesum Yip
12/15/2021, 4:17 AMDennis (Cerbos)
- actions: ['read']
effect: EFFECT_ALLOW
condition:
match:
expr: "read:businessassets" in request.aux_data.jwt.scope.split(" ")
should also refer to a role, albeit made up.Jesum Yip
12/15/2021, 4:17 AMDennis (Cerbos)
roles: ["valid_user"]
to itJesum Yip
12/15/2021, 4:18 AMJesum Yip
12/15/2021, 4:19 AMJesum Yip
12/15/2021, 4:19 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:20 AMJesum Yip
12/15/2021, 4:21 AMJesum Yip
12/15/2021, 4:21 AMJesum Yip
12/15/2021, 4:21 AMJesum Yip
12/15/2021, 4:22 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:22 AMJesum Yip
12/15/2021, 4:24 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:25 AMJesum Yip
12/15/2021, 4:25 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:26 AMJesum Yip
12/15/2021, 4:26 AMJesum Yip
12/15/2021, 4:27 AMJesum Yip
12/15/2021, 4:27 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:28 AMDennis (Cerbos)
aux_data.jwt
is a required partDennis (Cerbos)
Jesum Yip
12/15/2021, 4:29 AMDennis (Cerbos)
aux_data.jwt.mywonderfultoken.tokenvalue
Jesum Yip
12/15/2021, 4:29 AMJesum Yip
12/15/2021, 4:31 AMDennis (Cerbos)
Dennis (Cerbos)
Dennis (Cerbos)
Jesum Yip
12/15/2021, 4:32 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:33 AMJesum Yip
12/15/2021, 4:33 AMJesum Yip
12/15/2021, 4:33 AMJesum Yip
12/15/2021, 4:33 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:34 AMJesum Yip
12/15/2021, 4:34 AMDennis (Cerbos)
request.auxData.jwt.token.scope.split(" ")
Jesum Yip
12/15/2021, 4:34 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:35 AMJesum Yip
12/15/2021, 4:36 AMDennis (Cerbos)
- expr: '"cerbos-jwt-tests" in request.aux_data.jwt.aud'
- expr: '"A" in request.aux_data.jwt.customArray'
Dennis (Cerbos)
Jesum Yip
12/15/2021, 4:37 AMDennis (Cerbos)
aux_data
and no token
in the policy expressionJesum Yip
12/15/2021, 4:37 AMDennis (Cerbos)
hmmm so maybe i should change it to “aux_data” instead of “auxData” in the policy?In the policy, but not in the request
Jesum Yip
12/15/2021, 4:38 AMJesum Yip
12/15/2021, 4:39 AMJesum Yip
12/15/2021, 4:40 AMJesum Yip
12/15/2021, 4:42 AMJesum Yip
12/15/2021, 4:42 AMJesum Yip
12/15/2021, 4:42 AM{
"requestId": "1",
"resourceInstances": {
"prod": {
"actions": {
"read": "EFFECT_DENY"
}
}
},
"meta": {
"resourceInstances": {
"prod": {
"actions": {
"read": {
"matchedPolicy": "NO_MATCH"
}
},
"effectiveDerivedRoles": []
}
}
}
}
Jesum Yip
12/15/2021, 4:43 AMJesum Yip
12/15/2021, 4:46 AMJesum Yip
12/15/2021, 4:46 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:48 AMJesum Yip
12/15/2021, 4:48 AMJesum Yip
12/15/2021, 4:49 AMJesum Yip
12/15/2021, 4:49 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 4:53 AMJesum Yip
12/15/2021, 4:54 AMJesum Yip
12/15/2021, 4:54 AMJesum Yip
12/15/2021, 4:54 AMJesum Yip
12/15/2021, 4:56 AMDennis (Cerbos)
auxdata
and fails to load auxData
for a different reasonDennis (Cerbos)
auxData
Dennis (Cerbos)
Jesum Yip
12/15/2021, 5:04 AMDennis (Cerbos)
auxData:
jwt:
disableVerification: true
Jesum Yip
12/15/2021, 5:06 AMJesum Yip
12/15/2021, 5:06 AMJesum Yip
12/15/2021, 5:06 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 5:06 AMJesum Yip
12/15/2021, 5:11 AMJesum Yip
12/15/2021, 5:11 AMJesum Yip
12/15/2021, 5:11 AMJesum Yip
12/15/2021, 5:11 AMDennis (Cerbos)
Dennis (Cerbos)
{
"requestId": "test",
"actions": [
"defer"
],
"principal": {
"id": "john",
"policyVersion": "20210210",
"roles": [
"employee"
],
"attr": {
"department": "marketing",
"geography": "GB",
"team": "design"
}
},
"resource": {
"kind": "leave_request",
"policyVersion": "20210210",
"instances": {
"XX125": {
"attr": {
"department": "marketing",
"geography": "GB",
"id": "XX125",
"owner": "john",
"team": "design"
}
}
}
},
"auxData": {
"jwt": {
"token": "eyJhbGciOiJFUzM4NCIsImtpZCI6IjE5TGZaYXRFZGc4M1lOYzVyMjNndU1KcXJuND0iLCJ0eXAiOiJKV1QifQ.eyJhdWQiOlsiY2VyYm9zLWp3dC10ZXN0cyJdLCJjdXN0b21BcnJheSI6WyJBIiwiQiIsIkMiXSwiY3VzdG9tSW50Ijo0MiwiY3VzdG9tTWFwIjp7IkEiOiJBQSIsIkIiOiJCQiIsIkMiOiJDQyJ9LCJjdXN0b21TdHJpbmciOiJmb29iYXIiLCJleHAiOjE5NDk5MzQwMzksImlzcyI6ImNlcmJvcy10ZXN0LXN1aXRlIn0.WN_tOScSpd_EI-P5EI1YlagxEgExSfBjAtcrgcF6lyWj1lGpR_GKx9goZEp2p_t5AVWXN_bjz_sMUmJdJa4cVd55Qm1miR-FKu6oNRHnSEWdMFmnArwPw-YDJWfylLFX"
}
}
}
Policy:
- actions: ["defer"]
effect: EFFECT_ALLOW
roles: ["employee"]
condition:
match:
all:
of:
- expr: '"cerbos-jwt-tests" in request.aux_data.jwt.aud'
- expr: '"A" in request.aux_data.jwt.customArray'
Jesum Yip
12/15/2021, 5:39 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 8:42 AMJesum Yip
12/15/2021, 8:43 AM{
"log.level": "error",
"@timestamp": "2021-12-15T08:41:54.978Z",
"log.logger": "cerbos.blob",
"message": "Failed to check for updates",
"bucket": "<gs://abac-policies>",
"workDir": "/root/tmp/cerbos/work",
"error": "failed to convert data to JSON: yaml: line 16: did not find expected key"
}
Jesum Yip
12/15/2021, 8:43 AMCharith (Cerbos)
condition:
match:
expr: |-
"read:businessassets" in request.auxdata.jwt.scope.split(" ")
Jesum Yip
12/15/2021, 8:50 AM\"read:businessassets\" in request.auxdata.jwt.scope.split(\" \")
[undefined field 'auxdata'])"}Jesum Yip
12/15/2021, 8:50 AMJesum Yip
12/15/2021, 8:50 AMapiVersion: api.cerbos.dev/v1
resourcePolicy:
version: "1"
importDerivedRoles:
- special_roles
resource: "businessassets"
rules:
- actions: ['read']
effect: EFFECT_ALLOW
derivedRoles:
- hm_employee
- actions: ['read']
effect: EFFECT_ALLOW
roles: ["valid_user"]
condition:
match:
expr: |-
"read:businessassets" in request.auxdata.jwt.scope.split(" ")
Charith (Cerbos)
auxData
Jesum Yip
12/15/2021, 8:51 AMJesum Yip
12/15/2021, 8:51 AMauxdata
Jesum Yip
12/15/2021, 8:52 AM{
"log.level": "error",
"@timestamp": "2021-12-15T08:52:04.991Z",
"log.logger": "cerbos.compiler",
"message": "Failed to recompile",
"id": {},
"error": "1 compilation errors:\nresourcePolicy_businessassets.yaml: Invalid expression in resource rule 'rule-002' (failed to compile `\"read:businessassets\" in request.auxData.jwt.scope.split(\" \")` [undefined field 'auxData'])"
}
Jesum Yip
12/15/2021, 8:56 AMCharith (Cerbos)
compile
command and verified the policy repo before starting the server. It's better to warn about an invalid repo on startup and let users fix it immediately.Jesum Yip
12/15/2021, 9:01 AMJesum Yip
12/15/2021, 9:01 AMJesum Yip
12/15/2021, 9:02 AMCharith (Cerbos)
Jesum Yip
12/15/2021, 9:03 AMCharith (Cerbos)
Jesum Yip
12/15/2021, 9:03 AMJesum Yip
12/15/2021, 9:03 AMCharith (Cerbos)
Jesum Yip
12/15/2021, 9:06 AMapiVersion: api.cerbos.dev/v1
resourcePolicy:
version: "1"
importDerivedRoles:
- special_roles
resource: "businessassets"
rules:
- name: allow_readbusinessassets_is_employee
actions: ['read']
effect: EFFECT_ALLOW
derivedRoles:
- hm_employee
- name: allow_readbusinessassets_from_scope
actions: ['read']
effect: EFFECT_ALLOW
roles: ["valid_user"]
condition:
match:
expr: |-
"read:businessassets" in request.auxData.jwt.scope.split(" ")
and
apiVersion: "api.cerbos.dev/v1"
description: "Dynamic role to determine if this is a HM employee."
derivedRoles:
name: special_roles
definitions:
- name: hm_employee
parentRoles: ["valid_user"]
condition:
match:
expr: request.aux_data.jwt.is_hm_employee == "TRUE"
Jesum Yip
12/15/2021, 9:08 AMCharith (Cerbos)
aux_data
. https://docs.cerbos.dev/cerbos/0.9.1/policies/conditions.html#auxdataDennis (Cerbos)
auxData
in the HTTP request and aux_data in the policy.Charith (Cerbos)
Charith (Cerbos)
Emre (Cerbos)
Jesum Yip
12/15/2021, 9:19 AMJesum Yip
12/15/2021, 9:21 AMJesum Yip
12/15/2021, 9:21 AMapiVersion: "api.cerbos.dev/v1"
description: "Dynamic role to determine if this is a HM employee."
derivedRoles:
name: platform_roles
definitions:
- name: hm_employee
parentRoles: ["naked_user"]
condition:
match:
expr: request.aux_data.jwt.is_hm_employee == "TRUE"
- name: explore
parentRoles: ["naked_user"]
condition:
match:
expr: request.aux_data.jwt.hm_account_status == "Explore"
- name: expand
parentRoles: ["naked_user"]
condition:
match:
expr: request.aux_data.jwt.hm_account_status == "Expand"
- name: experience
parentRoles: ["naked_user"]
condition:
match:
expr: request.aux_data.jwt.hm_account_status == "Experience"
Jesum Yip
12/15/2021, 9:22 AMEmre (Cerbos)
Charith (Cerbos)
condition
block from explore. Then it will always be active for anyone with the role naked_userJesum Yip
12/15/2021, 9:24 AMJesum Yip
12/15/2021, 9:25 AMCharith (Cerbos)
Jesum Yip
12/15/2021, 9:25 AMapiVersion: "api.cerbos.dev/v1"
description: "Dynamic role to determine if this is a HM employee."
derivedRoles:
name: platform_roles
definitions:
- name: hm_employee
parentRoles: ["naked_user"]
condition:
match:
expr: request.aux_data.jwt.is_hm_employee == "TRUE"
- name: explore
parentRoles: ["naked_user"]
- name: expand
parentRoles: ["naked_user"]
condition:
match:
expr: request.aux_data.jwt.hm_account_status == "Expand"
- name: experience
parentRoles: ["naked_user"]
condition:
match:
expr: request.aux_data.jwt.hm_account_status == "Experience"
Jesum Yip
12/15/2021, 9:25 AMCharith (Cerbos)
Jesum Yip
12/15/2021, 9:26 AMJesum Yip
12/15/2021, 9:26 AMCharith (Cerbos)
Jesum Yip
12/15/2021, 9:29 AMapiVersion: "api.cerbos.dev/v1"
description: "Dynamic role to determine if this is a HM employee."
derivedRoles:
name: platform_roles
definitions:
- name: hm_employee
parentRoles: ["naked_user"]
condition:
match:
all:
of:
- expr: request.aux_data.jwt.is_hm_employee == "TRUE"
- expr: request.aux_data_jwt.hm_account_status != "Expand"
- expr: request.aux_data_jwt.hm_account_status != "Explore"
- expr: request.aux_data_jwt.hm_account_status != "Experience"
- name: explore
parentRoles: ["naked_user"]
- name: expand
parentRoles: ["naked_user"]
condition:
match:
all:
of:
- expr: request.aux_data.jwt.hm_account_status == "Expand"
- expr: request.aux_data_jwt.is_hm_employee != "TRUE"
- name: experience
parentRoles: ["naked_user"]
condition:
match:
all:
of:
- expr: request.aux_data.jwt.hm_account_status == "Experience"
- expr: request.aux_data_jwt.is_hm_employee != "TRUE"
Jesum Yip
12/15/2021, 9:30 AMJesum Yip
12/15/2021, 9:30 AMJesum Yip
12/15/2021, 9:30 AMJesum Yip
12/15/2021, 9:31 AMCharith (Cerbos)
Jesum Yip
12/15/2021, 9:35 AMJesum Yip
12/15/2021, 9:49 AMJesum Yip
12/15/2021, 9:49 AMapiVersion: api.cerbos.dev/v1
resourcePolicy:
version: "1"
importDerivedRoles:
- platform_roles
resource: "businessassets"
rules:
- name: allow_readbusinessassets_is_employee
actions: ['read']
effect: EFFECT_ALLOW
derivedRoles:
- hm_employee
- name: allow_readbusinessassets_from_scope
actions: ['read']
effect: EFFECT_ALLOW
roles: ["naked_user"]
condition:
match:
expr: |-
"read:businessassets" in request.aux_data.jwt.scope.split(" ")
Jesum Yip
12/15/2021, 9:49 AMapiVersion: "api.cerbos.dev/v1"
description: "Dynamic role to determine if this is a HM employee."
derivedRoles:
name: platform_roles
definitions:
- name: hm_employee
parentRoles: ["naked_user"]
condition:
match:
all:
of:
- expr: request.aux_data.jwt.is_hm_employee == "TRUE"
#- expr: !(request.aux_data.jwt.hm_account_status in ['Expand', 'Explore', 'Experience'])
- name: explore
parentRoles: ["naked_user"]
condition:
match:
any:
of:
- expr: request.aux_data.jwt.hm_account_status == "Explore"
- expr: request.aux_data.jwt.is_hm_employee != "TRUE"
- name: expand
parentRoles: ["naked_user"]
condition:
match:
all:
of:
- expr: request.aux_data.jwt.hm_account_status == "Expand"
- expr: request.aux_data.jwt.is_hm_employee != "TRUE"
- name: experience
parentRoles: ["naked_user"]
condition:
match:
all:
of:
- expr: request.aux_data.jwt.hm_account_status == "Experience"
- expr: request.aux_data.jwt.is_hm_employee != "TRUE"
Jesum Yip
12/15/2021, 9:50 AMJesum Yip
12/15/2021, 9:50 AM{
"requestId": "1",
"resourceInstances": {
"prod": {
"actions": {
"read": "EFFECT_DENY"
}
}
},
"meta": {
"resourceInstances": {
"prod": {
"actions": {
"read": {
"matchedPolicy": "resource.businessassets.v1"
}
},
"effectiveDerivedRoles": []
}
}
}
}
Jesum Yip
12/15/2021, 9:51 AMDennis (Cerbos)
auxdata
Jesum Yip
12/15/2021, 9:51 AMJesum Yip
12/15/2021, 9:51 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 9:52 AMJesum Yip
12/15/2021, 9:52 AMJesum Yip
12/15/2021, 9:52 AMDennis (Cerbos)
Jesum Yip
12/15/2021, 9:52 AMJesum Yip
12/15/2021, 9:52 AMDennis (Cerbos)
Dennis (Cerbos)
auxData
and aux_data
works in HTTP request.Dennis (Cerbos)
Jesum Yip
12/15/2021, 9:54 AMauxdata
doesn't work in HTTP requestJesum Yip
12/15/2021, 9:55 AM