This is an automated email from the ASF dual-hosted git repository. abhay pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push: new 4096838 RANGER-2404: Delegate-admin permission granted by policy needs to be effective only within the zone to which the policy belongs 4096838 is described below commit 4096838b60be4190ee9223369f6b27d93eb1190d Author: Abhay Kulkarni <ab...@apache.org> AuthorDate: Sat Apr 27 09:58:21 2019 -0700 RANGER-2404: Delegate-admin permission granted by policy needs to be effective only within the zone to which the policy belongs --- .../policyengine/RangerPolicyEngineCache.java | 122 +++++++++++++++++++-- .../RangerPolicyEngineCacheForEngineOptions.java | 7 +- .../policyengine/RangerPolicyEngineImpl.java | 6 +- .../java/org/apache/ranger/rest/ServiceREST.java | 111 ++++--------------- 4 files changed, 142 insertions(+), 104 deletions(-) diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineCache.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineCache.java index c1a7977..99b2ab3 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineCache.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineCache.java @@ -19,21 +19,29 @@ package org.apache.ranger.plugin.policyengine; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.ranger.plugin.model.RangerPolicy; +import org.apache.ranger.plugin.model.RangerPolicyDelta; +import org.apache.ranger.plugin.model.RangerSecurityZone; +import org.apache.ranger.plugin.store.SecurityZoneStore; import org.apache.ranger.plugin.store.ServiceStore; import org.apache.ranger.plugin.util.ServicePolicies; -class RangerPolicyEngineCache { +public class RangerPolicyEngineCache { private static final Log LOG = LogFactory.getLog(RangerPolicyEngineCache.class); private final Map<String, RangerPolicyEngine> policyEngineCache = new HashMap<String, RangerPolicyEngine>(); - synchronized final RangerPolicyEngine getPolicyEngine(String serviceName, ServiceStore svcStore, RangerPolicyEngineOptions options) { + synchronized final RangerPolicyEngine getPolicyEngine(String serviceName, ServiceStore svcStore, SecurityZoneStore zoneStore, RangerPolicyEngineOptions options) { RangerPolicyEngine ret = null; if(serviceName != null) { @@ -45,13 +53,17 @@ class RangerPolicyEngineCache { try { ServicePolicies policies = svcStore.getServicePoliciesIfUpdated(serviceName, policyVersion, false); - if(policies != null) { - if(ret == null) { - ret = addPolicyEngine(policies, options); - } else if(policies.getPolicyVersion() != null && !policies.getPolicyVersion().equals(policyVersion)) { - ret = updatePolicyEngine(ret, policies, options); + if (policies != null && policies.getPolicyVersion() != null && !policies.getPolicyVersion().equals(policyVersion)) { + ServicePolicies updatedServicePolicies = policies; + if (zoneStore != null) { + Map<String, RangerSecurityZone.RangerSecurityZoneService> securityZones = zoneStore.getSecurityZonesForService(serviceName); + if (MapUtils.isNotEmpty(securityZones)) { + updatedServicePolicies = getUpdatedServicePoliciesForZones(policies, securityZones); + } } + ret = ret == null ? addPolicyEngine(updatedServicePolicies, options) : updatePolicyEngine(ret, updatedServicePolicies, options); } + } catch(Exception excp) { LOG.error("getPolicyEngine(" + serviceName + "): failed to get latest policies from service-store", excp); } @@ -90,4 +102,100 @@ class RangerPolicyEngineCache { return ret; } + + public static ServicePolicies getUpdatedServicePoliciesForZones(ServicePolicies servicePolicies, Map<String, RangerSecurityZone.RangerSecurityZoneService> securityZones) { + + final ServicePolicies ret; + + if (MapUtils.isNotEmpty(securityZones)) { + ret = new ServicePolicies(); + ret.setServiceDef(servicePolicies.getServiceDef()); + ret.setServiceId(servicePolicies.getServiceId()); + ret.setServiceName(servicePolicies.getServiceName()); + ret.setAuditMode(servicePolicies.getAuditMode()); + ret.setPolicyVersion(servicePolicies.getPolicyVersion()); + ret.setPolicyUpdateTime(servicePolicies.getPolicyUpdateTime()); + + Map<String, ServicePolicies.SecurityZoneInfo> securityZonesInfo = new HashMap<>(); + + if (CollectionUtils.isEmpty(servicePolicies.getPolicyDeltas())) { + + List<RangerPolicy> allPolicies = new ArrayList<>(servicePolicies.getPolicies()); + + for (Map.Entry<String, RangerSecurityZone.RangerSecurityZoneService> entry : securityZones.entrySet()) { + + List<RangerPolicy> zonePolicies = extractZonePolicies(allPolicies, entry.getKey()); + + if (CollectionUtils.isNotEmpty(zonePolicies)) { + allPolicies.removeAll(zonePolicies); + } + + ServicePolicies.SecurityZoneInfo securityZoneInfo = new ServicePolicies.SecurityZoneInfo(); + securityZoneInfo.setZoneName(entry.getKey()); + securityZoneInfo.setPolicies(zonePolicies); + securityZoneInfo.setResources(entry.getValue().getResources()); + + securityZoneInfo.setContainsAssociatedTagService(false); + + securityZonesInfo.put(entry.getKey(), securityZoneInfo); + } + + ret.setPolicies(allPolicies); + ret.setTagPolicies(servicePolicies.getTagPolicies()); + } else { + List<RangerPolicyDelta> allPolicyDeltas = new ArrayList<>(servicePolicies.getPolicyDeltas()); + + for (Map.Entry<String, RangerSecurityZone.RangerSecurityZoneService> entry : securityZones.entrySet()) { + + List<RangerPolicyDelta> zonePolicyDeltas = extractZonePolicyDeltas(allPolicyDeltas, entry.getKey()); + + if (CollectionUtils.isNotEmpty(zonePolicyDeltas)) { + allPolicyDeltas.removeAll(zonePolicyDeltas); + } + + ServicePolicies.SecurityZoneInfo securityZoneInfo = new ServicePolicies.SecurityZoneInfo(); + securityZoneInfo.setZoneName(entry.getKey()); + securityZoneInfo.setPolicyDeltas(zonePolicyDeltas); + securityZoneInfo.setResources(entry.getValue().getResources()); + + securityZoneInfo.setContainsAssociatedTagService(false); + + securityZonesInfo.put(entry.getKey(), securityZoneInfo); + } + + ret.setPolicyDeltas(allPolicyDeltas); + } + ret.setSecurityZones(securityZonesInfo); + } else { + ret = servicePolicies; + } + + return ret; + } + + private static List<RangerPolicy> extractZonePolicies(final List<RangerPolicy> allPolicies, final String zoneName) { + + final List<RangerPolicy> ret = new ArrayList<>(); + + for (RangerPolicy policy : allPolicies) { + if (policy.getIsEnabled() && StringUtils.equals(policy.getZoneName(), zoneName)) { + ret.add(policy); + } + } + + return ret; + } + + private static List<RangerPolicyDelta> extractZonePolicyDeltas(final List<RangerPolicyDelta> allPolicyDeltas, final String zoneName) { + + final List<RangerPolicyDelta> ret = new ArrayList<>(); + + for (RangerPolicyDelta delta : allPolicyDeltas) { + if (StringUtils.equals(delta.getZoneName(), zoneName)) { + ret.add(delta); + } + } + + return ret; + } } diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineCacheForEngineOptions.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineCacheForEngineOptions.java index ca6a2a3..5cd82d8 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineCacheForEngineOptions.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineCacheForEngineOptions.java @@ -19,6 +19,7 @@ package org.apache.ranger.plugin.policyengine; +import org.apache.ranger.plugin.store.SecurityZoneStore; import org.apache.ranger.plugin.store.ServiceStore; import java.util.Collections; @@ -46,6 +47,10 @@ public class RangerPolicyEngineCacheForEngineOptions { } public final RangerPolicyEngine getPolicyEngine(String serviceName, ServiceStore svcStore, RangerPolicyEngineOptions options) { + return getPolicyEngine(serviceName, svcStore, null, options); + } + + public final RangerPolicyEngine getPolicyEngine(String serviceName, ServiceStore svcStore, SecurityZoneStore zoneStore, RangerPolicyEngineOptions options) { RangerPolicyEngineCache policyEngineCache; @@ -56,7 +61,7 @@ public class RangerPolicyEngineCacheForEngineOptions { policyEngineCacheForEngineOptions.put(options, policyEngineCache); } } - return policyEngineCache.getPolicyEngine(serviceName, svcStore, options); + return policyEngineCache.getPolicyEngine(serviceName, svcStore, zoneStore, options); } } diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java index 35fa534..365edcf 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java @@ -800,9 +800,8 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { matchedRepositories.add(policyRepository); } } else { - // Search all security zones + // Search unzoned security zone matchedRepositories.add(this.policyRepository); - matchedRepositories.addAll(this.policyRepositories.values()); } for (RangerPolicyRepository policyRepository : matchedRepositories) { @@ -862,9 +861,8 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { matchedRepositories.add(policyRepository); } } else { - // Search all security zones + // Search unzoned security zone matchedRepositories.add(this.policyRepository); - matchedRepositories.addAll(this.policyRepositories.values()); } for (RangerPolicyRepository policyRepository : matchedRepositories) { diff --git a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java index f17b65e..70088f9 100644 --- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java +++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java @@ -92,7 +92,6 @@ import org.apache.ranger.plugin.model.RangerPolicy; import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem; import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemAccess; import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource; -import org.apache.ranger.plugin.model.RangerPolicyDelta; import org.apache.ranger.plugin.model.RangerSecurityZone; import org.apache.ranger.plugin.model.RangerService; import org.apache.ranger.plugin.model.RangerServiceDef; @@ -104,6 +103,7 @@ import org.apache.ranger.plugin.model.validation.RangerValidator.Action; import org.apache.ranger.plugin.policyengine.RangerAccessResource; import org.apache.ranger.plugin.policyengine.RangerAccessResourceImpl; import org.apache.ranger.plugin.policyengine.RangerPolicyEngine; +import org.apache.ranger.plugin.policyengine.RangerPolicyEngineCache; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineCacheForEngineOptions; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineOptions; import org.apache.ranger.plugin.service.ResourceLookupContext; @@ -2898,7 +2898,11 @@ public class ServiceREST { logMsg = "No change since last update"; } else { Map<String, RangerSecurityZone.RangerSecurityZoneService> securityZones = zoneStore.getSecurityZonesForService(serviceName); - ServicePolicies updatedServicePolicies = getUpdatedServicePoliciesForZones(servicePolicies, securityZones); + ServicePolicies updatedServicePolicies = servicePolicies; + if (MapUtils.isNotEmpty(securityZones)) { + updatedServicePolicies = RangerPolicyEngineCache.getUpdatedServicePoliciesForZones(servicePolicies, securityZones); + patchAssociatedTagServiceInSecurityZoneInfos(updatedServicePolicies); + } downloadedVersion = updatedServicePolicies.getPolicyVersion(); if (lastKnownVersion == -1L || !supportsPolicyDeltas) { ret = filterServicePolicies(updatedServicePolicies); @@ -3015,7 +3019,11 @@ public class ServiceREST { logMsg = "No change since last update"; } else { Map<String, RangerSecurityZone.RangerSecurityZoneService> securityZones = zoneStore.getSecurityZonesForService(serviceName); - ServicePolicies updatedServicePolicies = getUpdatedServicePoliciesForZones(servicePolicies, securityZones); + ServicePolicies updatedServicePolicies = servicePolicies; + if (MapUtils.isNotEmpty(securityZones)) { + updatedServicePolicies = RangerPolicyEngineCache.getUpdatedServicePoliciesForZones(servicePolicies, securityZones); + patchAssociatedTagServiceInSecurityZoneInfos(updatedServicePolicies); + } downloadedVersion = updatedServicePolicies.getPolicyVersion(); if (lastKnownVersion == -1L || !supportsPolicyDeltas) { ret = filterServicePolicies(updatedServicePolicies); @@ -3530,7 +3538,7 @@ public class ServiceREST { } private RangerPolicyEngine getDelegatedAdminPolicyEngine(String serviceName) { - return RangerPolicyEngineCacheForEngineOptions.getInstance().getPolicyEngine(serviceName, svcStore, delegateAdminOptions); + return RangerPolicyEngineCacheForEngineOptions.getInstance().getPolicyEngine(serviceName, svcStore, zoneStore, delegateAdminOptions); } private RangerPolicyEngine getPolicySearchPolicyEngine(String serviceName) throws Exception { @@ -3811,19 +3819,9 @@ public class ServiceREST { } } } - private ServicePolicies getUpdatedServicePoliciesForZones(ServicePolicies servicePolicies, Map<String, RangerSecurityZone.RangerSecurityZoneService> securityZones) { - - final ServicePolicies ret; - - if (MapUtils.isNotEmpty(securityZones)) { - ret = new ServicePolicies(); - ret.setServiceDef(servicePolicies.getServiceDef()); - ret.setServiceId(servicePolicies.getServiceId()); - ret.setServiceName(servicePolicies.getServiceName()); - ret.setAuditMode(servicePolicies.getAuditMode()); - ret.setPolicyVersion(servicePolicies.getPolicyVersion()); - ret.setPolicyUpdateTime(servicePolicies.getPolicyUpdateTime()); + private void patchAssociatedTagServiceInSecurityZoneInfos(ServicePolicies servicePolicies) { + if (servicePolicies != null && MapUtils.isNotEmpty(servicePolicies.getSecurityZones())) { // Get list of zones that associated tag-service (if any) is associated with List<String> zonesInAssociatedTagService = new ArrayList<>(); @@ -3838,86 +3836,15 @@ public class ServiceREST { LOG.warn("Could not get service associated with [" + tagServiceName + "]", exception); } } + if (CollectionUtils.isNotEmpty(zonesInAssociatedTagService)) { + for (Map.Entry<String, ServicePolicies.SecurityZoneInfo> entry : servicePolicies.getSecurityZones().entrySet()) { + String zoneName = entry.getKey(); + ServicePolicies.SecurityZoneInfo securityZoneInfo = entry.getValue(); - Map<String, ServicePolicies.SecurityZoneInfo> securityZonesInfo = new HashMap<>(); - - if (CollectionUtils.isEmpty(servicePolicies.getPolicyDeltas())) { - - List<RangerPolicy> allPolicies = new ArrayList<>(servicePolicies.getPolicies()); - - for (Map.Entry<String, RangerSecurityZone.RangerSecurityZoneService> entry : securityZones.entrySet()) { - - List<RangerPolicy> zonePolicies = extractZonePolicies(allPolicies, entry.getKey()); - - if (CollectionUtils.isNotEmpty(zonePolicies)) { - allPolicies.removeAll(zonePolicies); - } - - ServicePolicies.SecurityZoneInfo securityZoneInfo = new ServicePolicies.SecurityZoneInfo(); - securityZoneInfo.setZoneName(entry.getKey()); - securityZoneInfo.setPolicies(zonePolicies); - securityZoneInfo.setResources(entry.getValue().getResources()); - - securityZoneInfo.setContainsAssociatedTagService(zonesInAssociatedTagService.contains(entry.getKey())); - - securityZonesInfo.put(entry.getKey(), securityZoneInfo); - } - - ret.setPolicies(allPolicies); - ret.setTagPolicies(servicePolicies.getTagPolicies()); - } else { - List<RangerPolicyDelta> allPolicyDeltas = new ArrayList<>(servicePolicies.getPolicyDeltas()); - - for (Map.Entry<String, RangerSecurityZone.RangerSecurityZoneService> entry : securityZones.entrySet()) { - - List<RangerPolicyDelta> zonePolicyDeltas = extractZonePolicyDeltas(allPolicyDeltas, entry.getKey()); - - if (CollectionUtils.isNotEmpty(zonePolicyDeltas)) { - allPolicyDeltas.removeAll(zonePolicyDeltas); - } - - ServicePolicies.SecurityZoneInfo securityZoneInfo = new ServicePolicies.SecurityZoneInfo(); - securityZoneInfo.setZoneName(entry.getKey()); - securityZoneInfo.setPolicyDeltas(zonePolicyDeltas); - securityZoneInfo.setResources(entry.getValue().getResources()); - - securityZonesInfo.put(entry.getKey(), securityZoneInfo); + securityZoneInfo.setContainsAssociatedTagService(zonesInAssociatedTagService.contains(zoneName)); } - - ret.setPolicyDeltas(allPolicyDeltas); } - ret.setSecurityZones(securityZonesInfo); - } else { - ret = servicePolicies; } - - return ret; - } - - private static List<RangerPolicy> extractZonePolicies(final List<RangerPolicy> allPolicies, final String zoneName) { - - final List<RangerPolicy> ret = new ArrayList<>(); - - for (RangerPolicy policy : allPolicies) { - if (policy.getIsEnabled() && StringUtils.equals(policy.getZoneName(), zoneName)) { - ret.add(policy); - } - } - - return ret; - } - - private static List<RangerPolicyDelta> extractZonePolicyDeltas(final List<RangerPolicyDelta> allPolicyDeltas, final String zoneName) { - - final List<RangerPolicyDelta> ret = new ArrayList<>(); - - for (RangerPolicyDelta delta : allPolicyDeltas) { - if (StringUtils.equals(delta.getZoneName(), zoneName)) { - ret.add(delta); - } - } - - return ret; } }