Nihal Jain created HBASE-29563:
----------------------------------
Summary: Shade, Relocate, and Transform a Minimal Set of Hadoop
Auth Filter Classes
Key: HBASE-29563
URL: https://issues.apache.org/jira/browse/HBASE-29563
Project: HBase
Issue Type: Improvement
Reporter: Nihal Jain
This JIRA proposes an alternative to creating a source-fork of Hadoop's
authentication classes i.e. HBASE-29557
The solution is to create a new {{hbase-auth-filters-shaded}} module that
isolates, relocates, and transforms only the specific, minimal set of Hadoop
authentication classes that HBase requires. This approach will target only the
{{org.apache.hadoop.security.authentication.server}} and
{{org.apache.hadoop.security.authentication.util}} packages. These will be
relocated into a clean {{org.apache.hbase.shaded}} namespace and have their
bytecode transformed from {{javax.servlet}} to {{{}jakarta.servlet{}}}. This
provides a surgical, low-impact solution to unblock HBase's migration to
Jakarta EE 10.
*Motivation*
The motivation remains to upgrade HBase's web servers (Web UI, REST, Thrift) to
Jetty 12 and the Jakarta EE 10 ecosystem. This proposal achieves that goal by
creating a private, Jakarta-compatible copy of the necessary authentication
filters, thereby resolving the dependency conflict without maintaining a source
fork.
*Proposed Change*
The implementation will be focused within a new {{hbase-auth-filters-shaded}}
Maven module and will use the Maven Shade Plugin to perform a highly specific
set of operations.
# *Create New Module:* A new Maven module, {{{}hbase-auth-filters-shaded{}}},
will be created.
# *Depend on {{{}hadoop-auth{}}}:* This module will depend on the official
{{hadoop-auth}} artifact.
# *Configure Precise Shading and Transformation:* The Maven Shade Plugin will
be configured with the following specific rules:
** *Include Only Necessary Packages:* The plugin will be explicitly configured
to _only_ include classes from the following two packages. All other classes
from {{hadoop-auth.jar}} will be excluded.
*** {{{}org.apache.hadoop.security.authentication.server{}}}: This contains
{{{}AuthenticationFilter{}}}, {{{}KerberosAuthenticationHandler{}}}, etc.
*** {{{}org.apache.hadoop.security.authentication.util{}}}: This contains
helpers like {{{}SignerSecretProvider{}}}.
** *Relocate to the {{org.apache.hbase.shaded}} Namespace:* The included
packages will be relocated to a new, private namespace to prevent classpath
conflicts.
*** *Source Pattern:* {{org.apache.hadoop.security.authentication}}
*** *Shaded Pattern:*
{{org.apache.hbase.shaded.org.apache.hadoop.security.authentication}}
*** This means a class like {{AuthenticationFilter}} will be moved from its
original package to
{{{}org.apache.hbase.shaded.org.apache.hadoop.security.authentication.server.AuthenticationFilter{}}}.
** *Transform {{javax}} to {{{}jakarta{}}}:* A resource transformer (e.g.,
Eclipse Transformer) will be applied during the shading process to rewrite the
bytecode of the relocated classes, replacing all {*}{{javax.servlet.}}{*}*
references with {*}{{jakarta.servlet.}}{*}*
# *Update HBase Server Modules:*
** The {{{}hbase-server{}}}, {{{}hbase-rest{}}}, and {{hbase-thrift}} modules
will be updated to depend on the new {{hbase-auth-filters-shaded}} module.
** Server-side code will be updated to import the relocated classes. For
example: {{import
org.apache.hbase.shaded.org.apache.hadoop.security.authentication.server.AuthenticationFilter;}}
*Pros*
* *Minimized Footprint:* By including only two specific packages, we create
the smallest possible artifact, reduce the attack surface, and simplify
maintenance.
* *Clean Namespace:* Using {{org.apache.hbase.shaded}} is a clear and
conventional way to denote an internally managed, private dependency.
* *Guaranteed Conflict Avoidance:* The relocation into a private namespace is
the key step that allows our new {{{}jakarta{}}}-based classes to coexist on
the classpath with Hadoop's original {{{}javax{}}}-based classes.
* *No Source Fork:* We avoid the long-term maintenance burden of a manual code
fork by consuming the official Hadoop artifact.
* *Simplified Upgrades:* Upstream security fixes can be incorporated by simply
updating the {{hadoop-auth}} version in the {{pom.xml}} and rebuilding.
*Cons/Risks*
* *Dependency on Hadoop Release Cycle:* We cannot patch the classes ourselves;
we must wait for an official {{hadoop-auth}} release to get fixes. Given the
stability of these classes, this is a low risk.
* *Build Complexity:* The {{pom.xml}} configuration for this module will be
more complex than a standard module, but it is a well-understood pattern.
*Alternatives (not chosen here)*
- HBASE-29557 Decouple dependency on Hadoop AuthenticationFilter classes
- Wait for Hadoop to move to Jakarta with HADOOP-19395: simplest short-term,
but keeps HBase blocked on Hadoop’s schedule.
*Compatibility/Support Notes*
- Server-internal change only; no wire or client API changes expected.
- Allows HBase to support Hadoop versions on javax today and those on Jakarta
in the future without forcing a drop of javax-era Hadoop immediately when
Hadoop switches.
- If/when Hadoop publishes Jakarta-native auth, we can evaluate switching to
their artifacts; because we’re decoupled, that can be done on our schedule.
*Acceptance Criteria*
* The {{hbase-auth-filters-shaded}} module successfully builds. The resulting
JAR contains *only* classes from the
{{org.apache.hadoop.security.authentication.server}} and
{{org.apache.hadoop.security.authentication.util}} packages.
* All classes within the artifact are successfully relocated under the
{{org.apache.hbase.shaded.*}} namespace.
* Bytecode analysis of the shaded classes confirms they reference
{*}{{javax.servlet.}}{*}* references ** with {*}{{jakarta.servlet.}}{*}{*}.
* HBase servers start and operate correctly using the relocated, transformed
classes.
* All existing authentication tests (Simple, Kerberos, REST, UI) pass without
regression.
*Fix Version(s)*
- Target: master, branch-3
*Class list identified for hbase-auth-filters*
Below is a minimal list of files we may have to shaded from hadoop; a PoC will
follow if others think this approach is worth investing our time in.
{code:java}
>> grep -r "javax.servlet." src/main | cut -d: -f1 | sort | uniq
src/main/java/org/apache/hadoop/security/authentication/server/AltKerberosAuthenticationHandler.java
src/main/java/org/apache/hadoop/security/authentication/server/AuthenticationFilter.java
src/main/java/org/apache/hadoop/security/authentication/server/AuthenticationHandler.java
src/main/java/org/apache/hadoop/security/authentication/server/AuthenticationToken.java
src/main/java/org/apache/hadoop/security/authentication/server/JWTRedirectAuthenticationHandler.java
src/main/java/org/apache/hadoop/security/authentication/server/KerberosAuthenticationHandler.java
src/main/java/org/apache/hadoop/security/authentication/server/LdapAuthenticationHandler.java
src/main/java/org/apache/hadoop/security/authentication/server/MultiSchemeAuthenticationHandler.java
src/main/java/org/apache/hadoop/security/authentication/server/PseudoAuthenticationHandler.java
src/main/java/org/apache/hadoop/security/authentication/util/CertificateUtil.java
src/main/java/org/apache/hadoop/security/authentication/util/FileSignerSecretProvider.java
src/main/java/org/apache/hadoop/security/authentication/util/RolloverSignerSecretProvider.java
src/main/java/org/apache/hadoop/security/authentication/util/SignerSecretProvider.java
src/main/java/org/apache/hadoop/security/authentication/util/ZKSignerSecretProvider.java{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)