diff --git a/dev-support/ranger-docker/scripts/pdp/ranger-pdp-site.xml b/dev-support/ranger-docker/scripts/pdp/ranger-pdp-site.xml index db867d7442b..e012711f997 100644 --- a/dev-support/ranger-docker/scripts/pdp/ranger-pdp-site.xml +++ b/dev-support/ranger-docker/scripts/pdp/ranger-pdp-site.xml @@ -109,6 +109,7 @@ true + ranger.pdp.authn.header.username X-Forwarded-User diff --git a/intg/src/main/python/README.md b/intg/src/main/python/README.md index a8c0c26710c..fd6b2e2c04d 100644 --- a/intg/src/main/python/README.md +++ b/intg/src/main/python/README.md @@ -141,8 +141,8 @@ Authentication options: - install dependency: `pip install requests-kerberos` - use `HTTPKerberosAuth()` as `auth` in `RangerPDPClient` - **Trusted header** - - pass caller header (default `X-Forwarded-User`, configurable by `ranger.pdp.authn.header.username`) - - recommended only behind a trusted proxy + - pass caller header (must be configured using `ranger.pdp.authn.header.username`) + - only behind a trusted proxy - **JWT bearer** - pass `Authorization: Bearer ` in request headers diff --git a/pdp/conf.dist/ranger-pdp-site.xml b/pdp/conf.dist/ranger-pdp-site.xml index ddf2ff9346c..fde66f26111 100644 --- a/pdp/conf.dist/ranger-pdp-site.xml +++ b/pdp/conf.dist/ranger-pdp-site.xml @@ -138,9 +138,10 @@ + ranger.pdp.authn.header.username - X-Forwarded-User + HTTP header name from which the authenticated username is read. diff --git a/pdp/src/main/java/org/apache/ranger/pdp/config/RangerPdpConfig.java b/pdp/src/main/java/org/apache/ranger/pdp/config/RangerPdpConfig.java index 11aea39ea85..c0e956dcb69 100644 --- a/pdp/src/main/java/org/apache/ranger/pdp/config/RangerPdpConfig.java +++ b/pdp/src/main/java/org/apache/ranger/pdp/config/RangerPdpConfig.java @@ -140,7 +140,7 @@ public boolean isHeaderAuthnEnabled() { } public String getHeaderAuthnUsername() { - return get(RangerPdpConstants.PROP_AUTHN_HEADER_USERNAME, "X-Forwarded-User"); + return get(RangerPdpConstants.PROP_AUTHN_HEADER_USERNAME, ""); } // --- JWT bearer token auth --- diff --git a/pdp/src/main/java/org/apache/ranger/pdp/security/HttpHeaderAuthNHandler.java b/pdp/src/main/java/org/apache/ranger/pdp/security/HttpHeaderAuthNHandler.java index 60df86dafa7..0d8f8aacdd8 100644 --- a/pdp/src/main/java/org/apache/ranger/pdp/security/HttpHeaderAuthNHandler.java +++ b/pdp/src/main/java/org/apache/ranger/pdp/security/HttpHeaderAuthNHandler.java @@ -50,7 +50,7 @@ public class HttpHeaderAuthNHandler implements PdpAuthNHandler { @Override public void init(Properties config) { - usernameHeader = config.getProperty(RangerPdpConstants.PROP_AUTHN_HEADER_USERNAME, "X-Forwarded-User"); + usernameHeader = config.getProperty(RangerPdpConstants.PROP_AUTHN_HEADER_USERNAME); LOG.info("HttpHeaderAuthHandler initialized; username header={}", usernameHeader); } diff --git a/pdp/src/main/java/org/apache/ranger/pdp/security/RangerPdpAuthNFilter.java b/pdp/src/main/java/org/apache/ranger/pdp/security/RangerPdpAuthNFilter.java index 32d04ef0a47..e425464a7a3 100644 --- a/pdp/src/main/java/org/apache/ranger/pdp/security/RangerPdpAuthNFilter.java +++ b/pdp/src/main/java/org/apache/ranger/pdp/security/RangerPdpAuthNFilter.java @@ -150,7 +150,9 @@ private PdpAuthNHandler createHandler(String type, FilterConfig filterConfig) { switch (type) { case "header": - ret = getBoolean(filterConfig, RangerPdpConstants.PROP_AUTHN_HEADER_ENABLED) ? new HttpHeaderAuthNHandler() : null; + ret = getBoolean(filterConfig, RangerPdpConstants.PROP_AUTHN_HEADER_ENABLED) && + StringUtils.isNotBlank(filterConfig.getInitParameter(RangerPdpConstants.PROP_AUTHN_HEADER_USERNAME)) + ? new HttpHeaderAuthNHandler() : null; break; case "jwt": ret = getBoolean(filterConfig, RangerPdpConstants.PROP_AUTHN_JWT_ENABLED) ? new JwtAuthNHandler() : null; diff --git a/pdp/src/main/resources/ranger-pdp-default.xml b/pdp/src/main/resources/ranger-pdp-default.xml index ddf2ff9346c..fde66f26111 100644 --- a/pdp/src/main/resources/ranger-pdp-default.xml +++ b/pdp/src/main/resources/ranger-pdp-default.xml @@ -138,9 +138,10 @@ + ranger.pdp.authn.header.username - X-Forwarded-User + HTTP header name from which the authenticated username is read. diff --git a/pdp/src/test/java/org/apache/ranger/pdp/security/HttpHeaderAuthNHandlerTest.java b/pdp/src/test/java/org/apache/ranger/pdp/security/HttpHeaderAuthNHandlerTest.java index c497be90863..1bd2a574634 100644 --- a/pdp/src/test/java/org/apache/ranger/pdp/security/HttpHeaderAuthNHandlerTest.java +++ b/pdp/src/test/java/org/apache/ranger/pdp/security/HttpHeaderAuthNHandlerTest.java @@ -29,10 +29,11 @@ import java.util.Properties; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class HttpHeaderAuthNHandlerTest { @Test - public void testAuthenticate_usesDefaultHeaderName() { + public void testAuthenticate_usesNoHeaderName() { HttpHeaderAuthNHandler handler = new HttpHeaderAuthNHandler(); Properties config = new Properties(); @@ -41,9 +42,9 @@ public void testAuthenticate_usesDefaultHeaderName() { HttpServletRequest request = requestWithHeader("X-Forwarded-User", "alice"); PdpAuthNHandler.Result result = handler.authenticate(request, null); - assertEquals(PdpAuthNHandler.Result.Status.AUTHENTICATED, result.getStatus()); - assertEquals("alice", result.getUserName()); - assertEquals(HttpHeaderAuthNHandler.AUTH_TYPE, result.getAuthType()); + assertEquals(PdpAuthNHandler.Result.Status.SKIP, result.getStatus()); + assertNull(result.getUserName()); + assertNull(result.getAuthType()); } @Test diff --git a/pdp/src/test/java/org/apache/ranger/pdp/security/RangerPdpAuthNFilterTest.java b/pdp/src/test/java/org/apache/ranger/pdp/security/RangerPdpAuthNFilterTest.java index 0d0e183c558..3f29ac313e9 100644 --- a/pdp/src/test/java/org/apache/ranger/pdp/security/RangerPdpAuthNFilterTest.java +++ b/pdp/src/test/java/org/apache/ranger/pdp/security/RangerPdpAuthNFilterTest.java @@ -55,6 +55,7 @@ public void testInit_registersHeaderHandlerWhenEnabled() throws Exception { params.put(RangerPdpConstants.PROP_AUTHN_TYPES, "header"); params.put(RangerPdpConstants.PROP_AUTHN_HEADER_ENABLED, "true"); + params.put(RangerPdpConstants.PROP_AUTHN_HEADER_USERNAME, "Some-X-Header"); filter.init(new TestFilterConfig(params));