wchevreuil commented on a change in pull request #884: HBASE-23347 Allowable custom authentication methods for RPCs URL: https://github.com/apache/hbase/pull/884#discussion_r351733518
########## File path: PluggableRpcAuthentication.md ########## @@ -0,0 +1,140 @@ +# Pluggable Authentication for HBase RPCs + +## Background + +As a distributed database, HBase must be able to authenticate users and HBase +services across an untrusted network. Clients and HBase services are treated +equivalently in terms of authentication (and this is the only time we will +draw such a distinction). + +There are currently three modes of authentication which are supported by HBase +today via the configuration property `hbase.security.authentication` + +1. `SIMPLE` +2. `KERBEROS` +3. `TOKEN` + +`SIMPLE` authentication is effectively no authentication; HBase assumes the user +is who they claim to be. `KERBEROS` uses authenticates clients via the KerberosV5 +protocol using the GSSAPI mechanism of the Java Simple Authentication and Security +Layer (SASL) protocol. `TOKEN` is a username-password based authentication protocol +which uses short-lived passwords that can only be obtained via a `KERBEROS` authenticated +request. `TOKEN` authentication is synonymous with Hadoop-style [Delegation Tokens](https://steveloughran.gitbooks.io/kerberos_and_hadoop/content/sections/hadoop_tokens.html#delegation-tokens). `TOKEN` authentication uses the `DIGEST-MD5` +SASL mechanism. + +[SASL](https://docs.oracle.com/javase/8/docs/technotes/guides/security/sasl/sasl-refguide.html) +is a library which specifies a network protocol that can authenticate a client +and a server using an arbitrary mechanism. SASL ships with a [number of mechanisms](https://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.xhtml) +out of the box and it is possible to implement custom mechanisms. SASL is effectively +decoupling an RPC client-server model from the mechanism used to authenticate those +requests (e.g. the RPC code is identical whether username-password, Kerberos, or any +other method is used to authenticate the request). + +The `SIMPLE` implementation does not use SASL, but instead has its own RPC logic +built into the HBase RPC protocol. `KERBEROS` and `TOKEN` both use SASL to authenticate, +relying on the `Token` interface that is intertwined with the Hadoop `UserGroupInformation` +class. SASL decouples an RPC from the mechanism used to authenticate that request. + +## Problem statement + +Despite HBase already shipping authentication implementations which leverage SASL, +it is (effectively) impossible to add a new authentication implementation to HBase. The +use of the `org.apache.hadoop.hbase.security.AuthMethod` enum makes it impossible +to define a new method of authentication. Also, the RPC implementation is written +to only use the methods that are expressly shipped in HBase. Adding a new authentication +method would require copying and modifying the RpcClient implementation. + +While it is possible to add a new authentication method to HBase, it cannot be done +cleanly or sustainably. This is what is meant by "impossible". + +## Proposal + +HBase should expose interfaces which allow for pluggable authentication mechanisms +such that HBase can authenticate against external systems. Because the RPC implementation +can already support SASL, HBase can standardize on SASL, allowing any authentication method +which is capable of using SASL to negotiate authentication. `KERBEROS` and `TOKEN` methods +will naturally fit into these new interfaces, but `SIMPLE` authentication will not (see the following +chapter for a tangent on SIMPLE authentication today) + +### Tangent: on SIMPLE authentication + +`SIMPLE` authentication in HBase today is treated as a special case. My impression is that +this stems from HBase not originally shipping an RPC solution that had any authentication. + +Re-implementing `SIMPLE` authentication such that it also flows through SASL (e.g. via +the `PLAIN` SASL mechanism) would simplify the HBase codebase such that all authentication +occurs via SASL. This was not done for the initial implementation to reduce the scope +of the changeset. Changing `SIMPLE` authentication to use SASL may result in some +performance impact in setting up a new RPC. The same conditional logic to determine +`if (sasl) ... else SIMPLE` logic is propagated in this implementation. + +## Implementation Overview + +HBASE-XXXXX includes a refactoring of HBase RPC authentication where all current methods Review comment: nit: I guess we now know this is HBASE-23347? ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services