You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ozone.apache.org by "Siyao Meng (Jira)" <ji...@apache.org> on 2020/03/27 19:06:00 UTC

[jira] [Updated] (HDDS-3047) ObjectStore#listVolumesByUser and CreateVolumeHandler#call should get principal name by default

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

Siyao Meng updated HDDS-3047:
-----------------------------
    Summary: ObjectStore#listVolumesByUser and CreateVolumeHandler#call should get principal name by default  (was: ObjectStore#listVolumesByUser and CreateVolumeHandler#call should get full principal name by default)

> ObjectStore#listVolumesByUser and CreateVolumeHandler#call should get principal name by default
> -----------------------------------------------------------------------------------------------
>
>                 Key: HDDS-3047
>                 URL: https://issues.apache.org/jira/browse/HDDS-3047
>             Project: Hadoop Distributed Data Store
>          Issue Type: Bug
>          Components: Ozone Client
>            Reporter: Siyao Meng
>            Assignee: Siyao Meng
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> [{{ObjectStore#listVolumesByUser}}|https://github.com/apache/hadoop-ozone/blob/2fa37ef99b8fb4575169ba8326eeb677b3d2ed74/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java#L249-L256] is using {{getShortUserName()}} by default (when user is empty or null):
> {code:java|title=ObjectStore#listVolumesByUser}
>   public Iterator<? extends OzoneVolume> listVolumesByUser(String user,
>       String volumePrefix, String prevVolume)
>       throws IOException {
>     if(Strings.isNullOrEmpty(user)) {
>       user = UserGroupInformation.getCurrentUser().getShortUserName();  // <--
>     }
>     return new VolumeIterator(user, volumePrefix, prevVolume);
>   }
> {code}
> It should use {{getUserName()}} instead.
> For a quick reference for the difference between {{getUserName()}} and {{getShortUserName()}}:
> {code:java|title=UserGroupInformation#getUserName}
>   /**
>    * Get the user's full principal name.
>    * @return the user's full principal name.
>    */
>   @InterfaceAudience.Public
>   @InterfaceStability.Evolving
>   public String getUserName() {
>     return user.getName();
>   }
> {code}
> {code:java|title=UserGroupInformation#getShortUserName}
>   /**
>    * Get the user's login name.
>    * @return the user's name up to the first '/' or '@'.
>    */
>   public String getShortUserName() {
>     return user.getShortName();
>   }
> {code}
> This won't cause issue if Kerberos is not in use. However, once Kerberos is enabled, {{getUserName()}} and {{getShortUserName()}} result differs and can cause some issues.
> When Kerberos is enabled, {{getUserName()}} returns full principal name e.g. {{om/om@EXAMPLE.COM}}, but {{getShortUserName()}} will return login name e.g. {{hadoop}}.
> If {{hadoop.security.auth_to_local}} is set, {{getShortUserName()}} result can become very different from full principal name.
> For example, when {{hadoop.security.auth_to_local = RULE:[2:$1@$0](.*)s/.*/root/}},
> {{getShortUserName()}} returns {{root}}, while {{getUserName()}} still gives {{om/om@EXAMPLE.COM}}.)
> This can lead to user experience issue (when Kerberos is enabled) where the user creates a volume with ozone shell ([uses {{getUserName()}}|https://github.com/apache/hadoop-ozone/blob/ecb5bf4df1d80723835a1500d595102f3f861708/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/web/ozShell/volume/CreateVolumeHandler.java#L63-L65] internally) then try to list it with {{ObjectStore#listVolumesByUser(null, ...)}} ([uses {{getShortUserName()}} by default|https://github.com/apache/hadoop-ozone/blob/2fa37ef99b8fb4575169ba8326eeb677b3d2ed74/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java#L238-L256] when user param is empty or null), the user won't see any volumes because of the mismatch.
> We should also double check *all* usages that uses {{getShortUserName()}}.
> *Update:*
> Xiaoyu and I checked that the usage of {{getShortUserName()}} on the server side shouldn't become a problem. Because server should've maintained it's own auth_to_local rules (admin should make sure they separate each user into different short names. just don't map multiple principal names into the same then it won't be a problem).
> The usage in {{BasicOzoneFileSystem}} itself also seems valid because that {{getShortUserName()}} is only used for client side purpose (to set {{workingDir}}, etc.).
> But the usage in {{ObjectStore#listVolumesByUser}} is confirmed problematic at the moment, which needs to be fixed. Same for [{{CreateVolumeHandler#call}}|https://github.com/apache/hadoop-ozone/blob/ecb5bf4df1d80723835a1500d595102f3f861708/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/web/ozShell/volume/CreateVolumeHandler.java#L81-L83]:
> {code:java|title=CreateVolumeHandler#call}
>       } else {
>         rootName = UserGroupInformation.getCurrentUser().getShortUserName();
>       }
> {code}
> It should pass full principal name to server.
> CC [~xyao] [~aengineer] [~arp] [~bharat]



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org