This is an automated email from the ASF dual-hosted git repository.

madhan 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 daeda7a  RANGER-785: updated Ranger plugin to support the notion of 
super-users and super-groups
daeda7a is described below

commit daeda7ab8aefcfdbe5869ff7c5852fe1ee351635
Author: Madhan Neethiraj <[email protected]>
AuthorDate: Tue Mar 31 18:43:38 2020 -0700

    RANGER-785: updated Ranger plugin to support the notion of super-users and 
super-groups
---
 .../plugin/policyengine/RangerPolicyEngine.java    |  10 +-
 .../policyengine/RangerPolicyEngineImpl.java       |  70 +++++++-
 .../ranger/plugin/service/RangerBasePlugin.java    |  17 +-
 .../plugin/policyengine/TestPolicyEngine.java      |  16 +-
 .../test_policyengine_super_user_groups.json       | 182 +++++++++++++++++++++
 5 files changed, 281 insertions(+), 14 deletions(-)

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 4602903..c673169 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
@@ -38,9 +38,11 @@ public interface RangerPolicyEngine {
        String AUDIT_NONE     = "audit-none";
        String AUDIT_DEFAULT  = "audit-default";
 
-       String PLUGIN_AUDIT_EXCLUDE_USERS = "ranger.plugin.audit.exclude.users";
+       String PLUGIN_AUDIT_EXCLUDE_USERS  = 
"ranger.plugin.audit.exclude.users";
        String PLUGIN_AUDIT_EXCLUDE_GROUPS = 
"ranger.plugin.audit.exclude.groups";
-       String PLUGIN_AUDIT_EXCLUDE_ROLES = "ranger.plugin.audit.exclude.roles";
+       String PLUGIN_AUDIT_EXCLUDE_ROLES  = 
"ranger.plugin.audit.exclude.roles";
+       String PLUGIN_SUPER_USERS          = "ranger.plugin.super.users";
+       String PLUGIN_SUPER_GROUPS         = "ranger.plugin.super.groups";
 
        String USER_CURRENT   = "{" + RangerAccessRequestUtil.KEY_USER + "}";
        String RESOURCE_OWNER = "{OWNER}";
@@ -49,6 +51,10 @@ public interface RangerPolicyEngine {
 
        void setTrustedProxyAddresses(String[] trustedProxyAddresses);
 
+       void setSuperUsersAndGroups(Set<String> users, Set<String> groups);
+
+       boolean isSuperUser(String userName, Set<String> userGroups);
+
        RangerServiceDef getServiceDef();
 
        long getPolicyVersion();
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 fefa465..c68e22d 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
@@ -24,6 +24,7 @@ import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ranger.authorization.utils.StringUtil;
 import org.apache.ranger.plugin.contextenricher.RangerTagForEval;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerServiceDef;
@@ -39,6 +40,7 @@ import org.apache.ranger.plugin.util.ServicePolicies;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -57,6 +59,11 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
 
        private final PolicyEngine                 policyEngine;
        private final RangerAccessRequestProcessor requestProcessor;
+       private final Set<String>                  svcCfgSuperUsers;
+       private final Set<String>                  svcCfgSuperGroups;
+       private       Set<String>                  superUsers;
+       private       Set<String>                  superGroups;
+       private       boolean                      isEmptySupers = true;
 
 
        static public RangerPolicyEngine getPolicyEngine(final 
RangerPolicyEngineImpl other, final ServicePolicies servicePolicies) {
@@ -66,7 +73,7 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
                        PolicyEngine policyEngine = 
other.policyEngine.cloneWithDelta(servicePolicies);
 
                        if (policyEngine != null) {
-                               ret = new RangerPolicyEngineImpl(policyEngine);
+                               ret = new RangerPolicyEngineImpl(policyEngine, 
other);
                        }
                }
 
@@ -74,11 +81,29 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
        }
 
        public RangerPolicyEngineImpl(ServicePolicies servicePolicies, 
RangerPluginContext pluginContext, RangerRoles roles) {
+               this(servicePolicies, pluginContext, roles, null, null);
+       }
+
+       public RangerPolicyEngineImpl(ServicePolicies servicePolicies, 
RangerPluginContext pluginContext, RangerRoles roles, Set<String> superUsers, 
Set<String> superGroups) {
                policyEngine = new PolicyEngine(servicePolicies, pluginContext, 
roles);
 
                
policyEngine.getPluginContext().getAuthContext().setRoles(roles);
 
                requestProcessor = new 
RangerDefaultRequestProcessor(policyEngine);
+
+               Map<String, String> svcConfig      = 
servicePolicies.getServiceConfig();
+               String              cfgSuperUsers  = null;
+               String              cfgSuperGroups = null;
+
+               if (svcConfig != null) {
+                       cfgSuperUsers  = 
svcConfig.get(RangerPolicyEngine.PLUGIN_SUPER_USERS);
+                       cfgSuperGroups = 
svcConfig.get(RangerPolicyEngine.PLUGIN_SUPER_GROUPS);
+               }
+
+               svcCfgSuperUsers  = StringUtils.isNotBlank(cfgSuperUsers) ? 
StringUtil.toSet(cfgSuperUsers) : Collections.emptySet();
+               svcCfgSuperGroups = StringUtils.isNotBlank(cfgSuperGroups) ? 
StringUtil.toSet(cfgSuperGroups) : Collections.emptySet();
+
+               setSuperUsersAndGroups(superUsers, superGroups);
        }
 
        @Override
@@ -472,6 +497,21 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
        }
 
        @Override
+       public void setSuperUsersAndGroups(Set<String> users, Set<String> 
groups) {
+               this.superUsers    = users == null ? Collections.emptySet() : 
users;
+               this.superGroups   = groups == null ? Collections.emptySet() : 
groups;
+               this.isEmptySupers = CollectionUtils.isEmpty(superUsers) && 
CollectionUtils.isEmpty(svcCfgSuperUsers) &&
+                                    CollectionUtils.isEmpty(superGroups) && 
CollectionUtils.isEmpty(svcCfgSuperGroups);
+       }
+
+       @Override
+       public boolean isSuperUser(String userName, Set<String> userGroups) {
+               return !isEmptySupers && (superUsers.contains(userName) || 
svcCfgSuperUsers.contains(userName) ||
+                                         
CollectionUtils.containsAny(superGroups, userGroups) ||
+                                         
CollectionUtils.containsAny(svcCfgSuperGroups, userGroups));
+       }
+
+       @Override
        public RangerServiceDef getServiceDef() {
                return policyEngine.getServiceDef();
        }
@@ -533,9 +573,13 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
                }
        }
 
-       private RangerPolicyEngineImpl(final PolicyEngine policyEngine) {
-               this.policyEngine     = policyEngine;
-               this.requestProcessor = new 
RangerDefaultRequestProcessor(policyEngine);
+       private RangerPolicyEngineImpl(final PolicyEngine policyEngine, 
RangerPolicyEngineImpl other) {
+               this.policyEngine      = policyEngine;
+               this.requestProcessor  = new 
RangerDefaultRequestProcessor(policyEngine);
+               this.svcCfgSuperUsers  = new HashSet<>(other.svcCfgSuperUsers);
+               this.svcCfgSuperGroups = new HashSet<>(other.svcCfgSuperGroups);
+               this.superUsers        = new HashSet<>(other.superUsers);
+               this.superGroups       = new HashSet<>(other.superGroups);
        }
 
        private RangerAccessResult 
zoneAwareAccessEvaluationWithNoAudit(RangerAccessRequest request, int 
policyType) {
@@ -578,8 +622,18 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
                        LOG.debug("==> 
RangerPolicyEngineImpl.evaluatePoliciesNoAudit(" + request + ", policyType =" + 
policyType + ", zoneName=" + zoneName + ")");
                }
 
-               Date               accessTime = request.getAccessTime() != null 
? request.getAccessTime() : new Date();
-               RangerAccessResult ret        = 
policyEngine.createAccessResult(request, policyType);
+               final Date               accessTime  = request.getAccessTime() 
!= null ? request.getAccessTime() : new Date();
+               final RangerAccessResult ret         = 
policyEngine.createAccessResult(request, policyType);
+               final boolean            isSuperUser = 
isSuperUser(request.getUser(), request.getUserGroups());
+
+               // for superusers, set access as allowed
+               if (isSuperUser) {
+                       ret.setIsAllowed(true);
+                       ret.setIsAccessDetermined(true);
+                       ret.setPolicyId(-1);
+                       ret.setPolicyPriority(Integer.MAX_VALUE);
+                       ret.setReason("superuser");
+               }
 
                evaluateTagPolicies(request, policyType, zoneName, 
tagPolicyRepository, ret);
 
@@ -601,7 +655,9 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
                        boolean findAuditByResource = 
!ret.getIsAuditedDetermined();
                        boolean foundInCache        = findAuditByResource && 
policyRepository.setAuditEnabledFromCache(request, ret);
 
-                       ret.setIsAccessDetermined(false); // discard result by 
tag-policies, to evaluate resource policies for possible override
+                       if (!isSuperUser) {
+                               ret.setIsAccessDetermined(false); // discard 
result by tag-policies, to evaluate resource policies for possible override
+                       }
 
                        List<RangerPolicyEvaluator> evaluators = 
policyRepository.getLikelyMatchPolicyEvaluators(request.getResource(), 
policyType);
 
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 32fbb06..b5e18ba 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
@@ -67,6 +67,8 @@ public class RangerBasePlugin {
        private       RangerAuthContext           currentAuthContext;
        private       RangerAccessResultProcessor resultProcessor;
        private       RangerRoles                 roles;
+       private       Set<String>                 superUsers  = 
Collections.emptySet();
+       private       Set<String>                 superGroups = 
Collections.emptySet();
 
 
        public RangerBasePlugin(String serviceType, String appId) {
@@ -128,6 +130,17 @@ public class RangerBasePlugin {
                pluginContext.notifyAuthContextChanged();
        }
 
+       public void setSuperUsersAndGroups(Set<String> users, Set<String> 
groups) {
+               this.superUsers  = users == null ? Collections.emptySet() : 
users;
+               this.superGroups = groups == null ? Collections.emptySet() : 
groups;
+
+               RangerPolicyEngine policyEngine = this.policyEngine;
+
+               if (policyEngine != null) {
+                       policyEngine.setSuperUsersAndGroups(this.superUsers, 
this.superGroups);
+               }
+       }
+
        public RangerServiceDef getServiceDef() {
                RangerPolicyEngine policyEngine = this.policyEngine;
 
@@ -217,7 +230,7 @@ public class RangerBasePlugin {
                                                LOG.debug("Creating engine from 
policies");
                                        }
 
-                                       newPolicyEngine = new 
RangerPolicyEngineImpl(policies, pluginContext, roles);
+                                       newPolicyEngine = new 
RangerPolicyEngineImpl(policies, pluginContext, roles, superUsers, superGroups);
                                } else {
                                        if (LOG.isDebugEnabled()) {
                                                LOG.debug("policy-deltas are 
not null");
@@ -246,7 +259,7 @@ public class RangerBasePlugin {
                                                                
LOG.debug("Creating new engine from servicePolicies:[" + servicePolicies + "]");
                                                        }
 
-                                                       newPolicyEngine = new 
RangerPolicyEngineImpl(servicePolicies, pluginContext, roles);
+                                                       newPolicyEngine = new 
RangerPolicyEngineImpl(servicePolicies, pluginContext, roles, superUsers, 
superGroups);
                                                }
                                        } else {
                                                if (LOG.isDebugEnabled()) {
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 4265b06..8811f2a 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
@@ -401,6 +401,13 @@ public class TestPolicyEngine {
                runTestsFromResourceFiles(conditionsTestResourceFiles);
        }
 
+       @Test
+       public void testPolicyEngine_superUserGroups() {
+               String[] resourceFiles = 
{"/policyengine/test_policyengine_super_user_groups.json"};
+
+               runTestsFromResourceFiles(resourceFiles);
+       }
+
        private void runTestsFromResourceFiles(String[] resourceNames) {
                for(String resourceName : resourceNames) {
                        InputStream inStream = 
this.getClass().getResourceAsStream(resourceName);
@@ -421,6 +428,7 @@ public class TestPolicyEngine {
                servicePolicies.setServiceDef(testCase.serviceDef);
                servicePolicies.setPolicies(testCase.policies);
                servicePolicies.setSecurityZones(testCase.securityZones);
+               servicePolicies.setServiceConfig(testCase.serviceConfig);
 
                if (StringUtils.isNotBlank(testCase.auditMode)) {
                        servicePolicies.setAuditMode(testCase.auditMode);
@@ -486,14 +494,14 @@ public class TestPolicyEngine {
 
         policyEngineOptions.disableAccessEvaluationWithPolicyACLSummary = true;
 
-        RangerPolicyEngineImpl policyEngine = new 
RangerPolicyEngineImpl(servicePolicies, pluginContext, roles);
+        RangerPolicyEngineImpl policyEngine = new 
RangerPolicyEngineImpl(servicePolicies, pluginContext, roles, 
testCase.superUsers, testCase.superGroups);
 
         policyEngine.setUseForwardedIPAddress(useForwardedIPAddress);
         policyEngine.setTrustedProxyAddresses(trustedProxyAddresses);
 
         policyEngineOptions.disableAccessEvaluationWithPolicyACLSummary = 
false;
 
-               RangerPolicyEngineImpl policyEngineForEvaluatingWithACLs = new 
RangerPolicyEngineImpl(servicePolicies, pluginContext, roles);
+               RangerPolicyEngineImpl policyEngineForEvaluatingWithACLs = new 
RangerPolicyEngineImpl(servicePolicies, pluginContext, roles, 
testCase.superUsers, testCase.superGroups);
 
                
policyEngineForEvaluatingWithACLs.setUseForwardedIPAddress(useForwardedIPAddress);
                
policyEngineForEvaluatingWithACLs.setTrustedProxyAddresses(trustedProxyAddresses);
@@ -666,9 +674,11 @@ public class TestPolicyEngine {
                public Map<String, Set<String>> groupRoles;
                public String             auditMode;
                public List<TestData>     tests;
-
+               public Map<String, String> serviceConfig;
                public UpdatedPolicies    updatedPolicies;
                public List<TestData>     updatedTests;
+               public Set<String>        superUsers;
+               public Set<String>        superGroups;
                
                class TestData {
                        public String              name;
diff --git 
a/agents-common/src/test/resources/policyengine/test_policyengine_super_user_groups.json
 
b/agents-common/src/test/resources/policyengine/test_policyengine_super_user_groups.json
new file mode 100644
index 0000000..c16d5f4
--- /dev/null
+++ 
b/agents-common/src/test/resources/policyengine/test_policyengine_super_user_groups.json
@@ -0,0 +1,182 @@
+{
+  "serviceName":"hivedev",
+
+  "original-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":"url","level":1,"mandatory":true,"lookupSupported":false,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true,
 "ignoreCase":true},"label":"URL","description":"URL"},
+      
{"name":"hiveservice","level":1,"mandatory":true,"lookupSupported":false,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true,
 "ignoreCase":true},"label":"HiveService","description":"HiveService"},
+      
{"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":"read","label":"Read"},
+      {"name":"write","label":"Write"},
+      {"name":"repladmin","label":"ReplAdmin"},
+      {"name":"serviceadmin","label":"ServiceAdmin"},
+      {"name":"all","label":"All",
+        "impliedGrants": ["select", "update", "create", "drop", "alter", 
"index", "lock", "read", "write", "repladmin", "serviceadmin"]
+      }
+    ]
+  },
+
+  "serviceDef": {
+    "id":3,
+    "name": "hive",
+    "implClass": "org.apache.ranger.services.hive.RangerServiceHive",
+    "label": "Hive Server2",
+    "description": "Hive Server2",
+    "guid": "3e1afb5a-184a-4e82-9d9c-87a5cacc243c",
+
+    "resources": [
+      {"itemId": 1, "name": "database", "type": "string", "level": 10, 
"parent": "", "mandatory": true, "lookupSupported": true, "recursiveSupported": 
false, "excludesSupported": true, "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher", 
"matcherOptions": { "wildCard":true, "ignoreCase":true }, "validationRegEx":"", 
"validationMessage": "", "uiHint":"", "label": "Hive Database", "description": 
"Hive Database", "isValidLeaf": true},
+      {"itemId": 2, "name": "table", "type": "string", "level": 20, "parent": 
"database", "mandatory": true, "lookupSupported": true, "recursiveSupported": 
false, "excludesSupported": true, "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher", 
"matcherOptions": { "wildCard":true, "ignoreCase":true }, "validationRegEx":"", 
"validationMessage": "", "uiHint":"", "label": "Hive Table", "description": 
"Hive Table", "isValidLeaf": true},
+      {"itemId": 3, "name": "udf", "type": "string", "level": 20, "parent": 
"database", "mandatory": true, "lookupSupported": true, "recursiveSupported": 
false, "excludesSupported": true, "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher", 
"matcherOptions": { "wildCard":true, "ignoreCase":true }, "validationRegEx":"", 
"validationMessage": "", "uiHint":"", "label": "Hive UDF", "description": "Hive 
UDF", "isValidLeaf": true},
+      {"itemId": 4, "name": "column", "type": "string", "level": 30, "parent": 
"table", "mandatory": true, "lookupSupported": true, "recursiveSupported": 
false, "excludesSupported": true, "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher", 
"matcherOptions": { "wildCard":true, "ignoreCase":true }, "validationRegEx":"", 
"validationMessage": "", "uiHint":"", "label": "Hive Column", "description": 
"Hive Column", "isValidLeaf": true},
+      {"itemId": 5, "name": "url", "type": "string", "level": 10, "parent": 
"", "mandatory": true, "lookupSupported": false, "recursiveSupported": true, 
"excludesSupported": false, "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerPathResourceMatcher", 
"matcherOptions": { "wildCard":true, "ignoreCase":false }, 
"validationRegEx":"", "validationMessage": "", "uiHint":"", "label": "URL", 
"description": "URL", "isValidLeaf": true}
+    ],
+
+    "accessTypes": [
+      {"itemId": 1, "name": "select", "label": "select"},
+      {"itemId": 2, "name": "update", "label": "update"},
+      {"itemId": 3, "name": "create", "label": "Create"},
+      {"itemId": 4, "name": "drop", "label": "Drop"},
+      {"itemId": 5, "name": "alter", "label": "Alter"},
+      {"itemId": 6, "name": "index", "label": "Index"},
+      {"itemId": 7, "name": "lock", "label": "Lock"},
+      {"itemId": 8, "name": "all", "label": "All",
+        "impliedGrants": ["select", "update", "create", "drop", "alter", 
"index", "lock", "read", "write"]},
+      {"itemId": 9, "name": "read", "label": "Read"},
+      {"itemId": 10, "name": "write", "label": "Write"}
+    ],
+
+    "configs": [
+      {"itemId": 1, "name": "username", "type": "string", "mandatory": true, 
"validationRegEx":"", "validationMessage": "", "uiHint":"", "label": 
"Username"},
+      {"itemId": 2, "name": "password", "type": "password", "mandatory": true, 
"validationRegEx":"", "validationMessage": "", "uiHint":"", "label": 
"Password"},
+      {"itemId": 3, "name": "jdbc.driverClassName", "type": "string", 
"mandatory": true, "validationRegEx":"", "validationMessage": "", "uiHint":"", 
"defaultValue": "org.apache.hive.jdbc.HiveDriver"},
+      {"itemId": 4, "name": "jdbc.url", "type": "string", "mandatory": true, 
"defaultValue": "", "validationRegEx":"", "validationMessage": "", "uiHint":""},
+      {"itemId": 5, "name": "commonNameForCertificate", "type": "string", 
"mandatory": false, "validationRegEx":"", "validationMessage": "", "uiHint":"", 
"label": "Common Name for Certificate"}
+    ],
+
+    "enums": [
+    ],
+
+    "contextEnrichers": [
+    ],
+
+    "policyConditions": [
+    ]
+  },
+
+  "serviceConfig": {
+    "ranger.plugin.super.users": "svc-cfg-su1, svc-cfg-su2",
+    "ranger.plugin.super.groups": "svc-cfg-sg1, svc-cfg-sg2"
+  },
+
+  "policies":[
+    {"id":1,"name":"database=db-*,table=*,column=* - 
audit-all-access","isEnabled":true,"isAuditEnabled":true,
+     
"resources":{"database":{"values":["db-*"]},"table":{"values":["*"]},"column":{"values":["*"]}},
+     "policyItems":[
+     ],
+     "denyPolicyItems":[
+       
{"accesses":[{"type":"create","isAllowed":true}],"users":["hive1","hive2"],"groups":["hadoop","hive"],"delegateAdmin":false}
+     ]
+    }
+  ],
+
+  "superUsers": [ "su1", "su2" ],
+  "superGroups": [ "sg1", "sg2" ],
+
+  "tests":[
+    {"name":"ALLOW 'create db-1;' for su1",
+      "request":{
+        "resource":{"elements":{"database":"db-1"}},
+        
"accessType":"create","user":"su1","userGroups":[""],"requestData":"create db-1 
for su1"
+      },
+      "result":{"isAudited":true,"isAllowed":true,"policyId":-1}
+    }
+    ,
+    {"name":"ALLOW 'create db-2;' for su2",
+      "request":{
+        "resource":{"elements":{"database":"db-2"}},
+        
"accessType":"create","user":"su2","userGroups":[""],"requestData":"create db-2 
for su2"
+      },
+      "result":{"isAudited":true,"isAllowed":true,"policyId":-1}
+    }
+  ,
+    {"name":"ALLOW 'create db-1;' for svc-cfg-su1",
+      "request":{
+        "resource":{"elements":{"database":"db-1"}},
+        
"accessType":"create","user":"svc-cfg-su1","userGroups":[""],"requestData":"create
 db-1 for svc-cfg-su1"
+      },
+      "result":{"isAudited":true,"isAllowed":true,"policyId":-1}
+    }
+  ,
+    {"name":"ALLOW 'create db-2;' for svc-cfg-su2",
+      "request":{
+        "resource":{"elements":{"database":"db-2"}},
+        
"accessType":"create","user":"svc-cfg-su2","userGroups":[""],"requestData":"create
 db-2 for svc-cfg-su2"
+      },
+      "result":{"isAudited":true,"isAllowed":true,"policyId":-1}
+    }
+  ,
+    {"name":"ALLOW 'create db-1.tbl-1;' for user1 (in sg1)",
+      "request":{
+        "resource":{"elements":{"database":"db-1", "table":"tbl-1"}},
+        
"accessType":"create","user":"user1","userGroups":["sg1"],"requestData":"create 
db-1.tbl-1;' for user1 (in sg1)"
+      },
+      "result":{"isAudited":true,"isAllowed":true,"policyId":-1}
+    }
+  ,
+    {"name":"ALLOW 'create db-1.tbl-2;' for user2 (in sg2)",
+      "request":{
+        "resource":{"elements":{"database":"db-1", "table":"tbl-2"}},
+        
"accessType":"create","user":"user2","userGroups":["sg2"],"requestData":"create 
db-1.tbl-2;' for user2 (in sg2)"
+      },
+      "result":{"isAudited":true,"isAllowed":true,"policyId":-1}
+    }
+  ,
+    {"name":"ALLOW 'create db-1.tbl-1;' for user1 (in svc-cfg-sg1)",
+      "request":{
+        "resource":{"elements":{"database":"db-1", "table":"tbl-1"}},
+        
"accessType":"create","user":"user1","userGroups":["svc-cfg-sg1"],"requestData":"create
 db-1.tbl-1;' for user1 (in svc-cfg-sg1)"
+      },
+      "result":{"isAudited":true,"isAllowed":true,"policyId":-1}
+    }
+  ,
+    {"name":"ALLOW 'create db-1.tbl-2;' for user2 (in svc-cfg-sg2)",
+      "request":{
+        "resource":{"elements":{"database":"db-1", "table":"tbl-2"}},
+        
"accessType":"create","user":"user2","userGroups":["svc-cfg-sg2"],"requestData":"create
 db-1.tbl-2;' for user2 (in svc-cfg-sg2)"
+      },
+      "result":{"isAudited":true,"isAllowed":true,"policyId":-1}
+    }
+  ,
+    {"name":"DENY 'create db-1.tbl-3;' for user3",
+      "request":{
+        "resource":{"elements":{"database":"db-1", "table":"tbl-3"}},
+        
"accessType":"create","user":"user3","userGroups":["users"],"requestData":"create
 db-1.tbl-3;' for user3"
+      },
+      "result":{"isAudited":true,"isAllowed":false,"policyId":-1}
+    }
+  ,
+    {"name":"ALLOW 'create testdb;' for su1; no audit",
+      "request":{
+        "resource":{"elements":{"database":"testdb"}},
+        
"accessType":"create","user":"su1","userGroups":[""],"requestData":"create db-1 
for su1"
+      },
+      "result":{"isAudited":false,"isAllowed":true,"policyId":-1}
+    }
+  ]
+}
+

Reply via email to