Return-Path: X-Original-To: apmail-ranger-commits-archive@www.apache.org Delivered-To: apmail-ranger-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 64D3919E54 for ; Thu, 24 Mar 2016 06:41:45 +0000 (UTC) Received: (qmail 92462 invoked by uid 500); 24 Mar 2016 06:41:45 -0000 Delivered-To: apmail-ranger-commits-archive@ranger.apache.org Received: (qmail 92432 invoked by uid 500); 24 Mar 2016 06:41:45 -0000 Mailing-List: contact commits-help@ranger.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ranger.incubator.apache.org Delivered-To: mailing list commits@ranger.incubator.apache.org Received: (qmail 92423 invoked by uid 99); 24 Mar 2016 06:41:45 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 24 Mar 2016 06:41:45 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id DB4C5180234 for ; Thu, 24 Mar 2016 06:41:44 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -3.221 X-Spam-Level: X-Spam-Status: No, score=-3.221 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.001] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id 41U4iko8o_fs for ; Thu, 24 Mar 2016 06:41:39 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id 1DB2B5F119 for ; Thu, 24 Mar 2016 06:41:37 +0000 (UTC) Received: (qmail 92419 invoked by uid 99); 24 Mar 2016 06:41:37 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 24 Mar 2016 06:41:37 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 1FDEADFC56; Thu, 24 Mar 2016 06:41:37 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: madhan@apache.org To: commits@ranger.incubator.apache.org Message-Id: <5eeb9fee751e405ab1985e0541f5b2fc@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: incubator-ranger git commit: RANGER-889: Policy engine API to find list of users/groups having access to a resource Date: Thu, 24 Mar 2016 06:41:37 +0000 (UTC) Repository: incubator-ranger Updated Branches: refs/heads/master 31c2b030c -> e5ca0fe51 RANGER-889: Policy engine API to find list of users/groups having access to a resource (cherry picked from commit 3bfc2e12c1ad825fedc4e339ae988d840d03b8ae) Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/e5ca0fe5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/e5ca0fe5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/e5ca0fe5 Branch: refs/heads/master Commit: e5ca0fe51390c48d4a5f67ca46db9ecd53b41c0a Parents: 31c2b03 Author: Madhan Neethiraj Authored: Mon Mar 21 10:16:43 2016 -0700 Committer: Madhan Neethiraj Committed: Wed Mar 23 23:28:31 2016 -0700 ---------------------------------------------------------------------- .../plugin/policyengine/RangerPolicyEngine.java | 3 +- .../policyengine/RangerPolicyEngineImpl.java | 43 ++++++- .../policyengine/RangerResourceAccessInfo.java | 116 +++++++++++++++++++ .../RangerAbstractPolicyItemEvaluator.java | 2 + .../RangerDefaultPolicyEvaluator.java | 87 +++++++++++++- .../policyevaluator/RangerPolicyEvaluator.java | 4 + .../RangerPolicyItemEvaluator.java | 2 + .../ranger/plugin/service/RangerBasePlugin.java | 12 ++ .../plugin/policyengine/TestPolicyEngine.java | 22 +++- .../test_policyengine_resource_access_info.json | 106 +++++++++++++++++ 10 files changed, 391 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngine.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngine.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngine.java index 64870d9..d19e3d0 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngine.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngine.java @@ -61,8 +61,9 @@ public interface RangerPolicyEngine { List getAllowedPolicies(String user, Set userGroups, String accessType); + RangerResourceAccessInfo getResourceAccessInfo(RangerAccessRequest request); + boolean preCleanup(); void cleanup(); - } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java ---------------------------------------------------------------------- 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 9e817d7..51cab80 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 @@ -448,6 +448,47 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { return ret; } + @Override + public RangerResourceAccessInfo getResourceAccessInfo(RangerAccessRequest request) { + if(LOG.isDebugEnabled()) { + LOG.debug("==> RangerPolicyEngineImpl.getResourceAccessInfo(" + request + ")"); + } + + RangerResourceAccessInfo ret = new RangerResourceAccessInfo(request); + + List tagPolicyEvaluators = tagPolicyRepository == null ? null : tagPolicyRepository.getPolicyEvaluators(); + List resPolicyEvaluators = policyRepository.getPolicyEvaluators(); + + if (CollectionUtils.isNotEmpty(tagPolicyEvaluators)) { + List tags = RangerAccessRequestUtil.getRequestTagsFromContext(request.getContext()); + + if(CollectionUtils.isNotEmpty(tags)) { + for (RangerTag tag : tags) { + RangerAccessRequest tagEvalRequest = new RangerTagAccessRequest(tag, tagPolicyRepository.getServiceDef(), request); + + for (RangerPolicyEvaluator evaluator : tagPolicyEvaluators) { + evaluator.getResourceAccessInfo(tagEvalRequest, ret); + } + } + } + } + + if(CollectionUtils.isNotEmpty(resPolicyEvaluators)) { + for (RangerPolicyEvaluator evaluator : resPolicyEvaluators) { + evaluator.getResourceAccessInfo(request, ret); + } + } + + ret.getAllowedUsers().removeAll(ret.getDeniedUsers()); + ret.getAllowedGroups().removeAll(ret.getDeniedGroups()); + + if(LOG.isDebugEnabled()) { + LOG.debug("<== RangerPolicyEngineImpl.getResourceAccessInfo(" + request + "): " + ret); + } + + return ret; + } + protected RangerAccessResult isAccessAllowedNoAudit(RangerAccessRequest request) { if (LOG.isDebugEnabled()) { LOG.debug("==> RangerPolicyEngineImpl.isAccessAllowedNoAudit(" + request + ")"); @@ -513,7 +554,7 @@ public class RangerPolicyEngineImpl implements RangerPolicyEngine { LOG.debug("==> RangerPolicyEngineImpl.isAccessAllowedForTagPolicies(" + request + ", " + result + ")"); } - List evaluators = tagPolicyRepository.getPolicyEvaluators(); + List evaluators = tagPolicyRepository == null ? null : tagPolicyRepository.getPolicyEvaluators(); if (CollectionUtils.isNotEmpty(evaluators)) { List tags = RangerAccessRequestUtil.getRequestTagsFromContext(request.getContext()); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceAccessInfo.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceAccessInfo.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceAccessInfo.java new file mode 100644 index 0000000..44ec854 --- /dev/null +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceAccessInfo.java @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.ranger.plugin.policyengine; + +import java.util.HashSet; +import java.util.Set; + +public class RangerResourceAccessInfo { + final private RangerAccessRequest request; + final private Set allowedUsers; + final private Set allowedGroups; + final private Set deniedUsers; + final private Set deniedGroups; + + + public RangerResourceAccessInfo(RangerAccessRequest request) { + this.request = request; + this.allowedUsers = new HashSet(); + this.allowedGroups = new HashSet(); + this.deniedUsers = new HashSet(); + this.deniedGroups = new HashSet(); + } + + public RangerResourceAccessInfo(RangerResourceAccessInfo other) { + this.request = other.request; + this.allowedUsers = other.allowedUsers == null ? new HashSet() : new HashSet(other.allowedUsers); + this.allowedGroups = other.allowedGroups == null ? new HashSet() : new HashSet(other.allowedGroups); + this.deniedUsers = other.deniedUsers == null ? new HashSet() : new HashSet(other.deniedUsers); + this.deniedGroups = other.deniedGroups == null ? new HashSet() : new HashSet(other.deniedGroups); + } + + public RangerAccessRequest getRequest() { + return request; + } + + public Set getAllowedUsers() { + return allowedUsers; + } + + public Set getAllowedGroups() { + return allowedGroups; + } + + public Set getDeniedUsers() { + return deniedUsers; + } + + public Set getDeniedGroups() { + return deniedGroups; + } + + @Override + public String toString( ) { + StringBuilder sb = new StringBuilder(); + + toString(sb); + + return sb.toString(); + } + + public StringBuilder toString(StringBuilder sb) { + sb.append("RangerResourceAccessInfo={"); + + sb.append("request={"); + if(request != null) { + sb.append(request.toString()); + } + sb.append("} "); + + sb.append("allowedUsers={"); + for(String user : allowedUsers) { + sb.append(user).append(" "); + } + sb.append("} "); + + sb.append("allowedGroups={"); + for(String group : allowedGroups) { + sb.append(group).append(" "); + } + sb.append("} "); + + sb.append("deniedUsers={"); + for(String user : deniedUsers) { + sb.append(user).append(" "); + } + sb.append("} "); + + sb.append("deniedGroups={"); + for(String group : deniedGroups) { + sb.append(group).append(" "); + } + sb.append("} "); + + sb.append("}"); + + return sb; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java index 514884f..7a082dd 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyItemEvaluator.java @@ -21,6 +21,7 @@ package org.apache.ranger.plugin.policyevaluator; import java.util.Collections; import java.util.List; +import java.util.Set; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; @@ -31,6 +32,7 @@ import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem; import org.apache.ranger.plugin.model.RangerServiceDef; import org.apache.ranger.plugin.policyengine.RangerPolicyEngine; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineOptions; +import org.apache.ranger.plugin.policyengine.RangerResourceAccessInfo; public abstract class RangerAbstractPolicyItemEvaluator implements RangerPolicyItemEvaluator { http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java ---------------------------------------------------------------------- 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 2ce3a54..c48fb72 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 @@ -44,6 +44,7 @@ import org.apache.ranger.plugin.policyengine.RangerAccessResource; import org.apache.ranger.plugin.policyengine.RangerAccessResult; import org.apache.ranger.plugin.policyengine.RangerDataMaskResult; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineOptions; +import org.apache.ranger.plugin.policyengine.RangerResourceAccessInfo; import org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher; import org.apache.ranger.plugin.policyresourcematcher.RangerPolicyResourceMatcher; import org.apache.ranger.plugin.util.RangerPerfTracer; @@ -170,10 +171,8 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator } if (!result.getIsAccessDetermined()) { - // Attempt resource matching only if there may be a matchable policyItem if (hasMatchablePolicyItem(request)) { - // Try Match only if it was not attempted as part of evaluating Audit requirement if (!isResourceMatchAttempted) { isResourceMatch = isMatch(request.getResource()); @@ -357,6 +356,90 @@ public class RangerDefaultPolicyEvaluator extends RangerAbstractPolicyEvaluator return ret; } + @Override + public void getResourceAccessInfo(RangerAccessRequest request, RangerResourceAccessInfo result) { + if(LOG.isDebugEnabled()) { + LOG.debug("==> RangerDefaultPolicyEvaluator.getResourceAccessInfo(" + request + ", " + result + ")"); + } + + final boolean isResourceMatch = isMatch(request.getResource()); + final boolean attemptResourceHeadMatch = request.isAccessTypeAny() || request.getResourceMatchingScope() == RangerAccessRequest.ResourceMatchingScope.SELF_OR_DESCENDANTS; + final boolean isResourceHeadMatch = (!isResourceMatch && attemptResourceHeadMatch) ? matchResourceHead(request.getResource()) : false; + + if(isResourceMatch || isResourceHeadMatch) { + if (CollectionUtils.isNotEmpty(allowEvaluators)) { + Set users = new HashSet(); + Set groups = new HashSet(); + + getResourceAccessInfo(request, allowEvaluators, users, groups); + + if (CollectionUtils.isNotEmpty(allowExceptionEvaluators)) { + Set exceptionUsers = new HashSet(); + Set exceptionGroups = new HashSet(); + + getResourceAccessInfo(request, allowExceptionEvaluators, exceptionUsers, exceptionGroups); + + users.removeAll(exceptionUsers); + groups.removeAll(exceptionGroups); + } + + result.getAllowedUsers().addAll(users); + result.getAllowedGroups().addAll(groups); + } + } + + if(isResourceMatch) { + if(CollectionUtils.isNotEmpty(denyEvaluators)) { + Set users = new HashSet(); + Set groups = new HashSet(); + + getResourceAccessInfo(request, denyEvaluators, users, groups); + + if(CollectionUtils.isNotEmpty(denyExceptionEvaluators)) { + Set exceptionUsers = new HashSet(); + Set exceptionGroups = new HashSet(); + + getResourceAccessInfo(request, denyExceptionEvaluators, exceptionUsers, exceptionGroups); + + users.removeAll(exceptionUsers); + groups.removeAll(exceptionGroups); + } + + result.getDeniedUsers().addAll(users); + result.getDeniedGroups().addAll(groups); + } + } + + if(LOG.isDebugEnabled()) { + LOG.debug("<== RangerDefaultPolicyEvaluator.getResourceAccessInfo(" + request + ", " + result + ")"); + } + } + + + private void getResourceAccessInfo(RangerAccessRequest request, List policyItems, Set users, Set groups) { + if(LOG.isDebugEnabled()) { + LOG.debug("==> RangerDefaultPolicyEvaluator.getResourceAccessInfo(" + request + ", " + policyItems + ", " + users + ", " + groups + ")"); + } + + if (CollectionUtils.isNotEmpty(policyItems)) { + for (RangerPolicyItemEvaluator policyItemEvaluator : policyItems) { + if (policyItemEvaluator.matchAccessType(request.getAccessType()) && policyItemEvaluator.matchCustomConditions(request)) { + if (CollectionUtils.isNotEmpty(policyItemEvaluator.getPolicyItem().getUsers())) { + users.addAll(policyItemEvaluator.getPolicyItem().getUsers()); + } + + if (CollectionUtils.isNotEmpty(policyItemEvaluator.getPolicyItem().getGroups())) { + groups.addAll(policyItemEvaluator.getPolicyItem().getGroups()); + } + } + } + } + + if(LOG.isDebugEnabled()) { + LOG.debug("<== RangerDefaultPolicyEvaluator.getResourceAccessInfo(" + request + ", " + policyItems + ", " + users + ", " + groups + ")"); + } + } + protected boolean matchResourceHead(RangerAccessResource resource) { if(LOG.isDebugEnabled()) { http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java index 3c73082..25812a4 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java @@ -31,6 +31,8 @@ import org.apache.ranger.plugin.policyengine.RangerAccessResult; import org.apache.ranger.plugin.policyengine.RangerAccessResource; import org.apache.ranger.plugin.policyengine.RangerDataMaskResult; import org.apache.ranger.plugin.policyengine.RangerPolicyEngineOptions; +import org.apache.ranger.plugin.policyengine.RangerResourceAccessInfo; + public interface RangerPolicyEvaluator extends Comparable { public static final String EVALUATOR_TYPE_AUTO = "auto"; @@ -66,4 +68,6 @@ public interface RangerPolicyEvaluator extends Comparable boolean isAccessAllowed(RangerAccessResource resource, String user, Set userGroups, String accessType); boolean isAccessAllowed(Map resources, String user, Set userGroups, String accessType); + + void getResourceAccessInfo(RangerAccessRequest request, RangerResourceAccessInfo result); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java index 9ac2f93..53f6df6 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyItemEvaluator.java @@ -24,6 +24,8 @@ import java.util.Set; import org.apache.ranger.plugin.conditionevaluator.RangerConditionEvaluator; import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem; import org.apache.ranger.plugin.policyengine.RangerAccessRequest; +import org.apache.ranger.plugin.policyengine.RangerAccessResult; +import org.apache.ranger.plugin.policyengine.RangerResourceAccessInfo; public interface RangerPolicyItemEvaluator extends Comparable { public static final int POLICY_ITEM_TYPE_ALLOW = 0; http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java index be54d36..1ec88d5 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java @@ -182,6 +182,18 @@ public class RangerBasePlugin { return null; } + public RangerResourceAccessInfo getResourceAccessInfo(RangerAccessRequest request) { + RangerPolicyEngine policyEngine = this.policyEngine; + + if(policyEngine != null) { + policyEngine.preProcess(request); + + return policyEngine.getResourceAccessInfo(request); + } + + return null; + } + public RangerAccessResult createAccessResult(RangerAccessRequest request) { RangerPolicyEngine policyEngine = this.policyEngine; http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java ---------------------------------------------------------------------- diff --git a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java index cd81836..05cbcde 100644 --- a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java +++ b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java @@ -181,6 +181,13 @@ public class TestPolicyEngine { } @Test + public void testPolicyEngine_resourceAccessInfo() { + String[] conditionsTestResourceFiles = { "/policyengine/test_policyengine_resource_access_info.json" }; + + runTestsFromResourceFiles(conditionsTestResourceFiles); + } + + @Test public void testPolicyEngine_geo() { String[] conditionsTestResourceFiles = { "/policyengine/test_policyengine_geo.json" }; @@ -238,7 +245,6 @@ public class TestPolicyEngine { RangerAccessRequest request = null; for(TestData test : testCase.tests) { - if (test.request.getContext().containsKey(RangerAccessRequestUtil.KEY_CONTEXT_TAGS) || test.request.getContext().containsKey(RangerAccessRequestUtil.KEY_CONTEXT_REQUESTED_RESOURCES)) { // Create a new AccessRequest @@ -332,6 +338,17 @@ public class TestPolicyEngine { assertEquals("maskedValue mismatched! - " + test.name, expected.getMaskedValue(), result.getMaskedValue()); assertEquals("policyId mismatched! - " + test.name, expected.getPolicyId(), result.getPolicyId()); } + + if(test.resourceAccessInfo != null) { + RangerResourceAccessInfo expected = new RangerResourceAccessInfo(test.resourceAccessInfo); + RangerResourceAccessInfo result = policyEngine.getResourceAccessInfo(test.request); + + assertNotNull("result was null! - " + test.name, result); + assertEquals("allowedUsers mismatched! - " + test.name, expected.getAllowedUsers(), result.getAllowedUsers()); + assertEquals("allowedGroups mismatched! - " + test.name, expected.getAllowedGroups(), result.getAllowedGroups()); + assertEquals("deniedUsers mismatched! - " + test.name, expected.getDeniedUsers(), result.getDeniedUsers()); + assertEquals("deniedGroups mismatched! - " + test.name, expected.getDeniedGroups(), result.getDeniedGroups()); + } } } @@ -339,7 +356,7 @@ public class TestPolicyEngine { public String serviceName; public RangerServiceDef serviceDef; public List policies; - public TagPolicyInfo tagPolicyInfo; + public TagPolicyInfo tagPolicyInfo; public List tests; class TestData { @@ -347,6 +364,7 @@ public class TestPolicyEngine { public RangerAccessRequest request; public RangerAccessResult result; public RangerDataMaskResult dataMaskResult; + public RangerResourceAccessInfo resourceAccessInfo; } class TagPolicyInfo { http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/e5ca0fe5/agents-common/src/test/resources/policyengine/test_policyengine_resource_access_info.json ---------------------------------------------------------------------- diff --git a/agents-common/src/test/resources/policyengine/test_policyengine_resource_access_info.json b/agents-common/src/test/resources/policyengine/test_policyengine_resource_access_info.json new file mode 100644 index 0000000..04d5236 --- /dev/null +++ b/agents-common/src/test/resources/policyengine/test_policyengine_resource_access_info.json @@ -0,0 +1,106 @@ +{ + "serviceName":"hivedev", + + "serviceDef":{ + "name":"hive", + "id":3, + "resources":[ + {"name":"database","level":1,"mandatory":true,"lookupSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true, "ignoreCase":true},"label":"Hive Database","description":"Hive Database"}, + {"name":"table","level":2,"parent":"database","mandatory":true,"lookupSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true, "ignoreCase":true},"label":"Hive Table","description":"Hive Table"}, + {"name":"udf","level":2,"parent":"database","mandatory":true,"lookupSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true, "ignoreCase":true},"label":"Hive UDF","description":"Hive UDF"}, + {"name":"column","level":3,"parent":"table","mandatory":true,"lookupSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true, "ignoreCase":true},"label":"Hive Column","description":"Hive Column"} + ], + "accessTypes":[ + {"name":"select","label":"Select"}, + {"name":"update","label":"Update"}, + {"name":"create","label":"Create"}, + {"name":"drop","label":"Drop"}, + {"name":"alter","label":"Alter"}, + {"name":"index","label":"Index"}, + {"name":"lock","label":"Lock"}, + {"name":"all","label":"All"} + ], + "options": { + "enableDenyAndExceptionsInPolicies":"true" + } + }, + + "policies":[ + {"id":1,"name":"db=default: audit-all-access","isEnabled":true,"isAuditEnabled":true, + "resources":{"database":{"values":["default"]},"table":{"values":["*"]},"column":{"values":["*"]}}, + "policyItems":[ + {"accesses":[],"users":[],"groups":["public"],"delegateAdmin":false} + ] + } + , + {"id":2,"name":"db=default; table=test*; column=*","isEnabled":true,"isAuditEnabled":true, + "resources":{"database":{"values":["default"]},"table":{"values":["test*"]},"column":{"values":["*"]}}, + "policyItems":[ + {"accesses":[{"type":"select","isAllowed":true}],"users":["user1","user2"],"groups":["group1","group2"],"delegateAdmin":false} + , + {"accesses":[{"type":"create","isAllowed":true},{"type":"drop","isAllowed":true}],"users":["admin"],"groups":["admin"],"delegateAdmin":true} + ] + } + , + {"id":3,"name":"db=db1; table=tbl*; column=*","isEnabled":true,"isAuditEnabled":true, + "resources":{"database":{"values":["db1"]},"table":{"values":["tbl*"]},"column":{"values":["*"]}}, + "policyItems":[ + {"accesses":[{"type":"select","isAllowed":true}],"users":["user1","user2"],"groups":["group1","group2"],"delegateAdmin":false} + ], + "denyPolicyItems":[ + {"accesses":[{"type":"select","isAllowed":true}],"users":["user3"],"groups":["group3"],"delegateAdmin":false} + ] + } + ], + + "tests":[ + {"name":"use default;", + "request":{ + "resource":{"elements":{"database":"default"}}, + "accessType":"","requestData":"use default" + }, + "resourceAccessInfo":{"allowedUsers":["admin", "user1", "user2"],"allowedGroups":["admin", "group1", "group2"]} + } + , + {"name":"select default.testtbl1", + "request":{ + "resource":{"elements":{"database":"default", "table":"testtbl1"}}, + "accessType":"select","requestData":"select default.testtbl1" + }, + "resourceAccessInfo":{"allowedUsers":["user1", "user2"],"allowedGroups":["group1", "group2"]} + } + , + {"name":"create default.testtbl1", + "request":{ + "resource":{"elements":{"database":"default", "table":"testtbl1"}}, + "accessType":"create","requestData":"create default.testtbl1" + }, + "resourceAccessInfo":{"allowedUsers":["admin"],"allowedGroups":["admin"]} + } + , + {"name":"select db1.tbl1", + "request":{ + "resource":{"elements":{"database":"db1", "table":"tbl1"}}, + "accessType":"select","requestData":"select db1.tbl1" + }, + "resourceAccessInfo":{"allowedUsers":["user1", "user2"],"allowedGroups":["group1", "group2"],"deniedUsers":["user3"],"deniedGroups":["group3"]} + } + , + {"name":"insert db1.tbl1", + "request":{ + "resource":{"elements":{"database":"db1", "table":"tb1"}}, + "accessType":"insert","requestData":"insert db1.tbl1" + }, + "resourceAccessInfo":{"allowedUsers":[],"allowedGroups":[]} + } + , + {"name":"select db2.tbl1", + "request":{ + "resource":{"elements":{"database":"db2", "table":"tb1"}}, + "accessType":"create","requestData":"select db2.tbl1" + }, + "resourceAccessInfo":{"allowedUsers":[],"allowedGroups":[]} + } + ] +} +