Commit 27918145 by nixonrodrigues Committed by Madhan Neethiraj

ATLAS-2166 - Block Knox proxy service user for kerberos authentication

Change-Id: Ib7549067bad928ae90d5f39b920c162d9c776780 Signed-off-by: 's avatarMadhan Neethiraj <madhan@apache.org>
parent 48feaa35
...@@ -29,7 +29,6 @@ import org.apache.commons.configuration.Configuration; ...@@ -29,7 +29,6 @@ import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationConverter; import org.apache.commons.configuration.ConfigurationConverter;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.security.SecurityUtil; import org.apache.hadoop.security.SecurityUtil;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.security.authentication.client.AuthenticatedURL; import org.apache.hadoop.security.authentication.client.AuthenticatedURL;
import org.apache.hadoop.security.authentication.client.AuthenticationException; import org.apache.hadoop.security.authentication.client.AuthenticationException;
import org.apache.hadoop.security.authentication.client.KerberosAuthenticator; import org.apache.hadoop.security.authentication.client.KerberosAuthenticator;
...@@ -47,7 +46,6 @@ import org.springframework.security.authentication.AbstractAuthenticationToken; ...@@ -47,7 +46,6 @@ import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
...@@ -84,16 +82,23 @@ import java.util.regex.Pattern; ...@@ -84,16 +82,23 @@ import java.util.regex.Pattern;
@Component @Component
public class AtlasAuthenticationFilter extends AuthenticationFilter { public class AtlasAuthenticationFilter extends AuthenticationFilter {
private static final Logger LOG = LoggerFactory.getLogger(AtlasAuthenticationFilter.class); private static final Logger LOG = LoggerFactory.getLogger(AtlasAuthenticationFilter.class);
static final String PREFIX = "atlas.authentication.method";
protected static ServletContext nullContext = new NullServletContext(); private static final String CONFIG_PROXY_USERS = "atlas.proxyusers";
private Signer signer; private static final String PREFIX = "atlas.authentication.method";
private static final String[] DEFAULT_PROXY_USERS = new String[] { "knox" };
protected static final ServletContext nullContext = new NullServletContext();
private Signer signer;
private SignerSecretProvider secretProvider; private SignerSecretProvider secretProvider;
public final boolean isKerberos = AuthenticationUtil.isKerberosAuthenticationEnabled(); private final boolean isKerberos = AuthenticationUtil.isKerberosAuthenticationEnabled();
private boolean isInitializedByTomcat; private boolean isInitializedByTomcat;
private Set<Pattern> browserUserAgents; private Set<Pattern> browserUserAgents;
private boolean supportKeyTabBrowserLogin = false; private boolean supportKeyTabBrowserLogin = false;
private Configuration configuration; private Configuration configuration;
private Properties headerProperties; private Properties headerProperties;
private Set<String> atlasProxyUsers = new HashSet<>();
public AtlasAuthenticationFilter() { public AtlasAuthenticationFilter() {
try { try {
LOG.info("AtlasAuthenticationFilter initialization started"); LOG.info("AtlasAuthenticationFilter initialization started");
...@@ -252,6 +257,14 @@ public class AtlasAuthenticationFilter extends AuthenticationFilter { ...@@ -252,6 +257,14 @@ public class AtlasAuthenticationFilter extends AuthenticationFilter {
agents = AtlasCSRFPreventionFilter.BROWSER_USER_AGENTS_DEFAULT; agents = AtlasCSRFPreventionFilter.BROWSER_USER_AGENTS_DEFAULT;
} }
String[] proxyUsers = configuration.getStringArray(CONFIG_PROXY_USERS);
if (proxyUsers == null || proxyUsers.length == 0) {
proxyUsers = DEFAULT_PROXY_USERS;
}
atlasProxyUsers = new HashSet<>(Arrays.asList(proxyUsers));
parseBrowserUserAgents(agents); parseBrowserUserAgents(agents);
return config; return config;
...@@ -417,6 +430,18 @@ public class AtlasAuthenticationFilter extends AuthenticationFilter { ...@@ -417,6 +430,18 @@ public class AtlasAuthenticationFilter extends AuthenticationFilter {
return (authToken != AuthenticationToken.ANONYMOUS) ? authToken : null; return (authToken != AuthenticationToken.ANONYMOUS) ? authToken : null;
} }
}; };
if(StringUtils.isNotBlank(httpRequest.getRemoteUser()) && atlasProxyUsers.contains(httpRequest.getRemoteUser())){
LOG.info("Ignoring kerberos login from proxy user "+ httpRequest.getRemoteUser());
httpResponse.setHeader(KerberosAuthenticator.WWW_AUTHENTICATE, "");
httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
filterChain.doFilter(request, response);
return;
}
if (newToken && !token.isExpired() && token != AuthenticationToken.ANONYMOUS) { if (newToken && !token.isExpired() && token != AuthenticationToken.ANONYMOUS) {
String signedToken = signer.sign(token.toString()); String signedToken = signer.sign(token.toString());
createAuthCookie(httpResponse, signedToken, getCookieDomain(), createAuthCookie(httpResponse, signedToken, getCookieDomain(),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment