Repository: incubator-ranger Updated Branches: refs/heads/master cdf6df935 -> 64582f029
RANGER-483: user credential will be stored in SHA256 hashed value instead of MD5 Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/64582f02 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/64582f02 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/64582f02 Branch: refs/heads/master Commit: 64582f029e4eedc38e636aac0144134b1146abd7 Parents: cdf6df9 Author: sneethiraj <[email protected]> Authored: Sun May 17 13:33:14 2015 -0400 Committer: sneethiraj <[email protected]> Committed: Sun May 17 13:33:14 2015 -0400 ---------------------------------------------------------------------- .../java/org/apache/ranger/biz/UserMgr.java | 24 +++- .../handler/RangerAuthenticationProvider.java | 110 ++++++++++++++++++- .../RangerAuthFailureHandler.java | 5 +- .../conf.dist/security-applicationContext.xml | 4 +- 4 files changed, 135 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/64582f02/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java ---------------------------------------------------------------------- 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 188682c..145c331 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 @@ -64,13 +64,14 @@ import org.springframework.security.authentication.encoding.Md5PasswordEncoder; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import org.springframework.security.authentication.encoding.ShaPasswordEncoder; @Component public class UserMgr { static final Logger logger = Logger.getLogger(UserMgr.class); private static final Md5PasswordEncoder md5Encoder = new Md5PasswordEncoder(); - + private static final ShaPasswordEncoder sha256Encoder = new ShaPasswordEncoder(256); @Autowired RangerDaoManager daoManager; @@ -1108,7 +1109,7 @@ public class UserMgr { } public String encrypt(String loginId, String password) { - String saltEncodedpasswd = md5Encoder.encodePassword(password, loginId); + String saltEncodedpasswd = sha256Encoder.encodePassword(password, loginId); return saltEncodedpasswd; } @@ -1248,4 +1249,23 @@ public class UserMgr { } return xXPortalUser; } + @Transactional(readOnly = false, propagation = Propagation.REQUIRED) + public XXPortalUser updatePasswordInSHA256(String userName,String userPassword) { + if (userName == null || userPassword == null + || userName.trim().isEmpty() || userPassword.trim().isEmpty()){ + return null; + } + + XXPortalUser xXPortalUser = this.findByLoginId(userName); + + if (xXPortalUser == null) { + return null; + } + + String encryptedNewPwd = encrypt(xXPortalUser.getLoginId(),userPassword); + xXPortalUser.setPassword(encryptedNewPwd); + xXPortalUser = daoManager.getXXPortalUser().update(xXPortalUser); + + return xXPortalUser; + } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/64582f02/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java b/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java index f74e5d9..a84736b 100644 --- a/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java +++ b/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java @@ -28,11 +28,14 @@ import java.util.HashMap; import javax.security.auth.login.AppConfigurationEntry; import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag; import javax.security.auth.login.Configuration; + import org.apache.log4j.Logger; import org.apache.ranger.authentication.unix.jaas.RoleUserAuthorityGranter; import org.apache.ranger.common.PropertiesUtil; import org.springframework.ldap.core.support.LdapContextSource; import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.jaas.DefaultJaasAuthenticationProvider; import org.springframework.security.authentication.jaas.memory.InMemoryConfiguration; @@ -49,10 +52,25 @@ import org.springframework.security.ldap.authentication.LdapAuthenticator; import org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider; import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator; import org.springframework.security.ldap.search.FilterBasedLdapUserSearch; +import org.springframework.security.provisioning.JdbcUserDetailsManager; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.authentication.dao.ReflectionSaltSource; +import org.springframework.security.authentication.encoding.Md5PasswordEncoder; +import org.springframework.security.authentication.encoding.ShaPasswordEncoder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.apache.ranger.biz.UserMgr; public class RangerAuthenticationProvider implements AuthenticationProvider { + + @Autowired + @Qualifier("userService") + private JdbcUserDetailsManager userDetailsService; + + @Autowired + UserMgr userMgr; private static Logger logger = Logger.getLogger(RangerAuthenticationProvider.class); private String rangerAuthenticationMethod; @@ -65,6 +83,9 @@ public class RangerAuthenticationProvider implements AuthenticationProvider { @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { + if(rangerAuthenticationMethod==null){ + rangerAuthenticationMethod="NONE"; + } if (authentication != null && rangerAuthenticationMethod!=null) { if (rangerAuthenticationMethod.equalsIgnoreCase("LDAP")) { authentication=getLdapAuthentication(authentication); @@ -89,11 +110,50 @@ public class RangerAuthenticationProvider implements AuthenticationProvider { } } if (rangerAuthenticationMethod.equalsIgnoreCase("UNIX")) { - return getUnixAuthentication(authentication); + authentication= getUnixAuthentication(authentication); + if(authentication!=null && authentication.isAuthenticated()){ + return authentication; + } + } + String encoder="SHA256"; + try{ + authentication=getJDBCAuthentication(authentication,encoder); + }catch (BadCredentialsException e) { + }catch (AuthenticationServiceException e) { + }catch (AuthenticationException e) { + }catch (Exception e) { + } + if(authentication!=null && authentication.isAuthenticated()){ + return authentication; + } + if(authentication!=null && !authentication.isAuthenticated()){ + encoder="MD5"; + String userName = authentication.getName(); + String userPassword = null; + if (authentication.getCredentials() != null) { + userPassword = authentication.getCredentials().toString(); + } + try{ + authentication=getJDBCAuthentication(authentication,encoder); + }catch (BadCredentialsException e) { + throw e; + }catch (AuthenticationServiceException e) { + throw e; + }catch (AuthenticationException e) { + throw e; + }catch (Exception e) { + throw e; + } + if(authentication!=null && authentication.isAuthenticated()){ + userMgr.updatePasswordInSHA256(userName,userPassword); + return authentication; + }else{ + return authentication; + } } - return null; + return authentication; } - return null; + return authentication; } private Authentication getLdapAuthentication(Authentication authentication) { @@ -410,4 +470,48 @@ public class RangerAuthenticationProvider implements AuthenticationProvider { } return authentication; } + + private Authentication getJDBCAuthentication(Authentication authentication,String encoder) throws AuthenticationException{ + try { + + ReflectionSaltSource saltSource = new ReflectionSaltSource(); + saltSource.setUserPropertyToUse("username"); + + DaoAuthenticationProvider authenticator = new DaoAuthenticationProvider(); + authenticator.setUserDetailsService(userDetailsService); + if(encoder!=null && "SHA256".equalsIgnoreCase(encoder)){ + authenticator.setPasswordEncoder( new ShaPasswordEncoder(256)); + }else if(encoder!=null && "MD5".equalsIgnoreCase(encoder)){ + authenticator.setPasswordEncoder( new Md5PasswordEncoder()); + } + + authenticator.setSaltSource(saltSource); + + String userName = authentication.getName(); + String userPassword = ""; + if (authentication.getCredentials() != null) { + userPassword = authentication.getCredentials().toString(); + } + String rangerLdapDefaultRole = PropertiesUtil.getProperty("ranger.ldap.default.role", "ROLE_USER"); + if (userName != null && userPassword != null && !userName.trim().isEmpty()&& !userPassword.trim().isEmpty()) { + final List<GrantedAuthority> grantedAuths = new ArrayList<>(); + grantedAuths.add(new SimpleGrantedAuthority(rangerLdapDefaultRole)); + grantedAuths.add(new SimpleGrantedAuthority("ROLE_SYS_ADMIN")); + grantedAuths.add(new SimpleGrantedAuthority("ROLE_KEY_ADMIN")); + final UserDetails principal = new User(userName, userPassword,grantedAuths); + final Authentication finalAuthentication = new UsernamePasswordAuthenticationToken(principal, userPassword, grantedAuths); + authentication= authenticator.authenticate(finalAuthentication); + return authentication; + } + } catch (BadCredentialsException e) { + throw e; + }catch (AuthenticationServiceException e) { + throw e; + }catch (AuthenticationException e) { + throw e; + }catch (Exception e) { + throw e; + } + return authentication; + } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/64582f02/security-admin/src/main/java/org/apache/ranger/security/web/authentication/RangerAuthFailureHandler.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/security/web/authentication/RangerAuthFailureHandler.java b/security-admin/src/main/java/org/apache/ranger/security/web/authentication/RangerAuthFailureHandler.java index b302888..94ce93a 100644 --- a/security-admin/src/main/java/org/apache/ranger/security/web/authentication/RangerAuthFailureHandler.java +++ b/security-admin/src/main/java/org/apache/ranger/security/web/authentication/RangerAuthFailureHandler.java @@ -84,7 +84,10 @@ ExceptionMappingAuthenticationFailureHandler { if(msg.equalsIgnoreCase("Bad credentials")){ vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED); vXResponse.setMsgDesc("The username or password you entered is incorrect.."); - }else{ + }else if(msg.contains("Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!")){ + vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED); + vXResponse.setMsgDesc("Unable to connect to DB.."); + }else if(msg.contains("Communications link failure")){ vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED); vXResponse.setMsgDesc("Unable to connect to DB.."); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/64582f02/security-admin/src/main/resources/conf.dist/security-applicationContext.xml ---------------------------------------------------------------------- diff --git a/security-admin/src/main/resources/conf.dist/security-applicationContext.xml b/security-admin/src/main/resources/conf.dist/security-applicationContext.xml index f58b7ba..a648809 100644 --- a/security-admin/src/main/resources/conf.dist/security-applicationContext.xml +++ b/security-admin/src/main/resources/conf.dist/security-applicationContext.xml @@ -147,11 +147,11 @@ http://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd"> <!-- LDAP_SEC_SETTINGS_END --> <!-- UNIX_SEC_SETTINGS_START --> <!-- UNIX_SEC_SETTINGS_END --> - <security:authentication-provider user-service-ref="userService"> + <!-- <security:authentication-provider user-service-ref="userService"> <security:password-encoder hash="md5"> <security:salt-source user-property="username"/> </security:password-encoder> - </security:authentication-provider> + </security:authentication-provider> --> <!-- security:authentication-provider ref="rememberMeAuthenticationProvider"/ --> </security:authentication-manager>
