[ 
https://issues.apache.org/jira/browse/HADOOP-19249?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Steve Loughran resolved HADOOP-19249.
-------------------------------------
    Fix Version/s: 3.5.0
                   3.4.1
       Resolution: Fixed

> Getting NullPointerException when the unauthorised user tries to perform the 
> key operation
> ------------------------------------------------------------------------------------------
>
>                 Key: HADOOP-19249
>                 URL: https://issues.apache.org/jira/browse/HADOOP-19249
>             Project: Hadoop Common
>          Issue Type: Improvement
>          Components: common, security
>            Reporter: Dhaval Shah
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 3.5.0, 3.4.1
>
>
> While validating the tomcat 9.x in apache Ranger when user doesn't have 
> appropriate permission in Ranger policies we faced the NPE for key operation 
> using hadoop cmd.
> *Problem :*
> _Functionally -_ We are facing the NPE while performing key operations from 
> hadoop cmd with the user not having permission in policy on cluster with 
> tomcat v9.x. However with curl to Ranger KSM Server is working as expected.
> _Technically -_ Getting response message as null on client side in 
> hadoop-common at 
> [KMSClientProvider.java|https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/KMSClientProvider.java#L565]
> *E.G.*
> _with Ranger KMS tomcat v9.x_
> {code:java}
>  hadoop key list
> The list subcommand displays the keynames contained within
> a particular provider as configured in core-site.xml or
> specified with the -provider argument. -metadata displays
> the metadata. If -strict is supplied, fail immediately if
> the provider requires a password and none is given.
> Exception in thread "main" java.lang.NullPointerException
>       at 
> org.apache.hadoop.crypto.key.KeyShell.prettifyException(KeyShell.java:541)
>       at 
> org.apache.hadoop.crypto.key.KeyShell.printException(KeyShell.java:536)
>       at org.apache.hadoop.tools.CommandShell.run(CommandShell.java:79)
>       at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:81)
>       at org.apache.hadoop.crypto.key.KeyShell.main(KeyShell.java:553) {code}
> _on_ _Ranger KMS_ _tomcat v8.5.x_
> {code:java}
> hadoop key list
> The list subcommand displays the keynames contained within
> a particular provider as configured in core-site.xml or
> specified with the -provider argument. -metadata displays
> the metadata. If -strict is supplied, fail immediately ifthe provider 
> requires a password and none is given.
> Executing command failed with the following exception: 
> AuthorizationException: User:xyzuser not allowed to do 'GET_KEYS'{code}
> *Debug logs on Ranger KMS Server side*
> 1.) Added logs in 
> [KMSExceptionsProvider.java|https://github.com/apache/ranger/blob/master/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSExceptionsProvider.java]
>  in method _createResponse()_ and _toResponse()_ where we are generating 
> response to send it to client i.e. _hadoop-common_
> Logs are exactly same on both the tomcat scenario. Refer below the added 
> logs, detailed logs will be available in ranger kms log file on cluster. 
> {code:java}
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ==== Entered into toResponse =========
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ==== exception 
> =========org.apache.hadoop.security.authorize.AuthorizationException: 
> User:systest not allowed to do 'GET_KEYS'
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ==== exception.getClass() =========class 
> org.apache.hadoop.security.authorize.AuthorizationException
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ==== AuthorizationException =========
> 2024-07-25 11:35:51,452 WARN  org.apache.hadoop.crypto.key.kms.server.KMS: 
> [https-jsse-nio-9494-exec-2]: User syst...@root.comops.site (auth:KERBEROS) 
> request GET 
> https://ccycloud-1.ss-tomcat-test1.root.comops.site:9494/kms/v1/keys/names 
> caused exception.
> org.apache.hadoop.security.authorize.AuthorizationException: User:systest not 
> allowed to do 'GET_KEYS'
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ===== Entered into createResponse ======
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ==== status ======= Forbidden
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ======= ex ======= 
> org.apache.hadoop.security.authorize.AuthorizationException: User:systest not 
> allowed to do 'GET_KEYS'
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ======= ex.getStackTrace() ======= 
> [Ljava.lang.StackTraceElement;@3e75ae9d
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ======= ex.getMessage() ======= User:systest 
> not allowed to do 'GET_KEYS'
> 2024-07-25 11:35:51,452 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSExceptionsProvider: 
> [https-jsse-nio-9494-exec-2]: ======= ex.toString() ======= 
> org.apache.hadoop.security.authorize.AuthorizationException: User:systest not 
> allowed to do 'GET_KEYS'  {code}
> 2.) Also added logs in 
> [KMSExceptionsProvider.java|https://github.com/apache/ranger/blob/master/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSExceptionsProvider.java]
> Adding logs in code base
> {code:java}
> public void setStatus(int sc, String sm) {
>         LOG.info("========= setStatus with message============ ");
>       statusCode = sc;
>       msg = sm;
>         LOG.info("========= sc ============ " +sc);
>         LOG.info("========= msg ============ " +msg);
>             if(sc == 403) {
>                 LOG.info("===== its 403 ====");
>                 super.setStatus(sc, sm);
>             } else{
>                 super.setStatus(sc, sm);
>             }
>     } {code}
> LOGS:
> {code:java}
> 2024-07-25 11:35:51,460 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSAuthenticationFilter: 
> [https-jsse-nio-9494-exec-2]: ========= setStatus with message============
> 2024-07-25 11:35:51,460 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSAuthenticationFilter: 
> [https-jsse-nio-9494-exec-2]: ========= sc ============ 403
> 2024-07-25 11:35:51,460 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSAuthenticationFilter: 
> [https-jsse-nio-9494-exec-2]: ========= msg ============ Forbidden
> 2024-07-25 11:35:51,460 INFO  
> org.apache.hadoop.crypto.key.kms.server.KMSAuthenticationFilter: 
> [https-jsse-nio-9494-exec-2]: ===== its 403 ==== {code}
> This explains that the KMS server is sending the code and message 
> appropriately.
> *Debug logs on Hadoop Common Client side*
> 1.) Added logs in 
> [HttpExceptionUtils.java|https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/HttpExceptionUtils.java]
>  to make sure whether appropriate response is received.
> Logs will be available in ranger kms log file.
> {code:java}
> 2024-07-25 11:35:51,453 INFO  org.apache.hadoop.util.HttpExceptionUtils: 
> [https-jsse-nio-9494-exec-2]: ====== Entered into 
> createJerseyExceptionResponse ====
> 2024-07-25 11:35:51,453 INFO  org.apache.hadoop.util.HttpExceptionUtils: 
> [https-jsse-nio-9494-exec-2]: ========== ex ========   
> org.apache.hadoop.security.authorize.AuthorizationException: User:systest not 
> allowed to do 'GET_KEYS'
> 2024-07-25 11:35:51,454 INFO  org.apache.hadoop.util.HttpExceptionUtils: 
> [https-jsse-nio-9494-exec-2]: ========== ex.getMessage ========   
> User:systest not allowed to do 'GET_KEYS'
> 2024-07-25 11:35:51,454 INFO  org.apache.hadoop.util.HttpExceptionUtils: 
> [https-jsse-nio-9494-exec-2]: ========== status ========   Forbidden
> 2024-07-25 11:35:51,454 INFO  org.apache.hadoop.util.HttpExceptionUtils: 
> [https-jsse-nio-9494-exec-2]: ========== status.getStatusCode ========   403
> 2024-07-25 11:35:51,454 INFO  org.apache.hadoop.util.HttpExceptionUtils: 
> [https-jsse-nio-9494-exec-2]: ========== status.getReasonPhrase ========   
> Forbidden
> 2024-07-25 11:35:51,454 INFO  org.apache.hadoop.util.HttpExceptionUtils: 
> [https-jsse-nio-9494-exec-2]:  =======  response  ======== 
> com.sun.jersey.core.spi.factory.ResponseImpl@5bd8a59b  {code}
> 2.) Added logs exactly before NPE occurs  i.e. 
> [KMSClientProvider.java|https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/KMSClientProvider.java#L564]
> Adding logs in code base
> LOG.info(" =========== conn ======== " + conn);
> Map<String, List<String>> map = conn.getHeaderFields();
> LOG.info("======= map ======== " + map);for (Map.Entry<String, List<String>> 
> entry : map.entrySet()) {
>   LOG.info("=============== " + "Key : " + entry.getKey() +          " ,Value 
> : " + entry.getValue());
> }
> LOG.info(" =========== conn.getResponseMessage ======== " + 
> conn.getResponseMessage());
> LOG.info(" =========== conn.getResponseCode ======== " + 
> conn.getResponseCode());if ((conn.getResponseCode() == 
> HttpURLConnection.HTTP_FORBIDDEN
>     && (conn.getResponseMessage().equals(ANONYMOUS_REQUESTS_DISALLOWED) ||
>         conn.getResponseMessage().contains(INVALID_SIGNATURE)))
>     || conn.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED) { 
> LOGS: This logs gets printed on terminal where we execute hadoop cmd .
> _with Ranger KMS tomcat v9.x_
> {code:java}
> hadoop key list
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: ======== Entered into call 
> ========
> 24/07/25 11:38:15 INFO kms.KMSClientProvider:  =========== conn ======== 
> sun.net.www.protocol.https.DelegateHttpsURLConnection:https://ccycloud-1.ss-tomcat-test1.root.comops.site:9494/kms/v1/keys/names
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: ======= map ======== 
> {Keep-Alive=[timeout=60], null=[HTTP/1.1 403], 
> Strict-Transport-Security=[max-age=31536000; includeSubDomains; preload], 
> Server=[Apache Ranger], Connection=[keep-alive], Content-Length=[220], 
> Date=[Thu, 25 Jul 2024 11:38:15 GMT], Content-Type=[application/json]}
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: =============== Key : 
> Keep-Alive ,Value : [timeout=60]
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: =============== Key : null 
> ,Value : [HTTP/1.1 403]
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: =============== Key : 
> Strict-Transport-Security ,Value : [max-age=31536000; includeSubDomains; 
> preload]
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: =============== Key : Server 
> ,Value : [Apache Ranger]
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: =============== Key : 
> Connection ,Value : [keep-alive]
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: =============== Key : 
> Content-Length ,Value : [220]
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: =============== Key : Date 
> ,Value : [Thu, 25 Jul 2024 11:38:15 GMT]
> 24/07/25 11:38:15 INFO kms.KMSClientProvider: =============== Key : 
> Content-Type ,Value : [application/json]
> 24/07/25 11:38:15 INFO kms.KMSClientProvider:  =========== 
> conn.getResponseMessage ======== null
> 24/07/25 11:38:15 INFO kms.KMSClientProvider:  =========== 
> conn.getResponseCode ======== 403
> list [-provider <provider>] [-strict] [-metadata] [-help]:
> The list subcommand displays the keynames contained within
> a particular provider as configured in core-site.xml or
> specified with the -provider argument. -metadata displays
> the metadata. If -strict is supplied, fail immediately if
> the provider requires a password and none is given.
> Exception in thread "main" java.lang.NullPointerException
>       at 
> org.apache.hadoop.crypto.key.KeyShell.prettifyException(KeyShell.java:541)
>       at 
> org.apache.hadoop.crypto.key.KeyShell.printException(KeyShell.java:536)
>       at org.apache.hadoop.tools.CommandShell.run(CommandShell.java:79)
>       at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:81)
>       at org.apache.hadoop.crypto.key.KeyShell.main(KeyShell.java:553) {code}
> _with Ranger KMS tomcat v8.5.x_
> hadoop key list
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: ======== Entered into call 
> ========
> 24/07/25 11:02:25 INFO kms.KMSClientProvider:  =========== conn ======== 
> sun.net.www.protocol.https.DelegateHttpsURLConnection:https://ccycloud-1.ds-tomcat-test1.root.comops.site:9494/kms/v1/keys/names24/07/25
>  11:02:25 INFO kms.KMSClientProvider: ======= map ======== 
> {Keep-Alive=[timeout=60], null=[HTTP/1.1 403 Forbidden], 
> Strict-Transport-Security=[max-age=31536000; includeSubDomains; preload], 
> Server=[Apache Ranger], Connection=[keep-alive], Content-Length=[220], 
> Date=[Thu, 25 Jul 2024 11:02:25 GMT], Content-Type=[application/json]}
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: =============== Key : 
> Keep-Alive ,Value : [timeout=60]
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: =============== Key : null 
> ,Value : [HTTP/1.1 403 Forbidden]
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: =============== Key : 
> Strict-Transport-Security ,Value : [max-age=31536000; includeSubDomains; 
> preload]
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: =============== Key : Server 
> ,Value : [Apache Ranger]
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: =============== Key : 
> Connection ,Value : [keep-alive]
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: =============== Key : 
> Content-Length ,Value : [220]
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: =============== Key : Date 
> ,Value : [Thu, 25 Jul 2024 11:02:25 GMT]
> 24/07/25 11:02:25 INFO kms.KMSClientProvider: =============== Key : 
> Content-Type ,Value : [application/json]
> 24/07/25 11:02:25 INFO kms.KMSClientProvider:  =========== 
> conn.getResponseMessage ======== Forbidden
> 24/07/25 11:02:25 INFO kms.KMSClientProvider:  =========== 
> conn.getResponseCode ======== 403
> Cannot list keys for KeyProvider: 
> org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@209da20d
> list [-provider <provider>] [-strict] [-metadata] [-help]:
> The list subcommand displays the keynames contained within
> a particular provider as configured in core-site.xml or
> specified with the -provider argument. -metadata displays
> the metadata. If -strict is supplied, fail immediately ifthe provider 
> requires a password and none is given.
> Executing command failed with the following exception: 
> AuthorizationException: User:xyzuser not allowed to do 'GET_KEYS' 
> Please notice 
> _with tomcat v9.x : *Key : null ,Value : [HTTP/1.1 403]*_ 
> _with. tomcat v8.5.x : *Key : null ,Value : [HTTP/1.1 403 Forbidden]*_
> **
> Message "Forbidden" is not present with tomcat v9.x.
> It seems that tomcat v9.x is not setting the message and hadoop-common is 
> trying to get where we are facing  NPE.
> Also checked for _*org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER*_ but 
> its not available in tomcat 9.x
> Ref:
> Tomcat Doc for 8.5.x 
> [https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/coyote/Constants.html#USE_CUSTOM_STATUS_MSG_IN_HEADER]
> Tomcat Doc for 9.x 
> [https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/coyote/Constants.html]
> Thanks
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: common-dev-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-dev-h...@hadoop.apache.org

Reply via email to