[
https://issues.apache.org/jira/browse/HADOOP-19401?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17916856#comment-17916856
]
ASF GitHub Bot commented on HADOOP-19401:
-----------------------------------------
cnauroth opened a new pull request, #7325:
URL: https://github.com/apache/hadoop/pull/7325
### Description of PR
Under simple auth, UGI identifies the current Hadoop user as the OS user. If
the OS can't determine the user, then they receive a cryptic
`KerberosAuthException`, even though Kerberos auth isn't really configured.
I've seen this come up for Hadoop processes launched in Docker containers that
accidentally specify a UID that's not actually present in the image. We can
improve this error so that users have a better understanding of how to fix the
problem.
Here is how the Unix user identification flows through the JDK:
https://github.com/openjdk/jdk11u-dev/blob/master/src/jdk.security.auth/share/classes/com/sun/security/auth/UnixPrincipal.java#L65
https://github.com/openjdk/jdk11u-dev/blob/master/src/jdk.security.auth/share/classes/com/sun/security/auth/module/UnixLoginModule.java#L129
https://github.com/openjdk/jdk11u-dev/blob/master/src/jdk.security.auth/share/classes/com/sun/security/auth/module/UnixSystem.java#L55
Ultimately, this is just delegating to native syscalls to `getuid` and
`getpwuid`:
https://github.com/openjdk/jdk11u-dev/blob/master/src/jdk.security.auth/unix/native/libjaas/Unix.c#L82
### How was this patch tested?
One easy way to reproduce this problem is to exec inside the dev container
with a non-existent UID:
```
docker exec -it -u 123 690a92a9a5dc /bin/bash
_ _ _ ______
| | | | | | | _ \
| |_| | __ _ __| | ___ ___ _ __ | | | |_____ __
| _ |/ _` |/ _` |/ _ \ / _ \| '_ \ | | | / _ \ \ / /
| | | | (_| | (_| | (_) | (_) | |_) | | |/ / __/\ V /
\_| |_/\__,_|\__,_|\___/ \___/| .__/ |___/ \___| \_(_)
| |
|_|
This is the standard Hadoop Developer build environment.
This has all the right tools installed required to build
Hadoop from source.
I have no name!@690a92a9a5dc:~/hadoop$
```
Then, run UGI's main entry point:
```
I have no name!@690a92a9a5dc:/tmp/123/hadoop-3.4.1$ java -cp "$(bin/hadoop
classpath)" org.apache.hadoop.security.UserGroupInformation
Getting UGI for current user
Exception in thread "main" org.apache.hadoop.security.KerberosAuthException:
failure to login: javax.security.auth.login.LoginException:
java.lang.NullPointerException: invalid null input: name
at
jdk.security.auth/com.sun.security.auth.UnixPrincipal.<init>(UnixPrincipal.java:71)
at
jdk.security.auth/com.sun.security.auth.module.UnixLoginModule.login(UnixLoginModule.java:134)
at
java.base/javax.security.auth.login.LoginContext.invoke(LoginContext.java:755)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:679)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:677)
at
java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at
java.base/javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:677)
at
java.base/javax.security.auth.login.LoginContext.login(LoginContext.java:587)
at
org.apache.hadoop.security.UserGroupInformation$HadoopLoginContext.login(UserGroupInformation.java:2148)
at
org.apache.hadoop.security.UserGroupInformation.doSubjectLogin(UserGroupInformation.java:2053)
at
org.apache.hadoop.security.UserGroupInformation.createLoginUser(UserGroupInformation.java:733)
at
org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:683)
at
org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:590)
at
org.apache.hadoop.security.UserGroupInformation.main(UserGroupInformation.java:2302)
at
org.apache.hadoop.security.UserGroupInformation.doSubjectLogin(UserGroupInformation.java:2064)
at
org.apache.hadoop.security.UserGroupInformation.createLoginUser(UserGroupInformation.java:733)
at
org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:683)
at
org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:590)
at
org.apache.hadoop.security.UserGroupInformation.main(UserGroupInformation.java:2302)
Caused by: javax.security.auth.login.LoginException:
java.lang.NullPointerException: invalid null input: name
at
jdk.security.auth/com.sun.security.auth.UnixPrincipal.<init>(UnixPrincipal.java:71)
at
jdk.security.auth/com.sun.security.auth.module.UnixLoginModule.login(UnixLoginModule.java:134)
at
java.base/javax.security.auth.login.LoginContext.invoke(LoginContext.java:755)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:679)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:677)
at
java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at
java.base/javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:677)
at
java.base/javax.security.auth.login.LoginContext.login(LoginContext.java:587)
at
org.apache.hadoop.security.UserGroupInformation$HadoopLoginContext.login(UserGroupInformation.java:2148)
at
org.apache.hadoop.security.UserGroupInformation.doSubjectLogin(UserGroupInformation.java:2053)
at
org.apache.hadoop.security.UserGroupInformation.createLoginUser(UserGroupInformation.java:733)
at
org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:683)
at
org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:590)
at
org.apache.hadoop.security.UserGroupInformation.main(UserGroupInformation.java:2302)
at
java.base/javax.security.auth.login.LoginContext.invoke(LoginContext.java:850)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:679)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:677)
at
java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at
java.base/javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:677)
at
java.base/javax.security.auth.login.LoginContext.login(LoginContext.java:587)
at
org.apache.hadoop.security.UserGroupInformation$HadoopLoginContext.login(UserGroupInformation.java:2148)
at
org.apache.hadoop.security.UserGroupInformation.doSubjectLogin(UserGroupInformation.java:2053)
... 4 more
```
This is problematic for two reasons:
1. The `NullPointerException` from the JDK doesn't point the user toward how
to fix the problem.
1. The presence of `KerberosAuthException` actually misleads people into
thinking it's a Kerberos problem, even though this is simple auth.
After the patch, the error indicates a problem with the UID and avoids
mentioning Kerberos. This will point users in the right direction of looking at
problems with their OS user.
```
Exception in thread "main" java.io.IOException: Invalid UID, could not
determine effective user
at
org.apache.hadoop.security.UserGroupInformation.doSubjectLogin(UserGroupInformation.java:2087)
at
org.apache.hadoop.security.UserGroupInformation.createLoginUser(UserGroupInformation.java:734)
at
org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:684)
at
org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:591)
at
org.apache.hadoop.security.UserGroupInformation.main(UserGroupInformation.java:2326)
Caused by: javax.security.auth.login.LoginException:
java.lang.NullPointerException: invalid null input: name
at
jdk.security.auth/com.sun.security.auth.UnixPrincipal.<init>(UnixPrincipal.java:71)
at
jdk.security.auth/com.sun.security.auth.module.UnixLoginModule.login(UnixLoginModule.java:134)
at
java.base/javax.security.auth.login.LoginContext.invoke(LoginContext.java:755)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:679)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:677)
at
java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at
java.base/javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:677)
at
java.base/javax.security.auth.login.LoginContext.login(LoginContext.java:587)
at
org.apache.hadoop.security.UserGroupInformation$HadoopLoginContext.login(UserGroupInformation.java:2172)
at
org.apache.hadoop.security.UserGroupInformation.doSubjectLogin(UserGroupInformation.java:2067)
at
org.apache.hadoop.security.UserGroupInformation.createLoginUser(UserGroupInformation.java:734)
at
org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:684)
at
org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:591)
at
org.apache.hadoop.security.UserGroupInformation.main(UserGroupInformation.java:2326)
at
java.base/javax.security.auth.login.LoginContext.invoke(LoginContext.java:850)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:679)
at
java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:677)
at
java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at
java.base/javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:677)
at
java.base/javax.security.auth.login.LoginContext.login(LoginContext.java:587)
at
org.apache.hadoop.security.UserGroupInformation$HadoopLoginContext.login(UserGroupInformation.java:2172)
at
org.apache.hadoop.security.UserGroupInformation.doSubjectLogin(UserGroupInformation.java:2067)
... 4 more
```
### For code changes:
- [X] Does the title or this PR starts with the corresponding JIRA issue id
(e.g. 'HADOOP-17799. Your PR title ...')?
- [ ] Object storage: have the integration tests been executed and the
endpoint declared according to the connector-specific documentation?
- [ ] If adding new dependencies to the code, are these dependencies
licensed in a way that is compatible for inclusion under [ASF
2.0](http://www.apache.org/legal/resolved.html#category-a)?
- [ ] If applicable, have you updated the `LICENSE`, `LICENSE-binary`,
`NOTICE-binary` files?
> Improve error message when OS can't identify the current user.
> --------------------------------------------------------------
>
> Key: HADOOP-19401
> URL: https://issues.apache.org/jira/browse/HADOOP-19401
> Project: Hadoop Common
> Issue Type: Improvement
> Components: security
> Affects Versions: 3.3.4, 3.3.6, 3.4.1
> Reporter: Chris Nauroth
> Assignee: Chris Nauroth
> Priority: Major
>
> Under simple auth, UGI identifies the current Hadoop user as the OS user. If
> the OS can't determine the user, then they receive a cryptic
> {{KerberosAuthException}}, even though Kerberos auth isn't really configured.
> I've seen this come up for Hadoop processes launched in Docker containers
> that accidentally specify a UID that's not actually present in the image. We
> can improve this error so that users have a better understanding of how to
> fix the problem.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]