<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>

<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

<!-- XML source for the Requirement Wars internet draft document -->

<!-- To generate text with the xml2rfc tool tclsh8.3 xml2rfc.tcl 
     xml2rfc this_file.xml that_file.txt which puts the formatted 
     text into that_file.txt -->

<!-- processing instructions (for a complete list and description,
     see file http://xml.resource.org/authoring/README.html -->

<!-- try to enforce the ID-nits conventions and DTD validity -->

<?rfc strict="yes" ?>

<!-- items used when reviewing the document -->

<?rfc comments="yes" ?>  <!-- controls display of <cref> elements -->
<?rfc inline="yes" ?>    <!-- when no, put comments at end in comments section,
                                otherwise, put inline -->
<?rfc editing="no" ?>   <!-- when yes, insert editing marks -->

<!-- create table of contents (set it options).  
     Note the table of contents may be omitted
     for very short documents --> 

<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>

<!-- choose the options for the references. Some like
     symbolic tags in the references (and citations)
     and others prefer numbers. --> 

<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>

<!-- these two save paper: start new paragraphs from the same page etc. -->

<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>

<!-- end of list of processing instructions -->

<rfc
    category="std"
    ipr="trust200902"
    docName="draft-ietf-nfsv4-umask-05" >

<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

<front>
    <title abbrev="NFSv4 umask">
      Allowing Inheritable NFSv4 Access Control Entries to Override the Umask
    </title>

    <author fullname="J. Bruce Fields"
            initials="J. B."
            surname="Fields">
      <organization abbrev="Red Hat">Red Hat, Inc.</organization>
      <address>
        <email>bfields@redhat.com</email>
      </address>
    </author>
    <author fullname="Andreas Gruenbacher"
            initials="A."
	    surname="Gruenbacher">
      <organization abbrev="Red Hat">Red Hat, Inc.</organization>
      <address>
        <email>agruenba@redhat.com</email>
      </address>
    </author>

    <date year="2017" month="August" day="30"/>

    <area>Transport</area>
    <workgroup>NFSv4</workgroup>
    <keyword>NFSv4</keyword>

    <abstract>
      <t>

	In many environments, inheritable NFSv4 Access Control Entries
	(ACEs) can be rendered ineffective by the application of the
	per-process umask.  This can be addressed by transmitting the
	umask and create mode as separate pieces of data, allowing the
	server to make more intelligent decisions about the permissions
	to set on new files.  This document proposes a protocol
	extension which accomplishes that.

      </t>
    </abstract>
</front>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->
<middle>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

<section anchor="ssc:solution:conv" title="Conventions Used in This Document">
  <t>
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
    "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
    document are to be interpreted as described in <xref target="RFC2119" />.
  </t>
</section>

<section anchor="sec:intro" title="Problem Statement">
  <t>
    On Unix-like systems, each process is associated with a file mode
    creation mask (umask), which specifies which permissions must be
    turned off when creating new file system objects.
  </t>

  <t>
    When applying the mode, section 6.4.1.1 of <xref target='RFC7530'/>
    recommends that servers SHOULD restrict permissions granted to any
    user or group named in the Access Control List (ACL) to be no more
    than the permissions granted by the MODE4_RGRP, MODE4_WGRP, and
    MODE4_XGRP bits.  Servers aiming to provide clients with Unix-like
    chmod behavior may also be motivated by the same requirements in
    <xref target='SUSv4'/>.  (See the discussion of additional and
    alternate access control mechanisms in section "4.4 File
    Permissions" of that document.)
  </t>

  <t>
    On many existing installations, all ordinary users by default use
    the same effective group ID.  To prevent granting all users full
    access to each other's files, such installations usually default to
    a umask with very restrictive permissions.  As a result, inherited
    ACL entries (inheritable ACEs) describing the permissions to be
    granted to named users and groups are often ignored.  This makes
    inheritable ACEs useless in some common cases.
  </t>

  <t>
    Linux solves this problem on local filesystems by ignoring the umask
    in the case the parent of the newly-created file has inheritable
    ACEs; see <xref target='LinuxACL'/>.
  </t>

  <t>
    The same solution should work for NFS.  However, the NFSv4 protocol
    does not currently give the client a way to transmit the umask of
    the process opening a file.  And clients have no way of atomically
    checking for inheritable permissions and applying the umask only
    when necessary.  As a result, the server receives an OPEN with a
    mode attribute that already has the umask applied.
  </t>

  <t>
    This document solves the problem by defining a new attribute which
    allows the client to transmit umask and the mode specified at file
    creation separately, allowing the client to ignore the umask in the
    presence of inheritable ACEs.  At least in the Linux case, this
    allows NFSv4 to provide the same semantics available using local
    access.
  </t>

</section>

<section anchor="sec:extension" title="Protocol Extension Considerations">

  <t>
    This document presents an extension to minor version 2 of the NFSv4
    protocol as described in <xref target='nfsv4-versioning'/>.  It
    describes a new OPTIONAL feature.  NFSv4.2 servers and clients
    implemented without knowledge of this extension will continue to
    interoperate with clients and servers that are aware of the
    extension (whether they support it or not).
  </t>

  <t>
    Note that <xref target='RFC7862'/> does not define NFSv4.2 as
    non-extensible, so that it is considered by <xref
    target='nfsv4-versioning'/> to be an extensible minor version.  As a
    result, upon publication of this document as a Proposed Standard,
    the extension described herein will effectively be part of NFSv4.2,
    even though this document does not update <xref target='RFC7862'/>
    or <xref target='RFC7863'/>.
  </t>

</section>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

<section anchor="xdr" title="XDR Extraction">
  <t>
    The additional lines of external data representation (XDR)
    <xref target='RFC4506' /> description
    embedded in this document can be extracted
    by feeding this document
    into the following shell script:
  </t>

  <t>
    &lt;CODE BEGINS&gt;
  </t>

  <figure>
    <artwork>
#!/bin/sh
grep '^ *///' $* | sed 's?^ */// ??' | sed 's?^ *///$??'
    </artwork>
  </figure>

  <t>
    &lt;CODE ENDS&gt;
  </t>

  <t>
    That is, if the above script is stored in a file called "extract.sh", and
    this document is in a file called "umask.txt", then the reader can do:
  </t>

  <figure>
    <artwork>
sh extract.sh &lt; umask.txt &gt; umask.x
    </artwork>
  </figure>

  <t>
    The effect of the script is to remove leading white space from each
    line, plus a sentinel sequence of "///".
  </t>

  <t>
    Once that extraction is done, these added lines need to be
    inserted into an appropiate base XDR of the generated
    XDR from <xref target="RFC7863"/>, together with XDR from
    any additional extensions to be recognized by the implementation.
    This will result in a ready-to-compile XDR file.
  </t>

</section>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

<section anchor="sec:solution" title="mode_umask Attribute">

  <t>
    &lt;CODE BEGINS&gt;
  </t>
  <figure>
    <artwork>
///   struct mode_umask4 {
///     mode4  mu_mode;
///     mode4  mu_umask;
///   };
///
///   %/*
///   % * New For UMASK
///   % */
///   const FATTR4_MODE_UMASK         = 81;
    </artwork>
  </figure>
  <t>
    &lt;CODE ENDS&gt;
  </t>

  <texttable anchor="tbl:rec_attr">
    <ttcol align="left">Name</ttcol>
    <ttcol align="left">Id</ttcol>
    <ttcol align="left">Data Type</ttcol>
    <ttcol align="left">Acc</ttcol>
    <ttcol align="left">Defined in</ttcol>
    <c>mode_umask</c>    <c>81</c> <c>mode_umask4</c>           <c>  W</c> <c><xref target="sec:solution" /></c>
  </texttable>

  <t>
    The NFSv4.2 mode_umask attribute is based on the umask and on the
    mode bits specified at open time, which together determine the mode
    of a newly created UNIX file.  Only the nine low-order mode4 bits of
    mu_umask are defined.  A server MUST return NFS4ERR_INVAL if bits
    other than those nine are set.
  </t>

  <t>
    The mode_umask attribute is only meaningful for operations that
    create objects (CREATE and OPEN); in other operations that take
    fattr4 arguments, the server MUST reject it with NFS4ERR_INVAL.
  </t>

  <t>
    The server MUST return NFS4ERR_INVAL if the client attempts to set
    both mode and mode_umask in the same operation.
  </t>

  <t>
    When the server supports the mode_umask attribute, a client creating
    a file should use mode_umask in place of mode, with mu_mode set to
    the unmodified mode provided by the user, and mu_umask set to the
    umask of the requesting process.
  </t>

  <t>
    The server then uses mode_umask as follows:
    <list style="symbols">
      <t>On a server that supports ACL attributes, if an object inherits
      any ACEs from its parent directory, mu_mode SHOULD be used,
      and mu_umask ignored.</t>
      <t>Otherwise, mu_umask MUST be used to limit the mode: all bits
      in the mode MUST be turned off which are set in the umask; the
      mode assigned to the new object becomes (mu_mode &amp; ~mu_umask)
      instead.  </t>
    </list>
  </t>

</section>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

<section anchor="sec:security" title="Security Considerations">
  <t>
    The mode_umask attribute shifts to the server the decision about
    when to apply the umask.  Because the server MUST apply the umask if
    there are no inheritable permissions, the traditional semantics are
    preserved in the absence of a permission inheritance mechanism.
    The only relaxation of permissions comes in the case servers follow
    the recommendation that they ignore the umask in the presence of
    inheritable permissions.
  </t>

  <t>
    The practice of ignoring the umask when there are inheritable
    permissions in the form of a "POSIX" default ACL is of long standing
    and has not given rise to security issues. The "POSIX" default ACL
    mechanism and the mechanism for permission inheritance in NFSv4 are
    equivalent from a security perspective.
  </t>
</section>

<section anchor="sec:IANA" title="IANA Considerations">
  <t>This document does not require any actions by IANA.</t>
</section>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

</middle>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

<back>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

  <references title="Normative References">

    <reference anchor='RFC2119'>
      <front>
	<title abbrev='RFC Key Words'>Key words for use in RFCs to Indicate Requirement Levels</title>
	<author initials='S.' surname='Bradner' fullname='Scott Bradner'>
	  <organization>Harvard University</organization>
	  <address>
	    <postal>
	      <street>1350 Mass. Ave.</street>
	      <street>Cambridge</street>
	    <street>MA 02138</street></postal>
	    <phone>- +1 617 495 3864</phone>
     	<email>sob@harvard.edu</email></address></author>
     	<date year='1997' month='March' />
      </front>
    </reference>

  <reference anchor='RFC4506'>
    <front>
    <title abbrev='XDR'>XDR: External Data Representation Standard</title>
    <author initials='M.' surname='Eisler' fullname='Mike Eisler'>
    <organization>Network Appliance, Inc.</organization>
    </author>
    <date month='May' year='2006'/>
    </front>
    <seriesInfo name='STD' value='67' />
    <seriesInfo name="RFC" value="4506"/>
  </reference>

  <reference anchor='RFC7530'>
    <front>
      <title>Network File System (NFS) version 4 Protocol</title>
      <author initials="T." surname="Haynes" fullname="T. Haynes">
        <organization>Primary Data</organization>
      </author>
      <author initials="D." surname="Noveck" fullname="D. Noveck">
        <organization>Dell</organization>
      </author>
      <date year="2015" month="March"/>
    </front>
    <seriesInfo name="RFC" value="7530"/>
  </reference>

  <reference anchor='RFC7862'>
    <front>
      <title>Network File System (NFS) Version 4 Minor Version 2
        Protocol</title>
      <author initials="T." surname="Haynes" fullname="T. Haynes">
        <organization>Primary Data</organization>
      </author>
      <date year="2016" month="November"/>
    </front>
    <seriesInfo name="RFC" value="7862"/>
  </reference>

  <reference anchor='RFC7863'>
    <front>
      <title>Network File System (NFS) Version 4 Minor Version 2
        External Data Representation Standard (XDR) Description</title>
      <author initials="T." surname="Haynes" fullname="T. Haynes">
        <organization>Primary Data</organization>
      </author>
      <date year="2016" month="November"/>
    </front>
    <seriesInfo name="RFC" value="7863"/>
  </reference>

  <reference anchor='nfsv4-versioning'>
    <front>
      <title>Rules for NFSv4 Extensions and Minor Versions</title>
      <author initials='D' surname='Noveck' fullname='D. Noveck'>
        <organization>HPE</organization>
      </author>
      <date month='December' year='2016'/>
    </front>
    <seriesInfo name='Internet-Draft'
                value='draft-ietf-nfsv4-versioning-08'/>
    <format type='html'
      target='https://tools.ietf.org/html/draft-ietf-nfsv4-versioning-08'/>
  </reference>

</references>

<references title="Informative References">

  <reference anchor="LinuxACL" target='http://kernel.org/doc/man-pages/online/pages/man5/acl.5.html'>
    <front>
      <title>ACL(5) - Access Control Lists</title>
      <author initials='A' surname='Gruenbacher' fullname='Andreas Gruenbacher'></author>
      <date month="March" year="2002"/>
    </front>
    <seriesInfo name='Linux man pages' value='ACL(5)'/>
    <format type='html'
      target='http://kernel.org/doc/man-pages/online/pages/man5/acl.5.html'/>
  </reference>

  <reference anchor='SUSv4'>
    <front>
      <title>Single UNIX Specification Version 4</title>
      <author>
        <organization>The Open Group</organization>
      </author>
      <date year="2013"/>
    </front>
  </reference>

</references>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

<section title="Acknowledgments">
<t>

Thanks to Trond Myklebust and Dave Noveck for the suggestion to define
this as a (mode, umask) pair rather than just umask.  Thanks for review
to them and to Warren Kumari, Adam Roach, Spencer Dawkins, Mike Kupfer,
and Thomas Haynes for review, and to Thomas Haynes for XDR help.

</t>
</section>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

</back>
<!-- Copyright (C) The IETF Trust (2014) -->
<!-- Copyright (C) The Internet Society (2014) -->

</rfc>
