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

Chris Nauroth updated HADOOP-11321:
-----------------------------------
    Attachment: HADOOP-11321.003.patch

Patch v3 implements a native code solution for creating local file system 
directories and files with an initial security descriptor equivalent to the 
mode passed by the caller.  I have tested this locally.  It fixes the original 
reported problem for a Windows client accessing an SMB share.  For a Linux 
client accessing an SMB share, there is no change in behavior in the Hadoop 
code, and it still works fine via the error handling in Linux CIFS mounts 
(silently ignoring the chmod failure).

Here is a description of the changes.
* {{RawLocalFileSystem}}: On Windows, make a JNI call to open a file descriptor 
for write instead of using {{java.io.FileOutputStream}}.  There are 2 new 
methods that can be overridden in subclasses: {{mkOneDirWithMode}} and 
{{createOutputStreamWithMode}}.  These are intended to support 
{{ElevatedRawLocalFileSystem}}, discussed in more detail below.  We cannot 
remove the older protected methods {{mkOneDir}} and {{createOutputStream}}, 
because the class is annotated {{Public}} and {{Stable}}.  These are now 
implemented as simple forwarding methods.
* {{ChecksumFileSystem}}: This needed to change some of the file creation calls 
it uses on the wrapped file system to pass down the mode.  There is one awkward 
point here that required an {{instanceof}} check, but I think it's preferable 
over adding more abstract methods to {{FileSystem}} just to cover one special 
case.  Several calls are rerouted to equivalent overloaded methods that can 
accept mode as an argument.
* {{NativeIO}}: Added Windows-specific JNI wrappers for a native implementation 
of directory and file creation.  For file creation, I needed to be careful to 
match the semantics that were implemented by {{java.io.FileOutputStream}}.  
This involved reading a bit of the JDK code, and I've described the details in 
comments.
* {{NativeIO.c}}: Added JNI implementations for the 2 new functions.  These are 
pretty boring and just pass through to the real action in...
* {{libwinutils.c}}: This contains the implementation of calling the relevant 
Windows APIs.  I've reused our implementation of translating a mode to a 
discretionary access control list ({{GetWindowsDACLs}}), so this will be 
consistent with, for example, {{winutils.exe chmod}}.
* {{WindowsSecureContainerExecutor}}: This needed some adjustment to be able to 
handle the changes required in {{RawLocalFileSystem}}.  [~rusanu], this 
implementation still does creation and setting permissions in separate 
syscalls.  I suppose we could consolidate to a single syscall if we update the 
IDL for the RPC protocol to accept a mode argument, but I didn't want to tackle 
that in this patch.  I also don't know the compatibility constraints around 
versioning this RPC protocol.  This change was focused on a bug fix related to 
SMB shares.  I don't believe this is a major limitation for 
{{ElevatedRawLocalFileSystem}}.  If NodeManager is running backed by an SMB 
share for the localization directory, then there are probably lots of other 
problems anyway.  :-)  If you think it's important to come back to this, please 
file a separate jira for that.

> copyToLocal cannot save a file to an SMB share unless the user has Full 
> Control permissions.
> --------------------------------------------------------------------------------------------
>
>                 Key: HADOOP-11321
>                 URL: https://issues.apache.org/jira/browse/HADOOP-11321
>             Project: Hadoop Common
>          Issue Type: Bug
>          Components: fs
>    Affects Versions: 2.6.0
>            Reporter: Chris Nauroth
>            Assignee: Chris Nauroth
>         Attachments: HADOOP-11321.003.patch, HADOOP-11321.1.patch, 
> HADOOP-11321.2.patch, winutils.tmp.patch
>
>
> In Hadoop 2, it is impossible to use {{copyToLocal}} to copy a file from HDFS 
> to a destination on an SMB share.  This is because in Hadoop 2, the 
> {{copyToLocal}} maps to 2 underlying {{RawLocalFileSystem}} operations: 
> {{create}} and {{setPermission}}.  On an SMB share, the user may be 
> authorized for the {{create}} but denied for the {{setPermission}}.  Windows 
> denies the {{WRITE_DAC}} right required by {{setPermission}} unless the user 
> has Full Control permissions.  Granting Full Control isn't feasible for most 
> deployments, because it's insecure.  This is a regression from Hadoop 1, 
> where {{copyToLocal}} only did a {{create}} and didn't do a separate 
> {{setPermission}}.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to