RANGER-4786: Ranger override policy is not working
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java
index ded8d09..9745dc6 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java
@@ -832,14 +832,23 @@
if (!result.getIsAllowed()) { // if access is not yet allowed by another policy
if (matchType != RangerPolicyResourceMatcher.MatchType.ANCESTOR) {
RangerAccessResult oneResult = new RangerAccessResult(result.getPolicyType(), result.getServiceName(), result.getServiceDef(), result.getAccessRequest());
- oneResult.setIsAllowed(true);
oneResult.setPolicyPriority(getPolicyPriority());
oneResult.setPolicyId(getPolicyId());
oneResult.setPolicyVersion(getPolicy().getVersion());
+ if (!oneResult.getIsAuditedDetermined()) {
+ oneResult.setAuditResultFrom(result);
+ }
RangerAccessRequestUtil.setAccessTypeResult(request.getContext(), accessType, oneResult);
}
}
+ Map<String, RangerAccessResult> savedAccessResults = RangerAccessRequestUtil.getAccessTypeResults(request.getContext());
+ int allowedAccessesCount = savedAccessResults == null ? 0 : savedAccessResults.size();
+ if (allRequestedAccesses.size() == allowedAccessesCount) {
+ RangerAccessRequestUtil.setAccessTypeResults(request.getContext(), null);
+ result.setIsAllowed(true);
+ break;
+ }
}
}
}
@@ -909,6 +918,13 @@
break;
} else if (oneResult.getIsAllowed()) {
RangerAccessRequestUtil.setAccessTypeResult(request.getContext(), accessType, oneResult);
+
+ // Check if all access requests are satisfied, if so, access is allowed
+ if (allRequestedAccesses.size() == RangerAccessRequestUtil.getAccessTypeResults(request.getContext()).size()) {
+ allowResult = oneResult;
+ RangerAccessRequestUtil.setAccessTypeResults(request.getContext(), null);
+ break;
+ }
}
}
}
diff --git a/agents-common/src/test/resources/policyengine/test_policyengine_hdfs_multiple_accesses.json b/agents-common/src/test/resources/policyengine/test_policyengine_hdfs_multiple_accesses.json
index 6b53d2e..8962c5a 100644
--- a/agents-common/src/test/resources/policyengine/test_policyengine_hdfs_multiple_accesses.json
+++ b/agents-common/src/test/resources/policyengine/test_policyengine_hdfs_multiple_accesses.json
@@ -48,6 +48,9 @@
"resources":{"path":{"values":["/public/*"],"isRecursive":true}},
"policyItems":[
{"accesses":[{"type":"execute","isAllowed":true}],"users":[],"groups":["public"],"delegateAdmin":false}
+ ],
+ "allowExceptions":[
+ {"accesses":[{"type":"execute","isAllowed":true}],"users":["guest"],"groups":[],"delegateAdmin":false}
]
}
,
@@ -56,10 +59,65 @@
"policyItems":[
{"accesses":[{"type":"read","isAllowed":true}],"users":["finance"],"groups":[],"delegateAdmin":false}
]
+ },
+ {"id":4,"name":"deny-all-to-finance under /public/finance to user guest","isEnabled":true,"isAuditEnabled":true,
+ "resources":{"path":{"values":["/public/finance"],"isRecursive":true}},
+ "denyPolicyItems":[
+ {"accesses":[{"type":"read","isAllowed":true}, {"type":"write","isAllowed":true}, {"type":"execute","isAllowed":true}],"users":["guest"],"groups":[],"delegateAdmin":false}
+ ]
+ },
+ {"id":5,"name":"allow-read-to-finance under /public/finance to user guest","isEnabled":true,"isAuditEnabled":true, "policyPriority": 1,
+ "resources":{"path":{"values":["/public/finance"],"isRecursive":true}},
+ "policyItems":[
+ {"accesses":[{"type":"read","isAllowed":true}],"users":["guest"],"groups":[],"delegateAdmin":false}
+ ]
+ },
+ {"id":6,"name":"allow-execute-to-finance under /public/finance to user guest","isEnabled":true,"isAuditEnabled":true, "policyPriority": 1,
+ "resources":{"path":{"values":["/public/finance"],"isRecursive":true}},
+ "policyItems":[
+ {"accesses":[{"type":"execute","isAllowed":true}],"users":["guest"],"groups":[],"delegateAdmin":false}
+ ]
}
],
"tests":[
+ {"name":"ALLOW 'read_execute /public/finance' for user guest",
+ "request":{
+ "resource":{"elements":{"path":"/public/finance"}},
+ "accessType":"read","user":"guest","userGroups":[],"requestData":"read_execute /public/finance",
+ "context": {"ACCESSTYPES": [ "read", "execute" ]}
+ },
+ "result":{"isAudited":true,"isAllowed":true,"policyId":6}
+ },
+ {"name":"ALLOW 'read /public/finance' for user guest",
+ "request":{
+ "resource":{"elements":{"path":"/public/finance"}},
+ "accessType":"read","user":"guest","userGroups":[],"requestData":"read /public/finance"
+ },
+ "result":{"isAudited":true,"isAllowed":true,"policyId":5}
+ },
+ {"name":"ALLOW 'execute /public/finance' for user guest",
+ "request":{
+ "resource":{"elements":{"path":"/public/finance"}},
+ "accessType":"execute","user":"guest","userGroups":[],"requestData":"execute /public/finance"
+ },
+ "result":{"isAudited":true,"isAllowed":true,"policyId":6}
+ },
+ {"name":"DENY 'write /public/finance' for user guest",
+ "request":{
+ "resource":{"elements":{"path":"/public/finance"}},
+ "accessType":"write","user":"guest","userGroups":[],"requestData":"write /public/finance"
+ },
+ "result":{"isAudited":true,"isAllowed":false,"policyId":4}
+ },
+ {"name":"DENY 'write_execute /public/finance' for user guest",
+ "request":{
+ "resource":{"elements":{"path":"/public/finance"}},
+ "accessType":"write","user":"guest","userGroups":[],"requestData":"write_execute /public/finance",
+ "context": {"ACCESSTYPES": [ "write", "execute" ]}
+ },
+ "result":{"isAudited":true,"isAllowed":false,"policyId":4}
+ },
{"name":"ALLOW 'read_execute /public/finance' for user finance",
"request":{
"resource":{"elements":{"path":"/public/finance"}},