This is an automated email from the ASF dual-hosted git repository.
kumaab pushed a commit to branch ranger-2.10
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/ranger-2.10 by this push:
new 5f328d05f RANGER-5807: Exclude KMS privileges from config super users
and fix RANGER-5627 related bugs (#1257)
5f328d05f is described below
commit 5f328d05ffc54f9799e589c2b31be6d13c5fcf46
Author: Abhishek Kumar <[email protected]>
AuthorDate: Wed Sep 30 15:47:44 2026 -0700
RANGER-5807: Exclude KMS privileges from config super users and fix
RANGER-5627 related bugs (#1257)
Config super users/groups (ranger.admin.super.users/groups, RANGER-5627)
now get system admin privileges only, independent of Ranger DB roles:
- Session: the super-user flag no longer makes isKeyAdmin() and
isAuditKeyAdmin() true; key-admin and auditor flags from DB roles are
cleared for super users.
- Auditor block: blockAuditorRoleUser() no longer rejects super users.
Before, isAuditUserAdmin() and isAuditKeyAdmin() were true for every
super user, so it rejected them wherever auditors are rejected.
- Roles: super users get ROLE_SYS_ADMIN only, whatever their roles in
Ranger DB, for Spring authorities, the session and the profile.
RangerSuperUserConfig.getSuperUserRoles replaces
mergeConfigSuperUserRoles and getConfigSuperUserProfileRoles, whose
result was always ROLE_SYS_ADMIN (plus ROLE_USER, which had no
effect). A warning is logged when a super user also has a KMS role in
Ranger DB.
- KMS service-def create/update/delete follows system admin rules.
- KMS entries are excluded from access audits and the admin audit log
for super users.
- Key Manager module removed from the session of all admins (DB sys
admins are never assigned it either) and from the super-user profile.
- User visibility (hasAccessToGetUserInfo, searchXUsers,
checkUserAccessible) follows system admin rules, so KMS users are not
visible/manageable by super users. As for system admins, searchXUsers
only adds the non-KMS roles to the role filter; the per-user checks
in hasAccessToGetUserInfo and checkUserAccessible do the enforcing.
Two exceptions are kept in hasAccessToGetUserInfo: rangerusersync
(when configured as a super user) still sees all users, as it does as
a DB system admin, and a super user can always read its own user,
even if its DB role is a KMS role.
- New UserMgr.getDBRolesByLoginId returns DB portal roles without the
merged super-user roles. checkUserAccessible uses it for the target
user: before, a target that is a super user always carried
ROLE_KEY_ADMIN, so system admins could not create or update any
super-user account; now only a target with a KMS role in Ranger DB
is rejected. createDefaultAccountUser also uses it to compare the
existing roles of an external user.
- Plugin grant/revoke is not blocked by DB auditor roles for super
users. New RangerBizUtil.isConfigSuperUser keeps this exemption
limited to config super users; a DB user with both system admin and
auditor roles is still blocked, as before.
- Config descriptions updated; unit tests updated and added.
UserMgr.mapXXPortalUserToVXPortalUser replaced the role list of every
mapped user with the config super-user roles ([ROLE_SYS_ADMIN]) whenever
the logged-in session was a config super user. With the auditor block
for super users lifted in the previous commit, within a super-user
session:
- /users APIs reported every user as ROLE_SYS_ADMIN.
- UserMgr.checkAccess saw every target as a system admin, so super users
could update the profile (name, email, roles) of KMS users (key
admin / key admin auditor) through PUT /service/users, which system
admins cannot.
- Role-change bookkeeping in XUserMgr compared new roles against the
wrong existing roles (e.g. promoting a user to ROLE_SYS_ADMIN via
setUserRolesByName/ByExternalID was a no-op).
Apply the config roles only when the mapped user is the logged-in super
user; other users keep their DB roles.
(cherry picked from commit a93f26817e945fe25c136fdf3a3fb4d476b49536)
---
.../scripts/ranger-admin-site-template.xml | 4 +-
.../java/org/apache/ranger/biz/RangerBizUtil.java | 69 ++++++------
.../java/org/apache/ranger/biz/SessionMgr.java | 16 ++-
.../main/java/org/apache/ranger/biz/UserMgr.java | 92 ++++++++++------
.../main/java/org/apache/ranger/biz/XUserMgr.java | 12 ++-
.../ranger/common/RangerSuperUserConfig.java | 38 ++-----
.../org/apache/ranger/common/UserSessionBase.java | 4 +-
.../java/org/apache/ranger/rest/AssetREST.java | 18 ++--
.../java/org/apache/ranger/rest/ServiceREST.java | 4 +-
.../java/org/apache/ranger/rest/XUserREST.java | 4 +-
.../main/resources/conf.dist/ranger-admin-site.xml | 4 +-
.../org/apache/ranger/biz/TestRangerBizUtil.java | 79 ++++++++++++--
.../java/org/apache/ranger/biz/TestSessionMgr.java | 116 +++++++++++++++++++--
.../java/org/apache/ranger/biz/TestUserMgr.java | 96 ++++++++++++++++-
.../java/org/apache/ranger/biz/TestXUserMgr.java | 62 +++++++++++
.../ranger/common/TestRangerSuperUserConfig.java | 48 +--------
.../java/org/apache/ranger/rest/TestAssetREST.java | 16 +--
17 files changed, 497 insertions(+), 185 deletions(-)
diff --git a/security-admin/scripts/ranger-admin-site-template.xml
b/security-admin/scripts/ranger-admin-site-template.xml
index ed6211cc9..f22b8322f 100644
--- a/security-admin/scripts/ranger-admin-site-template.xml
+++ b/security-admin/scripts/ranger-admin-site-template.xml
@@ -251,11 +251,11 @@
<property>
<name>ranger.admin.super.users</name>
<value></value>
- <description>Comma-separated list of users granted full Ranger
administrative privileges at login (system admin and key admin capabilities),
independent of database roles. Empty or absent disables config-based super
users.</description>
+ <description>Comma-separated list of users granted full Ranger
administrative privileges at login (system admin capabilities), independent of
database roles. Empty or absent disables config-based super users.</description>
</property>
<property>
<name>ranger.admin.super.groups</name>
<value></value>
- <description>Comma-separated list of groups whose members are
granted full Ranger administrative privileges at login (system admin and key
admin capabilities), independent of database roles. Empty or absent disables
config-based super groups.</description>
+ <description>Comma-separated list of groups whose members are
granted full Ranger administrative privileges at login (system admin
capabilities), independent of database roles. Empty or absent disables
config-based super groups.</description>
</property>
</configuration>
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 1a0037eb9..b37154981 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
@@ -1339,28 +1339,22 @@ public void hasKMSPermissions(String objType, String
implClassName) {
+ objType,
MessageEnums.OPER_NO_PERMISSION);
}
- if (!session.isSuperUser()) {
- boolean isKmsServiceType =
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME.equals(implClassName);
+ boolean isKmsServiceType =
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME.equals(implClassName);
- if (session.isKeyAdmin() && !isKmsServiceType) {
- throw
restErrorUtil.createRESTException("KeyAdmin can create/update/delete only KMS "
+ objType,
-
MessageEnums.OPER_NO_PERMISSION);
- }
+ if (session.isKeyAdmin() && !isKmsServiceType) {
+ throw restErrorUtil.createRESTException("KeyAdmin can
create/update/delete only KMS " + objType,
+ MessageEnums.OPER_NO_PERMISSION);
+ }
- if (session.isUserAdmin() && isKmsServiceType &&
"Service-Def".equalsIgnoreCase(objType)) {
- throw restErrorUtil.createRESTException("System
Admin cannot create/update/delete KMS " + objType,
-
MessageEnums.OPER_NO_PERMISSION);
- }
+ if (session.isUserAdmin() && isKmsServiceType &&
"Service-Def".equalsIgnoreCase(objType)) {
+ throw restErrorUtil.createRESTException("System Admin
cannot create/update/delete KMS " + objType,
+ MessageEnums.OPER_NO_PERMISSION);
}
}
public boolean checkUserAccessible(VXUser vXUser) {
- if (isSuperUser()) {
- return true;
- }
-
boolean isAccessible = true;
- Collection<String> roleList = userMgr.getRolesByLoginId(vXUser
+ Collection<String> roleList =
userMgr.getDBRolesByLoginId(vXUser
.getName());
Collection<String> payloadRoles = vXUser.getUserRoleList();
if (isKeyAdmin()) {
@@ -1434,17 +1428,8 @@ public boolean isUserRangerAdmin(String username) {
return true;
}
- final boolean configSuperUser;
-
- if (RangerSuperUserConfig.isSuperUser(username)) {
- configSuperUser = true;
- } else if (RangerSuperUserConfig.isSuperGroupsConfigured() &&
xUserMgr != null) {
- configSuperUser =
RangerSuperUserConfig.isSuperUser(username,
xUserMgr.getGroupsForUser(username));
- } else {
- configSuperUser = false;
- }
-
- if (configSuperUser) {
+ // Config super-user when no session context (e.g. grantor
checks).
+ if (isConfigSuperUser(username)) {
return true;
}
@@ -1459,6 +1444,20 @@ public boolean isUserRangerAdmin(String username) {
return isAdmin;
}
+ /* True when username matches ranger.admin.super.users/groups,
regardless of
+ * the current session and of the user's DB portal roles. */
+ public boolean isConfigSuperUser(String username) {
+ if (StringUtils.isBlank(username)) {
+ return false;
+ } else if (RangerSuperUserConfig.isSuperUser(username)) {
+ return true;
+ } else if (RangerSuperUserConfig.isSuperGroupsConfigured() &&
xUserMgr != null) {
+ return RangerSuperUserConfig.isSuperUser(username,
xUserMgr.getGroupsForUser(username));
+ }
+
+ return false;
+ }
+
public boolean isSuperUser() {
UserSessionBase currentUserSession =
ContextUtil.getCurrentUserSession();
@@ -1515,14 +1514,16 @@ public boolean
isAnyGroupInConfigParameter(RangerService rangerService, String c
public void blockAuditorRoleUser() {
UserSessionBase session = ContextUtil.getCurrentUserSession();
if (session != null) {
- if (session.isAuditKeyAdmin() ||
session.isAuditUserAdmin()) {
- VXResponse vXResponse = new VXResponse();
-
vXResponse.setStatusCode(HttpServletResponse.SC_FORBIDDEN);
- vXResponse.setMsgDesc("Operation"
- + " denied. LoggedInUser="
- +
session.getXXPortalUser().getId()
- + " ,isn't permitted to
perform the action.");
- throw
restErrorUtil.generateRESTException(vXResponse);
+ if (!session.isSuperUser()) {
+ if (session.isAuditKeyAdmin() ||
session.isAuditUserAdmin()) {
+ VXResponse vXResponse = new
VXResponse();
+
vXResponse.setStatusCode(HttpServletResponse.SC_FORBIDDEN);
+ vXResponse.setMsgDesc("Operation"
+ + " denied.
LoggedInUser="
+ +
session.getXXPortalUser().getId()
+ + " ,isn't permitted
to perform the action.");
+ throw
restErrorUtil.generateRESTException(vXResponse);
+ }
}
} else {
VXResponse vXResponse = new VXResponse();
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java
b/security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java
index d60e327d6..1ce109b69 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java
@@ -285,7 +285,10 @@ public void resetUserModulePermission(UserSessionBase
userSession) {
if (xUser != null) {
List<String> permissionList;
if (userSession.isUserAdmin()) {
- permissionList =
daoManager.getXXModuleDef().getAllModuleNames();
+ permissionList = new
ArrayList<>(daoManager.getXXModuleDef().getAllModuleNames());
+
+ // Key Manager is for key admins only, not for
sys admins or config super-users.
+
permissionList.remove(RangerConstants.MODULE_KEY_MANAGER);
} else {
permissionList =
daoManager.getXXModuleDef().findAccessibleModulesByUserId(userSession.getUserId(),
xUser.getId());
}
@@ -364,7 +367,16 @@ private void setUserRoles(UserSessionBase userSession) {
applyConfigSuperUserSessionFlags(userSession);
if (userSession.isSuperUser()) {
- strRoleList =
RangerSuperUserConfig.mergeConfigSuperUserRoles(strRoleList, true);
+ if
(strRoleList.contains(RangerConstants.ROLE_KEY_ADMIN) ||
strRoleList.contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) {
+ logger.warn("User {} is configured as a config
super-user but has KMS role(s) {} in Ranger DB; KMS privileges are not granted
to config super-users. Remove the user from ranger.admin.super.users/groups or
remove the KMS role.", userSession.getLoginId(), strRoleList);
+ }
+
+ // Config super-users act as system admin regardless of
DB portal roles.
+ userSession.setKeyAdmin(false);
+ userSession.setAuditKeyAdmin(false);
+ userSession.setAuditUserAdmin(false);
+
+ strRoleList = RangerSuperUserConfig.getSuperUserRoles();
}
userSession.setUserRoleList(strRoleList);
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
b/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
index b0254d212..51569b652 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
@@ -578,8 +578,9 @@ public VXPortalUser
mapXXPortalUserToVXPortalUser(XXPortalUser user,
if (userRoleList == null) {
userRoleList = new ArrayList<String>();
- if (sess.isSuperUser()) {
-
userRoleList.addAll(RangerSuperUserConfig.getConfigSuperUserProfileRoles());
+ // Config roles apply only to the super user's
own profile; other users keep their DB roles.
+ if (sess.isSuperUser() &&
sess.getXXPortalUser() != null &&
sess.getXXPortalUser().getId().equals(user.getId())) {
+
userRoleList.addAll(RangerSuperUserConfig.getSuperUserRoles());
} else {
List<XXPortalUserRole> gjUserRoleList =
daoManager
.getXXPortalUserRole().findByParentId(user.getId());
@@ -1131,7 +1132,7 @@ public VXPortalUser createDefaultAccountUser(VXPortalUser
userProfile) {
&& userProfile.getUserRoleList().size() > 0
&& ((List<String>) userProfile.getUserRoleList()).get(0)
!= null) {
reqRoleList = userProfile.getUserRoleList();
- existingRoleList = this.getRolesByLoginId(loginId);
+ existingRoleList = this.getDBRolesByLoginId(loginId);
XXPortalUser xxPortalUser = daoManager.getXXPortalUser()
.findByLoginId(userProfile.getLoginId());
if (xxPortalUser != null
@@ -1300,26 +1301,8 @@ public void checkAdminAccess() {
}
public Collection<String> getRolesByLoginId(String loginId) {
- if (loginId == null || loginId.trim().isEmpty()){
- return DEFAULT_ROLE_LIST;
- }
- XXPortalUser
xXPortalUser=daoManager.getXXPortalUser().findByLoginId(loginId);
- if(xXPortalUser==null){
- return DEFAULT_ROLE_LIST;
- }
- Collection<XXPortalUserRole> xXPortalUserRoles = daoManager
-
.getXXPortalUserRole().findByUserId(xXPortalUser.getId());
- if(xXPortalUserRoles==null){
- return DEFAULT_ROLE_LIST;
- }
- Collection<String> roleList = new ArrayList<String>();
- for (XXPortalUserRole role : xXPortalUserRoles) {
- if(role!=null &&
VALID_ROLE_LIST.contains(role.getUserRole())){
- if(!roleList.contains(role.getUserRole())){
- roleList.add(role.getUserRole());
- }
- }
- }
+ Collection<String> roleList = findDBRolesByLoginId(loginId);
+
if(roleList==null || roleList.size()==0){
return DEFAULT_ROLE_LIST;
}
@@ -1339,12 +1322,20 @@ public Collection<String> getRolesByLoginId(String
loginId) {
}
if (configSuperUser) {
- return
RangerSuperUserConfig.mergeConfigSuperUserRoles(roleList, false);
+ return RangerSuperUserConfig.getSuperUserRoles();
}
return roleList;
}
+ /* Portal roles stored in Ranger DB, without config super-user roles;
use when
+ * checking or updating the roles of a user other than the logged-in
one. */
+ public Collection<String> getDBRolesByLoginId(String loginId) {
+ Collection<String> roleList = findDBRolesByLoginId(loginId);
+
+ return roleList.isEmpty() ? DEFAULT_ROLE_LIST : roleList;
+ }
+
public boolean isUserNotActive(String loginId) {
if (loginId == null || loginId.trim().isEmpty()) {
return false;
@@ -1366,7 +1357,7 @@ private void applyConfigSuperUserProfileOverrides(final
VXPortalUser userProfile
return;
}
- List<String> effectiveRoles =
RangerSuperUserConfig.getConfigSuperUserProfileRoles();
+ List<String> effectiveRoles =
RangerSuperUserConfig.getSuperUserRoles();
userProfile.setUserRoleList(effectiveRoles);
@@ -1378,14 +1369,17 @@ private void applyConfigSuperUserProfileOverrides(final
VXPortalUser userProfile
Long xUserId = xUser != null ? xUser.getId() : null;
for (XXModuleDef moduleDef : moduleDefs) {
- VXUserPermission vxUserPermission = new
VXUserPermission();
+ // Config super-users get sys-admin modules
only.
+ if
(!RangerConstants.MODULE_KEY_MANAGER.equals(moduleDef.getModule())) {
+ VXUserPermission vxUserPermission = new
VXUserPermission();
- vxUserPermission.setModuleId(moduleDef.getId());
-
vxUserPermission.setModuleName(moduleDef.getModule());
- vxUserPermission.setUserId(xUserId);
-
vxUserPermission.setIsAllowed(RangerCommonEnums.IS_ALLOWED);
+
vxUserPermission.setModuleId(moduleDef.getId());
+
vxUserPermission.setModuleName(moduleDef.getModule());
+ vxUserPermission.setUserId(xUserId);
+
vxUserPermission.setIsAllowed(RangerCommonEnums.IS_ALLOWED);
- effectiveModules.add(vxUserPermission);
+ effectiveModules.add(vxUserPermission);
+ }
}
}
@@ -1484,8 +1478,44 @@ private String encodeString(String text, String salt,
String algorithm) {
}
}
+ private Collection<String> findDBRolesByLoginId(String loginId) {
+ Collection<String> roleList = new ArrayList<>();
+
+ if (loginId == null || loginId.trim().isEmpty()) {
+ return roleList;
+ }
+
+ XXPortalUser xXPortalUser =
daoManager.getXXPortalUser().findByLoginId(loginId);
+
+ if (xXPortalUser == null) {
+ return roleList;
+ }
+
+ Collection<XXPortalUserRole> xXPortalUserRoles =
daoManager.getXXPortalUserRole().findByUserId(xXPortalUser.getId());
+
+ if (xXPortalUserRoles != null) {
+ for (XXPortalUserRole role : xXPortalUserRoles) {
+ if (role != null &&
VALID_ROLE_LIST.contains(role.getUserRole()) &&
!roleList.contains(role.getUserRole())) {
+ roleList.add(role.getUserRole());
+ }
+ }
+ }
+
+ return roleList;
+ }
+
private boolean hasAccessToGetUserInfo(VXPortalUser requestedVXUser) {
UserSessionBase userSession =
ContextUtil.getCurrentUserSession();
+
+ if (userSession != null && userSession.isSuperUser()) {
+ /* rangerusersync must see all users; a super user can
always see self. */
+ if
("rangerusersync".equalsIgnoreCase(userSession.getLoginId()) ||
StringUtils.equals(requestedVXUser.getLoginId(), userSession.getLoginId())) {
+ return true;
+ }
+
+ return
requestedVXUser.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN) ||
requestedVXUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR)
|| requestedVXUser.getUserRoleList().contains(RangerConstants.ROLE_USER);
+ }
+
if (userSession != null && userSession.getLoginId() != null) {
VXPortalUser loggedInVXUser =
getUserProfileByLoginId(userSession.getLoginId());
if (loggedInVXUser != null &&
loggedInVXUser.getUserRoleList().size() == 1) {
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
index 13e614d65..7293e023f 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -850,7 +850,17 @@ private boolean hasAccessToGetUserInfo(VXUser
requestedVXUser) {
UserSessionBase userSession =
ContextUtil.getCurrentUserSession();
if (userSession != null && userSession.isSuperUser()) {
- return true;
+ if (requestedVXUser == null ||
CollectionUtils.isEmpty(requestedVXUser.getUserRoleList())) {
+ return false;
+ }
+
+ /* rangerusersync must see all users; a super user can
always see self,
+ * even when its DB role is a KMS role. */
+ if
("rangerusersync".equalsIgnoreCase(userSession.getLoginId()) ||
StringUtils.equals(requestedVXUser.getName(), userSession.getLoginId())) {
+ return true;
+ }
+
+ return
StringUtil.containsIgnoreCase(requestedVXUser.getUserRoleList(),
RangerConstants.ROLE_SYS_ADMIN) ||
StringUtil.containsIgnoreCase(requestedVXUser.getUserRoleList(),
RangerConstants.ROLE_ADMIN_AUDITOR) ||
StringUtil.containsIgnoreCase(requestedVXUser.getUserRoleList(),
RangerConstants.ROLE_USER);
}
if (userSession != null && userSession.getLoginId() != null) {
diff --git
a/security-admin/src/main/java/org/apache/ranger/common/RangerSuperUserConfig.java
b/security-admin/src/main/java/org/apache/ranger/common/RangerSuperUserConfig.java
index d2bc2f65e..e78192452 100644
---
a/security-admin/src/main/java/org/apache/ranger/common/RangerSuperUserConfig.java
+++
b/security-admin/src/main/java/org/apache/ranger/common/RangerSuperUserConfig.java
@@ -23,10 +23,8 @@
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
-import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -34,8 +32,7 @@
* Configuration-based Ranger Admin superusers and super groups.
* When {@code ranger.admin.super.users} or
* {@code ranger.admin.super.groups} are set, matching authenticated users
- * receive full Ranger administrative privileges (system admin and key admin
- * capabilities) without requiring corresponding roles in the Ranger database.
+ * receive full Ranger administrative privileges (system admin) without
requiring corresponding roles in the Ranger database.
*/
public final class RangerSuperUserConfig {
private static volatile RangerSuperUserConfig instance;
@@ -117,35 +114,14 @@ public static boolean isSuperUser(final String userName,
final Set<String> userG
}
/**
- * Merges config super-user admin roles with existing portal roles.
- * Used for Spring Security authentication and session role lists.
+ * Portal roles of a config super-user: {@code ROLE_SYS_ADMIN} only,
whatever
+ * its roles in the Ranger DB. Used for Spring Security authorities, the
+ * session role list and {@code GET /users/profile}.
*
- * @param existingRoles DB portal roles (may be null)
- * @param includeRoleUser when true, adds {@code ROLE_USER} (session lists)
- * @return merged role list with stable ordering
+ * @return a new, modifiable list
*/
- public static List<String> mergeConfigSuperUserRoles(final
Collection<String> existingRoles, final boolean includeRoleUser) {
- LinkedHashSet<String> merged = new LinkedHashSet<>();
-
- merged.add(RangerConstants.ROLE_SYS_ADMIN);
- merged.add(RangerConstants.ROLE_KEY_ADMIN);
-
- if (includeRoleUser) {
- merged.add(RangerConstants.ROLE_USER);
- }
-
- if (existingRoles != null) {
- merged.addAll(existingRoles);
- }
-
- return new ArrayList<>(merged);
- }
-
- /**
- * Admin roles exposed on {@code GET /user/profile} for config super-users.
- */
- public static List<String> getConfigSuperUserProfileRoles() {
- return mergeConfigSuperUserRoles(Collections.emptyList(), false);
+ public static List<String> getSuperUserRoles() {
+ return new
ArrayList<>(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN));
}
private static Set<String> parsePropertyValues(final String[] values) {
diff --git
a/security-admin/src/main/java/org/apache/ranger/common/UserSessionBase.java
b/security-admin/src/main/java/org/apache/ranger/common/UserSessionBase.java
index 61cbc5c86..cf53aae2e 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/UserSessionBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/UserSessionBase.java
@@ -119,7 +119,7 @@ public void setClientTimeOffsetInMinute(int
clientTimeOffsetInMinute) {
}
public boolean isKeyAdmin() {
- return superUser || keyAdmin;
+ return keyAdmin;
}
public boolean isSuperUser() {
@@ -146,7 +146,7 @@ public void setKeyAdmin(boolean keyAdmin) {
}
public boolean isAuditKeyAdmin() {
- return superUser || auditKeyAdmin;
+ return auditKeyAdmin;
}
public void setAuditKeyAdmin(boolean auditKeyAdmin) {
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
b/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
index 446ce48c8..e26101507 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
@@ -650,16 +650,14 @@ public VXAccessAuditList getAccessLogs(@Context
HttpServletRequest request, @Que
searchUtil.extractString(request, searchCriteria, "eventId",
"Event Id", null);
- if (!msBizUtil.isSuperUser()) {
- boolean isKeyAdmin = msBizUtil.isKeyAdmin();
- boolean isAuditKeyAdmin = msBizUtil.isAuditKeyAdmin();
- XXServiceDef xxServiceDef =
daoManager.getXXServiceDef().findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME);
- if(isKeyAdmin && xxServiceDef != null ||
isAuditKeyAdmin && xxServiceDef != null){
- searchCriteria.getParamList().put("repoType",
xxServiceDef.getId());
- }
- else if (xxServiceDef != null) {
- searchCriteria.getParamList().put("-repoType",
xxServiceDef.getId());
- }
+ boolean isKeyAdmin = msBizUtil.isKeyAdmin();
+ boolean isAuditKeyAdmin = msBizUtil.isAuditKeyAdmin();
+ XXServiceDef xxServiceDef =
daoManager.getXXServiceDef().findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME);
+ if(isKeyAdmin && xxServiceDef != null || isAuditKeyAdmin &&
xxServiceDef != null){
+ searchCriteria.getParamList().put("repoType",
xxServiceDef.getId());
+ }
+ else if (xxServiceDef != null) {
+ searchCriteria.getParamList().put("-repoType",
xxServiceDef.getId());
}
VXAccessAuditList vxAccessAuditList =
assetMgr.getAccessLogs(searchCriteria);
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 a76da647e..27615fb31 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
@@ -1265,7 +1265,7 @@ public RESTResponse grantAccess(@PathParam("serviceName")
String serviceName, Gr
Set<String>
accessTypes = grantRequest.getAccessTypes();
VXUser vxUser =
xUserService.getXUserByUserName(userName);
- if
(vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) ||
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) {
+ if
((vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) ||
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) &&
!bizUtil.isConfigSuperUser(userName)) {
VXResponse vXResponse = new
VXResponse();
vXResponse.setStatusCode(HttpServletResponse.SC_FORBIDDEN);
vXResponse.setMsgDesc("Operation denied. LoggedInUser=" + vxUser.getId() + " is
not permitted to perform the action.");
@@ -1507,7 +1507,7 @@ public RESTResponse
revokeAccess(@PathParam("serviceName") String serviceName, G
Set<String>
accessTypes = revokeRequest.getAccessTypes();
VXUser vxUser =
xUserService.getXUserByUserName(userName);
- if
(vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) ||
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) {
+ if
((vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) ||
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) &&
!bizUtil.isConfigSuperUser(userName)) {
VXResponse vXResponse = new
VXResponse();
vXResponse.setStatusCode(HttpServletResponse.SC_FORBIDDEN);
vXResponse.setMsgDesc("Operation denied. LoggedInUser=" + vxUser.getId() + " is
not permitted to perform the action.");
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
b/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
index 27dd8e777..9963cfbec 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
@@ -421,8 +421,8 @@ else if
((searchCriteria.getParamList().containsKey("name")) && userName!= null
UserSessionBase userSession =
ContextUtil.getCurrentUserSession();
if (userSession != null && userSession.getLoginId() != null) {
VXUser loggedInVXUser =
xUserService.getXUserByUserName(userSession.getLoginId());
- if (loggedInVXUser != null &&
loggedInVXUser.getUserRoleList().size() == 1) {
- if
(loggedInVXUser.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN) ||
loggedInVXUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR)) {
+ if (loggedInVXUser != null &&
(userSession.isSuperUser() || loggedInVXUser.getUserRoleList().size() == 1)) {
+ if (userSession.isSuperUser() ||
loggedInVXUser.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN) ||
loggedInVXUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR)) {
boolean hasRole = false;
hasRole =
!userRolesList.contains(RangerConstants.ROLE_SYS_ADMIN) ?
userRolesList.add(RangerConstants.ROLE_SYS_ADMIN) : hasRole;
hasRole =
!userRolesList.contains(RangerConstants.ROLE_ADMIN_AUDITOR) ?
userRolesList.add(RangerConstants.ROLE_ADMIN_AUDITOR) : hasRole;
diff --git a/security-admin/src/main/resources/conf.dist/ranger-admin-site.xml
b/security-admin/src/main/resources/conf.dist/ranger-admin-site.xml
index d8533051f..2f2d2faf7 100644
--- a/security-admin/src/main/resources/conf.dist/ranger-admin-site.xml
+++ b/security-admin/src/main/resources/conf.dist/ranger-admin-site.xml
@@ -482,12 +482,12 @@
<property>
<name>ranger.admin.super.users</name>
<value></value>
- <description>Comma-separated list of users granted full
Ranger administrative privileges at login (system admin and key admin
capabilities), independent of database roles. Empty or absent disables
config-based super users.</description>
+ <description>Comma-separated list of users granted full
Ranger administrative privileges at login (system admin capabilities),
independent of database roles. Empty or absent disables config-based super
users.</description>
</property>
<property>
<name>ranger.admin.super.groups</name>
<value></value>
- <description>Comma-separated list of groups whose
members are granted full Ranger administrative privileges at login (system
admin and key admin capabilities), independent of database roles. Empty or
absent disables config-based super groups.</description>
+ <description>Comma-separated list of groups whose
members are granted full Ranger administrative privileges at login (system
admin capabilities), independent of database roles. Empty or absent disables
config-based super groups.</description>
</property>
<property>
<name>xasecure.audit.jaas.Client.loginModuleName</name>
diff --git
a/security-admin/src/test/java/org/apache/ranger/biz/TestRangerBizUtil.java
b/security-admin/src/test/java/org/apache/ranger/biz/TestRangerBizUtil.java
index 566bc3219..53b8d5587 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestRangerBizUtil.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestRangerBizUtil.java
@@ -19,6 +19,7 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
@@ -42,6 +43,7 @@
import org.apache.ranger.entity.XXPortalUser;
import org.apache.ranger.entity.XXResource;
import org.apache.ranger.entity.XXUser;
+import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
import org.apache.ranger.security.context.RangerContextHolder;
import org.apache.ranger.security.context.RangerSecurityContext;
import org.apache.ranger.view.VXPortalUser;
@@ -415,7 +417,7 @@ public void
testCheckUserAccessibleThrowErrorForKeyAdminAndUserRoleSysAdmin()
Collection<String> roleList = new ArrayList<String>();
roleList.add(RangerConstants.ROLE_SYS_ADMIN);
-
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(
+
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(
roleList);
Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
@@ -449,7 +451,7 @@ public void
testCheckUserAccessibleThrowErrorForKeyAdminAndUserRoleAdminAuditor(
Collection<String> roleList = new ArrayList<String>();
roleList.add(RangerConstants.ROLE_ADMIN_AUDITOR);
-
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(
+
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(
roleList);
Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
@@ -482,7 +484,7 @@ public void testCheckUserAccessibleSuccessForKeyAdmin(){
Collection<String> roleList = new ArrayList<String>();
roleList.add(RangerConstants.ROLE_KEY_ADMIN);
roleList.add(RangerConstants.ROLE_KEY_ADMIN_AUDITOR);
-
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(
+
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(
roleList);
Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
@@ -505,7 +507,7 @@ public void
testCheckUserAccessibleThrowErrorForAdminAndUserRoleKeyAdmin()
Collection<String> roleList = new ArrayList<String>();
roleList.add(RangerConstants.ROLE_KEY_ADMIN);
-
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(
+
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(
roleList);
Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
@@ -540,7 +542,7 @@ public void
testCheckUserAccessibleThrowErrorForAdminAndUserRoleKeyAdminAuditor(
Collection<String> roleList = new ArrayList<String>();
roleList.add(RangerConstants.ROLE_KEY_ADMIN_AUDITOR);
-
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(
+
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(
roleList);
Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
@@ -573,7 +575,7 @@ public void
testCheckUserAccessibleThrowErrorForAdminAndUserRoleKeyAdminAuditor(
public void testCheckUserAccessibleSuccessForAdmin(){
Collection<String> roleList = new ArrayList<String>();
roleList.add(RangerConstants.ROLE_SYS_ADMIN);
-
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(
+
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(
roleList);
Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
@@ -671,6 +673,32 @@ public void testIsUserRangerAdmin_ConfigSuperUser() {
RangerSuperUserConfig.resetForTests();
}
+ @Test
+ public void testIsConfigSuperUser() {
+ RangerSuperUserConfig.resetForTests();
+
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS,
"config-admin");
+
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_GROUPS,
"super-group");
+
+
Mockito.when(xUserMgr.getGroupsForUser("group-member")).thenReturn(Collections.singleton("super-group"));
+
Mockito.when(xUserMgr.getGroupsForUser("db-admin")).thenReturn(Collections.emptySet());
+
+ XXPortalUser portalUser = new XXPortalUser();
+ portalUser.setLoginId("db-admin");
+
+ UserSessionBase session =
RangerContextHolder.getSecurityContext().getUserSession();
+ session.setXXPortalUser(portalUser);
+ session.setUserAdmin(true);
+
+
Assert.assertTrue(rangerBizUtil.isConfigSuperUser("config-admin"));
+
Assert.assertTrue(rangerBizUtil.isConfigSuperUser("group-member"));
+
Assert.assertFalse(rangerBizUtil.isConfigSuperUser("db-admin"));
+ Assert.assertFalse(rangerBizUtil.isConfigSuperUser(" "));
+
+
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
+
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_GROUPS);
+ RangerSuperUserConfig.resetForTests();
+ }
+
@Test
public void testIsUserRangerAdmin_ConfigDisabledSkipsGroupLookup() {
Assert.assertFalse(rangerBizUtil.isUserRangerAdmin("any-user"));
@@ -702,6 +730,45 @@ public void
testCheckUserAccessible_ConfigSuperUserCanManageSysAdminUser() {
Assert.assertTrue(rangerBizUtil.checkUserAccessible(vXUser));
}
+ @Test
+ public void
testHasKMSPermissions_DeniesConfigSuperUserOnServiceDefKMS() {
+
RangerContextHolder.getSecurityContext().getUserSession().setSuperUser(true);
+
+ WebApplicationException webExp = new WebApplicationException();
+
+ Mockito.when(restErrorUtil.createRESTException("System Admin
cannot create/update/delete KMS Service-Def",
MessageEnums.OPER_NO_PERMISSION)).thenReturn(webExp);
+
+ Assert.assertThrows(WebApplicationException.class, () ->
rangerBizUtil.hasKMSPermissions("Service-Def",
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME));
+ }
+
+ @Test
+ public void testHasKMSPermissions_AllowsConfigSuperUserOnKMSService() {
+
RangerContextHolder.getSecurityContext().getUserSession().setSuperUser(true);
+
+ rangerBizUtil.hasKMSPermissions("Service",
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME);
+ }
+
+ @Test
+ public void
testCheckUserAccessible_ConfigSuperUserCannotManageKeyAdminUser() {
+ List<String> roleList = new ArrayList<>();
+ roleList.add(RangerConstants.ROLE_KEY_ADMIN);
+
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(roleList);
+ Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
+
+ UserSessionBase session = new UserSessionBase();
+ session.setSuperUser(true);
+
+ RangerSecurityContext context = new RangerSecurityContext();
+ context.setUserSession(session);
+ RangerContextHolder.setSecurityContext(context);
+
+ WebApplicationException webExp = new WebApplicationException();
+
+ Mockito.when(restErrorUtil.createRESTException("Logged in user
is not allowed to create/update user",
MessageEnums.OPER_NO_PERMISSION)).thenReturn(webExp);
+
+ Assert.assertThrows(WebApplicationException.class, () ->
rangerBizUtil.checkUserAccessible(vXUser));
+ }
+
@Test
public void
testFailUnauthenticatedDownload_blocksWhenNoSessionAndFlagFalse() {
RangerContextHolder.setSecurityContext(null);
diff --git
a/security-admin/src/test/java/org/apache/ranger/biz/TestSessionMgr.java
b/security-admin/src/test/java/org/apache/ranger/biz/TestSessionMgr.java
index 1cba3c1e2..0ccdab564 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestSessionMgr.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestSessionMgr.java
@@ -590,11 +590,11 @@ public void testSetUserRoles_ConfigSuperUserAndGroup() {
sessionMgr.resetUserSessionForProfiles(userSession);
assertTrue(userSession.isUserAdmin());
- assertTrue(userSession.isKeyAdmin());
+ assertFalse(userSession.isKeyAdmin());
+ assertFalse(userSession.isAuditKeyAdmin());
assertTrue(userSession.isSuperUser());
assertTrue(userSession.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN));
-
assertTrue(userSession.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN));
-
assertTrue(userSession.getUserRoleList().contains(RangerConstants.ROLE_USER));
+
assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
userSession.getUserRoleList());
assertFalse(userSession.isSingleRoleUserSession());
verify(xUserMgr, never()).getGroupsForUser(anyString());
@@ -611,7 +611,7 @@ public void testSetUserRoles_ConfigSuperUserAndGroup() {
sessionMgr.resetUserSessionForProfiles(userSession);
assertTrue(userSession.isUserAdmin());
- assertTrue(userSession.isKeyAdmin());
+ assertFalse(userSession.isKeyAdmin());
assertTrue(userSession.isSuperUser());
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_GROUPS);
@@ -667,7 +667,7 @@ public void testIsUserAdminIncludesSuperUserFlag() {
}
@Test
- public void testSetUserRoles_ConfigSuperUserGrantsKeyAdminForSysAdmin() {
+ public void
testSetUserRoles_ConfigSuperUserDoesNotGrantKeyAdminForSysAdmin() {
RangerSuperUserConfig.resetForTests();
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS,
"config-admin");
@@ -695,13 +695,117 @@ public void
testSetUserRoles_ConfigSuperUserGrantsKeyAdminForSysAdmin() {
sessionMgr.resetUserSessionForProfiles(userSession);
assertTrue(userSession.isUserAdmin());
- assertTrue(userSession.isKeyAdmin());
+ assertFalse(userSession.isKeyAdmin());
assertTrue(userSession.isSuperUser());
+
assertFalse(userSession.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN));
verify(xUserMgr, never()).getGroupsForUser(anyString());
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
}
+ @Test
+ public void
testResetUserModulePermission_ConfigSuperUserExcludesKeyManager() {
+ UserSessionBase userSession = superUserSessionWithModules();
+
+ sessionMgr.resetUserModulePermission(userSession);
+
+ Set<String> permissions =
userSession.getRangerUserPermission().getUserPermissions();
+
+ assertTrue(permissions.contains(RangerConstants.MODULE_AUDIT));
+ assertFalse(permissions.contains(RangerConstants.MODULE_KEY_MANAGER));
+ }
+
+ @Test
+ public void testResetUserModulePermission_SysAdminExcludesKeyManager() {
+ UserSessionBase userSession = superUserSessionWithModules();
+
+ userSession.setSuperUser(false);
+ userSession.setUserAdmin(true);
+
+ sessionMgr.resetUserModulePermission(userSession);
+
+ Set<String> permissions =
userSession.getRangerUserPermission().getUserPermissions();
+
+ assertTrue(permissions.contains(RangerConstants.MODULE_AUDIT));
+ assertFalse(permissions.contains(RangerConstants.MODULE_KEY_MANAGER));
+ }
+
+ @Test
+ public void
testResetUserModulePermission_ConfigSuperUserExcludesKeyManagerEvenWithKeyAdminFlag()
{
+ UserSessionBase userSession = superUserSessionWithModules();
+
+ userSession.setKeyAdmin(true);
+
+ sessionMgr.resetUserModulePermission(userSession);
+
+ Set<String> permissions =
userSession.getRangerUserPermission().getUserPermissions();
+
+ assertTrue(permissions.contains(RangerConstants.MODULE_AUDIT));
+ assertFalse(permissions.contains(RangerConstants.MODULE_KEY_MANAGER));
+ }
+
+ @Test
+ public void testSetUserRoles_ConfigSuperUserIgnoresDbKeyAdminRole() {
+ RangerSuperUserConfig.resetForTests();
+
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS,
"config-admin");
+
+ UserSessionBase userSession = new UserSessionBase();
+ XXPortalUser portalUser = new XXPortalUser();
+
+ portalUser.setId(45L);
+ portalUser.setLoginId("config-admin");
+ userSession.setXXPortalUser(portalUser);
+
+ XXPortalUserDao portalDao = mock(XXPortalUserDao.class);
+
+ when(daoManager.getXXPortalUser()).thenReturn(portalDao);
+ when(portalDao.findByLoginId("config-admin")).thenReturn(portalUser);
+
+ XXPortalUserRole keyAdminRole = new XXPortalUserRole();
+
+ keyAdminRole.setUserRole(RangerConstants.ROLE_KEY_ADMIN);
+
+ XXPortalUserRoleDao roleDao = mock(XXPortalUserRoleDao.class);
+
+ when(daoManager.getXXPortalUserRole()).thenReturn(roleDao);
+
when(roleDao.findByUserId(45L)).thenReturn(Collections.singletonList(keyAdminRole));
+
+ sessionMgr.resetUserSessionForProfiles(userSession);
+
+ assertTrue(userSession.isSuperUser());
+ assertTrue(userSession.isUserAdmin());
+ assertFalse(userSession.isKeyAdmin());
+ assertFalse(userSession.isAuditKeyAdmin());
+
assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
userSession.getUserRoleList());
+
+
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
+ RangerSuperUserConfig.resetForTests();
+ }
+
+ private UserSessionBase superUserSessionWithModules() {
+ UserSessionBase userSession = new UserSessionBase();
+ XXPortalUser portalUser = new XXPortalUser();
+
+ portalUser.setId(44L);
+ portalUser.setLoginId("config-admin");
+ userSession.setXXPortalUser(portalUser);
+ userSession.setSuperUser(true);
+
+ XXUser xUser = new XXUser();
+
+ xUser.setId(144L);
+
+ XXUserDao xUserDao = mock(XXUserDao.class);
+ XXModuleDefDao moduleDefDao = mock(XXModuleDefDao.class);
+
+ when(daoManager.getXXUser()).thenReturn(xUserDao);
+ when(xUserDao.findByUserName("config-admin")).thenReturn(xUser);
+ when(daoManager.getXXModuleDef()).thenReturn(moduleDefDao);
+
when(moduleDefDao.getAllModuleNames()).thenReturn(Arrays.asList(RangerConstants.MODULE_AUDIT,
RangerConstants.MODULE_KEY_MANAGER));
+
+ return userSession;
+ }
+
@Test
public void testProcessSuccessLogin_LimitZeroDoesNotExpireOldestSession() {
RangerContextHolder.setSecurityContext(null);
diff --git
a/security-admin/src/test/java/org/apache/ranger/biz/TestUserMgr.java
b/security-admin/src/test/java/org/apache/ranger/biz/TestUserMgr.java
index 563f66a81..ac98a6053 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestUserMgr.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestUserMgr.java
@@ -1771,9 +1771,7 @@ public void testGetRolesByLoginId_ConfigSuperUser() {
Collection<String> roles =
userMgr.getRolesByLoginId(userLoginId);
- Assert.assertTrue(roles.contains(RangerConstants.ROLE_USER));
-
Assert.assertTrue(roles.contains(RangerConstants.ROLE_SYS_ADMIN));
-
Assert.assertTrue(roles.contains(RangerConstants.ROLE_KEY_ADMIN));
+
Assert.assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
new ArrayList<>(roles));
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
RangerSuperUserConfig.resetForTests();
@@ -1785,6 +1783,98 @@ public void testGetRolesByLoginId_ConfigSuperUser() {
RangerSuperUserConfig.resetForTests();
}
+ @Test
+ public void testGetDBRolesByLoginId_ConfigSuperUserKeepsDBRoles() {
+ setup();
+ XXPortalUserDao userDao = Mockito.mock(XXPortalUserDao.class);
+ XXPortalUserRoleDao roleDao =
Mockito.mock(XXPortalUserRoleDao.class);
+
+ VXPortalUser userProfile = userProfile();
+ String userLoginId = userProfile.getLoginId();
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId(userLoginId);
+ user.setId(userProfile.getId());
+
+ XXPortalUserRole xxPortalUserRole = new XXPortalUserRole();
+ xxPortalUserRole.setUserRole(RangerConstants.ROLE_KEY_ADMIN);
+ List<XXPortalUserRole> list = new ArrayList<XXPortalUserRole>();
+ list.add(xxPortalUserRole);
+
+ Mockito.when(daoManager.getXXPortalUser()).thenReturn(userDao);
+
Mockito.when(userDao.findByLoginId(userLoginId)).thenReturn(user);
+
Mockito.when(daoManager.getXXPortalUserRole()).thenReturn(roleDao);
+
Mockito.when(roleDao.findByUserId(user.getId())).thenReturn(list);
+ RangerSuperUserConfig.resetForTests();
+
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS,
userLoginId);
+
+
Assert.assertEquals(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN),
new ArrayList<>(userMgr.getDBRolesByLoginId(userLoginId)));
+
Assert.assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
new ArrayList<>(userMgr.getRolesByLoginId(userLoginId)));
+
+
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
+ RangerSuperUserConfig.resetForTests();
+ }
+
+ @Test
+ public void
testMapXXPortalUserToVXPortalUser_ConfigSuperUserKeepsOtherUserDbRoles() {
+ XXPortalUser keyAdminUser =
configSuperUserSessionAndKeyAdminUser();
+
+ VXPortalUser profile =
userMgr.mapXXPortalUserToVXPortalUser(keyAdminUser, null);
+
+
Assert.assertEquals(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN),
profile.getUserRoleList());
+
+ destroySession();
+ }
+
+ @Test
+ public void testCheckAccess_ConfigSuperUserCannotAccessKeyAdminUser() {
+ XXPortalUser keyAdminUser =
configSuperUserSessionAndKeyAdminUser();
+ XXPortalUserDao userDao = Mockito.mock(XXPortalUserDao.class);
+
+ Mockito.when(daoManager.getXXPortalUser()).thenReturn(userDao);
+
Mockito.when(userDao.findByLoginId("keyadmin-user")).thenReturn(keyAdminUser);
+
Mockito.when(restErrorUtil.createRESTException(HttpServletResponse.SC_FORBIDDEN,
"Logged-In user is not allowed to access requested user data",
true)).thenReturn(new WebApplicationException());
+
+ Assert.assertThrows(WebApplicationException.class, () ->
userMgr.checkAccess(keyAdminUser));
+
+ destroySession();
+ }
+
+ private XXPortalUser configSuperUserSessionAndKeyAdminUser() {
+ UserSessionBase session = new UserSessionBase();
+ XXPortalUser portalUser = new XXPortalUser();
+
+ portalUser.setId(99L);
+ portalUser.setLoginId("config-admin");
+ session.setXXPortalUser(portalUser);
+ session.setSuperUser(true);
+
+ RangerSecurityContext context = new RangerSecurityContext();
+ context.setUserSession(session);
+ RangerContextHolder.setSecurityContext(context);
+
+ XXPortalUser keyAdminUser = new XXPortalUser();
+ keyAdminUser.setId(100L);
+ keyAdminUser.setLoginId("keyadmin-user");
+ keyAdminUser.setUserSource(RangerCommonEnums.USER_APP);
+
+ XXPortalUserRole keyAdminRole = new XXPortalUserRole();
+ keyAdminRole.setUserRole(RangerConstants.ROLE_KEY_ADMIN);
+
+ XXPortalUserRoleDao roleDao =
Mockito.mock(XXPortalUserRoleDao.class);
+ XXUserPermissionDao userPermissionDao =
Mockito.mock(XXUserPermissionDao.class);
+ XXGroupPermissionDao groupPermissionDao =
Mockito.mock(XXGroupPermissionDao.class);
+
+
Mockito.when(daoManager.getXXPortalUserRole()).thenReturn(roleDao);
+
Mockito.when(roleDao.findByParentId(100L)).thenReturn(Collections.singletonList(keyAdminRole));
+
Mockito.when(daoManager.getXXUserPermission()).thenReturn(userPermissionDao);
+
Mockito.when(daoManager.getXXGroupPermission()).thenReturn(groupPermissionDao);
+
Mockito.when(userPermissionDao.findByUserPermissionIdAndIsAllowed(100L)).thenReturn(Collections.emptyList());
+
Mockito.when(groupPermissionDao.findbyVXPortalUserId(100L)).thenReturn(Collections.emptyList());
+
+ return keyAdminUser;
+ }
+
@Test
public void test31checkAccess() {
setup();
diff --git
a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
index 708507809..7fa828895 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
@@ -4878,4 +4878,66 @@ public void test135updateXGroupUser_userNotFound() {
xUserMgr.updateXGroupUser(vxGroupUser);
});
}
+
+ @Test
+ public void test136checkAccess_configSuperUserCanAccessSysAdminUser() {
+ setupConfigSuperUserSession();
+
+ VXUser requestedUser = new VXUser();
+ requestedUser.setId(2L);
+
requestedUser.setUserRoleList(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN));
+
+ xUserMgr.checkAccess(requestedUser);
+ }
+
+ @Test
+ public void
test137checkAccess_configSuperUserCannotAccessKeyAdminUser() {
+ setupConfigSuperUserSession();
+
+ VXUser requestedUser = new VXUser();
+ requestedUser.setId(2L);
+
requestedUser.setUserRoleList(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN));
+
+
Mockito.when(restErrorUtil.create403RESTException(Mockito.anyString())).thenReturn(new
WebApplicationException());
+
+ Assert.assertThrows(WebApplicationException.class, () ->
xUserMgr.checkAccess(requestedUser));
+ }
+
+ @Test
+ public void
test138checkAccess_configSuperUserCanAccessSelfWithKeyAdminDBRole() {
+ setupConfigSuperUserSession();
+
+ VXUser requestedUser = new VXUser();
+ requestedUser.setId(1L);
+ requestedUser.setName("config-admin");
+
requestedUser.setUserRoleList(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN));
+
+ xUserMgr.checkAccess(requestedUser);
+ }
+
+ @Test
+ public void
test139checkAccess_rangerusersyncConfigSuperUserCanAccessKeyAdminUser() {
+ setupConfigSuperUserSession();
+
ContextUtil.getCurrentUserSession().getXXPortalUser().setLoginId("rangerusersync");
+
+ VXUser requestedUser = new VXUser();
+ requestedUser.setId(2L);
+ requestedUser.setName("keyadmin");
+
requestedUser.setUserRoleList(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN));
+
+ xUserMgr.checkAccess(requestedUser);
+ }
+
+ private void setupConfigSuperUserSession() {
+ RangerSecurityContext context = new RangerSecurityContext();
+ context.setUserSession(new UserSessionBase());
+ RangerContextHolder.setSecurityContext(context);
+
+ UserSessionBase currentUserSession =
ContextUtil.getCurrentUserSession();
+ XXPortalUser portalUser = new XXPortalUser();
+ portalUser.setLoginId("config-admin");
+ portalUser.setId(1L);
+ currentUserSession.setXXPortalUser(portalUser);
+ currentUserSession.setSuperUser(true);
+ }
}
diff --git
a/security-admin/src/test/java/org/apache/ranger/common/TestRangerSuperUserConfig.java
b/security-admin/src/test/java/org/apache/ranger/common/TestRangerSuperUserConfig.java
index 8293c718f..de28dd37e 100644
---
a/security-admin/src/test/java/org/apache/ranger/common/TestRangerSuperUserConfig.java
+++
b/security-admin/src/test/java/org/apache/ranger/common/TestRangerSuperUserConfig.java
@@ -24,7 +24,6 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -149,40 +148,14 @@ public void testIsSuperUser_BlankLoginId() {
}
@Test
- public void testMergeConfigSuperUserRoles_ForAuthentication() {
- List<String> merged = RangerSuperUserConfig.mergeConfigSuperUserRoles(
- Collections.singletonList(RangerConstants.ROLE_USER), false);
+ public void testGetSuperUserRoles() {
+ List<String> roles = RangerSuperUserConfig.getSuperUserRoles();
- Assertions.assertEquals(
- Arrays.asList(
- RangerConstants.ROLE_SYS_ADMIN,
- RangerConstants.ROLE_KEY_ADMIN,
- RangerConstants.ROLE_USER),
- merged);
- }
+
Assertions.assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
roles);
- @Test
- public void testMergeConfigSuperUserRoles_ForSession() {
- List<String> merged = RangerSuperUserConfig.mergeConfigSuperUserRoles(
- Collections.singletonList(RangerConstants.ROLE_ADMIN_AUDITOR),
- true);
+ roles.add(RangerConstants.ROLE_USER);
- Assertions.assertEquals(
- Arrays.asList(
- RangerConstants.ROLE_SYS_ADMIN,
- RangerConstants.ROLE_KEY_ADMIN,
- RangerConstants.ROLE_USER,
- RangerConstants.ROLE_ADMIN_AUDITOR),
- merged);
- }
-
- @Test
- public void testGetConfigSuperUserProfileRoles() {
- Assertions.assertEquals(
- Arrays.asList(
- RangerConstants.ROLE_SYS_ADMIN,
- RangerConstants.ROLE_KEY_ADMIN),
- RangerSuperUserConfig.getConfigSuperUserProfileRoles());
+
Assertions.assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
RangerSuperUserConfig.getSuperUserRoles());
}
@Test
@@ -224,17 +197,6 @@ public void
testIsEnabled_WhenWildcardConfiguredAsLiteralUser() {
Assertions.assertTrue(RangerSuperUserConfig.isSuperUser("*",
Collections.emptySet()));
}
- @Test
- public void testMergeConfigSuperUserRoles_NullExistingRoles() {
- List<String> merged =
RangerSuperUserConfig.mergeConfigSuperUserRoles(null, false);
-
- Assertions.assertEquals(
- Arrays.asList(
- RangerConstants.ROLE_SYS_ADMIN,
- RangerConstants.ROLE_KEY_ADMIN),
- merged);
- }
-
@Test
public void testConfigReloadAfterResetForTests() {
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS,
"alice");
diff --git
a/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
b/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
index 3a3fda25a..74e3bce58 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
@@ -676,7 +676,6 @@ public void testGetAccessLogs() {
.thenReturn(new Date());
Mockito.when(searchUtil.extractLong((HttpServletRequest)
Mockito.any(),
(SearchCriteria) Mockito.any(),
Mockito.anyString(), Mockito.anyString())).thenReturn((Long) 8l);
- Mockito.when(msBizUtil.isSuperUser()).thenReturn(false);
Mockito.when(msBizUtil.isKeyAdmin()).thenReturn(false);
Mockito.when(daoManager.getXXServiceDef()).thenReturn(xxServiceDefDao);
XXServiceDef xServiceDef = new XXServiceDef();
@@ -730,16 +729,19 @@ public void testGetAccessLogsForConfigSuperUser() {
.thenReturn(new Date());
Mockito.when(searchUtil.extractLong((HttpServletRequest)
Mockito.any(),
(SearchCriteria) Mockito.any(),
Mockito.anyString(), Mockito.anyString())).thenReturn((Long) 8l);
- Mockito.when(msBizUtil.isSuperUser()).thenReturn(true);
+ Mockito.when(msBizUtil.isKeyAdmin()).thenReturn(false);
+ Mockito.when(msBizUtil.isAuditKeyAdmin()).thenReturn(false);
+
Mockito.when(daoManager.getXXServiceDef()).thenReturn(xxServiceDefDao);
+ XXServiceDef xServiceDef = new XXServiceDef();
+ xServiceDef.setId(Id);
+
Mockito.when(xxServiceDefDao.findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME)).thenReturn(xServiceDef);
ArgumentCaptor<SearchCriteria> criteriaCaptor =
ArgumentCaptor.forClass(SearchCriteria.class);
Mockito.when(assetMgr.getAccessLogs(criteriaCaptor.capture())).thenReturn(vXAccessAuditList);
VXAccessAuditList expectedVXAccessAuditList =
assetREST.getAccessLogs(request, null);
Assert.assertEquals(vXAccessAuditList,
expectedVXAccessAuditList);
Assert.assertFalse(criteriaCaptor.getValue().getParamList().containsKey("repoType"));
-
Assert.assertFalse(criteriaCaptor.getValue().getParamList().containsKey("-repoType"));
- Mockito.verify(msBizUtil).isSuperUser();
- Mockito.verify(msBizUtil, Mockito.never()).isKeyAdmin();
- Mockito.verify(daoManager, Mockito.never()).getXXServiceDef();
+ Assert.assertEquals(Id,
criteriaCaptor.getValue().getParamList().get("-repoType"));
+ Mockito.verify(msBizUtil, Mockito.never()).isSuperUser();
Mockito.verify(assetMgr).getAccessLogs(searchCriteria);
}
@@ -764,7 +766,6 @@ public void testGetAccessLogsForKms() {
(SearchCriteria) Mockito.any(),
Mockito.anyString(), Mockito.anyString())).thenReturn((Long) 8l);
Mockito.when(searchUtil.extractLong((HttpServletRequest)
Mockito.any(),
(SearchCriteria) Mockito.any(),
Mockito.anyString(), Mockito.anyString())).thenReturn((Long) 8l);
- Mockito.when(msBizUtil.isSuperUser()).thenReturn(false);
Mockito.when(msBizUtil.isKeyAdmin()).thenReturn(true);
Mockito.when(daoManager.getXXServiceDef()).thenReturn(xxServiceDefDao);
XXServiceDef xServiceDef = new XXServiceDef();
@@ -774,7 +775,6 @@ public void testGetAccessLogsForKms() {
Mockito.when(assetMgr.getAccessLogs(searchCriteria)).thenReturn(vXAccessAuditList);
VXAccessAuditList expectedVXAccessAuditList =
assetREST.getAccessLogs(request, null);
Assert.assertEquals(vXAccessAuditList,
expectedVXAccessAuditList);
- Mockito.verify(msBizUtil).isSuperUser();
Mockito.verify(msBizUtil).isKeyAdmin();
Mockito.verify(assetMgr).getAccessLogs(searchCriteria);
Mockito.verify(daoManager).getXXServiceDef();