Fateh Singh created RANGER-4733:
-----------------------------------
Summary: Bug in tag policy cache computation for a given service -
irrelevant tag policies found
Key: RANGER-4733
URL: https://issues.apache.org/jira/browse/RANGER-4733
Project: Ranger
Issue Type: Bug
Components: Ranger
Reporter: Fateh Singh
Assignee: Fateh Singh
While testing the hasTagPolicies function of the policy engine, I observed that
even though for a given service, there are no tag based policies, still some
tag based policies are found in the policy cache for a given service.
{code:java}
PolicyEngine.java
public boolean hasTagPolicies(RangerPolicyRepository tagPolicyRepository) {
if (LOG.isDebugEnabled()){
LOG.debug("PolicyEngine.hasTagPolicies
tagPolicies="+tagPolicyRepository.getPolicies().toString());
}
return tagPolicyRepository != null &&
CollectionUtils.isNotEmpty(tagPolicyRepository.getPolicies());
}
{code}
Below scenarios were tested for analysis-
Scenario 1: If an existing policy which has base as a policy and is now
modified such that base is no longer a service mentioned in any of the
conditions in the tag based policy, then “policies” still has this tag based
policy but with various conditions and policy items as empty lists (this is
unexpected behavior because ideally, policies list should have been empty
instead of it existing but policy items being empty)
Scenario 2: If a new tag policy is created but hbase is not mentioned as a
service, then still “policies” list has this policy in the hbase policy cache
(with policy items list being empty) which is unexpected behavior (similar to
Scenario 1)
Scenario 3: If a tag policy is disabled (and there are no other tag policies),
then the tag repository exists but “policies” list does not exist in the
tagPolicies data structure (which is expected behavior i.e. policy is deleted
from policy cache)
Scenario 4: If all tag policies for cm_tag are either disabled or deleted then
“policies” list does not exist (expected behavior similar to Scenario 3)
Scenario 5: cm_tag is disassociated from hbase- tag policy respository I.e.
tagPolicies in policy cache is removed (which is the expected behavior)
Illustration of Scenario 1:
When Hbase is listed as a service in a tag based policy item:
{code:java}
2024-03-04 16:13:31,853 DEBUG
org.apache.ranger.plugin.policyengine.PolicyEngine: PolicyEngine.hasTagPolicies
tagPolicies=[RangerPolicy={id={4} guid={3d82d579-bce0-4527-a23e-53dbcda21f4d}
isEnabled={true} createdBy={null} updatedBy={null} createTime={null}
updateTime={null} version={3} service={cm_tag} name={EXPIRES_ON} policyType={0}
policyPriority={0} description={Policy for data with EXPIRES_ON tag}
resourceSignature={null} isAuditEnabled={true} serviceType={tag}
resources={tag={RangerPolicyResource={values={EXPIRES_ON } isExcludes={false}
isRecursive={false} }} } policyLabels={} policyConditions={} policyItems={}
denyPolicyItems={RangerPolicyItem={accessTypes={RangerPolicyItemAccess={type={read}
isAllowed={true} }RangerPolicyItemAccess={type={write} isAllowed={true}
}RangerPolicyItemAccess={type={create} isAllowed={true}
}RangerPolicyItemAccess={type={admin} isAllowed={true}
}RangerPolicyItemAccess={type={execute} isAllowed={true} }} users={}
groups={public } roles={}
conditions={RangerPolicyCondition={type={accessed-after-expiry} values={yes }
}} delegateAdmin={false} }} allowExceptions={} denyExceptions={}
dataMaskPolicyItems={} rowFilterPolicyItems={} options={} validitySchedules={,
zoneName=null, isDenyAllElse={false} }}]
{code}
When Hbase is removed from all tag based policies :
{code:java}
2024-03-04 16:25:01,584 DEBUG
org.apache.ranger.plugin.policyengine.PolicyEngine: PolicyEngine.hasTagPolicies
tagPolicies=[RangerPolicy={id={4} guid={3d82d579-bce0-4527-a23e-53dbcda21f4d}
isEnabled={true} createdBy={null} updatedBy={null} createTime={null}
updateTime={null} version={4} service={cm_tag} name={EXPIRES_ON} policyType={0}
policyPriority={0} description={Policy for data with EXPIRES_ON tag}
resourceSignature={null} isAuditEnabled={true} serviceType={tag}
resources={tag={RangerPolicyResource={values={EXPIRES_ON } isExcludes={false}
isRecursive={false} }} } policyLabels={} policyConditions={} policyItems={}
denyPolicyItems={} allowExceptions={} denyExceptions={} dataMaskPolicyItems={}
rowFilterPolicyItems={} options={} validitySchedules={, zoneName=null,
isDenyAllElse={false} }}]{code}
Note here that policy still exists but the items lists are empty here instead
of policy not existing in hbase policy cache
*Scenario 1 and Scenario 2* need to be fixed so that no tag based policies
should be there in policy cache of a service if there are no relevant policies
(instead of returning all policies relevant to other services but with empty
policy items in the data structure)
*Impact:* While no impact in policy evaluation, there could be performance
impact due to this because if there are tag policies found then various
computations are performed for every request such as finding relevant tags etc.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)