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 618ebd3  RANGER-2642: Grant/Revoke REST invocations by non-service 
users should not specify resource owner
618ebd3 is described below

commit 618ebd3a9ce93bf348ff48b7c9a687c274d9556c
Author: Abhay Kulkarni <[email protected]>
AuthorDate: Fri Nov 15 07:32:21 2019 -0800

    RANGER-2642: Grant/Revoke REST invocations by non-service users should not 
specify resource owner
---
 .../java/org/apache/ranger/biz/RangerBizUtil.java  |  17 ++-
 .../java/org/apache/ranger/biz/ServiceDBStore.java |   2 +-
 .../java/org/apache/ranger/rest/ServiceREST.java   | 136 +++++++++++----------
 3 files changed, 84 insertions(+), 71 deletions(-)

diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java 
b/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
index 6cd8634..3761ef2 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
@@ -62,6 +62,7 @@ import org.apache.ranger.entity.XXUser;
 import org.apache.ranger.plugin.model.RangerBaseModelObject;
 import org.apache.ranger.plugin.model.RangerService;
 import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
+import org.apache.ranger.rest.ServiceREST;
 import org.apache.ranger.view.VXPortalUser;
 import org.apache.ranger.view.VXResource;
 import org.apache.ranger.view.VXResponse;
@@ -1406,12 +1407,18 @@ public class RangerBizUtil {
                return false;
        }
 
-       public boolean isUserAllowedForGrantRevoke(RangerService rangerService,
-                       String cfgNameAllowedUsers, String userName) {
+       public boolean isUserAllowedForGrantRevoke(RangerService rangerService, 
String userName) {
+               return isUserInConfigParameter(rangerService, 
ServiceREST.Allowed_User_List_For_Grant_Revoke, userName);
+       }
+       public boolean isUserServiceAdmin(RangerService rangerService, String 
userName) {
+               return isUserInConfigParameter(rangerService, 
ServiceDBStore.SERVICE_ADMIN_USERS, userName);
+       }
+
+       public boolean isUserInConfigParameter(RangerService rangerService, 
String configParamName, String userName) {
                Map<String, String> map = rangerService.getConfigs();
 
-               if (map != null && map.containsKey(cfgNameAllowedUsers)) {
-                       String userNames = map.get(cfgNameAllowedUsers);
+               if (map != null && map.containsKey(configParamName)) {
+                       String userNames = map.get(configParamName);
                        String[] userList = userNames.split(",");
                        if (userList != null) {
                                for (String u : userList) {
@@ -1422,7 +1429,7 @@ public class RangerBizUtil {
                        }
                }
                return false;
-       }       
+       }
 
         public void blockAuditorRoleUser() {
                 UserSessionBase session = ContextUtil.getCurrentUserSession();
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index 333672d..85289dd 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -229,7 +229,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 
     private static final String SERVICE_CHECK_USER = "service.check.user";
     private static final String AMBARI_SERVICE_CHECK_USER = 
"ambari.service.check.user";
-       private static final String SERVICE_ADMIN_USERS     = 
"service.admin.users";
+       public static final String SERVICE_ADMIN_USERS     = 
"service.admin.users";
 
        private static boolean isRolesDownloadedByService = false;
 
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 20849f6..54c9ee3 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
@@ -1259,21 +1259,23 @@ public class ServiceREST {
                                                perf = 
RangerPerfTracer.getPerfTracer(PERF_LOG, "ServiceREST.grantAccess(serviceName=" 
+ serviceName + ")");
                                        }
 
-                                       
validateGrantRevokeRequest(grantRequest);
+                                       // This is an open API - dont care 
about who calls it. Caller is treated as privileged user
+                                       boolean hasAdminPrivilege = true;
+                                       String loggedInUser = null;
+                                       
validateGrantRevokeRequest(grantRequest, hasAdminPrivilege, loggedInUser);
+
                                        String               userName   = 
grantRequest.getGrantor();
                                        Set<String>          userGroups = 
CollectionUtils.isNotEmpty(grantRequest.getGrantorGroups()) ? 
grantRequest.getGrantorGroups() : userMgr.getGroupsForUser(userName);
                                        String                           
ownerUser  = grantRequest.getOwnerUser();
                                        RangerAccessResource resource   = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(grantRequest.getResource()),
 ownerUser);
-                                        VXUser vxUser = 
xUserService.getXUserByUserName(userName);
-                                        
if(vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) || 
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)){
-                                                 VXResponse vXResponse = new 
VXResponse();
-                         
vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED);
-                         vXResponse.setMsgDesc("Operation"
-                                         + " denied. LoggedInUser="
-                                         +  vxUser.getId()
-                                         + " ,isn't permitted to perform the 
action.");
-                         throw restErrorUtil.generateRESTException(vXResponse);
-                                        }
+                                       VXUser               vxUser = 
xUserService.getXUserByUserName(userName);
+
+                                       if 
(vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) || 
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) {
+                                               VXResponse vXResponse = new 
VXResponse();
+                                               
vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED);
+                                               
vXResponse.setMsgDesc("Operation denied. LoggedInUser=" + vxUser.getId() + " is 
not permitted to perform the action.");
+                                               throw 
restErrorUtil.generateRESTException(vXResponse);
+                                       }
                                        boolean isAdmin = 
hasAdminAccess(serviceName, userName, userGroups, resource);
 
                                        if(!isAdmin) {
@@ -1359,42 +1361,40 @@ public class ServiceREST {
                }
                RESTResponse     ret  = new RESTResponse();
                RangerPerfTracer perf = null;
-               boolean isAllowed = false;
-               boolean isKeyAdmin = bizUtil.isKeyAdmin();
-                bizUtil.blockAuditorRoleUser();
-               if(grantRequest!=null){
+               bizUtil.blockAuditorRoleUser();
+
+               if(grantRequest != null) {
                        if (serviceUtil.isValidService(serviceName, request)) {
                                try {
                                        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
                                                perf = 
RangerPerfTracer.getPerfTracer(PERF_LOG, 
"ServiceREST.scureGrantAccess(serviceName=" + serviceName + ")");
                                        }
 
-                                       
validateGrantRevokeRequest(grantRequest);
+                                       XXService xService = 
daoManager.getXXService().findByName(serviceName);
+                                       XXServiceDef xServiceDef = 
daoManager.getXXServiceDef().getById(xService.getType());
+                                       RangerService rangerService = 
svcStore.getServiceByName(serviceName);
+
+                                       String  loggedInUser      = 
bizUtil.getCurrentUserLoginId();
+                                       boolean hasAdminPrivilege = 
bizUtil.isAdmin() || bizUtil.isUserServiceAdmin(rangerService, loggedInUser) || 
bizUtil.isUserAllowedForGrantRevoke(rangerService, loggedInUser);
+
+                                       
validateGrantRevokeRequest(grantRequest, hasAdminPrivilege, loggedInUser);
 
                                        String               userName   = 
grantRequest.getGrantor();
-                                       Set<String>          userGroups = 
CollectionUtils.isNotEmpty(grantRequest.getGrantorGroups()) ? 
grantRequest.getGrantorGroups() : userMgr.getGroupsForUser(userName);
+                                       Set<String>          userGroups = 
grantRequest.getGrantorGroups();
                                        String                           
ownerUser  = grantRequest.getOwnerUser();
+
                                        RangerAccessResource resource   = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(grantRequest.getResource()),
 ownerUser);
-                                       boolean isAdmin = 
hasAdminAccess(serviceName, userName, userGroups, resource);
 
-                                       XXService xService = 
daoManager.getXXService().findByName(serviceName);
-                                       XXServiceDef xServiceDef = 
daoManager.getXXServiceDef().getById(xService.getType());
-                                       RangerService rangerService = 
svcStore.getServiceByName(serviceName);
+                                       boolean isAllowed = false;
 
                                        if 
(StringUtils.equals(xServiceDef.getImplclassname(), 
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME)) {
-                                               if (isKeyAdmin) {
+                                               if (bizUtil.isKeyAdmin() || 
bizUtil.isUserAllowedForGrantRevoke(rangerService, loggedInUser)) {
                                                        isAllowed = true;
-                                               }else {
-                                                       isAllowed = 
bizUtil.isUserAllowedForGrantRevoke(rangerService, 
Allowed_User_List_For_Grant_Revoke, userName);
-                                               }
-                                       }else{
-                                               if (isAdmin) {
-                                                       isAllowed = true;
-                                               }
-                                               else{
-                                                       isAllowed = 
bizUtil.isUserAllowedForGrantRevoke(rangerService, 
Allowed_User_List_For_Grant_Revoke, userName);
                                                }
+                                       } else {
+                                               isAllowed = hasAdminPrivilege 
|| hasAdminAccess(serviceName, userName, userGroups, resource);
                                        }
+
                                        if (isAllowed) {
                                                RangerPolicy policy = 
getExactMatchPolicyForResource(serviceName, resource, userName);
 
@@ -1489,22 +1489,23 @@ public class ServiceREST {
                                                perf = 
RangerPerfTracer.getPerfTracer(PERF_LOG, 
"ServiceREST.revokeAccess(serviceName=" + serviceName + ")");
                                        }
 
-                                       
validateGrantRevokeRequest(revokeRequest);
+                                       // This is an open API - dont care 
about who calls it. Caller is treated as privileged user
+                                       boolean hasAdminPrivilege = true;
+                                       String loggedInUser = null;
+                                       
validateGrantRevokeRequest(revokeRequest, hasAdminPrivilege, loggedInUser);
 
                                        String               userName   = 
revokeRequest.getGrantor();
                                        Set<String>          userGroups = 
CollectionUtils.isNotEmpty(revokeRequest.getGrantorGroups()) ? 
revokeRequest.getGrantorGroups() : userMgr.getGroupsForUser(userName);
                                        String                           
ownerUser  = revokeRequest.getOwnerUser();
                                        RangerAccessResource resource   = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(revokeRequest.getResource()),
 ownerUser);
-                                        VXUser vxUser = 
xUserService.getXUserByUserName(userName);
-                                        
if(vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) || 
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)){
-                                                 VXResponse vXResponse = new 
VXResponse();
-                         
vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED);
-                         vXResponse.setMsgDesc("Operation"
-                                         + " denied. LoggedInUser="
-                                         +  vxUser.getId()
-                                         + " ,isn't permitted to perform the 
action.");
-                         throw restErrorUtil.generateRESTException(vXResponse);
-                                        }
+                                       VXUser vxUser = 
xUserService.getXUserByUserName(userName);
+
+                                       if 
(vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) || 
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) {
+                                               VXResponse vXResponse = new 
VXResponse();
+                                               
vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED);
+                                               
vXResponse.setMsgDesc("Operation denied. LoggedInUser=" + vxUser.getId() + " is 
not permitted to perform the action.");
+                                               throw 
restErrorUtil.generateRESTException(vXResponse);
+                                       }
                                        boolean isAdmin = 
hasAdminAccess(serviceName, userName, userGroups, resource);
 
                                        if(!isAdmin) {
@@ -1554,40 +1555,38 @@ public class ServiceREST {
                }
                RESTResponse     ret  = new RESTResponse();
                RangerPerfTracer perf = null;
-               if(revokeRequest!=null){
+               bizUtil.blockAuditorRoleUser();
+
+               if (revokeRequest != null) {
                        if (serviceUtil.isValidService(serviceName,request)) {
                                try {
                                        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
                                                perf = 
RangerPerfTracer.getPerfTracer(PERF_LOG, 
"ServiceREST.secureRevokeAccess(serviceName=" + serviceName + ")");
                                        }
 
-                                       
validateGrantRevokeRequest(revokeRequest);
-
-                                       String               userName   = 
revokeRequest.getGrantor();
-                                       Set<String>          userGroups = 
CollectionUtils.isNotEmpty(revokeRequest.getGrantorGroups()) ? 
revokeRequest.getGrantorGroups() : userMgr.getGroupsForUser(userName);
-                                       String                           
ownerUser  = revokeRequest.getOwnerUser();
-                                       RangerAccessResource resource   = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(revokeRequest.getResource()),
 ownerUser);
-                                       boolean isAdmin = 
hasAdminAccess(serviceName, userName, userGroups, resource);
-                                       boolean isAllowed = false;
-                                       boolean isKeyAdmin = 
bizUtil.isKeyAdmin();
-                                        bizUtil.blockAuditorRoleUser();
                                        XXService xService = 
daoManager.getXXService().findByName(serviceName);
                                        XXServiceDef xServiceDef = 
daoManager.getXXServiceDef().getById(xService.getType());
                                        RangerService rangerService = 
svcStore.getServiceByName(serviceName);
 
+                                       String  loggedInUser      = 
bizUtil.getCurrentUserLoginId();
+                                       boolean hasAdminPrivilege = 
bizUtil.isAdmin() || bizUtil.isUserServiceAdmin(rangerService, loggedInUser) || 
bizUtil.isUserAllowedForGrantRevoke(rangerService, loggedInUser);
+
+                                       
validateGrantRevokeRequest(revokeRequest, hasAdminPrivilege, loggedInUser);
+
+                                       String userName = 
revokeRequest.getGrantor();
+                                       Set<String> userGroups = 
revokeRequest.getGrantorGroups();
+                                       String ownerUser = 
revokeRequest.getOwnerUser();
+
+                                       RangerAccessResource resource = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(revokeRequest.getResource()),
 ownerUser);
+
+                                       boolean isAllowed = false;
+
                                        if 
(StringUtils.equals(xServiceDef.getImplclassname(), 
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME)) {
-                                               if (isKeyAdmin) {
+                                               if (bizUtil.isKeyAdmin() || 
bizUtil.isUserAllowedForGrantRevoke(rangerService, loggedInUser)) {
                                                        isAllowed = true;
-                                               }else {
-                                                       isAllowed = 
bizUtil.isUserAllowedForGrantRevoke(rangerService, 
Allowed_User_List_For_Grant_Revoke, userName);
-                                               }
-                                       }else{
-                                               if (isAdmin) {
-                                                       isAllowed = true;
-                                               }
-                                               else{
-                                                       isAllowed = 
bizUtil.isUserAllowedForGrantRevoke(rangerService, 
Allowed_User_List_For_Grant_Revoke, userName);
                                                }
+                                       } else {
+                                               isAllowed = hasAdminPrivilege 
|| hasAdminAccess(serviceName, userName, userGroups, resource);
                                        }
 
                                        if (isAllowed) {
@@ -3916,13 +3915,20 @@ public class ServiceREST {
                return ret;
        }
 
-       private void validateGrantRevokeRequest(GrantRevokeRequest request){
-               if( request!=null){
+       private void validateGrantRevokeRequest(GrantRevokeRequest request, 
final boolean hasAdminPrivilege, final String loggedInUser) {
+               if (request != null) {
                        
validateUsersGroupsAndRoles(request.getUsers(),request.getGroups(), 
request.getRoles());
                        validateGrantor(request.getGrantor());
                        validateGrantees(request.getUsers());
                        validateGroups(request.getGroups());
                        validateRoles(request.getRoles());
+
+                       if (!hasAdminPrivilege) {
+                               if (!StringUtils.equals(request.getGrantor(), 
loggedInUser) || StringUtils.isNotBlank(request.getOwnerUser())) {
+                                       throw 
restErrorUtil.createGrantRevokeRESTException("Invalid grant/revoke request - 
contains grantor or userOwner specification");
+                               }
+                               
request.setGrantorGroups(userMgr.getGroupsForUser(request.getGrantor()));
+                       }
                }
        }
 

Reply via email to