All of lore.kernel.org
 help / color / mirror / Atom feed
* NFSv4 ACL and POSIX interaction / mask
@ 2006-07-03 21:10 Andreas Gruenbacher
  2006-07-07 11:55 ` NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready Andreas Gruenbacher
  0 siblings, 1 reply; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-03 21:10 UTC (permalink / raw)
  To: nfsv4; +Cc: nfs

Hello,

I have been thinking about the problems of interaction between NFSv4 ACLs and 
POSIX, and particularly about the issue of masking permissions through chmod 
and after creating files or directories.

On a UNIX system that supports NFSv4 ACLs natively, I think we should try to 
accept as wide a range of NFSv4 ACLs as possible, but we must make sure that 
we can preserve POSIX semantics. In particular, this means that ACLs may 
contain ACEs for users other than OWNER@, GROUP@, and EVERYONE@, and that 
chmod(2) must continue to provide the same kinds of guarantees as without 
NFSv4 ACLs.

I am assuming here that NFSv4 ACLs shall be an additional rather than an 
alternate file access control mechanism in the POSIX sense: Alternate file 
access control mechanisms must ``be enabled only by explicit user action, on 
a per-file basis by the file owner or a user with the appropriate 
privilege'', and must ``be disabled for a file after the file permission bits 
are changed for that file with chmod( )'' according to POSIX. In other words, 
newly created files or directories would have alternate file access control 
mechanisms disabled. This would render NFSv4 ACLs essentially useless for 
UNIX processes, because they would almost always be disabled, and would only 
work for remote processes until a POSIX process chmods a file or creates a 
directory, which wouldn't get us very far.

Let's look at chmod(2): the mode specified in chmod(2) defines the permissions 
of three classes of users: owner, group, and other. Each class is assigned a 
set of the READ, WRITE, and EXECUTE permissions. This defines the maximum set 
of permissions that this class has at any moment.

In an NFSv4 ACL, each entry must be in exactly one of the three classes of 
users: OWNER@ is in the owner class, GROUP@ and additional users and groups 
listed in the ACL are in the group class, and EVERYONE@ is in the other 
class.

No ACL entry shall granted permissions that exceed the permissions of its 
class. (Additional permissions in a class could be enabled explicitly, which 
would amount to an alternate file access mechanism, though.)

Note that we must not allow an ACE to be in no class, either: if we did, a 
chmod call with mode 0 would not disable all access, which would conflict 
with POSIX.

Note that this definition is in line with POSIX 1003.1e draft 17 [2], while it 
conflicts with the IETF NFS Version 4 ACLs draft [1], which associates only 
GROUP@ entries with the group file mode permission bits in section 5.1. The 
relevant text of IETF NFS Version 4 ACLs draft [1] is also found in NFSv4 
Minor Version 1 [4].

We want chmod(2) to be non-destructive, so that a chmod to a more restrictive 
mode and back to the original mode will leave the file with the same 
permissions as before the changes.

According to NFS Version 4 ACLs [1], it has been tried to replace the entire 
ACL with an ACL that only grants the permissions specified by the new mode. 
This approach has two drawbacks: first, it is destructive, and additional 
permissions granted are lost in the first chmod. Second, additional 
restrictions (DENY entries) may be lost as well. This is not acceptable, and 
unsurprisingly, users did not favor this approach.

POSIX ACLs have solved the non-destructiveness problem by introducing a mask 
ACL entry: the mask entry applies to all group class entries, and defines an 
upper bound to the permissions those entries may grant. POSIX ACLs only have 
ACL entries that allow permissions, and only specify READ, WRITE, and EXECUTE 
permissions. Therefore, the owner class and other class permissions are the 
permissions granted to the owner and to others, respectively. (Note the 
difference between these others and NFSv4's EVERYONE@ special identifier).

The mask concept is not part of NFSv4 ACLs. Marius A. Eriksen and others have 
proposed to emulate the POSIX ACL mask entry by prepending (with exception of 
OWNER@ and EVERYONE@ ACEs) each ALLOW ACE with a DENY ACE for the same user, 
group, or special identifier as in the ALLOW ACE. The permissions in the DENY 
ACE are set so that the entry denies the permissions not granted by the mask.

Unless we accept a very specific form of NFSv4 ACLs only (which would 
contradict the goal stated at the top of this message, and which would mean 
that interoperability with anything but POSIX ACLs would become difficult), 
there is no easy way to tell DENY entries introduced to emulate the mask from 
DENY entries added by hand. This has two potential consequences:

 - First, if we fail to identify such a mask-emulation DENY entry, we may end 
up inserting another such entry. We might end up doing so repeatedly.

 - Second, we may take a user-provided DENY entry for a mask-emulation DENY 
entry, and clear mask bits from that entry. This would contradict the user's 
intention. So the approach of inserting mask-emulation DENY entries is not 
good enough in general. (Mapping between NFSv4 and POSIX ACLs does not have 
this problem, because POSIX ACLs don't have DENY ACEs.)

In my opinion, there are two possible solutions for this problem: we can (1) 
devise a special kind of NFSv4 ACL entry that we will recognize as mask 
entry, or (2) give the owner/group/other class permission bits higher 
priority than the ACL entries, and only allow permissions that are allowed by 
both the ACEs and their associated classes.

In case (1), we could either keep prepending (almost) each ALLOW entry with an 
associated DENY entry and set a special flag in the DENY entry, or we could 
introduce something like a MASK@ special identifier, add MASK@ entries to the 
ACL in the appropriate places, and add the mask logic to the permission check 
algorithm.

We would need at most three MASK@ entries per ACL, one for each class of 
users: it should be obvious that we need a mask for the group class, which 
contains the GROUP@ entries and all entries for explicitly named users and 
groups. We want to avoid destroying permissions set explicitly for USER@ and 
EVERYONE@ entries after a chmod as well though. We could then use the mask 
mechanism to selectively turn on additional permissions not covered by READ, 
WRITE, and EXECUTE, as a kind of alternate file access control mechanism.

We could keep such extensions local to the server and not expose them over the 
protocol, with the obvious interoperability problems when copying files 
around, or we could make whichever extensions we need part of the NFSv4 
protocol.

Case (2) would be pretty simple to implement, but all permissions that are not 
covered by READ, WRITE, EXECUTE would always be masked (for correctness, even 
for remote clients), and there would be no controlled way to un-mask them.

Thoughts anyone?

Thanks,
Andreas

REFERENCES

[1] Sam Falkner et al.: NFS Version 4 ACLs, draft-ietf-nfsv4-acls-00.txt

[2] POSIX 1003.1e/2c draft 17 (withdrawn), 
http://wt.xpilot.org/publications/posix.1e

[3] Marius Aamodt Eriksen et al.: Mapping Between NFSv4 and Posix Draft ACLs, 
draft-ietf-nfsv4-acl-mapping-04.txt

[4] Spencer Shepler (editor): NFSv4 Minor Version 1, 
draft-ietf-nfsv4-minorversion1-03.txt

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-03 21:10 NFSv4 ACL and POSIX interaction / mask Andreas Gruenbacher
@ 2006-07-07 11:55 ` Andreas Gruenbacher
  2006-07-08  3:45   ` Sam Falkner
  2006-07-14 17:59   ` [NFS] " J. Bruce Fields
  0 siblings, 2 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-07 11:55 UTC (permalink / raw)
  To: nfsv4; +Cc: Sam Falkner, Brian Pawlowski, Spencer Shepler, nfs

On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
> Hello,
>
> I have been thinking about the problems of interaction between NFSv4 ACLs
> and POSIX, and particularly about the issue of masking permissions through
> chmod and after creating files or directories.

Here is a follow-up after some personal feedback from Sam. I believe that 
draft-ietf-nfsv4-acls-00 is not ready to become part of the NFSv4 Minor 
Version 1 RFC: some assumptions are not correct from a POSIX point of view, 
and the way how chmod and file create modes are applied to NFSv4 ACLs is weak
and not guaranteed to be correct.

I will first try to clarify some of the points I tried to make in the previous 
posting and point out deficiencies in draft-ietf-nfsv4-acls-00. Then I will 
propose an alternative design which is more correct than introducing DENY 
entries to mask permissions. (As a bonus, it is easier to implement. too.)

> On a UNIX system that supports NFSv4 ACLs natively, I think we should try
> to accept as wide a range of NFSv4 ACLs as possible, but we must make sure
> that we can preserve POSIX semantics. In particular, this means that ACLs
> may contain ACEs for users other than OWNER@, GROUP@, and EVERYONE@, and
> that chmod(2) must continue to provide the same kinds of guarantees as
> without NFSv4 ACLs.
>
> I am assuming here that NFSv4 ACLs shall be an additional rather than an
> alternate file access control mechanism in the POSIX sense: Alternate file
> access control mechanisms must ``be enabled only by explicit user action,
> on a per-file basis by the file owner or a user with the appropriate
> privilege'', and must ``be disabled for a file after the file permission
> bits are changed for that file with chmod( )'' according to POSIX. In other
> words, newly created files or directories would have alternate file access
> control mechanisms disabled. This would render NFSv4 ACLs essentially
> useless for UNIX processes, because they would almost always be disabled,
> and would only work for remote processes until a POSIX process chmods a
> file or creates a directory, which wouldn't get us very far.

As Sam pointed out, a subset of NFSv4 ACLs maps to an additional file access 
control mechanism, while the rest goes beyond that, and therefore is an 
alternate file access control mechanism.

It is important to understand how POSIX defines additional file access control 
mechanisms:

[] 3.4 Additional File Access Control Mechanism
[] An implementation-defined mechanism that is layered upon the access control
[]  mechanisms defined here, but which do not grant permissions beyond those
[]  defined herein, although they may further restrict them.

In other words, when a file has just been created and after chmod, the file 
mode permission bits define an upper bound to the permissions granted to 
anyone on the system, and nobody has additional permissions. Additional 
permissions (as an alternate file access control mechanism) may be 
enabled explicitly, but the next chmod must disable them again.

We can classify the permissions that NFSv4 ACLs grant into additional and 
alternate mechanisms as follows: everything covered by the POSIX 
read/write/execute permissions (such as ACE4_READ_DATA, but also 
ACE4_APPEND_DATA) is additional, while everything beyond that (such as 
ACE4_WRITE_OWNER) is alternate. Under this definition, all NFSv4 ACLs that 
grant no more than ACE4_READ_DATA, ACE4_LIST_DIRECTORY, ACE4_WRITE_DATA, 
ACE4_ADD_FILE, ACE4_APPEND_DATA, ACE4_ADD_SUBDIRECTORY, 
ACE4_READ_NAMED_ATTRS, ACE4_WRITE_NAMED_ATTRS, ACE4_EXECUTE, 
ACE4_READ_ATTRIBUTES, ACE4_WRITE_ATTRIBUTES, ACE4_READ_ACL, and 
ACE4_SYNCHRONIZE would count as additional access control mechanisms. All 
others with ACE4_WRITE_ACL, ACE4_WRITE_OWNER, ACE4_DELETE_CHILD, and 
ACE4_DELETE are alternate.

As said already, the POSIX file mode permission bits define the permissions of 
three classes: owner, group, and other. An additional file access control 
mechanism may only further restrict the permissions granted to those classes.

To map NFSv4 ACLs to an additional file access control mechanism,

 - we must map each NFSv4 ACL entry to exactly one of the three classes.

 - we must ensure that the ACL does not grant any permissions that go beyond
   the class permissions after a chmod or create.

 - in particular, we must ensure that the ACL grants no "alternate"
   permissions after a chmod or create.

We are free to provide mechanisms by which more permissions may be enabled by 
explicit user action, on a per-file basis by the file owner or a user with 
the appropriate privilege, according to POSIX.

The POSIX definitions of the three file permission classes are:

[] 3.173 File Owner Class
[] The property of a file indicating access permissions for a process related
[] to the user identification of a process. A process is in the file owner
[] class of a file if the effective user ID of the process matches the user ID
[] of the file.

[] 3.166 File Group Class
[] The property of a file indicating access permissions for a process
[] related to the group identification of a process. A process is in
[] the file group class of a file if the process is not in the file owner
[] class and if the effective group ID or one of the supplementary group
[] IDs of the process matches the group ID associated with the file. Other
[] members of the class may be implementation-defined.

[] 3.172 File Other Class
[] The property of a file indicating access permissions for a process related
[] to the user and group identification of a process. A process is in the file
[] other class of a file if the process is not in the file owner class or file
[] group class.

The key fact in these definitions is that an implementation may define 
additional members of the File Group Class, while the other classes are not 
extensible.

Under this definition, we end up with the following mapping:

 - OWNER@ entries are in the File Owner Class,
 - EVERYONE@ entries are in the File Other Class,
 - every other entry is in the File Group Class(*).

 (*) User entries for the user who is the current file owner are a special
     case: due to how the NFSv4 ACL permission check algorithm is specified,
     I believe that they should be put in the OWNER@ class.

> Note that this definition is in line with POSIX 1003.1e draft 17 [2], while
> it conflicts with the IETF NFS Version 4 ACLs draft [1], which associates
> only GROUP@ entries with the group file mode permission bits in section
> 5.1. The relevant text of IETF NFS Version 4 ACLs draft [1] is also found
> in NFSv4 Minor Version 1 [4].

Section 5.1 of [1] needs to be fixed: we must set the permission bits so that 
they are a superset of the permissions of all the entries in the respective 
class. (We cannot represent permissions that are not supersets of 
POSIX read, write, execute in the class, but that is not a problem, as we will 
see later.)

Non-monotonic permissions
=========================

Note that with arbitrary NFSV4 ACLs, the permissions granted to a process from 
multiple ACL entries will accumulate. This means that permissions across 
multiple classes may accumulate as well. This can be prevented with DENY 
entries in the ACL, e.g.,

	OWNER@:mask1::ALLOW
	OWNER@:^mask1::DENY
	user@domain:mask2::ALLOW
	group@domain:mask3:ACE4_IDENTIFIER_GROUP:ALLOW
	user@domain:^mask2::DENY
	group@domain:^mask3:ACE4_IDENTIFIER_GROUP:DENY
	EVERYONE:mask4::ALLOW

This means that we will not have to deal with this special case when computing 
the file mode permission bits, and we can achieve consistency by forcing ACLs 
to be "well structured".

We could also leave this as an implementation consideration: ACLs which are 
not "well structured" in the above sense will grant permissions that go 
beyond what an additional access control mechanism may grant *only* for 
non-monotonic file mode permission bits. With non-monotonic I mean file mode 
permission bits which grant more permissions to the group class than to the 
owner class, or more permissions to the other class than to the group class. 

> We want chmod(2) to be non-destructive, so that a chmod to a more
> restrictive mode and back to the original mode will leave the file with the
> same permissions as before the changes.
>
>[...]
>
> POSIX ACLs have solved the non-destructiveness problem by introducing a
> mask ACL entry: the mask entry applies to all group class entries, and
> defines an upper bound to the permissions those entries may grant. POSIX
> ACLs only have ACL entries that allow permissions, and only specify READ,
> WRITE, and EXECUTE permissions. Therefore, the owner class and other class
> permissions are the permissions granted to the owner and to others,
> respectively. (Note the difference between these others and NFSv4's
> EVERYONE@ special identifier).
>
> The mask concept is not part of NFSv4 ACLs. Marius A. Eriksen and others
> have proposed to emulate the POSIX ACL mask entry by prepending (with
> exception of OWNER@ and EVERYONE@ ACEs) each ALLOW ACE with a DENY ACE for
> the same user, group, or special identifier as in the ALLOW ACE. The
> permissions in the DENY ACE are set so that the entry denies the
> permissions not granted by the mask.

Internet draft-ietf-nfsv4-acls-00.txt [1] uses the same mechanism to implement 
masking.

> Unless we accept a very specific form of NFSv4 ACLs only (which would
> contradict the goal stated at the top of this message, and which would mean
> that interoperability with anything but POSIX ACLs would become difficult),
> there is no easy way to tell DENY entries introduced to emulate the mask
> from DENY entries added by hand. This has two potential consequences:
>
>  - First, if we fail to identify such a mask-emulation DENY entry, we may
> end up inserting another such entry. We might end up doing so repeatedly.
>
>  - Second, we may take a user-provided DENY entry for a mask-emulation DENY
> entry, and clear mask bits from that entry. This would contradict the
> user's intention. So the approach of inserting mask-emulation DENY entries
> is not good enough in general. (Mapping between NFSv4 and POSIX ACLs does
> not have this problem, because POSIX ACLs don't have DENY ACEs.)

Therefore, the mechanism described in section 5.3 is not suitable for our 
purposes, and we need to replace it with something better.

> In my opinion, there are two possible solutions for this problem: we can
> (1) devise a special kind of NFSv4 ACL entry that we will recognize as mask
> entry, or (2) give the owner/group/other class permission bits higher
> priority than the ACL entries, and only allow permissions that are allowed
> by both the ACEs and their associated classes.

A third option exists as well which fits in very well with POSIX and can be 
implemented in NFSv4 in a backward compatible way.

Alternative Proposal
====================

Instead of adding DENY entries to the ACL for the purpose of masking, attach 
three optional attributes to each file: owner_class_mask, group_class_mask, 
and other_class_mask. When those attributes are present, they define which 
permissions in an ACE are effective.

Each ACE is is restricted by one of these mask attributes in each access 
check:

 - OWNER@ entries and entries for the user@domain that currently owns the file
   are restricted by owner_class_mask.

 - EVERYONE@ entries are restricted by other_class_mask.

 - All other entries are restricted by group_class_mask.

The effective permissions are computed as the bitwise and (&) of the ACE mask 
and the associated class_mask attribute.

When doing a chmod(2) or when applying a create mask, the owner_class_mask, 
group_class_mask, and other_class_mask attributes are modified according to 
the owner class, group class, and other class permissions of the mode 
parameter as follows:

 - The POSIX read permission implies the ACE4_READ_DATA, ACE4_READ_ATTRIBUTES, 
ACE4_READ_ACL, and ACE4_SYNCHRONIZE bitmask flags.

 - The POSIX write permission implies the ACE4_WRITE_DATA, ACE4_APPEND_DATA, 
ACE4_WRITE_ATTRIBUTES, ACE4_DELETE_CHILD, and ACE4_SYNCHRONIZE bitmask flags.

 - The POSIX execute permission implies the ACE4_EXECUTE mask.

This saves us from bloating ACLs with DENY entries, is more efficient when 
doing a chmod, and also saves us from destroying permissions in user provided 
DENY entries.

When an ACL is set, then set all mask attributes to the values provided in the 
same SETATTR operation, and set the remaining mask attributes to the union of 
all ALLOW ACL entries in the ACL that the class applies to.

Without any further changes, NFSv4 clients not aware of the three optional 
attributes would not be aware of the restrictions imposed by those masks when 
querying for the ACL. This would create an interoperability problem, and 
possible security holes. To solve this problem, we can extend the GETATTR 
operation as follows:

When a client requests the ACL attribute, check if it also requests one or 
more of the three optional owner_class_mask, group_class_mask, or 
other_class_mask attributes. If it does, then send the requested attributes 
as they are. If the client requests only the ACL without any of the masks, 
return an ACL with only effective mask flags set, and with all other flags 
removed.

Alternate permissions in the ACL can be enabled by either setting an ACL 
without providing full mask entries, or by setting the appropriate bit(s) in 
the corresponding mask entry or entries.

When comparing POSIX ACLs and the NFSv4 ACL + mask attributes as proposed 
here, one obvious difference is that POSIX ACLs have only one mask entry, 
while I propose three mask entries here. The reason for this is that POSIX 
ACLs can at most grant read, write, and execute permissions, and so with 
POSIX ACLs, the File Owner Class permissions are always identical to the 
permissions granted to the owner, and the File Other Class permissions are 
always identical to the permissions granted to others. With NFSv4 ACLs, 
OWNER@ and EVERYONE@ entries may grant additional permissions that go beyond 
what POSIX read, write, and execute can grant, and we need a mechanism so 
that those alternate permissions can be turned off by chmod and during file 
create without destroying the permissions.



I would appreciate if you could take this alternative proposal into 
consideration when deciding how to proceed with NFSv4 Minor 
Version 1 at next week's IETF 66 meeting.


Thanks and best regards,
Andreas

> REFERENCES
>
> [1] Sam Falkner et al.: NFS Version 4 ACLs, draft-ietf-nfsv4-acls-00.txt
>
> [2] POSIX 1003.1e/2c draft 17 (withdrawn),
> http://wt.xpilot.org/publications/posix.1e
>
> [3] Marius Aamodt Eriksen et al.: Mapping Between NFSv4 and Posix Draft
> ACLs, draft-ietf-nfsv4-acl-mapping-04.txt
>
> [4] Spencer Shepler (editor): NFSv4 Minor Version 1,
> draft-ietf-nfsv4-minorversion1-03.txt

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-07 11:55 ` NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready Andreas Gruenbacher
@ 2006-07-08  3:45   ` Sam Falkner
  2006-07-08  6:51     ` [nfsv4] " Lisa Week
                       ` (2 more replies)
  2006-07-14 17:59   ` [NFS] " J. Bruce Fields
  1 sibling, 3 replies; 38+ messages in thread
From: Sam Falkner @ 2006-07-08  3:45 UTC (permalink / raw)
  To: nfsv4; +Cc: Brian Pawlowski, Spencer Shepler, nfs, Lisa Week

On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:

> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
>> Hello,
>>
>> I have been thinking about the problems of interaction between  
>> NFSv4 ACLs
>> and POSIX, and particularly about the issue of masking permissions  
>> through
>> chmod and after creating files or directories.
>
> Here is a follow-up after some personal feedback from Sam. I  
> believe that
> draft-ietf-nfsv4-acls-00 is not ready to become part of the NFSv4  
> Minor
> Version 1 RFC: some assumptions are not correct from a POSIX point  
> of view,
> and the way how chmod and file create modes are applied to NFSv4  
> ACLs is weak
> and not guaranteed to be correct.

I disagree -- see below.

> I will first try to clarify some of the points I tried to make in  
> the previous
> posting and point out deficiencies in draft-ietf-nfsv4-acls-00.  
> Then I will
> propose an alternative design which is more correct than  
> introducing DENY
> entries to mask permissions. (As a bonus, it is easier to  
> implement. too.)
>
>> On a UNIX system that supports NFSv4 ACLs natively, I think we  
>> should try
>> to accept as wide a range of NFSv4 ACLs as possible, but we must  
>> make sure
>> that we can preserve POSIX semantics. In particular, this means  
>> that ACLs
>> may contain ACEs for users other than OWNER@, GROUP@, and  
>> EVERYONE@, and
>> that chmod(2) must continue to provide the same kinds of  
>> guarantees as
>> without NFSv4 ACLs.
>>
>> I am assuming here that NFSv4 ACLs shall be an additional rather  
>> than an
>> alternate file access control mechanism in the POSIX sense:  
>> Alternate file
>> access control mechanisms must ``be enabled only by explicit user  
>> action,
>> on a per-file basis by the file owner or a user with the appropriate
>> privilege'', and must ``be disabled for a file after the file  
>> permission
>> bits are changed for that file with chmod( )'' according to POSIX.  
>> In other
>> words, newly created files or directories would have alternate  
>> file access
>> control mechanisms disabled. This would render NFSv4 ACLs essentially
>> useless for UNIX processes, because they would almost always be  
>> disabled,
>> and would only work for remote processes until a POSIX process  
>> chmods a
>> file or creates a directory, which wouldn't get us very far.
>
> As Sam pointed out, a subset of NFSv4 ACLs maps to an additional  
> file access
> control mechanism, while the rest goes beyond that, and therefore  
> is an
> alternate file access control mechanism.

Yes -- ALLOW ACEs are alternate file access control, and DENY ACEs  
are additional file access control.

> It is important to understand how POSIX defines additional file  
> access control
> mechanisms:
>
> [] 3.4 Additional File Access Control Mechanism
> [] An implementation-defined mechanism that is layered upon the  
> access control
> []  mechanisms defined here, but which do not grant permissions  
> beyond those
> []  defined herein, although they may further restrict them.
>
> In other words, when a file has just been created and after chmod,  
> the file
> mode permission bits define an upper bound to the permissions  
> granted to
> anyone on the system, and nobody has additional permissions.  
> Additional
> permissions (as an alternate file access control mechanism) may be
> enabled explicitly, but the next chmod must disable them again.

The use of the word "Additional" is confusing in the above  
sentence.  :-)  I think you mean "more", or similar, but "Additional"  
has a very specific meaning which (I think) isn't what you mean.

> We can classify the permissions that NFSv4 ACLs grant into  
> additional and
> alternate mechanisms as follows: everything covered by the POSIX
> read/write/execute permissions (such as ACE4_READ_DATA, but also
> ACE4_APPEND_DATA) is additional, while everything beyond that (such as
> ACE4_WRITE_OWNER) is alternate.

Note well: this is quite different from draft-ietf-nfsv4- 
minorversion1-03.txt, i.e. this is an alternate proposal.

> Under this definition, all NFSv4 ACLs that
> grant no more than ACE4_READ_DATA, ACE4_LIST_DIRECTORY,  
> ACE4_WRITE_DATA,
> ACE4_ADD_FILE, ACE4_APPEND_DATA, ACE4_ADD_SUBDIRECTORY,
> ACE4_READ_NAMED_ATTRS, ACE4_WRITE_NAMED_ATTRS, ACE4_EXECUTE,
> ACE4_READ_ATTRIBUTES, ACE4_WRITE_ATTRIBUTES, ACE4_READ_ACL, and
> ACE4_SYNCHRONIZE would count as additional access control  
> mechanisms. All
> others with ACE4_WRITE_ACL, ACE4_WRITE_OWNER, ACE4_DELETE_CHILD, and
> ACE4_DELETE are alternate.

I don't understand what is gained by this designation of additional  
access control mechanisms.  If you really say that this ACL:

OWNER@:read_data:allow
friend@your.com:read_data:allow

is additional file access control, then what is the mode on such a  
file?  Unless the mode says "group can read", then friend@your.com  
wouldn't be able to read, if the ACL is additional file access  
control.  What if you want friend@your.com to be able to read, but  
you don't want the file's owning group to read?

> As said already, the POSIX file mode permission bits define the  
> permissions of
> three classes: owner, group, and other. An additional file access  
> control
> mechanism may only further restrict the permissions granted to  
> those classes.

> To map NFSv4 ACLs to an additional file access control mechanism,

>  - we must map each NFSv4 ACL entry to exactly one of the three  
> classes.
>
>  - we must ensure that the ACL does not grant any permissions that  
> go beyond
>    the class permissions after a chmod or create.

Additional File Access Control must not grant beyond the class  
permissions *ever*, not just after create or chmod.

>  - in particular, we must ensure that the ACL grants no "alternate"
>    permissions after a chmod or create.

I don't understand this; you began this section with "To map NFSv4  
ACLs to an additional...", but here, you seem to be describing ACLs  
as an alternate file access control mechanism.

> We are free to provide mechanisms by which more permissions may be  
> enabled by
> explicit user action, on a per-file basis by the file owner or a  
> user with
> the appropriate privilege, according to POSIX.

>
> The POSIX definitions of the three file permission classes are:
>
> [] 3.173 File Owner Class
> [] The property of a file indicating access permissions for a  
> process related
> [] to the user identification of a process. A process is in the  
> file owner
> [] class of a file if the effective user ID of the process matches  
> the user ID
> [] of the file.
>
> [] 3.166 File Group Class
> [] The property of a file indicating access permissions for a process
> [] related to the group identification of a process. A process is in
> [] the file group class of a file if the process is not in the file  
> owner
> [] class and if the effective group ID or one of the supplementary  
> group
> [] IDs of the process matches the group ID associated with the  
> file. Other
> [] members of the class may be implementation-defined.
>
> [] 3.172 File Other Class
> [] The property of a file indicating access permissions for a  
> process related
> [] to the user and group identification of a process. A process is  
> in the file
> [] other class of a file if the process is not in the file owner  
> class or file
> [] group class.
>
> The key fact in these definitions is that an implementation may define
> additional members of the File Group Class, while the other classes  
> are not
> extensible.
>
> Under this definition, we end up with the following mapping:
>
>  - OWNER@ entries are in the File Owner Class,
>  - EVERYONE@ entries are in the File Other Class,

No, I don't think EVERYONE@ is in the File Other Class.  Given this ACL:

EVERYONE@:read_data:deny
OWNER@:read_data:allow

the owner would NOT be able to read.  In other words, file owner  
class and file group class are also affected by EVERYONE@ ACEs.

>  - every other entry is in the File Group Class(*).

including EVERYONE@.  ;-)

>  (*) User entries for the user who is the current file owner are a  
> special
>      case: due to how the NFSv4 ACL permission check algorithm is  
> specified,
>      I believe that they should be put in the OWNER@ class.

The current minorversion1 draft has a similar design constraint.

>> Note that this definition is in line with POSIX 1003.1e draft 17  
>> [2], while
>> it conflicts with the IETF NFS Version 4 ACLs draft [1], which  
>> associates
>> only GROUP@ entries with the group file mode permission bits in  
>> section
>> 5.1. The relevant text of IETF NFS Version 4 ACLs draft [1] is  
>> also found
>> in NFSv4 Minor Version 1 [4].
>
> Section 5.1 of [1] needs to be fixed: we must set the permission  
> bits so that
> they are a superset of the permissions of all the entries in the  
> respective
> class. (We cannot represent permissions that are not supersets of
> POSIX read, write, execute in the class, but that is not a problem,  
> as we will
> see later.)

We must do so carefully.  I'm not convinced that a superset is the  
best way to go, but we should talk about this later.

> Non-monotonic permissions
> =========================
>
> Note that with arbitrary NFSV4 ACLs, the permissions granted to a  
> process from
> multiple ACL entries will accumulate. This means that permissions  
> across
> multiple classes may accumulate as well. This can be prevented with  
> DENY
> entries in the ACL, e.g.,
>
> 	OWNER@:mask1::ALLOW
> 	OWNER@:^mask1::DENY
> 	user@domain:mask2::ALLOW
> 	group@domain:mask3:ACE4_IDENTIFIER_GROUP:ALLOW
> 	user@domain:^mask2::DENY
> 	group@domain:^mask3:ACE4_IDENTIFIER_GROUP:DENY
> 	EVERYONE:mask4::ALLOW
>
> This means that we will not have to deal with this special case  
> when computing
> the file mode permission bits, and we can achieve consistency by  
> forcing ACLs
> to be "well structured".

Yuck!  I'm glad you're not proposing this as a general NFSv4 ACL  
model.  :-)

> We could also leave this as an implementation consideration: ACLs  
> which are
> not "well structured" in the above sense will grant permissions  
> that go
> beyond what an additional access control mechanism may grant *only*  
> for
> non-monotonic file mode permission bits. With non-monotonic I mean  
> file mode
> permission bits which grant more permissions to the group class  
> than to the
> owner class, or more permissions to the other class than to the  
> group class.

I'm sorry, I just don't follow that paragraph.

>> We want chmod(2) to be non-destructive, so that a chmod to a more
>> restrictive mode and back to the original mode will leave the file  
>> with the
>> same permissions as before the changes.
>>
>> [...]
>>
>> POSIX ACLs have solved the non-destructiveness problem by  
>> introducing a
>> mask ACL entry: the mask entry applies to all group class entries,  
>> and
>> defines an upper bound to the permissions those entries may grant.  
>> POSIX
>> ACLs only have ACL entries that allow permissions, and only  
>> specify READ,
>> WRITE, and EXECUTE permissions. Therefore, the owner class and  
>> other class
>> permissions are the permissions granted to the owner and to others,
>> respectively. (Note the difference between these others and NFSv4's
>> EVERYONE@ special identifier).
>>
>> The mask concept is not part of NFSv4 ACLs. Marius A. Eriksen and  
>> others
>> have proposed to emulate the POSIX ACL mask entry by prepending (with
>> exception of OWNER@ and EVERYONE@ ACEs) each ALLOW ACE with a DENY  
>> ACE for
>> the same user, group, or special identifier as in the ALLOW ACE. The
>> permissions in the DENY ACE are set so that the entry denies the
>> permissions not granted by the mask.
>
> Internet draft-ietf-nfsv4-acls-00.txt [1] uses the same mechanism  
> to implement
> masking.
>
>> Unless we accept a very specific form of NFSv4 ACLs only (which would
>> contradict the goal stated at the top of this message, and which  
>> would mean
>> that interoperability with anything but POSIX ACLs would become  
>> difficult),
>> there is no easy way to tell DENY entries introduced to emulate  
>> the mask
>> from DENY entries added by hand.

I would refute this; see below.

>> This has two potential consequences:
>>
>>  - First, if we fail to identify such a mask-emulation DENY entry,  
>> we may
>> end up inserting another such entry. We might end up doing so  
>> repeatedly.

But we will not ever fail to identify such a mask-emulation DENY  
entry, when it is one that was created by a previous chmod.  Only in  
a degenerate case of modify-acl-carefully, chmod, modify-acl- 
carefully, chmod, etc., would you get a growing ACL problem.

>>  - Second, we may take a user-provided DENY entry for a mask- 
>> emulation DENY
>> entry, and clear mask bits from that entry. This would contradict the
>> user's intention. So the approach of inserting mask-emulation DENY  
>> entries
>> is not good enough in general.

A user-provided DENY entry would have to fit into a very specific and  
somewhat nonsensical form in order to be misidentified.  Here's an  
example:

samf@sun.com:read_data:deny
samf@sun.com:read_data:allow

If a "chmod 444" were done, the deny ACE above would be modified.   
Any other cases of chmod modifying a user-provided ACE would have to  
be essentially the same as the above example.  I think that that's an  
acceptable situation.

>> (Mapping between NFSv4 and POSIX ACLs does
>> not have this problem, because POSIX ACLs don't have DENY ACEs.)

> Therefore, the mechanism described in section 5.3 is not suitable  
> for our
> purposes, and we need to replace it with something better.

I don't agree that 5.3 is not suitable, but I would love to see  
something better.

>> In my opinion, there are two possible solutions for this problem:  
>> we can
>> (1) devise a special kind of NFSv4 ACL entry that we will  
>> recognize as mask
>> entry, or (2) give the owner/group/other class permission bits higher
>> priority than the ACL entries, and only allow permissions that are  
>> allowed
>> by both the ACEs and their associated classes.

Yikes -- I don't like either of the above solutions; let's look at  
the third...

> A third option exists as well which fits in very well with POSIX  
> and can be
> implemented in NFSv4 in a backward compatible way.
>
> Alternative Proposal
> ====================
>
> Instead of adding DENY entries to the ACL for the purpose of  
> masking, attach
> three optional attributes to each file: owner_class_mask,  
> group_class_mask,
> and other_class_mask. When those attributes are present, they  
> define which
> permissions in an ACE are effective.
>
> Each ACE is is restricted by one of these mask attributes in each  
> access
> check:
>
>  - OWNER@ entries and entries for the user@domain that currently  
> owns the file
>    are restricted by owner_class_mask.
>
>  - EVERYONE@ entries are restricted by other_class_mask.
>
>  - All other entries are restricted by group_class_mask.
>
> The effective permissions are computed as the bitwise and (&) of  
> the ACE mask
> and the associated class_mask attribute.

I take it you mean that "the effective access mask bits for ACEs of  
type ALLOW"?

> When doing a chmod(2) or when applying a create mask, the  
> owner_class_mask,
> group_class_mask, and other_class_mask attributes are modified  
> according to
> the owner class, group class, and other class permissions of the mode
> parameter as follows:
>
>  - The POSIX read permission implies the ACE4_READ_DATA,  
> ACE4_READ_ATTRIBUTES,
> ACE4_READ_ACL, and ACE4_SYNCHRONIZE bitmask flags.
>
>  - The POSIX write permission implies the ACE4_WRITE_DATA,  
> ACE4_APPEND_DATA,
> ACE4_WRITE_ATTRIBUTES, ACE4_DELETE_CHILD, and ACE4_SYNCHRONIZE  
> bitmask flags.

I'm not sure I agree about ACE4_WRITE_ATTRIBUTES, but that's a minor  
detail.

>  - The POSIX execute permission implies the ACE4_EXECUTE mask.

> This saves us from bloating ACLs with DENY entries, is more  
> efficient when
> doing a chmod, and also saves us from destroying permissions in  
> user provided
> DENY entries.

Yes, but at the cost of adding new file attributes...  Don't get me  
wrong, I do see merit in this proposal, but I don't know if it'll be  
acceptable.

> When an ACL is set, then set all mask attributes to the values  
> provided in the
> same SETATTR operation, and set the remaining mask attributes to  
> the union of
> all ALLOW ACL entries in the ACL that the class applies to.

This doesn't take the ordering of the ACL into account; is this your  
intention?  So

GROUP@:read_data/write_data:DENY
GROUP@:read_data/write_data:ALLOW

would result in a group_class_mask of read_data|write_data, right?   
(I'm not saying it's wrong, I'm just making sure I understand.)

> Without any further changes, NFSv4 clients not aware of the three  
> optional
> attributes would not be aware of the restrictions imposed by those  
> masks when
> querying for the ACL. This would create an interoperability  
> problem, and
> possible security holes. To solve this problem, we can extend the  
> GETATTR
> operation as follows:
>
> When a client requests the ACL attribute, check if it also requests  
> one or
> more of the three optional owner_class_mask, group_class_mask, or
> other_class_mask attributes. If it does, then send the requested  
> attributes
> as they are. If the client requests only the ACL without any of the  
> masks,
> return an ACL with only effective mask flags set, and with all  
> other flags
> removed.

I assume you mean in the ALLOW ACEs only, right?

> Alternate permissions in the ACL can be enabled by either setting  
> an ACL
> without providing full mask entries, or by setting the appropriate  
> bit(s) in
> the corresponding mask entry or entries.

Yes, I think I understand.

> When comparing POSIX ACLs and the NFSv4 ACL + mask attributes as  
> proposed
> here, one obvious difference is that POSIX ACLs have only one mask  
> entry,
> while I propose three mask entries here. The reason for this is  
> that POSIX
> ACLs can at most grant read, write, and execute permissions, and so  
> with
> POSIX ACLs, the File Owner Class permissions are always identical  
> to the
> permissions granted to the owner, and the File Other Class  
> permissions are
> always identical to the permissions granted to others. With NFSv4  
> ACLs,
> OWNER@ and EVERYONE@ entries may grant additional permissions that  
> go beyond
> what POSIX read, write, and execute can grant, and we need a  
> mechanism so
> that those alternate permissions can be turned off by chmod and  
> during file
> create without destroying the permissions.

Given that EVERYONE@ is not equivalent to the POSIX "other" class, it  
could be trimmed down to two.

> I would appreciate if you could take this alternative proposal into
> consideration when deciding how to proceed with NFSv4 Minor
> Version 1 at next week's IETF 66 meeting.

This proposal certainly has its merits.  I have doubts about the  
feasibility of adding two or three new file attributes, and new as- 
yet-unimplemented semantics, into the minorversion1 draft.  I have  
doubts about how this would be implemented on a Windows-based server.

The current design specified in draft-ietf-nfsv4-minorversion1-03.txt  
has implementation experience -- it's released in Solaris 10 update  
3, a shipping product.  It meets strict POSIX requirements for those  
implementations that choose to conform to POSIX.  I believe it's  
fully implementable on a Windows-based server.

I too hope that this can be discussed at IETF 66.

- Sam

>
>
> Thanks and best regards,
> Andreas
>
>> REFERENCES
>>
>> [1] Sam Falkner et al.: NFS Version 4 ACLs, draft-ietf-nfsv4- 
>> acls-00.txt
>>
>> [2] POSIX 1003.1e/2c draft 17 (withdrawn),
>> http://wt.xpilot.org/publications/posix.1e
>>
>> [3] Marius Aamodt Eriksen et al.: Mapping Between NFSv4 and Posix  
>> Draft
>> ACLs, draft-ietf-nfsv4-acl-mapping-04.txt
>>
>> [4] Spencer Shepler (editor): NFSv4 Minor Version 1,
>> draft-ietf-nfsv4-minorversion1-03.txt
>
> -- 
> Andreas Gruenbacher <agruen@suse.de>
> Novell / SUSE Labs


Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-08  3:45   ` Sam Falkner
@ 2006-07-08  6:51     ` Lisa Week
  2006-07-10 21:09       ` Andreas Gruenbacher
  2006-07-08 14:32     ` Sam Falkner
  2006-07-09 16:22     ` [nfsv4] " Andreas Gruenbacher
  2 siblings, 1 reply; 38+ messages in thread
From: Lisa Week @ 2006-07-08  6:51 UTC (permalink / raw)
  To: Andreas Gruenbacher; +Cc: nfs, Spencer Shepler, Brian Pawlowski, nfsv4


[-- Attachment #1.1: Type: text/plain, Size: 24876 bytes --]

Hi Andreas,

I have a couple additional questions and comments.  See those inline...

Thanks,
Lisa

On Jul 7, 2006, at 9:45 PM, Sam Falkner wrote:

> On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:
>
>> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
>>> Hello,
>>>
>>> I have been thinking about the problems of interaction between  
>>> NFSv4 ACLs
>>> and POSIX, and particularly about the issue of masking  
>>> permissions through
>>> chmod and after creating files or directories.
>>
>> Here is a follow-up after some personal feedback from Sam. I  
>> believe that
>> draft-ietf-nfsv4-acls-00 is not ready to become part of the NFSv4  
>> Minor
>> Version 1 RFC: some assumptions are not correct from a POSIX point  
>> of view,
>> and the way how chmod and file create modes are applied to NFSv4  
>> ACLs is weak
>> and not guaranteed to be correct.
>
> I disagree -- see below.
>
>> I will first try to clarify some of the points I tried to make in  
>> the previous
>> posting and point out deficiencies in draft-ietf-nfsv4-acls-00.  
>> Then I will
>> propose an alternative design which is more correct than  
>> introducing DENY
>> entries to mask permissions. (As a bonus, it is easier to  
>> implement. too.)
>>
>>> On a UNIX system that supports NFSv4 ACLs natively, I think we  
>>> should try
>>> to accept as wide a range of NFSv4 ACLs as possible, but we must  
>>> make sure
>>> that we can preserve POSIX semantics. In particular, this means  
>>> that ACLs
>>> may contain ACEs for users other than OWNER@, GROUP@, and  
>>> EVERYONE@, and
>>> that chmod(2) must continue to provide the same kinds of  
>>> guarantees as
>>> without NFSv4 ACLs.
>>>
>>> I am assuming here that NFSv4 ACLs shall be an additional rather  
>>> than an
>>> alternate file access control mechanism in the POSIX sense:  
>>> Alternate file
>>> access control mechanisms must ``be enabled only by explicit user  
>>> action,
>>> on a per-file basis by the file owner or a user with the appropriate
>>> privilege'', and must ``be disabled for a file after the file  
>>> permission
>>> bits are changed for that file with chmod( )'' according to  
>>> POSIX. In other
>>> words, newly created files or directories would have alternate  
>>> file access
>>> control mechanisms disabled. This would render NFSv4 ACLs  
>>> essentially
>>> useless for UNIX processes, because they would almost always be  
>>> disabled,
>>> and would only work for remote processes until a POSIX process  
>>> chmods a
>>> file or creates a directory, which wouldn't get us very far.
>>
>> As Sam pointed out, a subset of NFSv4 ACLs maps to an additional  
>> file access
>> control mechanism, while the rest goes beyond that, and therefore  
>> is an
>> alternate file access control mechanism.
>
> Yes -- ALLOW ACEs are alternate file access control, and DENY ACEs  
> are additional file access control.
>
>> It is important to understand how POSIX defines additional file  
>> access control
>> mechanisms:
>>
>> [] 3.4 Additional File Access Control Mechanism
>> [] An implementation-defined mechanism that is layered upon the  
>> access control
>> []  mechanisms defined here, but which do not grant permissions  
>> beyond those
>> []  defined herein, although they may further restrict them.
>>
>> In other words, when a file has just been created and after chmod,  
>> the file
>> mode permission bits define an upper bound to the permissions  
>> granted to
>> anyone on the system, and nobody has additional permissions.  
>> Additional
>> permissions (as an alternate file access control mechanism) may be
>> enabled explicitly, but the next chmod must disable them again.
>
> The use of the word "Additional" is confusing in the above  
> sentence.  :-)  I think you mean "more", or similar, but  
> "Additional" has a very specific meaning which (I think) isn't what  
> you mean.
>
>> We can classify the permissions that NFSv4 ACLs grant into  
>> additional and
>> alternate mechanisms as follows: everything covered by the POSIX
>> read/write/execute permissions (such as ACE4_READ_DATA, but also
>> ACE4_APPEND_DATA) is additional, while everything beyond that  
>> (such as
>> ACE4_WRITE_OWNER) is alternate.
>
> Note well: this is quite different from draft-ietf-nfsv4- 
> minorversion1-03.txt, i.e. this is an alternate proposal.
>
>> Under this definition, all NFSv4 ACLs that
>> grant no more than ACE4_READ_DATA, ACE4_LIST_DIRECTORY,  
>> ACE4_WRITE_DATA,
>> ACE4_ADD_FILE, ACE4_APPEND_DATA, ACE4_ADD_SUBDIRECTORY,
>> ACE4_READ_NAMED_ATTRS, ACE4_WRITE_NAMED_ATTRS, ACE4_EXECUTE,
>> ACE4_READ_ATTRIBUTES, ACE4_WRITE_ATTRIBUTES, ACE4_READ_ACL, and
>> ACE4_SYNCHRONIZE would count as additional access control  
>> mechanisms. All
>> others with ACE4_WRITE_ACL, ACE4_WRITE_OWNER, ACE4_DELETE_CHILD, and
>> ACE4_DELETE are alternate.
>
> I don't understand what is gained by this designation of additional  
> access control mechanisms.  If you really say that this ACL:
>
> OWNER@:read_data:allow
> friend@your.com:read_data:allow
>
> is additional file access control, then what is the mode on such a  
> file?  Unless the mode says "group can read", then friend@your.com  
> wouldn't be able to read, if the ACL is additional file access  
> control.  What if you want friend@your.com to be able to read, but  
> you don't want the file's owning group to read?

1.) If ACEs with ACE4_WRITE_ACL, ACE4_WRITE_OWNER, ACE4_DELETE_CHILD  
and ACE4_DELETE are alternate access control mechanisms, what will  
happen to ACEs with these access mask bits set upon chmod of the file?

For example, if we have the following ACL:
     lisa@sun.com:ACE4_WRITE_ACL:deny

		or even

     lisa@sun.com:ACE4_WRITE_OWNER:allow

Upon chmod we would have to disable them (however an implementation  
chooses to) and effectively remove it.

The thing that I have a problem with here is the fact that the  
changing of the file permission bits will affect what access has been  
defined in the ACL for things such as ACE4_WRITE_OWNER,  
ACE4_WRITE_ACL, etc.  A user setting the file permission bits is not  
saying anything about what they want to be done with any ACEs that  
include the ACE4_WRITE_OWNER mask bit.  Why would we want to mess  
with them?

2.) So, what if an ACE contained a mixture of the access mask bits  
that are alternate and additional?

Would we allow having ACE4_READ_DATA and ACE4_WRITE_ACL in the same  
ACE?  What would happen to an ACE such as this upon chmod?

>
>> As said already, the POSIX file mode permission bits define the  
>> permissions of
>> three classes: owner, group, and other. An additional file access  
>> control
>> mechanism may only further restrict the permissions granted to  
>> those classes.
>
>> To map NFSv4 ACLs to an additional file access control mechanism,
>
>>  - we must map each NFSv4 ACL entry to exactly one of the three  
>> classes.
>>
>>  - we must ensure that the ACL does not grant any permissions that  
>> go beyond
>>    the class permissions after a chmod or create.
>
> Additional File Access Control must not grant beyond the class  
> permissions *ever*, not just after create or chmod.
>
>>  - in particular, we must ensure that the ACL grants no "alternate"
>>    permissions after a chmod or create.
>
> I don't understand this; you began this section with "To map NFSv4  
> ACLs to an additional...", but here, you seem to be describing ACLs  
> as an alternate file access control mechanism.
>
>> We are free to provide mechanisms by which more permissions may be  
>> enabled by
>> explicit user action, on a per-file basis by the file owner or a  
>> user with
>> the appropriate privilege, according to POSIX.
>
>>
>> The POSIX definitions of the three file permission classes are:
>>
>> [] 3.173 File Owner Class
>> [] The property of a file indicating access permissions for a  
>> process related
>> [] to the user identification of a process. A process is in the  
>> file owner
>> [] class of a file if the effective user ID of the process matches  
>> the user ID
>> [] of the file.
>>
>> [] 3.166 File Group Class
>> [] The property of a file indicating access permissions for a process
>> [] related to the group identification of a process. A process is in
>> [] the file group class of a file if the process is not in the  
>> file owner
>> [] class and if the effective group ID or one of the supplementary  
>> group
>> [] IDs of the process matches the group ID associated with the  
>> file. Other
>> [] members of the class may be implementation-defined.
>>
>> [] 3.172 File Other Class
>> [] The property of a file indicating access permissions for a  
>> process related
>> [] to the user and group identification of a process. A process is  
>> in the file
>> [] other class of a file if the process is not in the file owner  
>> class or file
>> [] group class.
>>
>> The key fact in these definitions is that an implementation may  
>> define
>> additional members of the File Group Class, while the other  
>> classes are not
>> extensible.
>>
>> Under this definition, we end up with the following mapping:
>>
>>  - OWNER@ entries are in the File Owner Class,
>>  - EVERYONE@ entries are in the File Other Class,
>
> No, I don't think EVERYONE@ is in the File Other Class.  Given this  
> ACL:
>
> EVERYONE@:read_data:deny
> OWNER@:read_data:allow
>
> the owner would NOT be able to read.  In other words, file owner  
> class and file group class are also affected by EVERYONE@ ACEs.

I'll restate it because it is important: EVERYONE@ is not equivalent  
to the File Other Class.  I believe the original intention was to  
have it be equivalent to one the Windows "well known sid":   http:// 
msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/ 
security/well_known_sid_type.asp


Really with NFSv4 ACLs, the only way we have the equivalent of a File  
Other Class is if the EVERYONE@ entries come at the end of the ACL.   
Such as this:

      owner@:execute:deny
      owner@:read_data/write_data/append_data/write_xattr/ 
write_attributes
          /write_acl/write_owner:allow
      group@:write_data/append_data/execute:deny
      group@:read_data:allow
      everyone@:write_data/append_data/write_xattr/execute/ 
write_attributes
          /write_acl/write_owner:deny
      everyone@:read_data/read_xattr/read_attributes/read_acl/ 
synchronize
          :allow


>
>>  - every other entry is in the File Group Class(*).
>
> including EVERYONE@.  ;-)
>
>>  (*) User entries for the user who is the current file owner are a  
>> special
>>      case: due to how the NFSv4 ACL permission check algorithm is  
>> specified,
>>      I believe that they should be put in the OWNER@ class.
>
> The current minorversion1 draft has a similar design constraint.
>
>>> Note that this definition is in line with POSIX 1003.1e draft 17  
>>> [2], while
>>> it conflicts with the IETF NFS Version 4 ACLs draft [1], which  
>>> associates
>>> only GROUP@ entries with the group file mode permission bits in  
>>> section
>>> 5.1. The relevant text of IETF NFS Version 4 ACLs draft [1] is  
>>> also found
>>> in NFSv4 Minor Version 1 [4].
>>
>> Section 5.1 of [1] needs to be fixed: we must set the permission  
>> bits so that
>> they are a superset of the permissions of all the entries in the  
>> respective
>> class. (We cannot represent permissions that are not supersets of
>> POSIX read, write, execute in the class, but that is not a  
>> problem, as we will
>> see later.)
>
> We must do so carefully.  I'm not convinced that a superset is the  
> best way to go, but we should talk about this later.
>
>> Non-monotonic permissions
>> =========================
>>
>> Note that with arbitrary NFSV4 ACLs, the permissions granted to a  
>> process from
>> multiple ACL entries will accumulate. This means that permissions  
>> across
>> multiple classes may accumulate as well. This can be prevented  
>> with DENY
>> entries in the ACL, e.g.,
>>
>> 	OWNER@:mask1::ALLOW
>> 	OWNER@:^mask1::DENY
>> 	user@domain:mask2::ALLOW
>> 	group@domain:mask3:ACE4_IDENTIFIER_GROUP:ALLOW
>> 	user@domain:^mask2::DENY
>> 	group@domain:^mask3:ACE4_IDENTIFIER_GROUP:DENY
>> 	EVERYONE:mask4::ALLOW
>>
>> This means that we will not have to deal with this special case  
>> when computing
>> the file mode permission bits, and we can achieve consistency by  
>> forcing ACLs
>> to be "well structured".
>
> Yuck!  I'm glad you're not proposing this as a general NFSv4 ACL  
> model.  :-)
>
>> We could also leave this as an implementation consideration: ACLs  
>> which are
>> not "well structured" in the above sense will grant permissions  
>> that go
>> beyond what an additional access control mechanism may grant  
>> *only* for
>> non-monotonic file mode permission bits. With non-monotonic I mean  
>> file mode
>> permission bits which grant more permissions to the group class  
>> than to the
>> owner class, or more permissions to the other class than to the  
>> group class.
>
> I'm sorry, I just don't follow that paragraph.
>
>>> We want chmod(2) to be non-destructive, so that a chmod to a more
>>> restrictive mode and back to the original mode will leave the  
>>> file with the
>>> same permissions as before the changes.
>>>
>>> [...]
>>>
>>> POSIX ACLs have solved the non-destructiveness problem by  
>>> introducing a
>>> mask ACL entry: the mask entry applies to all group class  
>>> entries, and
>>> defines an upper bound to the permissions those entries may  
>>> grant. POSIX
>>> ACLs only have ACL entries that allow permissions, and only  
>>> specify READ,
>>> WRITE, and EXECUTE permissions. Therefore, the owner class and  
>>> other class
>>> permissions are the permissions granted to the owner and to others,
>>> respectively. (Note the difference between these others and NFSv4's
>>> EVERYONE@ special identifier).
>>>
>>> The mask concept is not part of NFSv4 ACLs. Marius A. Eriksen and  
>>> others
>>> have proposed to emulate the POSIX ACL mask entry by prepending  
>>> (with
>>> exception of OWNER@ and EVERYONE@ ACEs) each ALLOW ACE with a  
>>> DENY ACE for
>>> the same user, group, or special identifier as in the ALLOW ACE. The
>>> permissions in the DENY ACE are set so that the entry denies the
>>> permissions not granted by the mask.
>>
>> Internet draft-ietf-nfsv4-acls-00.txt [1] uses the same mechanism  
>> to implement
>> masking.
>>
>>> Unless we accept a very specific form of NFSv4 ACLs only (which  
>>> would
>>> contradict the goal stated at the top of this message, and which  
>>> would mean
>>> that interoperability with anything but POSIX ACLs would become  
>>> difficult),
>>> there is no easy way to tell DENY entries introduced to emulate  
>>> the mask
>>> from DENY entries added by hand.
>
> I would refute this; see below.
>
>>> This has two potential consequences:
>>>
>>>  - First, if we fail to identify such a mask-emulation DENY  
>>> entry, we may
>>> end up inserting another such entry. We might end up doing so  
>>> repeatedly.
>
> But we will not ever fail to identify such a mask-emulation DENY  
> entry, when it is one that was created by a previous chmod.  Only  
> in a degenerate case of modify-acl-carefully, chmod, modify-acl- 
> carefully, chmod, etc., would you get a growing ACL problem.
>
>>>  - Second, we may take a user-provided DENY entry for a mask- 
>>> emulation DENY
>>> entry, and clear mask bits from that entry. This would contradict  
>>> the
>>> user's intention. So the approach of inserting mask-emulation  
>>> DENY entries
>>> is not good enough in general.
>
> A user-provided DENY entry would have to fit into a very specific  
> and somewhat nonsensical form in order to be misidentified.  Here's  
> an example:
>
> samf@sun.com:read_data:deny
> samf@sun.com:read_data:allow
>
> If a "chmod 444" were done, the deny ACE above would be modified.   
> Any other cases of chmod modifying a user-provided ACE would have  
> to be essentially the same as the above example.  I think that  
> that's an acceptable situation.
>
>>> (Mapping between NFSv4 and POSIX ACLs does
>>> not have this problem, because POSIX ACLs don't have DENY ACEs.)
>
>> Therefore, the mechanism described in section 5.3 is not suitable  
>> for our
>> purposes, and we need to replace it with something better.
>
> I don't agree that 5.3 is not suitable, but I would love to see  
> something better.
>
>>> In my opinion, there are two possible solutions for this problem:  
>>> we can
>>> (1) devise a special kind of NFSv4 ACL entry that we will  
>>> recognize as mask
>>> entry, or (2) give the owner/group/other class permission bits  
>>> higher
>>> priority than the ACL entries, and only allow permissions that  
>>> are allowed
>>> by both the ACEs and their associated classes.
>
> Yikes -- I don't like either of the above solutions; let's look at  
> the third...
>
>> A third option exists as well which fits in very well with POSIX  
>> and can be
>> implemented in NFSv4 in a backward compatible way.
>>
>> Alternative Proposal
>> ====================
>>
>> Instead of adding DENY entries to the ACL for the purpose of  
>> masking, attach
>> three optional attributes to each file: owner_class_mask,  
>> group_class_mask,
>> and other_class_mask. When those attributes are present, they  
>> define which
>> permissions in an ACE are effective.
>>
>> Each ACE is is restricted by one of these mask attributes in each  
>> access
>> check:
>>
>>  - OWNER@ entries and entries for the user@domain that currently  
>> owns the file
>>    are restricted by owner_class_mask.
>>
>>  - EVERYONE@ entries are restricted by other_class_mask.

Again, EVERYONE@ is not equivalent to the File Other Class.   
Depending on where an ACE pertaining to EVERYONE@ is in the ACL, it  
could even refer to the owner and the owning group.

>>
>>  - All other entries are restricted by group_class_mask.
>>
>> The effective permissions are computed as the bitwise and (&) of  
>> the ACE mask
>> and the associated class_mask attribute.
>
> I take it you mean that "the effective access mask bits for ACEs of  
> type ALLOW"?
>
>> When doing a chmod(2) or when applying a create mask, the  
>> owner_class_mask,
>> group_class_mask, and other_class_mask attributes are modified  
>> according to
>> the owner class, group class, and other class permissions of the mode
>> parameter as follows:
>>
>>  - The POSIX read permission implies the ACE4_READ_DATA,  
>> ACE4_READ_ATTRIBUTES,
>> ACE4_READ_ACL, and ACE4_SYNCHRONIZE bitmask flags.
>>
>>  - The POSIX write permission implies the ACE4_WRITE_DATA,  
>> ACE4_APPEND_DATA,
>> ACE4_WRITE_ATTRIBUTES, ACE4_DELETE_CHILD, and ACE4_SYNCHRONIZE  
>> bitmask flags.
>
> I'm not sure I agree about ACE4_WRITE_ATTRIBUTES, but that's a  
> minor detail.

Yes, as [4] says, ACE4_WRITE_ATTRIBUTES is the "Permission to change  
the times associated with a file or directory to an arbitrary  
value."  Having that included in the POSIX write permission would not  
be correct, but as Sam said, that is minor.

>
>>  - The POSIX execute permission implies the ACE4_EXECUTE mask.
>
>> This saves us from bloating ACLs with DENY entries, is more  
>> efficient when
>> doing a chmod, and also saves us from destroying permissions in  
>> user provided
>> DENY entries.
>
> Yes, but at the cost of adding new file attributes...  Don't get me  
> wrong, I do see merit in this proposal, but I don't know if it'll  
> be acceptable.
>
>> When an ACL is set, then set all mask attributes to the values  
>> provided in the
>> same SETATTR operation, and set the remaining mask attributes to  
>> the union of
>> all ALLOW ACL entries in the ACL that the class applies to.
>
> This doesn't take the ordering of the ACL into account; is this  
> your intention?  So
>
> GROUP@:read_data/write_data:DENY
> GROUP@:read_data/write_data:ALLOW
>
> would result in a group_class_mask of read_data|write_data, right?   
> (I'm not saying it's wrong, I'm just making sure I understand.)
>
>> Without any further changes, NFSv4 clients not aware of the three  
>> optional
>> attributes would not be aware of the restrictions imposed by those  
>> masks when
>> querying for the ACL. This would create an interoperability  
>> problem, and
>> possible security holes. To solve this problem, we can extend the  
>> GETATTR
>> operation as follows:
>>
>> When a client requests the ACL attribute, check if it also  
>> requests one or
>> more of the three optional owner_class_mask, group_class_mask, or
>> other_class_mask attributes. If it does, then send the requested  
>> attributes
>> as they are. If the client requests only the ACL without any of  
>> the masks,
>> return an ACL with only effective mask flags set, and with all  
>> other flags
>> removed.
>
> I assume you mean in the ALLOW ACEs only, right?
>
>> Alternate permissions in the ACL can be enabled by either setting  
>> an ACL
>> without providing full mask entries, or by setting the appropriate  
>> bit(s) in
>> the corresponding mask entry or entries.
>
> Yes, I think I understand.

Sorry, but I don't think I understand.  Andreas, what do you mean by  
"Alternate" permissions in that sentence?  It is unclear to me as to  
what happens to the access mask bits outside of the following:   
(collectively, these are the access mask bits that make up the POSIX  
read, write and execute permissions)
ACE4_READ_DATA, ACE4_READ_ATTRIBUTES, ACE4_READ_ACL, ACE4_SYNCHRONIZE  
ACE4_WRITE_DATA, ACE4_APPEND_DATA, ACE4_WRITE_ATTRIBUTES,  
ACE4_DELETE_CHILD and ACE4_EXECUTE

The remaining ones are:
ACE4_WRITE_ACL, ACE4_WRITE_OWNER, ACE4_DELETE, ACE4_READ_NAMED_ATTRS  
and ACE4_WRITE_NAMED_ATTRS

Are these "remaining ones" also given representation in the masks?   
Right away I assumed not, but now I am not sure.


Actually, I think what is confusing me is that before, when talking  
about Additional and Alternate file access control mechanisms, you  
said that: " All others with ACE4_WRITE_ACL, ACE4_WRITE_OWNER,  
ACE4_DELETE_CHILD, and ACE4_DELETE are alternate."

I just wonder how that statement  relates to the statement that  
"Alternate permissions in the ACL can be enabled by either setting an  
ACL without providing full mask entries, or by setting the  
appropriate bit(s) in the corresponding mask entry or entries."


>
>> When comparing POSIX ACLs and the NFSv4 ACL + mask attributes as  
>> proposed
>> here, one obvious difference is that POSIX ACLs have only one mask  
>> entry,
>> while I propose three mask entries here. The reason for this is  
>> that POSIX
>> ACLs can at most grant read, write, and execute permissions, and  
>> so with
>> POSIX ACLs, the File Owner Class permissions are always identical  
>> to the
>> permissions granted to the owner, and the File Other Class  
>> permissions are
>> always identical to the permissions granted to others. With NFSv4  
>> ACLs,
>> OWNER@ and EVERYONE@ entries may grant additional permissions that  
>> go beyond
>> what POSIX read, write, and execute can grant, and we need a  
>> mechanism so
>> that those alternate permissions can be turned off by chmod and  
>> during file
>> create without destroying the permissions.
>
> Given that EVERYONE@ is not equivalent to the POSIX "other" class,  
> it could be trimmed down to two.
>
>> I would appreciate if you could take this alternative proposal into
>> consideration when deciding how to proceed with NFSv4 Minor
>> Version 1 at next week's IETF 66 meeting.
>
> This proposal certainly has its merits.  I have doubts about the  
> feasibility of adding two or three new file attributes, and new as- 
> yet-unimplemented semantics, into the minorversion1 draft.  I have  
> doubts about how this would be implemented on a Windows-based server.
>
> The current design specified in draft-ietf-nfsv4- 
> minorversion1-03.txt has implementation experience -- it's released  
> in Solaris 10 update 3, a shipping product.  It meets strict POSIX  
> requirements for those implementations that choose to conform to  
> POSIX.  I believe it's fully implementable on a Windows-based server.
>
> I too hope that this can be discussed at IETF 66.
>
> - Sam
>
>>
>>
>> Thanks and best regards,
>> Andreas
>>
>>> REFERENCES
>>>
>>> [1] Sam Falkner et al.: NFS Version 4 ACLs, draft-ietf-nfsv4- 
>>> acls-00.txt
>>>
>>> [2] POSIX 1003.1e/2c draft 17 (withdrawn),
>>> http://wt.xpilot.org/publications/posix.1e
>>>
>>> [3] Marius Aamodt Eriksen et al.: Mapping Between NFSv4 and Posix  
>>> Draft
>>> ACLs, draft-ietf-nfsv4-acl-mapping-04.txt
>>>
>>> [4] Spencer Shepler (editor): NFSv4 Minor Version 1,
>>> draft-ietf-nfsv4-minorversion1-03.txt
>>
>> -- 
>> Andreas Gruenbacher <agruen@suse.de>
>> Novell / SUSE Labs
>
>
> _______________________________________________
> nfsv4 mailing list
> nfsv4@ietf.org
> https://www1.ietf.org/mailman/listinfo/nfsv4


[-- Attachment #1.2: Type: text/html, Size: 69763 bytes --]

[-- Attachment #2: Type: text/plain, Size: 299 bytes --]

Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

[-- Attachment #3: Type: text/plain, Size: 140 bytes --]

_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-08  3:45   ` Sam Falkner
  2006-07-08  6:51     ` [nfsv4] " Lisa Week
@ 2006-07-08 14:32     ` Sam Falkner
  2006-07-09 16:22     ` [nfsv4] " Andreas Gruenbacher
  2 siblings, 0 replies; 38+ messages in thread
From: Sam Falkner @ 2006-07-08 14:32 UTC (permalink / raw)
  To: Sam Falkner; +Cc: nfs, Spencer Shepler, Brian Pawlowski, nfsv4, Lisa Week

On Jul 7, 2006, at 9:45 PM, Sam Falkner wrote:

> On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:
>>
>> Alternative Proposal
>> ====================
>>
>> Instead of adding DENY entries to the ACL for the purpose of  
>> masking, attach
>> three optional attributes to each file: owner_class_mask,  
>> group_class_mask,
>> and other_class_mask. When those attributes are present, they  
>> define which
>> permissions in an ACE are effective.
>>
>> Each ACE is is restricted by one of these mask attributes in each  
>> access
>> check:
>>
>>  - OWNER@ entries and entries for the user@domain that currently  
>> owns the file
>>    are restricted by owner_class_mask.
>>
>>  - EVERYONE@ entries are restricted by other_class_mask.
>>
>>  - All other entries are restricted by group_class_mask.
>>
>> The effective permissions are computed as the bitwise and (&) of  
>> the ACE mask
>> and the associated class_mask attribute.
>
> I take it you mean that "the effective access mask bits for ACEs of  
> type ALLOW"?
>
>> When doing a chmod(2) or when applying a create mask, the  
>> owner_class_mask,
>> group_class_mask, and other_class_mask attributes are modified  
>> according to
>> the owner class, group class, and other class permissions of the mode
>> parameter as follows:
>>
>>  - The POSIX read permission implies the ACE4_READ_DATA,  
>> ACE4_READ_ATTRIBUTES,
>> ACE4_READ_ACL, and ACE4_SYNCHRONIZE bitmask flags.
>>
>>  - The POSIX write permission implies the ACE4_WRITE_DATA,  
>> ACE4_APPEND_DATA,
>> ACE4_WRITE_ATTRIBUTES, ACE4_DELETE_CHILD, and ACE4_SYNCHRONIZE  
>> bitmask flags.
>
> I'm not sure I agree about ACE4_WRITE_ATTRIBUTES, but that's a  
> minor detail.
>
>>  - The POSIX execute permission implies the ACE4_EXECUTE mask.
>
>> This saves us from bloating ACLs with DENY entries, is more  
>> efficient when
>> doing a chmod, and also saves us from destroying permissions in  
>> user provided
>> DENY entries.
>
> Yes, but at the cost of adding new file attributes...  Don't get me  
> wrong, I do see merit in this proposal, but I don't know if it'll  
> be acceptable.
>
>> When an ACL is set, then set all mask attributes to the values  
>> provided in the
>> same SETATTR operation, and set the remaining mask attributes to  
>> the union of
>> all ALLOW ACL entries in the ACL that the class applies to.
>
> This doesn't take the ordering of the ACL into account; is this  
> your intention?  So
>
> GROUP@:read_data/write_data:DENY
> GROUP@:read_data/write_data:ALLOW
>
> would result in a group_class_mask of read_data|write_data, right?   
> (I'm not saying it's wrong, I'm just making sure I understand.)
>
>> Without any further changes, NFSv4 clients not aware of the three  
>> optional
>> attributes would not be aware of the restrictions imposed by those  
>> masks when
>> querying for the ACL. This would create an interoperability  
>> problem, and
>> possible security holes. To solve this problem, we can extend the  
>> GETATTR
>> operation as follows:
>>
>> When a client requests the ACL attribute, check if it also  
>> requests one or
>> more of the three optional owner_class_mask, group_class_mask, or
>> other_class_mask attributes. If it does, then send the requested  
>> attributes
>> as they are. If the client requests only the ACL without any of  
>> the masks,
>> return an ACL with only effective mask flags set, and with all  
>> other flags
>> removed.
>
> I assume you mean in the ALLOW ACEs only, right?

More thoughts on this model and getattr.  Giving different versions  
of the ACL depending on how it's requested leads to problems.  To  
recap, if NFSv4.0 client asks for the post-chmod ACL, it'll get the  
inhibited version of the ACL.  Tools for modifying an ACL invariably  
do read/modify/write.  So NFSv4.0 client reads the stripped down ACL,  
modifies it, and writes it back.  At this point, information is lost  
-- the stripped down ACL is now the only ACL we have.  This leads to  
future environments where some classes of clients inadvertently do  
bad things, while others behave more correctly.

The ACL model in draft-ietf-nfsv4-minorversion1-03.txt always shows  
every client the entire, correct ACL, every time.

- Sam

>
>> Alternate permissions in the ACL can be enabled by either setting  
>> an ACL
>> without providing full mask entries, or by setting the appropriate  
>> bit(s) in
>> the corresponding mask entry or entries.
>
> Yes, I think I understand.
>
>> When comparing POSIX ACLs and the NFSv4 ACL + mask attributes as  
>> proposed
>> here, one obvious difference is that POSIX ACLs have only one mask  
>> entry,
>> while I propose three mask entries here. The reason for this is  
>> that POSIX
>> ACLs can at most grant read, write, and execute permissions, and  
>> so with
>> POSIX ACLs, the File Owner Class permissions are always identical  
>> to the
>> permissions granted to the owner, and the File Other Class  
>> permissions are
>> always identical to the permissions granted to others. With NFSv4  
>> ACLs,
>> OWNER@ and EVERYONE@ entries may grant additional permissions that  
>> go beyond
>> what POSIX read, write, and execute can grant, and we need a  
>> mechanism so
>> that those alternate permissions can be turned off by chmod and  
>> during file
>> create without destroying the permissions.
>
> Given that EVERYONE@ is not equivalent to the POSIX "other" class,  
> it could be trimmed down to two.
>
>> I would appreciate if you could take this alternative proposal into
>> consideration when deciding how to proceed with NFSv4 Minor
>> Version 1 at next week's IETF 66 meeting.
>
> This proposal certainly has its merits.  I have doubts about the  
> feasibility of adding two or three new file attributes, and new as- 
> yet-unimplemented semantics, into the minorversion1 draft.  I have  
> doubts about how this would be implemented on a Windows-based server.
>
> The current design specified in draft-ietf-nfsv4- 
> minorversion1-03.txt has implementation experience -- it's released  
> in Solaris 10 update 3, a shipping product.  It meets strict POSIX  
> requirements for those implementations that choose to conform to  
> POSIX.  I believe it's fully implementable on a Windows-based server.
>
> I too hope that this can be discussed at IETF 66.
>
> - Sam
>
>>
>>
>> Thanks and best regards,
>> Andreas
>>
>>> REFERENCES
>>>
>>> [1] Sam Falkner et al.: NFS Version 4 ACLs, draft-ietf-nfsv4- 
>>> acls-00.txt
>>>
>>> [2] POSIX 1003.1e/2c draft 17 (withdrawn),
>>> http://wt.xpilot.org/publications/posix.1e
>>>
>>> [3] Marius Aamodt Eriksen et al.: Mapping Between NFSv4 and Posix  
>>> Draft
>>> ACLs, draft-ietf-nfsv4-acl-mapping-04.txt
>>>
>>> [4] Spencer Shepler (editor): NFSv4 Minor Version 1,
>>> draft-ietf-nfsv4-minorversion1-03.txt
>>
>> -- 
>> Andreas Gruenbacher <agruen@suse.de>
>> Novell / SUSE Labs
>
>
> _______________________________________________
> nfsv4 mailing list
> nfsv4@ietf.org
> https://www1.ietf.org/mailman/listinfo/nfsv4


_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-08  3:45   ` Sam Falkner
  2006-07-08  6:51     ` [nfsv4] " Lisa Week
  2006-07-08 14:32     ` Sam Falkner
@ 2006-07-09 16:22     ` Andreas Gruenbacher
  2006-07-10 13:29       ` Sam Falkner
  2006-07-11  6:50       ` Lisa Week
  2 siblings, 2 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-09 16:22 UTC (permalink / raw)
  To: nfsv4; +Cc: Sam Falkner, nfs, Spencer Shepler, Brian Pawlowski, Lisa Week

T24gU2F0dXJkYXksIDguIEp1bHkgMjAwNiAwNTo0NSwgU2FtIEZhbGtuZXIgd3JvdGU6Cj4gT24g
SnVsIDcsIDIwMDYsIGF0IDU6NTUgQU0sIEFuZHJlYXMgR3J1ZW5iYWNoZXIgd3JvdGU6Cj4gPiBP
biBNb25kYXksIDMuIEp1bHkgMjAwNiAyMzoxMCwgQW5kcmVhcyBHcnVlbmJhY2hlciB3cm90ZToK
PiA+PiBIZWxsbywKPiA+Pgo+ID4+IEkgaGF2ZSBiZWVuIHRoaW5raW5nIGFib3V0IHRoZSBwcm9i
bGVtcyBvZiBpbnRlcmFjdGlvbiBiZXR3ZWVuCj4gPj4gTkZTdjQgQUNMcyBhbmQgUE9TSVgsIGFu
ZCBwYXJ0aWN1bGFybHkgYWJvdXQgdGhlIGlzc3VlIG9mIG1hc2tpbmcKPiA+PiBwZXJtaXNzaW9u
cyB0aHJvdWdoIGNobW9kIGFuZCBhZnRlciBjcmVhdGluZyBmaWxlcyBvciBkaXJlY3Rvcmllcy4K
PiA+Cj4gPiBIZXJlIGlzIGEgZm9sbG93LXVwIGFmdGVyIHNvbWUgcGVyc29uYWwgZmVlZGJhY2sg
ZnJvbSBTYW0uIEkKPiA+IGJlbGlldmUgdGhhdCBkcmFmdC1pZXRmLW5mc3Y0LWFjbHMtMDAgaXMg
bm90IHJlYWR5IHRvIGJlY29tZSBwYXJ0IG9mIHRoZQo+ID4gTkZTdjQgTWlub3IgVmVyc2lvbiAx
IFJGQzogc29tZSBhc3N1bXB0aW9ucyBhcmUgbm90IGNvcnJlY3QgZnJvbSBhIFBPU0lYCj4gPiBw
b2ludCBvZiB2aWV3LCBhbmQgdGhlIHdheSBob3cgY2htb2QgYW5kIGZpbGUgY3JlYXRlIG1vZGVz
IGFyZSBhcHBsaWVkIHRvCj4gPiBORlN2NCBBQ0xzIGlzIHdlYWsgYW5kIG5vdCBndWFyYW50ZWVk
IHRvIGJlIGNvcnJlY3QuCj4KPiBJIGRpc2FncmVlIC0tIHNlZSBiZWxvdy4KCkhlcmUgYXJlIHNv
bWUgZmFjdHMgdG8gYmFjayBteSBwb2ludHM6IExldCdzIGFzc3VtZSB0aGF0IGEgZmlsZSBpbmhl
cml0cyB0aGUgCmZvbGxvd2luZyBBQ0wgd2hlbiBiZWluZyBjcmVhdGVkIChJIGFtIHVzaW5nIF4o
Li4uKSBoZXJlIHdpdGggdGhlIG1lYW5pbmcgb2YgCiJhbGwgYml0ZmxhZ3MgZXhjZXB0IC4uLiIp
OgoKCU9XTkVSQDpSRUFEX0RBVEEvV1JJVEVfREFUQTo6QUxMT1cKCU9XTkVSQDpeKFJFQURfREFU
QS9XUklURV9EQVRBKTo6REVOWQoJR1JPVVBAOlJFQURfREFUQTo6QUxMT1cKCXVzZXJAZG9tYWlu
OlJFQURfREFUQS9XUklURV9EQVRBOjpBTExPVwoJR1JPVVBAOl5SRUFEX0RBVEE6OkRFTlkKCXVz
ZXJAZG9tYWluOl4oUkVBRF9EQVRBL1dSSVRFX0RBVEEpOjpERU5ZCglFVkVSWU9ORUA6UkVBRF9E
QVRBOjpBTExPVwoKVGhpcyBhY2wgaXMgIndlbGwgc3RydWN0dXJlZCIgaW4gdGhlIFBPU0lYIHNl
bnNlOiBPV05FUkAgd2lsbCBvbmx5IGdldCB0aGUgCm93bmVyIHBlcm1pc3Npb25zIGFuZCBub25l
IG9mIHRoZSBvdGhlciBwZXJtaXNzaW9ucywgdXNlckBkb21haW4gYW5kIEdST1VQQCAKd2lsbCBv
bmx5IGdldCB0aGUgcGVybWlzc2lvbnMgaW50ZW5kZWQgZm9yIHRoZW0sIGFuZCBvbmx5IG90aGVy
cyAobmVpdGhlciAKT1dORVJAIG5vciB1c2VyQGRvbWFpbiBub3IgR1JPVVBAKSB3aWxsIGdldCBF
VkVSWU9ORUAgcGVybWlzc2lvbnM7IGluIG90aGVyIAp3b3JkcywgdGhlIGFjbCBpcyBldmVuIGNv
cnJlY3QgZm9yIG5vbi1tb25vdG9uaWMgcGVybWlzc2lvbnMuCgpBY2NvcmRpbmcgdG8gc2VjdGlv
biA1LjEgb2YgZHJhZnQtaWV0Zi1uZnN2NC1hY2xzIFsxXSwgdGhlIHJlc3VsdGluZyBmaWxlIG1v
ZGUgCnBlcm1pc3Npb24gYml0cyBmb3IgdGhpcyBhY2wgc2hhbGwgYmUgcnctci0tci0tLiBBZnRl
ciBhIGNobW9kIG9yIGEgZmlsZSAKY3JlYXRlLCBhbHRlcm5hdGUgZmlsZSBhY2Nlc3MgY29udHJv
bCBtZWNoYW5pc21zIG11c3QgYmUgZGlzYWJsZWQgYW5kIG9ubHkgCmFkZGl0aW9uYWwgZmlsZSBh
Y2Nlc3MgY29udHJvbCBtZWNoYW5pc21zIG1heSByZW1haW4gYWN0aXZlLiBBY2NvcmRpbmcgdG8g
ClBPU0lYLCBhZGRpdGlvbmFsIGZpbGUgYWNjZXNzIGNvbnRyb2wgbWVjaGFuaXNtcyByZXF1aXJl
IHRoYXQgbm8gdXNlciBtYXkgYmUgCmdyYW50ZWQgbW9yZSBwZXJtaXNzaW9ucyB0aGFuIHRoZSBy
ZXNwZWN0aXZlIGZpbGUgY2xhc3NlcyBwZXJtaXQuIEluIHRoaXMgCmNhc2UsIHVzZXJAZG9tYWlu
IGNsZWFybHkgaXMgbm90IGluIHRoZSBGaWxlIE93bmVyIENsYXNzLiAoQWNjb3JkaW5nIHRvIApQ
T1NJWCwgdXNlckBkb21haW4gbXVzdCBiZSBpbiB0aGUgRmlsZSBHcm91cCBDbGFzcy4pIFRoZSB1
c2VyQGRvbWFpbiB1c2VyIGlzIApncmFudGVkIFdSSVRFX0RBVEEgdGhvdWdoLCB3aGljaCBpcyAq
aW5jb3JyZWN0KiBmcm9tIGEgUE9TSVggcG9pbnQgb2Ygdmlldy4KCk5leHQsIGxldCdzIGFzc3Vt
ZSB0aGFuIGFuIEFDTCBjb250YWlucyB0aGUgZm9sbG93aW5nIHBhaXIgb2YgdXNlci1wcm92aWRl
ZCAKZW50cmllczoKCglHUk9VUEA6V1JJVEVfREFUQTo6REVOWQoJR1JPVVBAOlJFQURfREFUQTo6
QUxMT1cKCkNsZWFybHkgdGhlIHVzZXIncyBpbnRlbnRpb24gaXMgdG8gZGVueSBXUklURV9EQVRB
IGFjY2VzcyB0byBHUk9VUEAuIFRoZSAKYWxnb3JpdGhtIHRvIGFwcGx5IGEgbW9kZSB0byBhbiBl
eGlzdGluZyBBQ0wgd2lsbCByZW1vdmUgdGhlIFdSSVRFX0RBVEEgYml0IApmcm9tIHRoZSBHUk9V
UEA6V1JJVEVfREFUQTo6REVOWSBlbnRyeSB3aGVuIGEgY2htb2QoLi4uLCAwNzcwKSBpcyBkb25l
IAp0aG91Z2guIFRoaXMgaXMgY291bnRlciB0byB0aGUgdXNlcidzIGludGVudGlvbiwgc28gSSB3
b3VsZCBjYWxsIHRoYXQgKndyb25nKiAKYXMgd2VsbC4gSXQgYWxzbyB2aW9sYXRlcyB0aGUgcHJp
bmNpcGxlIG9mIGxlYXN0IHN1cnByaXNlLiBUaGVyZSByZWFsbHkgaXMgbm8gCnNhZmUgd2F5IHRv
IHRlbGwgdXNlci1wcm92aWRlZCBBQ0wgZW50cmllcyBmcm9tIGFydGlmaWNpYWxseSBtYWRlIHVw
IEFDTCAKZW50cmllcy4KCmRyYWZ0LWlldGYtbmZzdjQtYWNscyBpcyBtaXNzaW5nIGEgY2xlYXIg
Y2xhc3NpZmljYXRpb24gb2YgQUNMIGVudHJpZXMgaW50byAKdGhlIEZpbGUgT3duZXIsIEZpbGUg
R3JvdXAsIGFuZCBGaWxlIE90aGVyIGNsYXNzZXMuIEV2ZXJ5IEFDTCBlbnRyeSBtdXN0IGJlIApp
biBvbmUgb2YgdGhlIHRocmVlIGNsYXNzZXMgaW4gb3JkZXIgdG8gY29tcHV0ZSBhcHByb3ByaWF0
ZSBmaWxlIG1vZGUgCnBlcm1pc3Npb24gYml0cyB3aGVuIHNldHRpbmcgYW4gQUNMLCBhbmQgYWZ0
ZXIgaW5oZXJpdGluZyBwZXJtaXNzaW9ucy4gVGhpcyAKY2xhc3NpZmljYXRpb24gYWxzbyBkZXRl
cm1pbmVzIHdoaWNoIGVmZmVjdCBjaG1vZCB3aWxsIGhhdmUgb24gYW4gQUNMLgoKU28gZHJhZnQt
aWV0Zi1uZnN2NC1hY2xzIGlzICppbmNvcnJlY3QqIGFuZCAqd3JvbmcqIGZyb20gYSBQT1NJWCBw
b2ludCBvZiAKdmlldywgd2hpbGUgbXkgYWx0ZXJuYXRpdmUgcHJvcG9zYWwgaXMgY29ycmVjdCwg
YXBhcnQgZnJvbSBiZWluZyBzaW1wbGVyIHRvIAppbXBsZW1lbnQuIEkgaG9wZSB0aGF0IG15IGVt
YWlscyBhbmQgc29tZSBiYWNrZ3JvdW5kIHJlYWRpbmcgKGxpa2UgdGhlIGZpbGUgCmFjY2VzcyBy
ZWxhdGVkIHBhcnRzIG9mIHRoZSBQT1NJWCBkZWZpbml0aW9ucyB2b2x1bWUgWzVdLCBhIHBhcGVy
IHRoYXQgCmV4cGxhaW5zIFBPU0lYIEFDTHMgYW5kIGhvdyB0aGV5IGFyZSBpbXBsZW1lbnRlZCBv
biBMaW51eCBbNl0sIGFuZCBwZXJoYXBzIAoxMDAzLjFlIGRyYWZ0IDE3KSB3aWxsIGNvbnZpbmNl
IHlvdSBhYm91dCB0aGF0LgoKTm90ZSB0aGF0IGluIHRyYWRpdGlvbmFsIFBPU0lYLCBwZXJtaXNz
aW9ucyBmcm9tIG11bHRpcGxlIGZpbGUgY2xhc3NlcyB3aWxsIApuZXZlciBhY2N1bXVsYXRlOiBl
YWNoIHVzZXIgYWx3YXlzIGlzIGVpdGhlciBncmFudGVkIHRoZSBGaWxlIE93bmVyIApwZXJtaXNz
aW9uIGJpdHMsIHRoZSBGaWxlIEdyb3VwIHBlcm1pc3Npb24gYml0cywgb3IgdGhlIEZpbGUgT3Ro
ZXIgcGVybWlzc2lvbiAKYml0cy4gKEFkZGl0aW9uYWwgZmlsZSBhY2Nlc3MgY29udHJvbCBtZWNo
YW5pc21zIG1heSBmdXJ0aGVyIGxpbWl0IHRoZSAKcGVybWlzc2lvbnMgZ3JhbnRlZCwgYW5kIGFs
dGVybmF0aXZlIGZpbGUgYWNjZXNzIGNvbnRyb2wgbWVjaGFuaXNtcyBtYXkgCmZ1cnRoZXIgbGlt
aXQgb3IgZXh0ZW5kIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkLikgUGVybWlzc2lvbnMgZnJvbSBt
dWx0aXBsZSAKYWNsIGVudHJpZXMgYWNjdW11bGF0ZSBpbiB0aGUgTkZTdjQgQUNMIG1vZGVsIHRo
b3VnaCwgYW5kIHNvIHVubGVzcyBhbiBhY2wgaXMgCiJ3ZWxsIHN0cnVjdHVyZWQiIGluIHRoZSBh
Ym92ZSBzZW5zZSwgcGVybWlzc2lvbnMgZnJvbSBtdWx0aXBsZSBjbGFzc2VzIG1heSAKYWNjdW11
bGF0ZS4KCj4gPiBJIHdpbGwgZmlyc3QgdHJ5IHRvIGNsYXJpZnkgc29tZSBvZiB0aGUgcG9pbnRz
IEkgdHJpZWQgdG8gbWFrZSBpbgo+ID4gdGhlIHByZXZpb3VzIHBvc3RpbmcgYW5kIHBvaW50IG91
dCBkZWZpY2llbmNpZXMgaW4KPiA+IGRyYWZ0LWlldGYtbmZzdjQtYWNscy0wMC4gVGhlbiBJIHdp
bGwgcHJvcG9zZSBhbiBhbHRlcm5hdGl2ZSBkZXNpZ24gd2hpY2gKPiA+IGlzIG1vcmUgY29ycmVj
dCB0aGFuIGludHJvZHVjaW5nIERFTlkgZW50cmllcyB0byBtYXNrIHBlcm1pc3Npb25zLiAoQXMg
YQo+ID4gYm9udXMsIGl0IGlzIGVhc2llciB0byBpbXBsZW1lbnQuIHRvby4pCj4gPgo+ID4+IE9u
IGEgVU5JWCBzeXN0ZW0gdGhhdCBzdXBwb3J0cyBORlN2NCBBQ0xzIG5hdGl2ZWx5LCBJIHRoaW5r
IHdlCj4gPj4gc2hvdWxkIHRyeSB0byBhY2NlcHQgYXMgd2lkZSBhIHJhbmdlIG9mIE5GU3Y0IEFD
THMgYXMgcG9zc2libGUsIGJ1dCB3ZQo+ID4+IG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgY2FuIHBy
ZXNlcnZlIFBPU0lYIHNlbWFudGljcy4gSW4gcGFydGljdWxhciwgdGhpcwo+ID4+IG1lYW5zIHRo
YXQgQUNMcyBtYXkgY29udGFpbiBBQ0VzIGZvciB1c2VycyBvdGhlciB0aGFuIE9XTkVSQCwgR1JP
VVBALCBhbmQKPiA+PiBFVkVSWU9ORUAsIGFuZCB0aGF0IGNobW9kKDIpIG11c3QgY29udGludWUg
dG8gcHJvdmlkZSB0aGUgc2FtZSBraW5kcyBvZgo+ID4+IGd1YXJhbnRlZXMgYXMgd2l0aG91dCBO
RlN2NCBBQ0xzLgo+ID4+Cj4gPj4gSSBhbSBhc3N1bWluZyBoZXJlIHRoYXQgTkZTdjQgQUNMcyBz
aGFsbCBiZSBhbiBhZGRpdGlvbmFsIHJhdGhlciB0aGFuIGFuCj4gPj4gYWx0ZXJuYXRlIGZpbGUg
YWNjZXNzIGNvbnRyb2wgbWVjaGFuaXNtIGluIHRoZSBQT1NJWCBzZW5zZTogQWx0ZXJuYXRlCj4g
Pj4gZmlsZSBhY2Nlc3MgY29udHJvbCBtZWNoYW5pc21zIG11c3QgYGBiZSBlbmFibGVkIG9ubHkg
YnkgZXhwbGljaXQgdXNlcgo+ID4+IGFjdGlvbiwgb24gYSBwZXItZmlsZSBiYXNpcyBieSB0aGUg
ZmlsZSBvd25lciBvciBhIHVzZXIgd2l0aCB0aGUKPiA+PiBhcHByb3ByaWF0ZSBwcml2aWxlZ2Un
JywgYW5kIG11c3QgYGBiZSBkaXNhYmxlZCBmb3IgYSBmaWxlIGFmdGVyIHRoZSBmaWxlCj4gPj4g
cGVybWlzc2lvbiBiaXRzIGFyZSBjaGFuZ2VkIGZvciB0aGF0IGZpbGUgd2l0aCBjaG1vZCggKScn
IGFjY29yZGluZyB0bwo+ID4+IFBPU0lYLiBJbiBvdGhlciB3b3JkcywgbmV3bHkgY3JlYXRlZCBm
aWxlcyBvciBkaXJlY3RvcmllcyB3b3VsZCBoYXZlCj4gPj4gYWx0ZXJuYXRlIGZpbGUgYWNjZXNz
IGNvbnRyb2wgbWVjaGFuaXNtcyBkaXNhYmxlZC4gVGhpcyB3b3VsZCByZW5kZXIKPiA+PiBORlN2
NCBBQ0xzIGVzc2VudGlhbGx5IHVzZWxlc3MgZm9yIFVOSVggcHJvY2Vzc2VzLCBiZWNhdXNlIHRo
ZXkgd291bGQKPiA+PiBhbG1vc3QgYWx3YXlzIGJlIGRpc2FibGVkLCBhbmQgd291bGQgb25seSB3
b3JrIGZvciByZW1vdGUgcHJvY2Vzc2VzIHVudGlsCj4gPj4gYSBQT1NJWCBwcm9jZXNzIGNobW9k
cyBhIGZpbGUgb3IgY3JlYXRlcyBhIGRpcmVjdG9yeSwgd2hpY2ggd291bGRuJ3QgZ2V0Cj4gPj4g
dXMgdmVyeSBmYXIuIAo+ID4KPiA+IEFzIFNhbSBwb2ludGVkIG91dCwgYSBzdWJzZXQgb2YgTkZT
djQgQUNMcyBtYXBzIHRvIGFuIGFkZGl0aW9uYWwgZmlsZQo+ID4gYWNjZXNzIGNvbnRyb2wgbWVj
aGFuaXNtLCB3aGlsZSB0aGUgcmVzdCBnb2VzIGJleW9uZCB0aGF0LCBhbmQgdGhlcmVmb3JlCj4g
PiBpcyBhbiBhbHRlcm5hdGUgZmlsZSBhY2Nlc3MgY29udHJvbCBtZWNoYW5pc20uCj4KPiBZZXMg
LS0gQUxMT1cgQUNFcyBhcmUgYWx0ZXJuYXRlIGZpbGUgYWNjZXNzIGNvbnRyb2wsIGFuZCBERU5Z
IEFDRXMKPiBhcmUgYWRkaXRpb25hbCBmaWxlIGFjY2VzcyBjb250cm9sLgoKVGhpcyBjbGFzc2lm
aWNhdGlvbiBtYWtlcyBubyBzZW5zZSwgYW5kIGl0IGFsc28gZG9lcyBub3QgbWF0Y2ggd2hhdCB5
b3UgCnByb3Bvc2UgaW4gc2VjdGlvbiA1LjMgb2YgZHJhZnQtaWV0Zi1uZnN2NC1hY2xzLCBlaXRo
ZXI6IHRoZXJlIGFyZSBhY2xzIHRoYXQgCmNvbnRhaW4gQUxMT1cgZW50cmllcyB3aGljaCBhcmUg
c3RpbGwgb25seSBhbiBhZGRpdGlvbmFsIGZpbGUgYWNjZXNzIGNvbnRyb2wgCm1lY2hhbmlzbSwg
c28gd2UgcmVhbGx5IG5lZWQgdG8gY2xhc3NpZnkgdGhlbSBhcyBhbiBhZGRpdGlvbmFsIGZpbGUg
YWNjZXNzIApjb250cm9sIG1lY2hhbmlzbSBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG8gZGlz
YWJsZSB0aGVtIGR1cmluZyBjaG1vZCBvciAKd2hlbiBpbmhlcml0aW5nIHBlcm1pc3Npb25zLiBJ
ZiBBTExPVyBBQ0VzIHdlcmUgYWx0ZXJuYXRlIGluIGdlbmVyYWwsIHRoZW4gd2UgCndvdWxkIGhh
dmUgdG8gZGlzYWJsZSB0aGVtIGFsbCBhZnRlciBhIGNobW9kLCBhbmQgSSB0aGluayB3ZSBhZ3Jl
ZSB0aGF0IHRoaXMgCndvdWxkIG1ha2UgQUNMcyBwcmFjdGljYWxseSB1c2VsZXNzIGluIGNvbWJp
bmF0aW9uIHdpdGggUE9TSVguCgpUaGUgb25seSBjbGFzc2lmaWNhdGlvbiB0aGF0IG1ha2VzIHNl
bnNlIGlzIGJ5IHRoZSBwZXJtaXNzaW9ucyB0aGF0IGFuIEFDTCAKZ3JhbnRzLiBZb3UgaGF2ZSBn
aXZlbiBhbiBleGFtcGxlIG9mIGFuIEFDTCB0aGF0IGNsZWFybHkgaXMgYW4gYWRkaXRpb25hbCAK
ZmlsZSBhY2Nlc3MgY29udHJvbCBtZWNoYW5pc20gb25seS4gV2l0aCB0aGlzIGtpbmQgb2YgY2xh
c3NpZmljYXRpb24sIGEgCnNpZ25pZmljYW50IHN1YnNldCBvZiBORlN2NCBBQ0xzIGNhbiBiZSB0
cmVhdGVkIGFzIGFuIGFkZGl0aW9uYWwgZmlsZSBhY2Nlc3MgCmNvbnRyb2wgbWVjaGFuaXNtLCB3
aGljaCBtYWtlcyB0aGVtIGFjdHVhbGx5IHVzZWZ1bCBldmVuIHdoZW4gUE9TSVggc3lzdGVtcyAK
YW5kIFdpbmRvd3MgKG9yIG90aGVyIHN5c3RlbXMgd2l0aCBORlN2NCBBQ0xzIG9yIHNpbWlsYXIp
IGludGVyYWN0IGFuZCBib3RoIApjaGFuZ2UgQUNMcy4KCj4gPiBJdCBpcyBpbXBvcnRhbnQgdG8g
dW5kZXJzdGFuZCBob3cgUE9TSVggZGVmaW5lcyBhZGRpdGlvbmFsIGZpbGUKPiA+IGFjY2VzcyBj
b250cm9sIG1lY2hhbmlzbXM6Cj4gPgo+ID4gW10gMy40IEFkZGl0aW9uYWwgRmlsZSBBY2Nlc3Mg
Q29udHJvbCBNZWNoYW5pc20KPiA+IFtdIEFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgbWVjaGFu
aXNtIHRoYXQgaXMgbGF5ZXJlZCB1cG9uIHRoZQo+ID4gW10gYWNjZXNzIGNvbnRyb2wgbWVjaGFu
aXNtcyBkZWZpbmVkIGhlcmUsIGJ1dCB3aGljaCBkbyBub3QgZ3JhbnQKPiA+IFtdIHBlcm1pc3Np
b25zIGJleW9uZCB0aG9zZSBkZWZpbmVkIGhlcmVpbiwgYWx0aG91Z2ggdGhleSBtYXkgZnVydGhl
cgo+ID4gW10gcmVzdHJpY3QgdGhlbS4gCj4gPgo+ID4gSW4gb3RoZXIgd29yZHMsIHdoZW4gYSBm
aWxlIGhhcyBqdXN0IGJlZW4gY3JlYXRlZCBhbmQgYWZ0ZXIgY2htb2QsCj4gPiB0aGUgZmlsZSBt
b2RlIHBlcm1pc3Npb24gYml0cyBkZWZpbmUgYW4gdXBwZXIgYm91bmQgdG8gdGhlIHBlcm1pc3Np
b25zCj4gPiBncmFudGVkIHRvIGFueW9uZSBvbiB0aGUgc3lzdGVtLCBhbmQgbm9ib2R5IGhhcyBh
ZGRpdGlvbmFsIHBlcm1pc3Npb25zLgo+ID4gQWRkaXRpb25hbCBwZXJtaXNzaW9ucyAoYXMgYW4g
YWx0ZXJuYXRlIGZpbGUgYWNjZXNzIGNvbnRyb2wgbWVjaGFuaXNtKSBtYXkKPiA+IGJlIGVuYWJs
ZWQgZXhwbGljaXRseSwgYnV0IHRoZSBuZXh0IGNobW9kIG11c3QgZGlzYWJsZSB0aGVtIGFnYWlu
Lgo+Cj4gVGhlIHVzZSBvZiB0aGUgd29yZCAiQWRkaXRpb25hbCIgaXMgY29uZnVzaW5nIGluIHRo
ZSBhYm92ZQo+IHNlbnRlbmNlLiAgOi0pICBJIHRoaW5rIHlvdSBtZWFuICJtb3JlIiwgb3Igc2lt
aWxhciwgYnV0ICJBZGRpdGlvbmFsIgo+IGhhcyBhIHZlcnkgc3BlY2lmaWMgbWVhbmluZyB3aGlj
aCAoSSB0aGluaykgaXNuJ3Qgd2hhdCB5b3UgbWVhbi4KCkkgaW5kZWVkIG1lYW50IG1vcmUgcGVy
bWlzc2lvbnMgYXMgaW4gYWRkaXRpb25hbCBtYXNrIGJpdHMgZ3JhbnRlZCwgYXMgb3Bwb3NlZCAK
dG8gYW4gYWRkaXRpb25hbCBmaWxlIGFjY2VzcyBjb250cm9sIG1lY2hhbmlzbSBpbiB0aGUgc2Vu
c2UgaG93IFBPU0lYIGRlZmluZXMgCnRoaXMgdGVybS4KCj4gPiBXZSBjYW4gY2xhc3NpZnkgdGhl
IHBlcm1pc3Npb25zIHRoYXQgTkZTdjQgQUNMcyBncmFudCBpbnRvIGFkZGl0aW9uYWwgYW5kCj4g
PiBhbHRlcm5hdGUgbWVjaGFuaXNtcyBhcyBmb2xsb3dzOiBldmVyeXRoaW5nIGNvdmVyZWQgYnkg
dGhlIFBPU0lYCj4gPiByZWFkL3dyaXRlL2V4ZWN1dGUgcGVybWlzc2lvbnMgKHN1Y2ggYXMgQUNF
NF9SRUFEX0RBVEEsIGJ1dCBhbHNvCj4gPiBBQ0U0X0FQUEVORF9EQVRBKSBpcyBhZGRpdGlvbmFs
LCB3aGlsZSBldmVyeXRoaW5nIGJleW9uZCB0aGF0IChzdWNoIGFzCj4gPiBBQ0U0X1dSSVRFX09X
TkVSKSBpcyBhbHRlcm5hdGUuCj4KPiBOb3RlIHdlbGw6IHRoaXMgaXMgcXVpdGUgZGlmZmVyZW50
IGZyb20gZHJhZnQtaWV0Zi1uZnN2NC0KPiBtaW5vcnZlcnNpb24xLTAzLnR4dCwgaS5lLiB0aGlz
IGlzIGFuIGFsdGVybmF0ZSBwcm9wb3NhbC4KClllcywgdGhpcyBpcyBhIGRpZmZlcmVudCBhcHBy
b2FjaCBvZiBjbGFzc2lmeWluZyBORlN2NCBBQ0xzIGludG8gYWRkaXRpb25hbCAKYW5kIGFsdGVy
bmF0ZSBmaWxlIGFjY2VzcyBjb250cm9sIG1lY2hhbmlzbXMsIHdoaWNoIGNvbXBsaWVzIHRvIFBP
U0lYIGFzIHdlbGwgCmFzIHRvIHRoZSBjdXJyZW50IE5GU3Y0IFJGQy4gSXQgY29uZmxpY3RzIHdp
dGggZHJhZnQtaWV0Zi1uZnN2NC1hY2xzLCBhbmQgYnkgCmltcGxpY2F0aW9uIHdpdGggZHJhZnQt
aWV0Zi1uZnN2NC1taW5vcnZlcnNpb24xLTAzIFs0XSwgd2hpY2ggaW5jbHVkZXMgdGhlIApzYW1l
IHRleHQuCgpOb3RlIHRoYXQgZHJhZnQtaWV0Zi1uZnN2NC1hY2xzIGlzIGluY29uc2lzdGVudCBp
biBpdHNlbGY6IHRoZSBhbGdvcml0aG0gaW4gCnNlY3Rpb24gNS4zIHJlc3RyaWN0cyB3aGljaCBw
ZXJtaXNzaW9ucyBhbiBBQ0wgZ3JhbnRzIGJ5IG1hc2tpbmcgcGVybWlzc2lvbnMgCih3aGljaCBp
bXBsaWVzIHRoYXQgeW91IGFyZSBjbGFzc2lmeWluZyBieSBwZXJtaXNzaW9uIGFzIG9wcG9zZWQg
dG8gdHVybmluZyAKb2ZmIGFsbCBBTExPVyBlbnRyaWVzKSwgd2hpbGUgc2VjdGlvbiAxNC40IHNh
eXMgdGhhdCAidGhlIEFMTE9XIHR5cGUgb2YgQUNFIAppcyBjb25zaWRlcmVkIHRvIGJlIGFuIGFs
dGVybmF0ZSBmaWxlIGFjY2VzcyBjb250cm9sIG1lY2hhbmlzbSBiZWNhdXNlIGl0IGNhbiAKZnVy
dGhlciBleHRlbmQgdGhlIHBlcm1pc3Npb25zIG9mIGEgdXNlciIuCgo+ID4gVW5kZXIgdGhpcyBk
ZWZpbml0aW9uLCBhbGwgTkZTdjQgQUNMcyB0aGF0IGdyYW50IG5vIG1vcmUgdGhhbgo+ID4gQUNF
NF9SRUFEX0RBVEEsIEFDRTRfTElTVF9ESVJFQ1RPUlksIEFDRTRfV1JJVEVfREFUQSwgCj4gPiBB
Q0U0X0FERF9GSUxFLCBBQ0U0X0FQUEVORF9EQVRBLCBBQ0U0X0FERF9TVUJESVJFQ1RPUlksCj4g
PiBBQ0U0X1JFQURfTkFNRURfQVRUUlMsIEFDRTRfV1JJVEVfTkFNRURfQVRUUlMsIEFDRTRfRVhF
Q1VURSwKPiA+IEFDRTRfUkVBRF9BVFRSSUJVVEVTLCBBQ0U0X1dSSVRFX0FUVFJJQlVURVMsIEFD
RTRfUkVBRF9BQ0wsIGFuZAo+ID4gQUNFNF9TWU5DSFJPTklaRSB3b3VsZCBjb3VudCBhcyBhZGRp
dGlvbmFsIGFjY2VzcyBjb250cm9sCj4gPiBtZWNoYW5pc21zLiBBbGwgb3RoZXJzIHdpdGggQUNF
NF9XUklURV9BQ0wsIEFDRTRfV1JJVEVfT1dORVIsCj4gPiBBQ0U0X0RFTEVURV9DSElMRCwgYW5k
IEFDRTRfREVMRVRFIGFyZSBhbHRlcm5hdGUuCgpGdXJ0aGVyIGJlbG93IGluIHlvdXIgcmVwbHkg
eW91IHdyb3RlOgo+IEknbSBub3Qgc3VyZSBJIGFncmVlIGFib3V0IEFDRTRfV1JJVEVfQVRUUklC
VVRFUywgYnV0IHRoYXQncyBhIG1pbm9yCj4gZGV0YWlsLgoKSSBzdGFuZCBjb3JyZWN0ZWQgdGhh
dCBBQ0U0X1dSSVRFX0FUVFJJQlVURVMgaXMgYW4gYWx0ZXJuYXRlIHBlcm1pc3Npb24gcmF0aGVy
IAp0aGFuIGFuIGFkZGl0aW9uYWwgb25lOiB0aGUgUE9TSVggcmVhZC93cml0ZS9leGVjdXRlIHBl
cm1pc3Npb25zIGRvIG5vdCBhbGxvdyAKdG8gd3JpdGUgdG8gaW5vZGUgYXR0cmlidXRlcy4KCj4g
SSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgaXMgZ2FpbmVkIGJ5IHRoaXMgZGVzaWduYXRpb24gb2Yg
YWRkaXRpb25hbAo+IGFjY2VzcyBjb250cm9sIG1lY2hhbmlzbXMuCgpUaGUgYmVuZWZpdCBpcyB0
aGF0IGEgbW9yZSByZWFzb25hYmxlIHNldCBvZiBwZXJtaXNzaW9ucyBjYW4gcmVtYWluIGFjdGl2
ZSAKYWNyb3NzIGNobW9kIGFuZCBwZXJtaXNzaW9uIGluaGVyaXRhbmNlOiBpZiB3ZSBhc3N1bWUg
dGhhdCBBTExPVyBBQ0VzIGFyZSAKYWx0ZXJuYXRpdmUsIGFsbCBBTExPVyBBQ0VzIHdpbGwgaGF2
ZSB0byBiZSBkaXNhYmxlZCB3aGVuIGEgY2htb2QgaXMgZG9uZSwgb3IgCmluIHRoZSBwZXJtaXNz
aW9ucyB0aGF0IGEgZmlsZSBpbmhlcml0cy4gQSBjaG1vZCBmb3JtIG9uZSBtb2RlIHRvIGFub3Ro
ZXIgYW5kIApiYWNrIHdpbGwgZGlzYWJsZSBhbGwgYWx0ZXJuYXRpdmUgZmlsZSBhY2Nlc3MgY29u
dHJvbCBtZWNoYW5pc21zOyB0aGVyZSBpcyBubyAKd2F5IGFyb3VuZCB0aGF0LgoKSWYgd2UgYXNz
dW1lIHRoYXQgY2VydGFpbiBwZXJtaXNzaW9ucyBhcmUgaW4gdGhlIGFkZGl0aW9uYWwgY2xhc3Mg
YW5kIG90aGVycyAKYXJlIGluIHRoZSBhbHRlcm5hdGl2ZSBjbGFzcywgdGhlbiB3ZSBjYW4gZGlz
YWJsZSBvbmx5IHRob3NlIGFkZGl0aW9uYWwgCnBlcm1pc3Npb25zIHdoaWNoIGV4Y2VlZCB3aGF0
IHRoZSBhc3NvY2lhdGVkIGZpbGUgY2xhc3MgcGVybWl0cyAocmVtZW1iZXIgCnRoYXQgdGhlIGZp
bGUgY2xhc3NlcyBkZWZpbmUgdGhlIG1heGltdW0gcGVybWlzc2lvbnMgdGhhdCBhIG1lbWJlciBv
ZiB0aGF0IApjbGFzcyBtYXkgaGF2ZS4gV2Ugd2lsbCBhbHdheXMgZGlzYWJsZSBhbGwgYWx0ZXJu
YXRpdmUgcGVybWlzc2lvbnMgdXBvbiAKY2htb2QsIGJlY2F1c2UgdGhvc2UgYXJlIHRoZSBlbnRy
aWVzIHdoaWNoIGV4Y2VlZCB3aGF0IHRoZSBmaWxlIGNsYXNzIG1heSAKcGVybWl0IGJ5IGRlZmlu
aXRpb24sIGJ1dCB3ZSB3aWxsIGxlYXZlIGFzIG11Y2ggb2YgdGhlIGFkZGl0aW9uYWwgCnBlcm1p
c3Npb25zIGludGFjdCBhcyBwb3NzaWJsZS4KCkNvbnNpZGVyIHRoaXMgQUNMIChJIGhhdmUgdXNl
ZCB0aGUgc2FtZSBleGFtcGxlIGFib3ZlIGFscmVhZHkpOgoKCU9XTkVSQDpSRUFEX0RBVEEvV1JJ
VEVfREFUQTo6QUxMT1cKCU9XTkVSQDpeKFJFQURfREFUQS9XUklURV9EQVRBKTo6REVOWQoJR1JP
VVBAOlJFQURfREFUQTo6QUxMT1cKCXVzZXJAZG9tYWluOlJFQURfREFUQS9XUklURV9EQVRBOjpB
TExPVwoJR1JPVVBAOl5SRUFEX0RBVEE6OkRFTlkKCXVzZXJAZG9tYWluOl4oUkVBRF9EQVRBL1dS
SVRFX0RBVEEpOjpERU5ZCglFVkVSWU9ORUA6UkVBRF9EQVRBOjpBTExPVwoKV2l0aCB0aGUgQUxM
T1cgPSBhbHRlcm5hdGl2ZSBjbGFzc2lmaWNhdGlvbiwgYWxsIGFsbG93IGVudHJpZXMgd291bGQg
Z2V0IApkaXNhYmxlZCwgYW5kIHNvIHRoaXMgQUNMIHdvdWxkIG5vdCBncmFudCBhbnkgcGVybWlz
c2lvbnMgdG8gYW55Ym9keSBubyAKbWF0dGVyIHdoaWNoIGNobW9kIG1vZGUgaXMgdXNlZC4gV2l0
aCB0aGUgY2xhc3NpZmljYXRpb24gSSBhbSBwcm9wb3NpbmcsIHRoaXMgCmZpbGUgd291bGQgaGF2
ZSBydy1ydy1yLS0gZmlsZSBtb2RlIHBlcm1pc3Npb24gYml0cy4gQSBjaG1vZCB0byBydy1yLS0t
LS0gCndvdWxkIGRpc2FibGUgdGhlIHVzZXJAZG9tYWluOldSSVRFX0RBVEEgYW5kIEVWRVJZT05F
QDpSRUFEX0RBVEEgcGVybWlzc2lvbnMsIApidXQgdGhlIG90aGVyIHBlcm1pc3Npb25zIHdvdWxk
IHN0aWxsIHJlbWFpbiBlZmZlY3RpdmUuCgpOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSB0aGUg
YmVoYXZpb3IgeW91IGFyZSBkZXNjcmliaW5nIGluIHNlY3Rpb24gNS4zIG9mIApkcmFmdC1pZXRm
LW5mc3Y0LWFjbHMtMDAsIHRoZSBkcmFmdCBpcyBvbmx5IG1pc3NpbmcgYSBjbGVhciBjbGFzc2lm
aWNhdGlvbiBvZiAKQUNFcyBpbnRvIHRoZSBGaWxlIE93bmVyLCBGaWxlIEdyb3VwLCBhbmQgRmls
ZSAgT3RoZXIgY2xhc3Nlcy4KCk9uZSBlc3NlbnRpYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIGRyYWZ0
LWlldGYtbmZzdjQtYWNscy0wMCBhbmQgbXkgcHJvcG9zYWwgaXMgCnRoZSBtZWNoYW5pc20gdXNl
ZCB0byByZXN0cmljdCB0aGUgcGVybWlzc2lvbnMgdGhhdCBhbiBBQ0wgZ3JhbnRzOiAKZHJhZnQt
aWV0Zi1uZnN2NC1hY2xzLTAwIGluc2VydHMgREVOWSBlbnRyaWVzIGluIHRoZSBhY2wgYXQgdGhl
IGFwcHJvcHJpYXRlIApwbGFjZXMgYW5kIHVwZGF0ZXMgdGhlbSBsYXRlciBhcyBhcHByb3ByaWF0
ZSwgd2hpbGUgbXkgcHJvcG9zYWwgaW50cm9kdWNlcyAKb3B0aW9uYWwgbWFzayBhdHRyaWJ1dGVz
IGFuZCBvbmx5IHVwZGF0ZXMgdGhvc2UgYXR0cmlidXRlcy4KCldoaWxlIGRyYWZ0LWlldGYtbmZz
djQtYWNscy0wMCBzdHlsZSBBQ0xzIGNhbiBiZSBzZW50IHRvIGFsbCBORlN2NCBjbGllbnRzIAp1
bm1vZGlmaWVkLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgd2hlbiBzZW5kaW5nIEFDTHMgdG8gY2xp
ZW50cyBpbiB0aGUgCnByZXNlbmNlIG9mIG1hc2sgYXR0cmlidXRlczogaWYgYSBjbGllbnQgaXMg
YXdhcmUgb2YgdGhlIG1hc2sgYXR0cmlidXRlcywgd2UgCmNhbiBzZW5kIHRoZSBBQ0wgZGlyZWN0
bHkuIElmIHRoZSBjbGllbnQgaXMgdW5hd2FyZSBvZiB0aGUgbWFzayBhdHRyaWJ1dGVzLCAKd2Ug
Y2FuIGNob29zZSB0byBlaXRoZXIgc2VuZCBhbiBBQ0wgdGhhdCBvbmx5IGNvbnRhaW5zIGFsbCB0
aGUgZWZmZWN0aXZlIApwZXJtaXNzaW9ucyBhbmQgd2l0aCB0aGUgbWFza2VkIHBlcm1pc3Npb25z
IHJlbW92ZWQsIG9yIHdlIGNvdWxkIGZpcnN0IGluc2VydCAKREVOWSBlbnRyaWVzIGluIHRoZSBB
Q0wgd2Ugc2VuZCBzaW1pbGFyIHRvIHNlY3Rpb24gNS4zIG9mIApkcmFmdC1pZXRmLW5mc3Y0LWFj
bHMtMDAgKGJ1dCB3aXRoIHRoZSBjbGFzc2lmaWNhdGlvbiBvZiBBQ0VzIGludG8gdGhlIGZpbGUg
CmNsYXNzZXMgY2xlYW5lZCB1cCkuCgo+IElmIHlvdSByZWFsbHkgc2F5IHRoYXQgdGhpcyBBQ0w6
IAo+Cj4gT1dORVJAOnJlYWRfZGF0YTphbGxvdwo+IGZyaWVuZEB5b3VyLmNvbTpyZWFkX2RhdGE6
YWxsb3cKPgo+IGlzIGFkZGl0aW9uYWwgZmlsZSBhY2Nlc3MgY29udHJvbCwKClllcy4KCj4gdGhl
biB3aGF0IGlzIHRoZSBtb2RlIG9uIHN1Y2ggYSBmaWxlPwoKVGhlIG1vZGUgaXMgci0tci0tLS0t
LCB3aGljaCBkb2VzICpub3QqIGltcGx5IHRoYXQgdGhlIG93bmluZyBncm91cCBoYXMgcmVhZCAK
YWNjZXNzLgoKPiBVbmxlc3MgdGhlIG1vZGUgc2F5cyAiZ3JvdXAgY2FuIHJlYWQiLCB0aGVuIGZy
aWVuZEB5b3VyLmNvbSAKPiB3b3VsZG4ndCBiZSBhYmxlIHRvIHJlYWQsIGlmIHRoZSBBQ0wgaXMg
YWRkaXRpb25hbCBmaWxlIGFjY2Vzcwo+IGNvbnRyb2wuCgpUaGF0J3MgY29ycmVjdC4KCj4gV2hh
dCBpZiB5b3Ugd2FudCBmcmllbmRAeW91ci5jb20gdG8gYmUgYWJsZSB0byByZWFkLCBidXQgeW91
IGRvbid0IHdhbnQgdGhlCj4gZmlsZSdzIG93bmluZyBncm91cCB0byByZWFkPyAKClBPU0lYIGRv
ZXMgbm90IHJlcXVpcmUgdGhhdCByLS1yLS0tLS0gZmlsZSBtb2RlIHBlcm1pc3Npb24gYml0cyBn
aXZlIHRoZSAKb3duaW5nIGdyb3VwIHdyaXRlIGFjY2Vzcy4gVGhlIG93bmluZyBncm91cCBwZXJt
aXNzaW9ucyBkZXBlbmQgb24gd2hpY2ggCmVudHJpZXMgYXJlIGluIHRoZSBhY2w6IHdpdGggRmls
ZSBHcm91cCBDbGFzcyBwZXJtaXNzaW9ucyBvZiByLS0sIGlmIHRoZSBhY2wgCmNvbnRhaW5zIGEg
R1JPVVBAOlJFQURfREFUQTo6QUxMT1cgZW50cnksIHRoZSBvd25pbmcgZ3JvdXAgaXMgZ3JhbnRl
ZCAKUkVBRF9EQVRBIGFjY2Vzcy4gV2l0aCBubyBHUk9VUEAgZW50cnksIGEgR1JPVVBAOldSSVRF
X0RBVEE6OkFMTE9XIGVudHJ5LCBvciAKYSBHUk9VUEA6UkVBRF9EQVRBOjpERU5ZIGVudHJ5IGJl
Zm9yZSBvdGhlciBlbnRyaWVzIHRoYXQgd291bGQgZ2l2ZSBHUk9VUEAgCnJlYWQgYWNjZXNzLCBH
Uk9VUEAgd291bGQgbm90IGJlIGdyYW50ZWQgUkVBRF9EQVRBIGFjY2Vzcy4KClRoZXJlIGlzIG9u
ZSBvdGhlciBjYXNlIHRvIGxvb2sgYXQgdGhvdWdoOiB3aGlsZSBhIGNobW9kIHdpbGwgZGlzYWJs
ZSBhbGwgCmFsdGVybmF0ZSBwZXJtaXNzaW9ucyBhbmQgbm8gYWx0ZXJuYXRlIHBlcm1pc3Npb25z
IHdpbGwgYmUgZWZmZWN0aXZlIGZvciAKbmV3bHkgY3JlYXRlZCBmaWxlcywgdGhlIG1hc2sgYXR0
cmlidXRlcyBjYW4gYmUgc2V0IGV4cGxpY2l0bHksIGFuZCBhbHRlcm5hdGUgCnBlcm1pc3Npb25z
IG1heSBiZSBlbmFibGVkLiBEZXBlbmRpbmcgb24gd2hpY2ggcGVybWlzc2lvbnMgdGhlIEFDTCBn
cmFudHMsIAp0aGlzIG1heSBjYXVzZSBhbHRlcm5hdGUgcGVybWlzc2lvbnMgdG8gYmVjb21lIGVm
ZmVjdGl2ZSAoYWx0ZXJuYXRlIGZpbGUgCmFjY2VzcyBjb250cm9sIG1lY2hhbmlzbSksIGFuZCBp
biB0aGlzIGNhc2UsIG1vcmUgcGVybWlzc2lvbnMgbWF5IGJlIGdyYW50ZWQgCnRoYW4gdGhlIGZp
bGUgbW9kZSBwZXJtaXNzaW9uIGJpdHMgaW1wbHkuCgpTZXR0aW5nIHRoZSBtYXNrIGF0dHJpYnV0
ZXMgc2hvdWxkIGNhdXNlIHRoZSBmaWxlIG1vZGUgcGVybWlzc2lvbiBiaXRzIHRvIGJlIApzZXQg
dG8gdGhlIHZhbHVlIHRoYXQgbW9zdCBjbG9zZWx5IG1hdGNoZXMgdGhlIG1hc2sgYXR0cmlidXRl
cy4gKEZvciBleGFtcGxlLCAKc2V0dGluZyB0aGUgUkVBRF9EQVRBIGJpdG1hc2sgaW4gZ3JvdXBf
Y2xhc3NfbWFzayBzaG91bGQgYWxzbyBzZXQgdGhlIHJlYWQgCkZpbGUgR3JvdXAgQ2xhc3MgcGVy
bWlzc2lvbikuCgpJIHByb3Bvc2VkIHRoYXQgd2hlbiBhIFNFVEFUVFIgb2YgQUNMIGlzIGRvbmUg
d2l0aG91dCBhbHNvIHNldHRpbmcgdGhlIHRocmVlIAoqX2NsYXNzX21hc2sgYXR0cmlidXRlcywg
dGhlbiB0aG9zZSpfY2xhc3NfbWFzayBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCAKc3BlY2lmaWVk
IHNob3VsZCBiZSBjb21wdXRlZCBhcyB0aGUgdW5pb24gb2YgdGhlIG1hc2sgYml0cyBvZiB0aGUg
ZW50cmllcyBpbiAKdGhlIHJlc3BlY3RpdmUgY2xhc3MuIFRoaXMgbWVhbnMgdGhhdCBhIFNFVEFU
VFIgb2YgQUNMIG1heSBvciBtYXkgbm90IGFtb3VudCAKdG8gYW4gYWx0ZXJuYXRlIGZpbGUgYWNj
ZXNzIGNvbnRyb2wgb3BlcmF0aW9uLgoKSSBoaWdobHkgcmVjb21tZW5kIHRvIHJlYWQgUE9TSVgg
QWNjZXNzIENvbnRyb2wgTGlzdHMgb24gTGludXggWzZdLgoKPiA+IEFzIHNhaWQgYWxyZWFkeSwg
dGhlIFBPU0lYIGZpbGUgbW9kZSBwZXJtaXNzaW9uIGJpdHMgZGVmaW5lIHRoZQo+ID4gcGVybWlz
c2lvbnMgb2YgdGhyZWUgY2xhc3Nlczogb3duZXIsIGdyb3VwLCBhbmQgb3RoZXIuIEFuIGFkZGl0
aW9uYWwKPiA+IGZpbGUgYWNjZXNzIGNvbnRyb2wgbWVjaGFuaXNtIG1heSBvbmx5IGZ1cnRoZXIg
cmVzdHJpY3QgdGhlIHBlcm1pc3Npb25zCj4gPiBncmFudGVkIHRvIHRob3NlIGNsYXNzZXMuCj4g
Pgo+ID4gVG8gbWFwIE5GU3Y0IEFDTHMgdG8gYW4gYWRkaXRpb25hbCBmaWxlIGFjY2VzcyBjb250
cm9sIG1lY2hhbmlzbSwKPiA+Cj4gPiAgLSB3ZSBtdXN0IG1hcCBlYWNoIE5GU3Y0IEFDTCBlbnRy
eSB0byBleGFjdGx5IG9uZSBvZiB0aGUgdGhyZWUKPiA+IGNsYXNzZXMuCj4gPgo+ID4gIC0gd2Ug
bXVzdCBlbnN1cmUgdGhhdCB0aGUgQUNMIGRvZXMgbm90IGdyYW50IGFueSBwZXJtaXNzaW9ucyB0
aGF0Cj4gPiBnbyBiZXlvbmQgdGhlIGNsYXNzIHBlcm1pc3Npb25zIGFmdGVyIGEgY2htb2Qgb3Ig
Y3JlYXRlLgo+Cj4gQWRkaXRpb25hbCBGaWxlIEFjY2VzcyBDb250cm9sIG11c3Qgbm90IGdyYW50
IGJleW9uZCB0aGUgY2xhc3MKPiBwZXJtaXNzaW9ucyAqZXZlciosIG5vdCBqdXN0IGFmdGVyIGNy
ZWF0ZSBvciBjaG1vZC4KPgo+ID4gIC0gaW4gcGFydGljdWxhciwgd2UgbXVzdCBlbnN1cmUgdGhh
dCB0aGUgQUNMIGdyYW50cyBubyAiYWx0ZXJuYXRlIgo+ID4gICAgcGVybWlzc2lvbnMgYWZ0ZXIg
YSBjaG1vZCBvciBjcmVhdGUuCj4KPiBJIGRvbid0IHVuZGVyc3RhbmQgdGhpczsgeW91IGJlZ2Fu
IHRoaXMgc2VjdGlvbiB3aXRoICJUbyBtYXAgTkZTdjQKPiBBQ0xzIHRvIGFuIGFkZGl0aW9uYWwu
Li4iLCBidXQgaGVyZSwgeW91IHNlZW0gdG8gYmUgZGVzY3JpYmluZyBBQ0xzCj4gYXMgYW4gYWx0
ZXJuYXRlIGZpbGUgYWNjZXNzIGNvbnRyb2wgbWVjaGFuaXNtLgoKSSBhbSBzYXlpbmcgdGhhdCBw
ZXJtaXNzaW9ucyBjbGFzc2lmaWVkIGFzIGFsdGVybmF0ZSBjYW4gbmV2ZXIgYmVjb21lIAplZmZl
Y3RpdmUgYXMgcGFydCBvZiBhbiBhZGRpdGlvbmFsIGZpbGUgYWNjZXNzIGNvbnRyb2wgbWVjaGFu
aXNtLiBUaGlzIG1lYW5zIAp0aGF0IHRoZSBBQ0wgbWF5IHN0aWxsIGNvbnRhaW4gc3VjaCBhbHRl
cm5hdGUgcGVybWlzc2lvbnMsIGJ1dCB3ZSBtdXN0IGVuc3VyZSAKdGhhdCB0aGVzZSBwZXJtaXNz
aW9ucyB3aWxsIG5vdCBiZWNvbWUgZWZmZWN0aXZlIGltcGxpY2l0bHkuCgo+ID4gV2UgYXJlIGZy
ZWUgdG8gcHJvdmlkZSBtZWNoYW5pc21zIGJ5IHdoaWNoIG1vcmUgcGVybWlzc2lvbnMgbWF5IGJl
Cj4gPiBlbmFibGVkIGJ5IGV4cGxpY2l0IHVzZXIgYWN0aW9uLCBvbiBhIHBlci1maWxlIGJhc2lz
IGJ5IHRoZSBmaWxlIG93bmVyIG9yCj4gPiBhIHVzZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJp
dmlsZWdlLCBhY2NvcmRpbmcgdG8gUE9TSVguCgouLi4gYW5kIHRoaXMgd291bGQgY291bnQgYXMg
YW4gYWx0ZXJuYXRlIGFjY2VzcyBjb250cm9sIG1lY2hhbmlzbSB0aGVuLgoKPiA+IFRoZSBQT1NJ
WCBkZWZpbml0aW9ucyBvZiB0aGUgdGhyZWUgZmlsZSBwZXJtaXNzaW9uIGNsYXNzZXMgYXJlOgo+
ID4KPiA+IFtdIDMuMTczIEZpbGUgT3duZXIgQ2xhc3MKPiA+IFtdIFRoZSBwcm9wZXJ0eSBvZiBh
IGZpbGUgaW5kaWNhdGluZyBhY2Nlc3MgcGVybWlzc2lvbnMgZm9yIGEKPiA+IFtdIHByb2Nlc3Mg
cmVsYXRlZCB0byB0aGUgdXNlciBpZGVudGlmaWNhdGlvbiBvZiBhIHByb2Nlc3MuIEEgcHJvY2Vz
cwo+ID4gW10gaXMgaW4gdGhlIGZpbGUgb3duZXIgY2xhc3Mgb2YgYSBmaWxlIGlmIHRoZSBlZmZl
Y3RpdmUgdXNlciBJRCBvZiB0aGUKPiA+IFtdIHByb2Nlc3MgbWF0Y2hlcyB0aGUgdXNlciBJRCBv
ZiB0aGUgZmlsZS4KPiA+Cj4gPiBbXSAzLjE2NiBGaWxlIEdyb3VwIENsYXNzCj4gPiBbXSBUaGUg
cHJvcGVydHkgb2YgYSBmaWxlIGluZGljYXRpbmcgYWNjZXNzIHBlcm1pc3Npb25zIGZvciBhIHBy
b2Nlc3MKPiA+IFtdIHJlbGF0ZWQgdG8gdGhlIGdyb3VwIGlkZW50aWZpY2F0aW9uIG9mIGEgcHJv
Y2Vzcy4gQSBwcm9jZXNzIGlzIGluCj4gPiBbXSB0aGUgZmlsZSBncm91cCBjbGFzcyBvZiBhIGZp
bGUgaWYgdGhlIHByb2Nlc3MgaXMgbm90IGluIHRoZSBmaWxlCj4gPiBbXSBvd25lciBjbGFzcyBh
bmQgaWYgdGhlIGVmZmVjdGl2ZSBncm91cCBJRCBvciBvbmUgb2YgdGhlIHN1cHBsZW1lbnRhcnkK
PiA+IFtdIGdyb3VwIElEcyBvZiB0aGUgcHJvY2VzcyBtYXRjaGVzIHRoZSBncm91cCBJRCBhc3Nv
Y2lhdGVkIHdpdGggdGhlCj4gPiBbXSBmaWxlLiBPdGhlciBtZW1iZXJzIG9mIHRoZSBjbGFzcyBt
YXkgYmUgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KPiA+Cj4gPiBbXSAzLjE3MiBGaWxlIE90aGVy
IENsYXNzCj4gPiBbXSBUaGUgcHJvcGVydHkgb2YgYSBmaWxlIGluZGljYXRpbmcgYWNjZXNzIHBl
cm1pc3Npb25zIGZvciBhCj4gPiBbXSBwcm9jZXNzIHJlbGF0ZWQgdG8gdGhlIHVzZXIgYW5kIGdy
b3VwIGlkZW50aWZpY2F0aW9uIG9mIGEgcHJvY2Vzcy4KPiA+IFtdIEEgcHJvY2VzcyBpcyBpbiB0
aGUgZmlsZSBvdGhlciBjbGFzcyBvZiBhIGZpbGUgaWYgdGhlIHByb2Nlc3MgaXMgbm90Cj4gPiBb
XSBpbiB0aGUgZmlsZSBvd25lciBjbGFzcyBvciBmaWxlIGdyb3VwIGNsYXNzLgo+ID4KPiA+IFRo
ZSBrZXkgZmFjdCBpbiB0aGVzZSBkZWZpbml0aW9ucyBpcyB0aGF0IGFuIGltcGxlbWVudGF0aW9u
IG1heSBkZWZpbmUKPiA+IGFkZGl0aW9uYWwgbWVtYmVycyBvZiB0aGUgRmlsZSBHcm91cCBDbGFz
cywgd2hpbGUgdGhlIG90aGVyIGNsYXNzZXMKPiA+IGFyZSBub3QgZXh0ZW5zaWJsZS4KPiA+Cj4g
PiBVbmRlciB0aGlzIGRlZmluaXRpb24sIHdlIGVuZCB1cCB3aXRoIHRoZSBmb2xsb3dpbmcgbWFw
cGluZzoKPiA+Cj4gPiAgLSBPV05FUkAgZW50cmllcyBhcmUgaW4gdGhlIEZpbGUgT3duZXIgQ2xh
c3MsCj4gPiAgLSBFVkVSWU9ORUAgZW50cmllcyBhcmUgaW4gdGhlIEZpbGUgT3RoZXIgQ2xhc3Ms
Cj4KPiBObywgSSBkb24ndCB0aGluayBFVkVSWU9ORUAgaXMgaW4gdGhlIEZpbGUgT3RoZXIgQ2xh
c3MuICBHaXZlbiB0aGlzIEFDTDoKPgo+IEVWRVJZT05FQDpyZWFkX2RhdGE6ZGVueQo+IE9XTkVS
QDpyZWFkX2RhdGE6YWxsb3cKPgo+IHRoZSBvd25lciB3b3VsZCBOT1QgYmUgYWJsZSB0byByZWFk
LiAgSW4gb3RoZXIgd29yZHMsIGZpbGUgb3duZXIKPiBjbGFzcyBhbmQgZmlsZSBncm91cCBjbGFz
cyBhcmUgYWxzbyBhZmZlY3RlZCBieSBFVkVSWU9ORUAgQUNFcy4KPgo+ID4gIC0gZXZlcnkgb3Ro
ZXIgZW50cnkgaXMgaW4gdGhlIEZpbGUgR3JvdXAgQ2xhc3MoKikuCj4KPiBpbmNsdWRpbmcgRVZF
UllPTkVALiAgOy0pCgpJIHN0cm9uZ2x5IGRpc2FncmVlLiBQbGVhc2UgcmVjb25zaWRlciB3aGF0
IEkgc2FpZCBhYm91dCBub24tbW9ub3RvbmljIApwZXJtaXNzaW9ucyBhbmQgIndlbGwgc3RydWN0
dXJlZCIgYWNscyAod2VsbC1mb3JtZWQgd291bGQgaGF2ZSBiZWVuIGEgYmV0dGVyIAp0ZXJtIGZv
ciBpdCk6CgogLSB3aXRoIHdlbGwtZm9ybWVkIEFDTHMsIHBlcm1pc3Npb25zIGZyb20gbXVsdGlw
bGUgY2xhc3NlcyBjYW5ub3QKICAgYWNjdW11bGF0ZS4KCiAtIHdpdGggYXJiaXRyYXJ5IEFDTHMs
IHBlcm1pc3Npb25zIGZyb20gbXVsdGlwbGUgY2xhc3NlcyBjYW4KICAgYWNjdW11bGF0ZS4gCgpU
aGUgd2VsbC1mb3JtZWRuZXNzIHByb3BlcnR5IG9mIGFuIEFDTCBkZXRlcm1pbmVzIHdoZXRoZXIg
b3Igbm90IHBlcm1pc3Npb25zIAptYXkgYWNjdW11bGF0ZSBhY3Jvc3MgY2xhc3Nlcy4gVGhpcyBk
b2VzIG5vdCBpbnZhbGlkYXRlIHRoZSBjbGFzc2lmaWNhdGlvbiAKaXRzZWxmLgoKV2hpbGUgYmVp
bmcgYSBwZXJmZWN0bHkgZmluZSBORlN2NCBBQ0wsIHRoZSBhYm92ZSBBQ0wgZGVmaW5pdGVseSBp
cyBub3QgCndlbGwtZm9ybWVkLgoKT3RoZXIgdGhhbiB0aGUgZmFjdCB0aGF0IHBlcm1pc3Npb25z
IG1heSBhY2N1bXVsYXRlIGFjcm9zcyBjbGFzc2VzICh3aGljaCBvbmx5IApiZWNvbWVzIGEgcHJv
YmxlbSB3aXRoIG5vbi1tb25vdG9uaWMgZmlsZSBtb2RlIHBlcm1pc3Npb24gYml0cyksICJpbGwt
Zm9ybWVkIiAKQUNMcyBhcmUgbm90IGEgcHJvYmxlbS4KCkZvciBzdHJpY3QgUE9TSVggY29tcGxp
YW5jZSwgd2UgbXVzdCBlbnN1cmUgdGhhdCBBQ0xzIGFyZSB3ZWxsLWZvcm1lZCBhZnRlciAKY2ht
b2QsIGFuZCB0aGF0IGluaGVyaXRlZCBBQ0xzIHdpbGwgYmUgd2VsbC1mb3JtZWQgYXMgd2VsbC4g
V2UgY291bGQgYWNoaWV2ZSAKdGhpcyBlaXRoZXIgYnkgcmVqZWN0aW5nICJpbGwtZm9ybWVkIiBB
Q0xzIGR1cmluZyBTRVRBVFRSIG9mIEFDTCAoc28gdGhhdCAKY2htb2QgYW5kIGluaGVyaXRlZCBw
ZXJtaXNzaW9ucyB3aWxsIGFsd2F5cyBvcGVyYXRlIG9uIHdlbGwtZm9ybWVkIGFjbHMpLCBvciAK
d2UgY291bGQgdHJ5IHRvIGNvbnZlcnQgYXJiaXRyYXJ5IEFDTHMgaW50byB3ZWxsLWZvcm1lZCBB
Q0xzIGR1cmluZyBjaG1vZCBhbmQgCmR1cmluZyBwZXJtaXNzaW9uIGluaGVyaXRhbmNlICgqKS4g
SSBhbSBzdXJlIHRoYXQgdGhlcmUgYXJlIHNvbWUgZm9ybXMgb2YgCk5GU3Y0IEFDTHMgd2hpY2gg
Y2Fubm90IGJlIGNvbnZlcnRlZCBpbnRvIHdlbGwtZm9ybWVkIEFDTHMgd2l0aG91dCBsb3NzIG9m
IAppbmZvcm1hdGlvbiwgc28gd2Ugd291bGQgaGF2ZSB0byBmYWlsIHNvbWUgY2htb2RzIGFuZCBm
aWxlIGNyZWF0ZXMuIFRoaXMgaXMgCnVnbHkgb2YgY291cnNlLCBhbmQgY2htb2QgZXJyb3JzIGlu
IHBhcnRpY3VsYXIgd291bGQgbW9zdCBsaWtlbHkgYmFkbHkgdHJhcCAKdXAgc29tZSBQT1NJWCBh
cHBsaWNhdGlvbnMuIEkgYW0gdW5kZWNpZGVkIHdoZXRoZXIgY2hlY2tpbmcgZm9yIHdlbGwtZm9y
bWVkIApBQ0xzIGluIFNFVEFUVFIgb3IgbWFzYWdlaW5nIEFDTHMgaW4gQ0hNT0QgYW5kIGR1cmlu
ZyBjcmVhdGVzIGlzIHRoZSBsZXNzZXIgCmV2aWwuCgooKikgSWxsLWZvcm1lZCBBQ0xzIGFyZSBv
bmx5IGFuIGlzc3VlIHdpdGggYSBub24tbW9ub3RvbmljIGNobW9kIG9yIGZpbGUgCmNyZWF0ZSBt
b2RlLiBUaGlzIG1lYW5zIHRoYXQgYWNsIGluaGVyaXRhbmNlIGFuZCBjaG1vZCBpcyBQT1NJWCBj
b21wbGlhbnQgCmV2ZW4gd2l0aCBpbGwtZm9ybWVkIEFDTHMgYXMgbG9uZyBhcyB0aGUgbW9kZSBp
cyBtb25vdG9uaWMsIGFuZCB3ZSBhY3R1YWxseSAKb25seSBuZWVkIHRvIGJlIGNhcmVmdWwgaW4g
dGhlIChhbG1vc3QgdW5yZWFsaXN0aWNhbGx5KSByYXJlIGNhc2Ugd2hlcmUgdGhlIAptb2RlIGlz
IG5vbi1tb25vdG9uaWMuCgpCZWNhdXNlIG9mIHRoZSByYW1pZmljYXRpb25zIG9mIHRyeWluZyB0
byBlbmZvcmNlIHdlbGwtZm9ybWVkIEFDTHMgb3IgdHJ5aW5nIAp0byBjb25zdHJ1Y3RpbmcgdGhl
bSBhZnRlciB0aGUgZmFjdCwgd2UgbWF5IHdhbnQgdG8gb2ZmZXIgdXNlcnMgYSBjaG9pY2UgdG8g
CnZpb2xhdGUgdGhpcyBwYXJ0aWN1bGFyIGFzcGVjdCBvZiBQT1NJWCBpbiBjZXJ0YWluIGluc3Rh
bGxhdGlvbnM6IGFjY29yZGluZyAKdG8gbXkgZXhwZXJpZW5jZSwgbm9uLW1vbm90b25pYyBwZXJt
aXNzaW9ucyBkbyBub3QgYWN0dWFsbHkgb2NjdXIgaW4gcmVhbCAKbGlmZSwgc28gSSBhbSBjb252
aW5jZWQgdGhhdCB0aGlzIGlzIG11Y2ggbGVzcyBldmlsIG9uIHVzZXJzIHRoYW4gdG90YWxseSAK
c3RyaWN0IFBPU0lYIGNvbXBsaWFuY2UuCgooVGhlIHJ1bGVzIGhvdyB3ZWxsLWZvcm1lZCBBQ0xz
IG11c3QgYmUgc3RydWN0dXJlZCBhcmUgcHJldHR5IHNpbXBsZS4gSSBkb24ndCAKd2FudCB0byBk
ZXRhaWwgdGhlbSBoZXJlIGF0IHRoaXMgcG9pbnQsIGJ1dCB0aGV5IGNhbiBiZSBkaXN0aWxsZWQg
ZnJvbSAKTWFyaXVzJ3MgZHJhZnQtaWV0Zi1uZnN2NC1hY2wtbWFwcGluZy0wNCBbM10uKQoKPiA+
ICAoKikgVXNlciBlbnRyaWVzIGZvciB0aGUgdXNlciB3aG8gaXMgdGhlIGN1cnJlbnQgZmlsZSBv
d25lciBhcmUgYQo+ID4gICAgICBzcGVjaWFsIGNhc2U6IGR1ZSB0byBob3cgdGhlIE5GU3Y0IEFD
TCBwZXJtaXNzaW9uIGNoZWNrIGFsZ29yaXRobQo+ID4gICAgICBpcyBzcGVjaWZpZWQsIEkgYmVs
aWV2ZSB0aGF0IHRoZXkgc2hvdWxkIGJlIHB1dCBpbiB0aGUgT1dORVJACj4gPiAgICAgIGNsYXNz
LiAKPgo+IFRoZSBjdXJyZW50IG1pbm9ydmVyc2lvbjEgZHJhZnQgaGFzIGEgc2ltaWxhciBkZXNp
Z24gY29uc3RyYWludC4KCi4uLiB3aGljaCBjb21lcyBlbnRpcmVseSBmcm9tIGRyYWZ0LWlldGYt
bmZzdjQtYWNscywgaWYgSSBhbSBub3QgbWlzdGFrZW4uCgo+ID4+IE5vdGUgdGhhdCB0aGlzIGRl
ZmluaXRpb24gaXMgaW4gbGluZSB3aXRoIFBPU0lYIDEwMDMuMWUgZHJhZnQgMTcKPiA+PiBbMl0s
IHdoaWxlIGl0IGNvbmZsaWN0cyB3aXRoIHRoZSBJRVRGIE5GUyBWZXJzaW9uIDQgQUNMcyBkcmFm
dCBbMV0sCj4gPj4gd2hpY2ggYXNzb2NpYXRlcyBvbmx5IEdST1VQQCBlbnRyaWVzIHdpdGggdGhl
IGdyb3VwIGZpbGUgbW9kZQo+ID4+IHBlcm1pc3Npb24gYml0cyBpbiBzZWN0aW9uIDUuMS4gVGhl
IHJlbGV2YW50IHRleHQgb2YgSUVURiBORlMKPiA+PiBWZXJzaW9uIDQgQUNMcyBkcmFmdCBbMV0g
aXMgYWxzbyBmb3VuZCBpbiBORlN2NCBNaW5vciBWZXJzaW9uIDEgWzRdLgo+ID4KPiA+IFNlY3Rp
b24gNS4xIG9mIFsxXSBuZWVkcyB0byBiZSBmaXhlZDogd2UgbXVzdCBzZXQgdGhlIHBlcm1pc3Np
b24KPiA+IGJpdHMgc28gdGhhdCB0aGV5IGFyZSBhIHN1cGVyc2V0IG9mIHRoZSBwZXJtaXNzaW9u
cyBvZiBhbGwgdGhlCj4gPiBlbnRyaWVzIGluIHRoZSByZXNwZWN0aXZlIGNsYXNzLiAoV2UgY2Fu
bm90IHJlcHJlc2VudCBwZXJtaXNzaW9ucyB0aGF0Cj4gPiBhcmUgbm90IHN1cGVyc2V0cyBvZiBQ
T1NJWCByZWFkLCB3cml0ZSwgZXhlY3V0ZSBpbiB0aGUgY2xhc3MsIGJ1dCB0aGF0Cj4gPiBpcyBu
b3QgYSBwcm9ibGVtLCBhcyB3ZSB3aWxsCj4gPiBzZWUgbGF0ZXIuKQo+Cj4gV2UgbXVzdCBkbyBz
byBjYXJlZnVsbHkuCgpObyBkb3VidCBhYm91dCBpdC4KCj4gSSdtIG5vdCBjb252aW5jZWQgdGhh
dCBhIHN1cGVyc2V0IGlzIHRoZSBiZXN0IHdheSB0byBnbywgYnV0IHdlIHNob3VsZCB0YWxrCj4g
YWJvdXQgdGhpcyBsYXRlci4gIAoKTm90aGluZyBlbHNlIG1ha2VzIGFueSBzZW5zZSBhdCBhbGwg
SU1PLCBhbmQgbm90aGluZyBlbHNlIHdvdWxkIGJlIGNvbXBhdGlibGUgCndpdGggUE9TSVggKGFz
IGZhciBhcyB0aGUgYWRkaXRpb25hbCBmaWxlIGFjY2VzcyBjb250cm9sIHBhcnQgZ29lcyksIG9y
IGluIAp0aGUgc3Bpcml0IG9mIFBPU0lYIChmb3IgdGhlIGFsdGVybmF0ZSBmaWxlIGFjY2VzcyBj
b250cm9sIHBhcnQpLiBJIHRoaW5rIEkgCmhhdmUgZ2l2ZW4gc3VmZmljaWVudCBhcmd1bWVudHMg
d2h5IHRoaXMgaXMgc28uCgo+ID4gTm9uLW1vbm90b25pYyBwZXJtaXNzaW9ucwo+ID4gPT09PT09
PT09PT09PT09PT09PT09PT09PQo+ID4KPiA+IE5vdGUgdGhhdCB3aXRoIGFyYml0cmFyeSBORlNW
NCBBQ0xzLCB0aGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBhCj4gPiBwcm9jZXNzIGZyb20gbXVs
dGlwbGUgQUNMIGVudHJpZXMgd2lsbCBhY2N1bXVsYXRlLiBUaGlzIG1lYW5zIHRoYXQKPiA+IHBl
cm1pc3Npb25zIGFjcm9zcyBtdWx0aXBsZSBjbGFzc2VzIG1heSBhY2N1bXVsYXRlIGFzIHdlbGwu
IFRoaXMgY2FuIGJlCj4gPiBwcmV2ZW50ZWQgd2l0aCBERU5ZIGVudHJpZXMgaW4gdGhlIEFDTCwg
ZS5nLiwKPiA+Cj4gPiAJT1dORVJAOm1hc2sxOjpBTExPVwo+ID4gCU9XTkVSQDpebWFzazE6OkRF
TlkKPiA+IAl1c2VyQGRvbWFpbjptYXNrMjo6QUxMT1cKPiA+IAlncm91cEBkb21haW46bWFzazM6
QUNFNF9JREVOVElGSUVSX0dST1VQOkFMTE9XCj4gPiAJdXNlckBkb21haW46Xm1hc2syOjpERU5Z
Cj4gPiAJZ3JvdXBAZG9tYWluOl5tYXNrMzpBQ0U0X0lERU5USUZJRVJfR1JPVVA6REVOWQo+ID4g
CUVWRVJZT05FOm1hc2s0OjpBTExPVwo+ID4KPiA+IFRoaXMgbWVhbnMgdGhhdCB3ZSB3aWxsIG5v
dCBoYXZlIHRvIGRlYWwgd2l0aCB0aGlzIHNwZWNpYWwgY2FzZQo+ID4gd2hlbiBjb21wdXRpbmcg
dGhlIGZpbGUgbW9kZSBwZXJtaXNzaW9uIGJpdHMsIGFuZCB3ZSBjYW4gYWNoaWV2ZQo+ID4gY29u
c2lzdGVuY3kgYnkgZm9yY2luZyBBQ0xzIHRvIGJlICJ3ZWxsIHN0cnVjdHVyZWQiLgo+Cj4gWXVj
ayEgIEknbSBnbGFkIHlvdSdyZSBub3QgcHJvcG9zaW5nIHRoaXMgYXMgYSBnZW5lcmFsIE5GU3Y0
IEFDTAo+IG1vZGVsLiAgOi0pCgpOb3RlIHRoYXQgdGhpcyBpcyBleGFjdGx5IGhvdyB0aGUgcHJv
cG9zZWQgc2l4LWVudHJ5IEFDTCBvbiBwYWdlIDE1IG9mIApkcmFmdC1pZXRmLW5mc3Y0LWFjbHMg
aXMgc3RydWN0dXJlZCwgYW5kIGhvdyBkcmFmdC1pZXRmLW5mc3Y0LWFjbC1tYXBwaW5nLTA0IApB
Q0xzIGFyZSBzdHJ1Y3R1cmVkLCBhbmQgbm90IGJ5IGNvaW5jaWRlbmNlLiBJIGFncmVlIGl0J3Mg
YSBiaXQgdWdseSwgYnV0IHRoZSAKYWNjdW11bGF0aXZlIHNlbWFudGljcyBvZiBORlN2NCBBQ0xz
IGRvbid0IGxlYXZlIHVzIGFueSBvdGhlciBvcHRpb25zLgoKPiA+IFdlIGNvdWxkIGFsc28gbGVh
dmUgdGhpcyBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjb25zaWRlcmF0aW9uOiBBQ0xzCj4gPiB3aGlj
aCBhcmUgbm90ICJ3ZWxsIHN0cnVjdHVyZWQiIGluIHRoZSBhYm92ZSBzZW5zZSB3aWxsIGdyYW50
IHBlcm1pc3Npb25zCj4gPiB0aGF0IGdvIGJleW9uZCB3aGF0IGFuIGFkZGl0aW9uYWwgYWNjZXNz
IGNvbnRyb2wgbWVjaGFuaXNtIG1heSBncmFudAo+ID4gKm9ubHkqIGZvciBub24tbW9ub3Rvbmlj
IGZpbGUgbW9kZSBwZXJtaXNzaW9uIGJpdHMuIFdpdGggbm9uLW1vbm90b25pYyBJCj4gPiBtZWFu
ICBmaWxlIG1vZGUgcGVybWlzc2lvbiBiaXRzIHdoaWNoIGdyYW50IG1vcmUgcGVybWlzc2lvbnMg
dG8gdGhlIGdyb3VwCj4gPiBjbGFzcyB0aGFuIHRvIHRoZSBvd25lciBjbGFzcywgb3IgbW9yZSBw
ZXJtaXNzaW9ucyB0byB0aGUgb3RoZXIgY2xhc3MgdGhhbgo+ID4gdG8gdGhlIGdyb3VwIGNsYXNz
Lgo+Cj4gSSdtIHNvcnJ5LCBJIGp1c3QgZG9uJ3QgZm9sbG93IHRoYXQgcGFyYWdyYXBoLgoKSSBo
YXZlIGFscmVhZHkgdHJpZWQgdG8gcmVpdGVyYXRlIHRoaXMgcG9pbnQgZnVydGhlciB1cCBpbiB0
aGlzIHJlcGx5LiBTdGlsbCAKdW5jbGVhcj8KCj4gPj4gV2Ugd2FudCBjaG1vZCgyKSB0byBiZSBu
b24tZGVzdHJ1Y3RpdmUsIHNvIHRoYXQgYSBjaG1vZCB0byBhIG1vcmUKPiA+PiByZXN0cmljdGl2
ZSBtb2RlIGFuZCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlIHdpbGwgbGVhdmUgdGhlIGZpbGUK
PiA+PiB3aXRoIHRoZSBzYW1lIHBlcm1pc3Npb25zIGFzIGJlZm9yZSB0aGUgY2hhbmdlcy4KPiA+
Pgo+ID4+IFsuLi5dCj4gPj4KPiA+PiBQT1NJWCBBQ0xzIGhhdmUgc29sdmVkIHRoZSBub24tZGVz
dHJ1Y3RpdmVuZXNzIHByb2JsZW0gYnkgaW50cm9kdWNpbmcgYQo+ID4+IG1hc2sgQUNMIGVudHJ5
OiB0aGUgbWFzayBlbnRyeSBhcHBsaWVzIHRvIGFsbCBncm91cCBjbGFzcyBlbnRyaWVzLCBhbmQK
PiA+PiBkZWZpbmVzIGFuIHVwcGVyIGJvdW5kIHRvIHRoZSBwZXJtaXNzaW9ucyB0aG9zZSBlbnRy
aWVzIG1heSBncmFudC4gUE9TSVgKPiA+PiBBQ0xzIG9ubHkgaGF2ZSBBQ0wgZW50cmllcyB0aGF0
IGFsbG93IHBlcm1pc3Npb25zLCBhbmQgb25seSBzcGVjaWZ5IFJFQUQsCj4gPj4gV1JJVEUsIGFu
ZCBFWEVDVVRFIHBlcm1pc3Npb25zLiBUaGVyZWZvcmUsIHRoZSBvd25lciBjbGFzcyBhbmQgb3Ro
ZXIKPiA+PiBjbGFzcyBwZXJtaXNzaW9ucyBhcmUgdGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8g
dGhlIG93bmVyIGFuZCB0byBvdGhlcnMsCj4gPj4gcmVzcGVjdGl2ZWx5LiAoTm90ZSB0aGUgZGlm
ZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIG90aGVycyBhbmQgTkZTdjQncwo+ID4+IEVWRVJZT05FQCBz
cGVjaWFsIGlkZW50aWZpZXIpLgo+ID4+Cj4gPj4gVGhlIG1hc2sgY29uY2VwdCBpcyBub3QgcGFy
dCBvZiBORlN2NCBBQ0xzLiBNYXJpdXMgQS4gRXJpa3NlbiBhbmQgb3RoZXJzCj4gPj4gaGF2ZSBw
cm9wb3NlZCB0byBlbXVsYXRlIHRoZSBQT1NJWCBBQ0wgbWFzayBlbnRyeSBieSBwcmVwZW5kaW5n
ICh3aXRoCj4gPj4gZXhjZXB0aW9uIG9mIE9XTkVSQCBhbmQgRVZFUllPTkVAIEFDRXMpIGVhY2gg
QUxMT1cgQUNFIHdpdGggYSBERU5ZCj4gPj4gQUNFIGZvciB0aGUgc2FtZSB1c2VyLCBncm91cCwg
b3Igc3BlY2lhbCBpZGVudGlmaWVyIGFzIGluIHRoZSBBTExPVyBBQ0UuCj4gPj4gVGhlIHBlcm1p
c3Npb25zIGluIHRoZSBERU5ZIEFDRSBhcmUgc2V0IHNvIHRoYXQgdGhlIGVudHJ5IGRlbmllcyB0
aGUKPiA+PiBwZXJtaXNzaW9ucyBub3QgZ3JhbnRlZCBieSB0aGUgbWFzay4KPiA+Cj4gPiBJbnRl
cm5ldCBkcmFmdC1pZXRmLW5mc3Y0LWFjbHMtMDAudHh0IFsxXSB1c2VzIHRoZSBzYW1lIG1lY2hh
bmlzbQo+ID4gdG8gaW1wbGVtZW50IG1hc2tpbmcuCj4gPgo+ID4+IFVubGVzcyB3ZSBhY2NlcHQg
YSB2ZXJ5IHNwZWNpZmljIGZvcm0gb2YgTkZTdjQgQUNMcyBvbmx5ICh3aGljaCB3b3VsZAo+ID4+
IGNvbnRyYWRpY3QgdGhlIGdvYWwgc3RhdGVkIGF0IHRoZSB0b3Agb2YgdGhpcyBtZXNzYWdlLCBh
bmQgd2hpY2gKPiA+PiB3b3VsZCBtZWFuIHRoYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIGFueXRo
aW5nIGJ1dCBQT1NJWCBBQ0xzIHdvdWxkCj4gPj4gYmVjb21lIGRpZmZpY3VsdCksIHRoZXJlIGlz
IG5vIGVhc3kgd2F5IHRvIHRlbGwgREVOWSBlbnRyaWVzIGludHJvZHVjZWQKPiA+PiB0byBlbXVs
YXRlIHRoZSBtYXNrIGZyb20gREVOWSBlbnRyaWVzIGFkZGVkIGJ5IGhhbmQuCj4KPiBJIHdvdWxk
IHJlZnV0ZSB0aGlzOyBzZWUgYmVsb3cuCj4KPiA+PiBUaGlzIGhhcyB0d28gcG90ZW50aWFsIGNv
bnNlcXVlbmNlczoKPiA+Pgo+ID4+ICAtIEZpcnN0LCBpZiB3ZSBmYWlsIHRvIGlkZW50aWZ5IHN1
Y2ggYSBtYXNrLWVtdWxhdGlvbiBERU5ZIGVudHJ5LAo+ID4+ICAgIHdlIG1heSBlbmQgdXAgaW5z
ZXJ0aW5nIGFub3RoZXIgc3VjaCBlbnRyeS4gV2UgbWlnaHQgZW5kIHVwIGRvaW5nCj4gPj4gICAg
c28gcmVwZWF0ZWRseS4KPgo+IEJ1dCB3ZSB3aWxsIG5vdCBldmVyIGZhaWwgdG8gaWRlbnRpZnkg
c3VjaCBhIG1hc2stZW11bGF0aW9uIERFTlkKPiBlbnRyeSwgd2hlbiBpdCBpcyBvbmUgdGhhdCB3
YXMgY3JlYXRlZCBieSBhIHByZXZpb3VzIGNobW9kLiAgT25seSBpbgo+IGEgZGVnZW5lcmF0ZSBj
YXNlIG9mIG1vZGlmeS1hY2wtY2FyZWZ1bGx5LCBjaG1vZCwgbW9kaWZ5LWFjbC0KPiBjYXJlZnVs
bHksIGNobW9kLCBldGMuLCB3b3VsZCB5b3UgZ2V0IGEgZ3Jvd2luZyBBQ0wgcHJvYmxlbS4KClll
cy4gQW5kIGd1ZXNzIHdoYXQgd2lsbCBoYXBwZW4gd2hlbiBQT1NJWCBhbmQgV2luZG93cyBhcHBs
aWNhdGlvbnMgd2lsbCAKbW9kaWZ5IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgc2FtZSBmaWxlIGlu
IHR1cm4/IE5vdGUgdGhhdCBldmVuIGEgY2htb2QgZnJvbSAKb25lIG1vZGUgdG8gYW5vdGhlciBh
bmQgYmFjayBpcyBlbm91Z2ggdG8gbWVzcyB0aGluZ3MgdXAgcXVpdGUgYmFkbHkuCgpBcyBmYXIg
YXMgSSByZW1lbWJlciwgV2luMksgYWx3YXlzIHJlb3JkZXJzIEFDTCBlbnRyaWVzIHNvIHRoYXQg
YWxsIERFTlkgCmVudHJpZXMgY29tZSBiZWZvcmUgYWxsIEFMTE9XIGVudHJpZXMuCgo+ID4+ICAt
IFNlY29uZCwgd2UgbWF5IHRha2UgYSB1c2VyLXByb3ZpZGVkIERFTlkgZW50cnkgZm9yIGEgbWFz
ay0KPiA+PiBlbXVsYXRpb24gREVOWSBlbnRyeSwgYW5kIGNsZWFyIG1hc2sgYml0cyBmcm9tIHRo
YXQgZW50cnkuIFRoaXMgd291bGQKPiA+PiBjb250cmFkaWN0IHRoZSB1c2VyJ3MgaW50ZW50aW9u
LiBTbyB0aGUgYXBwcm9hY2ggb2YgaW5zZXJ0aW5nCj4gPj4gbWFzay1lbXVsYXRpb24gREVOWSBl
bnRyaWVzIGlzIG5vdCBnb29kIGVub3VnaCBpbiBnZW5lcmFsLgo+Cj4gQSB1c2VyLXByb3ZpZGVk
IERFTlkgZW50cnkgd291bGQgaGF2ZSB0byBmaXQgaW50byBhIHZlcnkgc3BlY2lmaWMgYW5kCj4g
c29tZXdoYXQgbm9uc2Vuc2ljYWwgZm9ybSBpbiBvcmRlciB0byBiZSBtaXNpZGVudGlmaWVkLiAg
SGVyZSdzIGFuCj4gZXhhbXBsZToKPgo+IHNhbWZAc3VuLmNvbTpyZWFkX2RhdGE6ZGVueQo+IHNh
bWZAc3VuLmNvbTpyZWFkX2RhdGE6YWxsb3cKPgo+IElmIGEgImNobW9kIDQ0NCIgd2VyZSBkb25l
LCB0aGUgZGVueSBBQ0UgYWJvdmUgd291bGQgYmUgbW9kaWZpZWQuCj4gQW55IG90aGVyIGNhc2Vz
IG9mIGNobW9kIG1vZGlmeWluZyBhIHVzZXItcHJvdmlkZWQgQUNFIHdvdWxkIGhhdmUgdG8KPiBi
ZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgZXhhbXBsZS4gIEkgdGhpbmsgdGhh
dCB0aGF0J3MgYW4KPiBhY2NlcHRhYmxlIHNpdHVhdGlvbi4KCkkgYWxyZWFkeSBnYXZlIGEgbW9y
ZSByZWFsaXN0aWMgZXhhbXBsZSBhYm92ZToKCglHUk9VUEA6V1JJVEVfREFUQTo6REVOWQoJR1JP
VVBAOlJFQURfREFUQTo6QUxMT1cKCj4gPj4gKE1hcHBpbmcgYmV0d2VlbiBORlN2NCBhbmQgUE9T
SVggQUNMcyBkb2VzCj4gPj4gbm90IGhhdmUgdGhpcyBwcm9ibGVtLCBiZWNhdXNlIFBPU0lYIEFD
THMgZG9uJ3QgaGF2ZSBERU5ZIEFDRXMuKQo+ID4KPiA+IFRoZXJlZm9yZSwgdGhlIG1lY2hhbmlz
bSBkZXNjcmliZWQgaW4gc2VjdGlvbiA1LjMgaXMgbm90IHN1aXRhYmxlCj4gPiBmb3Igb3VyIHB1
cnBvc2VzLCBhbmQgd2UgbmVlZCB0byByZXBsYWNlIGl0IHdpdGggc29tZXRoaW5nIGJldHRlci4K
Pgo+IEkgZG9uJ3QgYWdyZWUgdGhhdCA1LjMgaXMgbm90IHN1aXRhYmxlLCBidXQgSSB3b3VsZCBs
b3ZlIHRvIHNlZQo+IHNvbWV0aGluZyBiZXR0ZXIuCgpXZWxsLCBJIGRpZCBwcm9wb3NlIHNvbWV0
aGluZyAqbXVjaCogYmV0dGVyLgoKPiA+PiBJbiBteSBvcGluaW9uLCB0aGVyZSBhcmUgdHdvIHBv
c3NpYmxlIHNvbHV0aW9ucyBmb3IgdGhpcyBwcm9ibGVtOgo+ID4+IHdlIGNhbiAoMSkgZGV2aXNl
IGEgc3BlY2lhbCBraW5kIG9mIE5GU3Y0IEFDTCBlbnRyeSB0aGF0IHdlIHdpbGwKPiA+PiByZWNv
Z25pemUgYXMgbWFzayBlbnRyeSwgb3IgKDIpIGdpdmUgdGhlIG93bmVyL2dyb3VwL290aGVyIGNs
YXNzCj4gPj4gcGVybWlzc2lvbiBiaXRzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBBQ0wgZW50
cmllcywgYW5kIG9ubHkgYWxsb3cKPiA+PiBwZXJtaXNzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIGJ5
IGJvdGggdGhlIEFDRXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQKPiA+PiBjbGFzc2VzLiAKPgo+IFlp
a2VzIC0tIEkgZG9uJ3QgbGlrZSBlaXRoZXIgb2YgdGhlIGFib3ZlIHNvbHV0aW9uczsgbGV0J3Mg
bG9vayBhdAo+IHRoZSB0aGlyZC4uLgo+Cj4gPiBBIHRoaXJkIG9wdGlvbiBleGlzdHMgYXMgd2Vs
bCB3aGljaCBmaXRzIGluIHZlcnkgd2VsbCB3aXRoIFBPU0lYCj4gPiBhbmQgY2FuIGJlIGltcGxl
bWVudGVkIGluIE5GU3Y0IGluIGEgYmFja3dhcmQgY29tcGF0aWJsZSB3YXkuCj4gPgo+ID4gQWx0
ZXJuYXRpdmUgUHJvcG9zYWwKPiA+ID09PT09PT09PT09PT09PT09PT09Cj4gPgo+ID4gSW5zdGVh
ZCBvZiBhZGRpbmcgREVOWSBlbnRyaWVzIHRvIHRoZSBBQ0wgZm9yIHRoZSBwdXJwb3NlIG9mIG1h
c2tpbmcsCj4gPiBhdHRhY2ggdGhyZWUgb3B0aW9uYWwgYXR0cmlidXRlcyB0byBlYWNoIGZpbGU6
IG93bmVyX2NsYXNzX21hc2ssCj4gPiBncm91cF9jbGFzc19tYXNrLCBhbmQgb3RoZXJfY2xhc3Nf
bWFzay4gV2hlbiB0aG9zZSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LAo+ID4gdGhleSBkZWZpbmUg
d2hpY2ggcGVybWlzc2lvbnMgaW4gYW4gQUNFIGFyZSBlZmZlY3RpdmUuCj4gPgo+ID4gRWFjaCBB
Q0UgaXMgaXMgcmVzdHJpY3RlZCBieSBvbmUgb2YgdGhlc2UgbWFzayBhdHRyaWJ1dGVzIGluIGVh
Y2gKPiA+IGFjY2VzcyBjaGVjazoKPiA+Cj4gPiAgLSBPV05FUkAgZW50cmllcyBhbmQgZW50cmll
cyBmb3IgdGhlIHVzZXJAZG9tYWluIHRoYXQgY3VycmVudGx5Cj4gPiAgICBvd25zIHRoZSBmaWxl
IGFyZSByZXN0cmljdGVkIGJ5IG93bmVyX2NsYXNzX21hc2suCj4gPgo+ID4gIC0gRVZFUllPTkVA
IGVudHJpZXMgYXJlIHJlc3RyaWN0ZWQgYnkgb3RoZXJfY2xhc3NfbWFzay4KPiA+Cj4gPiAgLSBB
bGwgb3RoZXIgZW50cmllcyBhcmUgcmVzdHJpY3RlZCBieSBncm91cF9jbGFzc19tYXNrLgo+ID4K
PiA+IFRoZSBlZmZlY3RpdmUgcGVybWlzc2lvbnMgYXJlIGNvbXB1dGVkIGFzIHRoZSBiaXR3aXNl
IGFuZCAoJikgb2YKPiA+IHRoZSBBQ0UgbWFzayBhbmQgdGhlIGFzc29jaWF0ZWQgY2xhc3NfbWFz
ayBhdHRyaWJ1dGUuCj4KPiBJIHRha2UgaXQgeW91IG1lYW4gdGhhdCAidGhlIGVmZmVjdGl2ZSBh
Y2Nlc3MgbWFzayBiaXRzIGZvciBBQ0VzIG9mCj4gdHlwZSBBTExPVyI/CgpXaGVuIGRldGVybWlu
aW5nIGFjY2VzcywgaXQgaXMgaXJyZWxldmFudCB3aGV0aGVyIHdlIG1hc2sgb25seSBBTExPVyBl
bnRyaWVzLCAKb3IgQUxMT1cgYW5kIERFTlkgZW50cmllcy4gV2hlbiBjb21wdXRpbmcgdGhlIG1h
c2sgYXR0cmlidXRlcywgd2UgbXVzdCBvbmx5IApjb25zaWRlciBBTExPVyBlbnRyaWVzIHRob3Vn
aC4KCj4gPiBXaGVuIGRvaW5nIGEgY2htb2QoMikgb3Igd2hlbiBhcHBseWluZyBhIGNyZWF0ZSBt
YXNrLCB0aGUKPiA+IG93bmVyX2NsYXNzX21hc2ssIGdyb3VwX2NsYXNzX21hc2ssIGFuZCBvdGhl
cl9jbGFzc19tYXNrIGF0dHJpYnV0ZXMgYXJlCj4gPiBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhl
IG93bmVyIGNsYXNzLCBncm91cCBjbGFzcywgYW5kIG90aGVyIGNsYXNzCj4gPiBwZXJtaXNzaW9u
cyBvZiB0aGUgbW9kZSBwYXJhbWV0ZXIgYXMgZm9sbG93czoKPiA+Cj4gPiAgLSBUaGUgUE9TSVgg
cmVhZCBwZXJtaXNzaW9uIGltcGxpZXMgdGhlIEFDRTRfUkVBRF9EQVRBLAo+ID4gICAgQUNFNF9S
RUFEX0FUVFJJQlVURVMsIEFDRTRfUkVBRF9BQ0wsIGFuZCBBQ0U0X1NZTkNIUk9OSVpFIGJpdG1h
c2sKPiA+ICAgIGZsYWdzLiAKPiA+Cj4gPiAgLSBUaGUgUE9TSVggd3JpdGUgcGVybWlzc2lvbiBp
bXBsaWVzIHRoZSBBQ0U0X1dSSVRFX0RBVEEsCj4gPiAgICBBQ0U0X0FQUEVORF9EQVRBLCBBQ0U0
X1dSSVRFX0FUVFJJQlVURVMsIEFDRTRfREVMRVRFX0NISUxELCBhbmQKPiA+ICAgIEFDRTRfU1lO
Q0hST05JWkUgYml0bWFzayBmbGFncy4KPgo+IEknbSBub3Qgc3VyZSBJIGFncmVlIGFib3V0IEFD
RTRfV1JJVEVfQVRUUklCVVRFUywgYnV0IHRoYXQncyBhIG1pbm9yCj4gZGV0YWlsLgoKSSBhZ3Jl
ZSB0aGF0IFBPU0lYIHdyaXRlIGRvZXMgbm90IGltcGx5IEFDRTRfV1JJVEVfQVRUUklCVVRFUy4K
Cj4gPiAgLSBUaGUgUE9TSVggZXhlY3V0ZSBwZXJtaXNzaW9uIGltcGxpZXMgdGhlIEFDRTRfRVhF
Q1VURSBtYXNrLgo+ID4KPiA+IFRoaXMgc2F2ZXMgdXMgZnJvbSBibG9hdGluZyBBQ0xzIHdpdGgg
REVOWSBlbnRyaWVzLCBpcyBtb3JlCj4gPiBlZmZpY2llbnQgd2hlbiBkb2luZyBhIGNobW9kLCBh
bmQgYWxzbyBzYXZlcyB1cyBmcm9tIGRlc3Ryb3lpbmcKPiA+IHBlcm1pc3Npb25zIGluIHVzZXIg
cHJvdmlkZWQgREVOWSBlbnRyaWVzLgo+Cj4gWWVzLCBidXQgYXQgdGhlIGNvc3Qgb2YgYWRkaW5n
IG5ldyBmaWxlIGF0dHJpYnV0ZXMuLi4gIERvbid0IGdldCBtZQo+IHdyb25nLCBJIGRvIHNlZSBt
ZXJpdCBpbiB0aGlzIHByb3Bvc2FsLCBidXQgSSBkb24ndCBrbm93IGlmIGl0J2xsIGJlCj4gYWNj
ZXB0YWJsZS4KCklmIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBpcyBhIGNvbmNlcm4sIHdlIGNv
dWxkIGVxdWFsbHkgd2VsbCBzdG9yZSBhbGwgCnRocmVlIG1hc2tzIGluIGEgc2luZ2xlIHRocmVl
LWVudHJ5IGFycmF5LgoKPiA+IFdoZW4gYW4gQUNMIGlzIHNldCwgdGhlbiBzZXQgYWxsIG1hc2sg
YXR0cmlidXRlcyB0byB0aGUgdmFsdWVzCj4gPiBwcm92aWRlZCBpbiB0aGUgc2FtZSBTRVRBVFRS
IG9wZXJhdGlvbiwgYW5kIHNldCB0aGUgcmVtYWluaW5nIG1hc2sKPiA+IGF0dHJpYnV0ZXMgdG8g
dGhlIHVuaW9uIG9mIGFsbCBBTExPVyBBQ0wgZW50cmllcyBpbiB0aGUgQUNMIHRoYXQgdGhlCj4g
PiBjbGFzcyBhcHBsaWVzIHRvLiAKPgo+IFRoaXMgZG9lc24ndCB0YWtlIHRoZSBvcmRlcmluZyBv
ZiB0aGUgQUNMIGludG8gYWNjb3VudDsgaXMgdGhpcyB5b3VyCj4gaW50ZW50aW9uPyAgU28KPgo+
IEdST1VQQDpyZWFkX2RhdGEvd3JpdGVfZGF0YTpERU5ZCj4gR1JPVVBAOnJlYWRfZGF0YS93cml0
ZV9kYXRhOkFMTE9XCj4KPiB3b3VsZCByZXN1bHQgaW4gYSBncm91cF9jbGFzc19tYXNrIG9mIHJl
YWRfZGF0YXx3cml0ZV9kYXRhLCByaWdodD8KPiAoSSdtIG5vdCBzYXlpbmcgaXQncyB3cm9uZywg
SSdtIGp1c3QgbWFraW5nIHN1cmUgSSB1bmRlcnN0YW5kLikKClllcywgb3JkZXIgaXMgaXJyZWxl
dmFudC4gTm90ZSB0aGF0IHdlIG11c3Qgb25seSBjb25zaWRlciB0aGUgQUxMT1cgZW50cmllcyAK
d2hlbiBjb21wdXRpbmcgb25lIG9mIHRoZSBtYXNrIGF0dHJpYnV0ZXMgdGhvdWdoLgoKPiA+IFdp
dGhvdXQgYW55IGZ1cnRoZXIgY2hhbmdlcywgTkZTdjQgY2xpZW50cyBub3QgYXdhcmUgb2YgdGhl
IHRocmVlCj4gPiBvcHRpb25hbCBhdHRyaWJ1dGVzIHdvdWxkIG5vdCBiZSBhd2FyZSBvZiB0aGUg
cmVzdHJpY3Rpb25zIGltcG9zZWQKPiA+IGJ5IHRob3NlIG1hc2tzIHdoZW4gcXVlcnlpbmcgZm9y
IHRoZSBBQ0wuIFRoaXMgd291bGQgY3JlYXRlIGFuCj4gPiBpbnRlcm9wZXJhYmlsaXR5IHByb2Js
ZW0sIGFuZCBwb3NzaWJsZSBzZWN1cml0eSBob2xlcy4gVG8gc29sdmUgdGhpcwo+ID4gcHJvYmxl
bSwgd2UgY2FuIGV4dGVuZCB0aGUgR0VUQVRUUgo+ID4gb3BlcmF0aW9uIGFzIGZvbGxvd3M6Cj4g
Pgo+ID4gV2hlbiBhIGNsaWVudCByZXF1ZXN0cyB0aGUgQUNMIGF0dHJpYnV0ZSwgY2hlY2sgaWYg
aXQgYWxzbyByZXF1ZXN0cwo+ID4gb25lIG9yIG1vcmUgb2YgdGhlIHRocmVlIG9wdGlvbmFsIG93
bmVyX2NsYXNzX21hc2ssIGdyb3VwX2NsYXNzX21hc2ssCj4gPiBvciBvdGhlcl9jbGFzc19tYXNr
IGF0dHJpYnV0ZXMuIElmIGl0IGRvZXMsIHRoZW4gc2VuZCB0aGUgcmVxdWVzdGVkCj4gPiBhdHRy
aWJ1dGVzIGFzIHRoZXkgYXJlLiBJZiB0aGUgY2xpZW50IHJlcXVlc3RzIG9ubHkgdGhlIEFDTCB3
aXRob3V0Cj4gPiBhbnkgb2YgdGhlIG1hc2tzLCByZXR1cm4gYW4gQUNMIHdpdGggb25seSBlZmZl
Y3RpdmUgbWFzayBmbGFncyBzZXQsCj4gPiBhbmQgd2l0aCBhbGwgb3RoZXIgZmxhZ3MgcmVtb3Zl
ZC4KPgo+IEkgYXNzdW1lIHlvdSBtZWFuIGluIHRoZSBBTExPVyBBQ0VzIG9ubHksIHJpZ2h0PwoK
UHJvYmFibHkgbm90OiB0aGUgcmVzdWx0aW5nIEFDTCB3aWxsIGdyYW50IGV4YWN0bHkgdGhlIHNh
bWUgcGVybWlzc2lvbnMgZWl0aGVyIAp3YXkuIFRoZSB3aG9sZSBBQ0wgd2lsbCBiZWNvbWUgZWFz
aWVyIHRvIHVuZGVyc3RhbmQgaWYgd2UgYWxzbyByZW1vdmUgbWFza2VkIApwZXJtaXNzaW9ucyBm
cm9tIERFTlkgQUNMIGVudHJpZXMsIHNvIHRoYWlzIGlzIHdoeSBJIHdvdWxkIHByZWZlciB0aGlz
IAphcHByb2FjaC4KCj4gPiBBbHRlcm5hdGUgcGVybWlzc2lvbnMgaW4gdGhlIEFDTCBjYW4gYmUg
ZW5hYmxlZCBieSBlaXRoZXIgc2V0dGluZwo+ID4gYW4gQUNMIHdpdGhvdXQgcHJvdmlkaW5nIGZ1
bGwgbWFzayBlbnRyaWVzLCBvciBieSBzZXR0aW5nIHRoZQo+ID4gYXBwcm9wcmlhdGUgYml0KHMp
IGluIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sgZW50cnkgb3IgZW50cmllcy4KPgo+IFllcywgSSB0
aGluayBJIHVuZGVyc3RhbmQuCj4KPiA+IFdoZW4gY29tcGFyaW5nIFBPU0lYIEFDTHMgYW5kIHRo
ZSBORlN2NCBBQ0wgKyBtYXNrIGF0dHJpYnV0ZXMgYXMKPiA+IHByb3Bvc2VkIGhlcmUsIG9uZSBv
YnZpb3VzIGRpZmZlcmVuY2UgaXMgdGhhdCBQT1NJWCBBQ0xzIGhhdmUgb25seQo+ID4gb25lIG1h
c2sgZW50cnksIHdoaWxlIEkgcHJvcG9zZSB0aHJlZSBtYXNrIGVudHJpZXMgaGVyZS4gVGhlIHJl
YXNvbgo+ID4gZm9yIHRoaXMgaXMgdGhhdCBQT1NJWCBBQ0xzIGNhbiBhdCBtb3N0IGdyYW50IHJl
YWQsIHdyaXRlLCBhbmQKPiA+IGV4ZWN1dGUgcGVybWlzc2lvbnMsIGFuZCBzbyB3aXRoIFBPU0lY
IEFDTHMsIHRoZSBGaWxlIE93bmVyIENsYXNzCj4gPiBwZXJtaXNzaW9ucyBhcmUgYWx3YXlzIGlk
ZW50aWNhbCB0byB0aGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUKPiA+IG93bmVyLCBhbmQg
dGhlIEZpbGUgT3RoZXIgQ2xhc3MgcGVybWlzc2lvbnMgYXJlIGFsd2F5cyBpZGVudGljYWwgdG8K
PiA+IHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIG90aGVycy4gV2l0aCBORlN2NCBBQ0xzLCBP
V05FUkAgYW5kCj4gPiBFVkVSWU9ORUAgZW50cmllcyBtYXkgZ3JhbnQgYWRkaXRpb25hbCBwZXJt
aXNzaW9ucyB0aGF0IGdvIGJleW9uZAo+ID4gd2hhdCBQT1NJWCByZWFkLCB3cml0ZSwgYW5kIGV4
ZWN1dGUgY2FuIGdyYW50LCBhbmQgd2UgbmVlZCBhCj4gPiBtZWNoYW5pc20gc28gdGhhdCB0aG9z
ZSBhbHRlcm5hdGUgcGVybWlzc2lvbnMgY2FuIGJlIHR1cm5lZCBvZmYgYnkKPiA+IGNobW9kIGFu
ZCBkdXJpbmcgZmlsZSBjcmVhdGUgd2l0aG91dCBkZXN0cm95aW5nIHRoZSBwZXJtaXNzaW9ucy4K
Pgo+IEdpdmVuIHRoYXQgRVZFUllPTkVAIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBQT1NJWCAi
b3RoZXIiIGNsYXNzLCBpdAo+IGNvdWxkIGJlIHRyaW1tZWQgZG93biB0byB0d28uCgpTZWUgdGhl
IHdlbGwtZm9ybWVkIEFDTCBkaXNjdXNzaW9uIGFib3ZlIHdoeSBFVkVSWU9ORUAgc2hvdWxkIGJl
IGluIHRoZSBGaWxlIApPdGhlciBDbGFzcy4gQnV0IGV2ZW4gaWYgeW91IHRvdGFsbHkgb2JqZWN0
IHRvIHRoaXMgbGluZSBvZiBhcmd1bWVudGF0aW9uLCAKdGhlIEZpbGUgT3RoZXIgQ2xhc3Mgd291
bGQgc3RpbGwgbmVlZCB0byByZXN0cmljdCBFVkVSWU9ORUAgZW50cmllczogYWxsIAp1c2VycyBv
dGhlciB0aGFuIHRoZSBvd25lciwgb3duaW5nIGdyb3VwLCBvciBvdGhlciB1c2VycyBleHBsaWNp
dGx5IG1lbnRpb25lZCAKaW4gdGhlIEFDTCB3aWxsIGJlIGdyYW50ZWQgRVZFUllPTkVAIHBlcm1p
c3Npb25zLCBhbmQgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCAKbm8gdXNlciBpbiB0aGUgRmlsZSBP
dGhlciBDbGFzcyB3aWxsIG9idGFpbiBhbnkgcGVybWlzc2lvbnMgYmV5b25kIHRoZSBGaWxlIApP
dGhlciBDbGFzcyBwZXJtaXNzaW9ucyBhZnRlciBhIGNobW9kIHRvIGJlIFBPU0lYIGNvbXBsaWFu
dC4gKEFsdGVybmF0aXZlbHksIAp3ZSBjb3VsZCByZW1vdmUgcGVybWlzc2lvbnMgZGlyZWN0bHkg
ZnJvbSBhbGwgRVZFUllPTkVAIGVudHJpZXMsIGJ1dCB0aGF0IAp3b3VsZCBiZSBkZXN0cnVjdGl2
ZSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIGFyZSB0cnlpbmcgdG8gYXZvaWQuCgo+ID4gSSB3
b3VsZCBhcHByZWNpYXRlIGlmIHlvdSBjb3VsZCB0YWtlIHRoaXMgYWx0ZXJuYXRpdmUgcHJvcG9z
YWwgaW50bwo+ID4gY29uc2lkZXJhdGlvbiB3aGVuIGRlY2lkaW5nIGhvdyB0byBwcm9jZWVkIHdp
dGggTkZTdjQgTWlub3IKPiA+IFZlcnNpb24gMSBhdCBuZXh0IHdlZWsncyBJRVRGIDY2IG1lZXRp
bmcuCj4KPiBUaGlzIHByb3Bvc2FsIGNlcnRhaW5seSBoYXMgaXRzIG1lcml0cy4gIEkgaGF2ZSBk
b3VidHMgYWJvdXQgdGhlCj4gZmVhc2liaWxpdHkgb2YgYWRkaW5nIHR3byBvciB0aHJlZSBuZXcg
ZmlsZSBhdHRyaWJ1dGVzLCBhbmQgbmV3IGFzLQo+IHlldC11bmltcGxlbWVudGVkIHNlbWFudGlj
cywKCkNvbWUgb24sIGl0J3Mgbm90IGZhaXIgdG8gcHVsbCB0aGUgImFzLXlldC11bmltcGxlbWVu
dGVkIiBjYXJkLiBJIGFtIGRvaW5nIG15IApiZXN0IHRvIGFyZ3VlIG15IHBvaW50cyBhcyBleGhh
dXN0aXZlbHkgYXMgcG9zc2libGUuIEkgYWxzbyBoYXZlIHRoaXMgCnByb3Bvc2FsIGltcGxlbWVu
dGVkLCBhbmQgSSB3aWxsIHN0YXJ0IHNoYWtpbmcgb3V0IGJ1Z3MgdG9tb3Jyb3cuIEkgY2FuIG1h
a2UgCnRoZSBwcm90b3R5cGUgYXZhaWxhYmxlIHB1YmxpY2x5IGltbWVkaWF0ZWx5IGluIGNhc2Ug
eW91IGRvdWJ0IG1lLiBNeSBwbGFuIAp3YXMgdG8gZG8gc28gbGF0ZXIgdGhpcyB3ZWVrLCBhZnRl
ciBzb21lIG1vcmUgZGVidWdnaW5nLCB0aG91Z2guIEkgd2lsbCAKZGVmaW5pdGVseSBkbyBldmVy
eXRoaW5nIEkgY2FuIHRvIHJlbGVhc2UgYW4gaW5pdGlhbCB2ZXJzaW9uIHdpdGhpbiB0aGUgbmV4
dCAKZGF5cy4KCj4gaW50byB0aGUgbWlub3J2ZXJzaW9uMSBkcmFmdC4gIEkgaGF2ZSBkb3VidHMg
YWJvdXQgaG93IHRoaXMgd291bGQgYmUKPiBpbXBsZW1lbnRlZCBvbiBhIFdpbmRvd3MtYmFzZWQg
c2VydmVyLiAKCk5vdCBhdCBhbGwuICBXaW5kb3dzIHNlcnZlciBzaW1wbHkgd29uJ3QgaW1wbGVt
ZW50IHRoZSBtYXNrIGF0dHJpYnV0ZXMsIGFuZCBzbyAKdGhleSB3b3VsZCBzZWUgYSBwZXJmZWN0
IE5GU3Y0IEFDTCB3b3JsZC4gU29tZSBwZXJtaXNzaW9ucyB3aWxsIGdldCBrbm9ja2VkIApvdXQg
aWYgdGhlIEFDTCBjb250YWlucyBzb21lIGFsdGVybmF0aXZlIHBlcm1pc3Npb25zIGFuZCB0aGUg
VU5JWCBzaWRlIGxhdGVyIApkaXNhYmxlcyB0aGVtLCBvciBpZiB0aGUgQUNMIGNvbnRhaW5zIHNv
bWUgcGVybWlzc2lvbnMgdGhhdCB0aGUgVU5JWCBzaWRlIApkZWNpZGVzIHRvIG1hc2suIFRoaXMg
aXMgKm9ubHkqIGFuIGlzc3VlIHdoZW4gYSBXaW5kb3dzIHN5c3RlbSBtb2RpZmllcyB0aGUgCnBl
cm1pc3Npb25zIG9mIGEgZmlsZSBhZnRlciBzb21lIHBlcm1pc3Npb25zIGhhdmUgYmVlbiBtYXNr
ZWQgYnkgYSBQT1NJWCAKc3lzdGVtICh3aGljaCBtZWFucyB0aGF0IHRoZSBQT1NJWCBzeXN0ZW0g
bXVzdCBoYXZlIG1vZGlmaWVkIHRoZSBwZXJtaXNzaW9ucyAKb2YgdGhlIHNhbWUgZmlsZSBhcyB3
ZWxsKS4gSW4gcGFydGljdWxhciwgaXQgaXMgbm90IGFuIGlzc3VlIHdoZW4gb25seSAKV2luZG93
cyBzeXN0ZW1zIGFjY2VzcyBhIGZpbGUsIG9yIHdoZW4gb25seSBQT1NJWCBzeXN0ZW1zIGFjY2Vz
cyBhIGZpbGUuCgo+IFRoZSBjdXJyZW50IGRlc2lnbiBzcGVjaWZpZWQgaW4gZHJhZnQtaWV0Zi1u
ZnN2NC1taW5vcnZlcnNpb24xLTAzLnR4dAo+IGhhcyBpbXBsZW1lbnRhdGlvbiBleHBlcmllbmNl
IC0tIGl0J3MgcmVsZWFzZWQgaW4gU29sYXJpcyAxMCB1cGRhdGUKPiAzLCBhIHNoaXBwaW5nIHBy
b2R1Y3QuIEl0IG1lZXRzIHN0cmljdCBQT1NJWCByZXF1aXJlbWVudHMgZm9yIHRob3NlCj4gaW1w
bGVtZW50YXRpb25zIHRoYXQgY2hvb3NlIHRvIGNvbmZvcm0gdG8gUE9TSVguICAKCkl0IGlzICpu
b3QqIFBPU0lYIGNvbXBsaWFudCB1bmxlc3MgaXQgaW1wbGVtZW50cyBhIGZldyB0aGluZ3Mgb3Ro
ZXIgdGhhbiAKZGVzY3JpYmVkIGluIGRyYWZ0LWlldGYtbmZzdjQtYWNscy0wMC4gSSBoYXZlIGFy
Z3VlZCB3aHkgaW4gdGhlIGZpcnN0IHBhcnQgb2YgCm15IHJlcGx5LgoKPiBJIGJlbGlldmUgaXQn
cyBmdWxseSBpbXBsZW1lbnRhYmxlIG9uIGEgV2luZG93cy1iYXNlZCBzZXJ2ZXIuCgpXaHkgc2hv
dWxkIE1pY3Jvc29mdCBzcGVuZCB0aW1lIG9uIGRyYWZ0LWlldGYtbmZzdjQtYWNscy0wMCBvdGhl
ciB0aGFuIGZvciAKY29tcHV0aW5nIHJlYXNvbmFibGUgZmlsZSBtb2RlcygqKik/IE5GU3Y0IEFD
THMgYXJlIE5URlMvQ0lGUyBBQ0xzIG1pbnVzIApBdXRvbWF0aWMgSW5oZXJpdGFuY2UgKHNlZSAK
aHR0cDovL3d3dzEuaWV0Zi5vcmcvbWFpbC1hcmNoaXZlL3dlYi9uZnN2NC9jdXJyZW50L21zZzAz
MTM1Lmh0bWwpCgooKiopIEkgYWxyZWFkeSBhcmd1ZSB3aHkgdGhlIGFsZ29yaXRobSBpbiBzZWN0
aW9uIDUuMSBvZiAKZHJhZnQtaWV0Zi1uZnN2NC1hY2xzLTAwIGlzIHdyb25nIGFuZCBub3QgUE9T
SVggY29tcGxpYW50LiBUaGlzIGNhbiBlYXNpbHkgYmUgCmZpeGVkLCBidXQgaG93IGl0IHNob3Vs
ZCBiZSBmaXhlZCBkZXBlbmRzIG9uIHdoaWNoIGFwcHJvYWNoIGlzIGNob3Nlbi4KCgpUaGFua3Ms
CkFuZHJlYXMKCj4gPj4gUkVGRVJFTkNFUwo+ID4+Cj4gPj4gWzFdIFNhbSBGYWxrbmVyIGV0IGFs
LjogTkZTIFZlcnNpb24gNCBBQ0xzLCBkcmFmdC1pZXRmLW5mc3Y0LQo+ID4+IGFjbHMtMDAudHh0
Cj4gPj4KPiA+PiBbMl0gUE9TSVggMTAwMy4xZS8yYyBkcmFmdCAxNyAod2l0aGRyYXduKSwKPiA+
PiBodHRwOi8vd3QueHBpbG90Lm9yZy9wdWJsaWNhdGlvbnMvcG9zaXguMWUKPiA+Pgo+ID4+IFsz
XSBNYXJpdXMgQWFtb2R0IEVyaWtzZW4gZXQgYWwuOiBNYXBwaW5nIEJldHdlZW4gTkZTdjQgYW5k
IFBvc2l4Cj4gPj4gRHJhZnQKPiA+PiBBQ0xzLCBkcmFmdC1pZXRmLW5mc3Y0LWFjbC1tYXBwaW5n
LTA0LnR4dAo+ID4+Cj4gPj4gWzRdIFNwZW5jZXIgU2hlcGxlciAoZWRpdG9yKTogTkZTdjQgTWlu
b3IgVmVyc2lvbiAxLAo+ID4+IGRyYWZ0LWlldGYtbmZzdjQtbWlub3J2ZXJzaW9uMS0wMy50eHQK
Cls1XSBTdGFuZGFyZCBmb3IgSW5mb3JtYXRpb24gVGVjaG5vbG9neSDigJQgUG9ydGFibGUgT3Bl
cmF0aW5nIFN5c3RlbSBJbnRlcmZhY2UgCihQT1NJWMKuKSwgaHR0cDovL3d3dy5vcGVuZ3JvdXAu
b3JnL2F1c3Rpbi8KCls2XSBBbmRyZWFzIEdydWVuYmFjaGVyOiBQT1NJWCBBY2Nlc3MgQ29udHJv
bCBMaXN0cyBvbiBMaW51eCwgCmh0dHA6Ly93d3cuc3VzZS5kZS9+YWdydWVuL2FjbC9saW51eC1h
Y2xzLwoKWzddIFBPU0lYIDEwMDMuMWUvMmMgZHJhZnQgMTcsIGh0dHA6Ly93dC54cGlsb3Qub3Jn
L3B1YmxpY2F0aW9ucy9wb3NpeC4xZS8KCi0tIApBbmRyZWFzIEdydWVuYmFjaGVyIDxhZ3J1ZW5A
c3VzZS5kZT4KTm92ZWxsIC8gU1VTRSBMYWJzCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpVc2luZyBUb21j
YXQgYnV0IG5lZWQgdG8gZG8gbW9yZT8gTmVlZCB0byBzdXBwb3J0IHdlYiBzZXJ2aWNlcywgc2Vj
dXJpdHk/CkdldCBzdHVmZiBkb25lIHF1aWNrbHkgd2l0aCBwcmUtaW50ZWdyYXRlZCB0ZWNobm9s
b2d5IHRvIG1ha2UgeW91ciBqb2IgZWFzaWVyCkRvd25sb2FkIElCTSBXZWJTcGhlcmUgQXBwbGlj
YXRpb24gU2VydmVyIHYuMS4wLjEgYmFzZWQgb24gQXBhY2hlIEdlcm9uaW1vCmh0dHA6Ly9zZWwu
YXMtdXMuZmFsa2FnLm5ldC9zZWw/Y21kPWxuayZraWQ9MTIwNzA5JmJpZD0yNjMwNTcmZGF0PTEy
MTY0MgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpORlMg
bWFpbGxpc3QgIC0gIE5GU0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKaHR0cHM6Ly9saXN0cy5zb3Vy
Y2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vbmZzCg==

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-09 16:22     ` [nfsv4] " Andreas Gruenbacher
@ 2006-07-10 13:29       ` Sam Falkner
  2006-07-10 14:15         ` [nfsv4] " J. Bruce Fields
  2006-07-10 22:50         ` Andreas Gruenbacher
  2006-07-11  6:50       ` Lisa Week
  1 sibling, 2 replies; 38+ messages in thread
From: Sam Falkner @ 2006-07-10 13:29 UTC (permalink / raw)
  To: nfsv4; +Cc: nfs, Spencer Shepler, Brian Pawlowski, Lisa Week

On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:

> On Saturday, 8. July 2006 05:45, Sam Falkner wrote:
>> On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:
>>> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
>>>> Hello,
>>>>
>>>> I have been thinking about the problems of interaction between
>>>> NFSv4 ACLs and POSIX, and particularly about the issue of masking
>>>> permissions through chmod and after creating files or directories.
>>>
>>> Here is a follow-up after some personal feedback from Sam. I
>>> believe that draft-ietf-nfsv4-acls-00 is not ready to become part  
>>> of the
>>> NFSv4 Minor Version 1 RFC: some assumptions are not correct from  
>>> a POSIX
>>> point of view, and the way how chmod and file create modes are  
>>> applied to
>>> NFSv4 ACLs is weak and not guaranteed to be correct.
>>
>> I disagree -- see below.
>
> Here are some facts to back my points: Let's assume that a file  
> inherits the
> following ACL when being created (I am using ^(...) here with the  
> meaning of
> "all bitflags except ..."):
>
> 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
> 	OWNER@:^(READ_DATA/WRITE_DATA)::DENY
> 	GROUP@:READ_DATA::ALLOW
> 	user@domain:READ_DATA/WRITE_DATA::ALLOW
> 	GROUP@:^READ_DATA::DENY
> 	user@domain:^(READ_DATA/WRITE_DATA)::DENY
> 	EVERYONE@:READ_DATA::ALLOW
>
> This acl is "well structured" in the POSIX sense: OWNER@ will only  
> get the
> owner permissions and none of the other permissions, user@domain  
> and GROUP@
> will only get the permissions intended for them, and only others  
> (neither
> OWNER@ nor user@domain nor GROUP@) will get EVERYONE@ permissions;  
> in other
> words, the acl is even correct for non-monotonic permissions.
>
> According to section 5.1 of draft-ietf-nfsv4-acls [1], the  
> resulting file mode
> permission bits for this acl shall be rw-r--r--.

Your proposal would give this mode: rw-rw-r--.  I think we should  
consider this more carefully.

> After a chmod or a file
> create, alternate file access control mechanisms must be disabled  
> and only
> additional file access control mechanisms may remain active.  
> According to
> POSIX, additional file access control mechanisms require that no  
> user may be
> granted more permissions than the respective file classes permit.  
> In this
> case, user@domain clearly is not in the File Owner Class.  
> (According to
> POSIX, user@domain must be in the File Group Class.) The  
> user@domain user is
> granted WRITE_DATA though, which is *incorrect* from a POSIX point  
> of view.

No, it is not granted WRITE_DATA after a chmod().  After a chmod 644,  
there will be a "user@domain:WRITE_DATA::DENY" prepended.  This is  
well defined in the current minorversion1.  So it is not "incorrect  
from a POSIX point of view."

If your problem is with the computation of the mode, then we can  
discuss this some more.  But following create or chmod, user@domain  
is not granted WRITE_DATA.

> Next, let's assume than an ACL contains the following pair of user- 
> provided
> entries:
>
> 	GROUP@:WRITE_DATA::DENY
> 	GROUP@:READ_DATA::ALLOW
>
> Clearly the user's intention is to deny WRITE_DATA access to GROUP@.

Yes, that *was* the user's intention, at the time the user set the ACL.

> The
> algorithm to apply a mode to an existing ACL will remove the  
> WRITE_DATA bit
> from the GROUP@:WRITE_DATA::DENY entry when a chmod(..., 0770) is done
> though. This is counter to the user's intention, so I would call  
> that *wrong*
> as well.

You would call it wrong that a chmod 770 would allow WRITE_DATA to  
members of the file's owning group?!  The  user did a chmod -- the  
user changed the permissions on the file!

This is not a POSIX flaw, and this is not a design flaw of any kind.   
"chmod 770" grants the owning group permission to write the file,  
period.

> It also violates the principle of least surprise.

Are you kidding?  Consider a directory with this ACE in its ACL:

GROUP@:READ_DATA/WRITE_DATA:FILE_INHERIT:DENY

With your proposal, open("foo", O_CREAT | O_RDWR, 0666) in this  
directory creates a file that the owning group is denied read and  
write permission.  Then:

% chmod 664 foo

Oops, owning group *still* cannot read or write the file!  Linux/*NIX  
has a long history of files having a mode attribute, and users using  
chmod to set permissions -- but not much history with NFSv4 ACLs.   
Your proposal more or less requires that Linux/*NIX users immediately  
start using ACLs, or face the "chmod doesn't fix my file" problem.

I've spent quite some time over the last few days looking for flaws  
in your proposal, but I'll admit that I missed this one, and it's a  
big one.

> There really is no
> safe way to tell user-provided ACL entries from artificially made  
> up ACL
> entries.

The semantics in draft-ietf-nfsv4-acls are well defined, predictable,  
consistent, and reasonable.

> draft-ietf-nfsv4-acls is missing a clear classification of ACL  
> entries into
> the File Owner, File Group, and File Other classes. Every ACL entry  
> must be
> in one of the three classes in order to compute appropriate file mode
> permission bits when setting an ACL, and after inheriting  
> permissions. This
> classification also determines which effect chmod will have on an ACL.

I assume you mean "every ACE", not "every ACL".  As I mentioned  
above, I'm not sure whether or not this is a requirement, but it can  
be discussed further.  However, if it turns out that draft-ietf-nfsv4- 
acls is wrong in this regard, then the only consequence is a minor  
change to 5.1.

> So draft-ietf-nfsv4-acls is *incorrect* and *wrong* from a POSIX  
> point of
> view, while my alternative proposal is correct, apart from being  
> simpler to
> implement. I hope that my emails and some background reading (like  
> the file
> access related parts of the POSIX definitions volume [5], a paper that
> explains POSIX ACLs and how they are implemented on Linux [6], and  
> perhaps
> 1003.1e draft 17) will convince you about that.

I am absolutely not convinced.

This email is getting *way* too long, so I will stop at this point,  
and perhaps will reply to other pieces in the future.

- Sam

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 13:29       ` Sam Falkner
@ 2006-07-10 14:15         ` J. Bruce Fields
  2006-07-10 15:32           ` Sam Falkner
  2006-07-11  0:01           ` Andreas Gruenbacher
  2006-07-10 22:50         ` Andreas Gruenbacher
  1 sibling, 2 replies; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-10 14:15 UTC (permalink / raw)
  To: Sam Falkner; +Cc: Brian Pawlowski, Spencer Shepler, nfs, nfsv4, Lisa Week

On Mon, Jul 10, 2006 at 07:29:56AM -0600, Sam Falkner wrote:
> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
> >According to section 5.1 of draft-ietf-nfsv4-acls [1], the  
> >resulting file mode
> >permission bits for this acl shall be rw-r--r--.
> 
> Your proposal would give this mode: rw-rw-r--.  I think we should  
> consider this more carefully.

As Andreas says, this is what the posix draft would have you do.  It's
also what Linux (and, I assume, Solaris) do in the case of posix ACLs.

If the goals was compatibility with that posix draft, RFC3530 should
have specified that owner, other, and group bits be kept in sync with
(respectively) OWNER@, EVERYONE@, and the *maximum* of permissions given
to any other entity, rather than with OWNER@, EVERYONE@, and GROUP@.

> You would call it wrong that a chmod 770 would allow WRITE_DATA to  
> members of the file's owning group?!  The  user did a chmod -- the  
> user changed the permissions on the file!

That is how posix acl's work; again, the group mode bit really
corresponds to the mask, not to the group acl entry:

	bfields@pickle:~$ getfacl foo
	# file: foo
	# owner: bfields
	# group: bfields
	user::rw-
	user:bfields:r--
	group::r--
	mask::r--
	other::---

	bfields@pickle:~$ chmod 770 foo
	bfields@pickle:~$ getfacl foo
	# file: foo
	# owner: bfields
	# group: bfields
	user::rwx
	user:bfields:r--
	group::r--
	mask::rwx
	other::---


Of course, "posix" acls aren't really posix, and we could do something
else if seems simpler.  Neither behavior seems intuitive to me in all
situations.

--b.


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 14:15         ` [nfsv4] " J. Bruce Fields
@ 2006-07-10 15:32           ` Sam Falkner
  2006-07-10 18:57             ` [NFS] " J. Bruce Fields
  2006-07-11  0:15             ` Andreas Gruenbacher
  2006-07-11  0:01           ` Andreas Gruenbacher
  1 sibling, 2 replies; 38+ messages in thread
From: Sam Falkner @ 2006-07-10 15:32 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: Brian Pawlowski, Spencer Shepler, nfs, nfsv4, Lisa Week


On Jul 10, 2006, at 8:15 AM, J. Bruce Fields wrote:

> On Mon, Jul 10, 2006 at 07:29:56AM -0600, Sam Falkner wrote:
>> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
>>> According to section 5.1 of draft-ietf-nfsv4-acls [1], the
>>> resulting file mode
>>> permission bits for this acl shall be rw-r--r--.
>>
>> Your proposal would give this mode: rw-rw-r--.  I think we should
>> consider this more carefully.
>
> As Andreas says, this is what the posix draft would have you do.  It's
> also what Linux (and, I assume, Solaris) do in the case of posix ACLs.

Not on Solaris.  With POSIX-draft ACLs, adding user:friend:rw- to a  
mode rw-r--r-- file still gives you rw-r--r--.  (And as you point out  
later, these ACLs ain't POSIX.)

> If the goals was compatibility with that posix draft, RFC3530 should
> have specified that owner, other, and group bits be kept in sync with
> (respectively) OWNER@, EVERYONE@, and the *maximum* of permissions  
> given
> to any other entity, rather than with OWNER@, EVERYONE@, and GROUP@.
>
>> You would call it wrong that a chmod 770 would allow WRITE_DATA to
>> members of the file's owning group?!  The  user did a chmod -- the
>> user changed the permissions on the file!
>
> That is how posix acl's work; again, the group mode bit really
> corresponds to the mask, not to the group acl entry:
>
> 	bfields@pickle:~$ getfacl foo
> 	# file: foo
> 	# owner: bfields
> 	# group: bfields
> 	user::rw-
> 	user:bfields:r--
> 	group::r--
> 	mask::r--
> 	other::---
>
> 	bfields@pickle:~$ chmod 770 foo
> 	bfields@pickle:~$ getfacl foo
> 	# file: foo
> 	# owner: bfields
> 	# group: bfields
> 	user::rwx
> 	user:bfields:r--
> 	group::r--
> 	mask::rwx
> 	other::---

Again, not so on Solaris.  I wasn't aware that it was on Linux.  Sigh.

> Of course, "posix" acls aren't really posix, and we could do something
> else if seems simpler.  Neither behavior seems intuitive to me in all
> situations.

I think having chmod be functional, i.e. chmod 770 gives write  
permission to the owning group, and an "ls -l" shows "rwxrwx---",  
would be best by far.

- Sam

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [NFS] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 15:32           ` Sam Falkner
@ 2006-07-10 18:57             ` J. Bruce Fields
  2006-07-10 22:26               ` [nfsv4] " Sam Falkner
  2006-07-11  0:15             ` Andreas Gruenbacher
  1 sibling, 1 reply; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-10 18:57 UTC (permalink / raw)
  To: Sam Falkner; +Cc: nfs, Spencer Shepler, Brian Pawlowski, nfsv4, Lisa Week

On Mon, Jul 10, 2006 at 09:32:28AM -0600, Sam Falkner wrote:
> On Jul 10, 2006, at 8:15 AM, J. Bruce Fields wrote:
> > As Andreas says, this is what the posix draft would have you do.  It's
> > also what Linux (and, I assume, Solaris) do in the case of posix ACLs.
> 
> Not on Solaris.  With POSIX-draft ACLs, adding user:friend:rw- to a  
> mode rw-r--r-- file still gives you rw-r--r--.  (And as you point out  
> later, these ACLs ain't POSIX.)
...
> > That is how posix acl's work; again, the group mode bit really
> > corresponds to the mask, not to the group acl entry:
...
> Again, not so on Solaris.  I wasn't aware that it was on Linux.  Sigh.

Ugh, sorry, OK, I didn't understand that we had that difference.

Personally, after seeing how complicated this can get, I almost think
I'd rather translate mode bits to NFSv4 ACLs by translating them to the
obvious ACL with 3 ALLOW ACEs.  And I'd rather translate the mask by
just masking out the bits in the obvious way, rather than adding DENY
aces.

At the very least, I'd rather not *forbid* such an implementation.  Yes,
it makes chmod irreversible, and it's wrong in a few rare corner cases,
but there are advantages to being wrong in a way that's simple and easy
to document.

If we're committed to getting the mask ace right, though, I would prefer
to adopt one of Andreas's solutions; they'd allow us to generate much
simpler ACLs.  I actually prefer the first proposal (letting the server
use the mode bits to mask out permissions).  But if we're going to add
explicit mask aces, then please, let's add only one.  I understand the
theoretical advantage to masking out all three classes, but that's
adding too much complexity for a few corner cases, and I don't think
it's going to be easy for users to understand.

We could add a new ACE type (in addition to ALLOW, DENY, AUDIT, ALARM),
and then a client could query the server's ability to represent the mask
with the aclsupport attribute and decide whether it wants to add DENY's
to represent the mask, or just give up on chmod reversibility.

--b.

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-08  6:51     ` [nfsv4] " Lisa Week
@ 2006-07-10 21:09       ` Andreas Gruenbacher
  0 siblings, 0 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-10 21:09 UTC (permalink / raw)
  To: Lisa Week; +Cc: Brian Pawlowski, Spencer Shepler, nfs, nfsv4

Lisa,

On Saturday, 08 July 2006 08:51, Lisa Week wrote:
> Hi Andreas,
>
> I have a couple additional questions and comments.  See those inline...
>
> [...]
>
> For example, if we have the following ACL:
>      lisa@sun.com:ACE4_WRITE_ACL:deny
>
> 		or even
>
>      lisa@sun.com:ACE4_WRITE_OWNER:allow
>
> Upon chmod we would have to disable them (however an implementation
> chooses to) and effectively remove it.

In my proposal with the owner_class_mask, group_class_mask, and 
other_class_mask attributes, the chmod does not remove any mask bits from the 
ACEs, it sets the mask attributes to reflect the chmod mode parameter. The 
permission check algorithm only considers the effective permissions. So the 
mask attributes define which permissions are enabled and which are disabled.

> The thing that I have a problem with here is the fact that the
> changing of the file permission bits will affect what access has been
> defined in the ACL for things such as ACE4_WRITE_OWNER,
> ACE4_WRITE_ACL, etc.  A user setting the file permission bits is not
> saying anything about what they want to be done with any ACEs that
> include the ACE4_WRITE_OWNER mask bit.  Why would we want to mess
> with them?

It's quite simple: ACE4_WRITE_OWNER is an alternate access control mechanism 
under POSIX, no matter how we look at it. POSIX says that a chmod must disable 
alternate access control mechanisms, and it says that additional access 
control mechanisms may only introduce further restrictions. So a chmod will 
disable ACE4_WRITE_ACL and ACE4_WRITE_OWNER access, in both proposals.

> 2.) So, what if an ACE contained a mixture of the access mask bits
> that are alternate and additional?
>
> Would we allow having ACE4_READ_DATA and ACE4_WRITE_ACL in the same
> ACE?  What would happen to an ACE such as this upon chmod?

Of course we allow such ACEs. In fact, any NFSv4 ACL is allowed(*). Chmod does 
not touch the ACL, it adjusts the mask attributes so that only bits allowed 
by the respective class (File Owner Class, File Group Class, File Other 
Class) will be set in the mask attributes. Because only bits set both in an 
ACE and in the associated mask attribute are effective, all other permissions 
will automatically be disabled. Your proposal achieves the same effect by 
prepending ALLOW entries with DENY entries that deny masked permissions.

(*) See the well-formed ACLs and non-monotonic permissions discussion in the 
previous mails for why we may want to enforce a specific form of ACLs for 
full POSIX compliance, and in which conditions this matters.

> I'll restate it because it is important: EVERYONE@ is not equivalent
> to the File Other Class.  I believe the original intention was to
> have it be equivalent to one the Windows "well known sid":   http://
> msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/
> security/well_known_sid_type.asp

EVERYONE@ in NFSv4 ACLs indeed matches EVERYONE@ in Windows ACLs.

> Really with NFSv4 ACLs, the only way we have the equivalent of a File
> Other Class is if the EVERYONE@ entries come at the end of the ACL.

Again, that's what I discussed as part of well-formed ACLs and non-monotonic 
permissions. Think of it this way:

We classify ACEs as follows:

  - OWNER@ entries and user@domain entries for the user who currently owns
    a file are in the File Owner Class,

  - EVERYONE@ entries are in the File Other Class,

  - all other entries are in the File Group Class.

Well-formed NFSv4 ACLs include DENY entries which make sure that the 
permissions granted to each class (File Owner Class, File Group Class, File 
Other Class) are isolated, and permissions granted to one class will not 
"swap over" to another class. In particular, this means that nobody in the 
File Owner and File Group classes will be granted any permissions from an 
EVERYONE@ ACE.

Arbitrary NFSv4 ACLs are not "well-formed" in this sense. They do not isolate 
the classes, and permissions from several classes may accumulate.

So, for strict POSIX compliance, we much make sure that ACLs are well-formed 
if both is true:

 - they are inherited or chmod'ed

 - and the mask applied to the ACL is non-monotonic

In all other cases (when an ACL is set, or when the permissions are monotonic) 
we will still be within the bounds of POSIX, and so we don't need to care.

So I'll restate that EVERYONE@ entries *are* in the File Other Class. Whether 
or not permissions may "swap over" from one class to another is determined by 
whether or not an ACL is "well-formed". This is an aspect orthogonal to the 
classification, to be dealt with separately. No other classification can fix 
the well-formedness aspect.

> Again, EVERYONE@ is not equivalent to the File Other Class.
> Depending on where an ACE pertaining to EVERYONE@ is in the ACL, it
> could even refer to the owner and the owning group.

Wrong in my opinion: with an ACL that simply consists of a single EVERYONE@ 
ACE, the other permissions will apply to all classes, but that's because the 
ACL is not well-formed, not because EVERYONE@ is classified wrong.

> Sorry, but I don't think I understand.  Andreas, what do you mean by
> "Alternate" permissions in that sentence?

Here is a table of NFSv4 ACL mask bits and their classification. Mask bits are 
classified as Additional if they are either always permitted under POSIX 
(indicated as None in the table), or if they are equivalent to or a subset of 
a POSIX permission (indicated as Read, Write, Execute in the table). Mask 
bits are classified as Alternate if POSIX permissions cannot grant this 
permission (e.g., the equvalent of WRITE_ACL is implicitly granted to the 
owner, but there is no way to grant WRITE_ACL to an arbitrary other user).

READ_DATA               Additional (Read)
LIST_DIRECTORY          Additional (Read)
WRITE_DATA              Additional (Write)
ADD_FILE                Additional (Write)
APPEND_DATA             Additional (Write)
ADD_SUBDIRECTORY        Additional (Write)
READ_NAMED_ATTRS        Additional (Read) (**)
WRITE_NAMED_ATTRS       Additional (Write) (**)
EXECUTE                 Additional (Execute)
DELETE_CHILD            Additional (Write)
READ_ATTRIBUTES         Additional (None)
WRITE_ATTRIBUTES        Alternate
DELETE                  Alternate
READ_ACL                Additional (None)
WRITE_ACL               Alternate
WRITE_OWNER             Alternate
SYNCHRONIZE             Additional (None)

> It is unclear to me as to 
> what happens to the access mask bits outside of the following:
> (collectively, these are the access mask bits that make up the POSIX
> read, write and execute permissions)
> ACE4_READ_DATA, ACE4_READ_ATTRIBUTES, ACE4_READ_ACL, ACE4_SYNCHRONIZE
> ACE4_WRITE_DATA, ACE4_APPEND_DATA, ACE4_WRITE_ATTRIBUTES,
> ACE4_DELETE_CHILD and ACE4_EXECUTE
>
> The remaining ones are:
> ACE4_WRITE_ACL, ACE4_WRITE_OWNER, ACE4_DELETE, ACE4_READ_NAMED_ATTRS
> and ACE4_WRITE_NAMED_ATTRS

(**) I think that Read and Write imply ACE4_READ_NAMED_ATTRS and 
ACE4_WRITE_NAMED_ATTRS on Solaris, respectively, but I'm not sure. In case 
they are not, they would indeed count as Alternate.

> Are these "remaining ones" also given representation in the masks?

Yes. Alternate permissions must be subject to the mask attributes, because we 
must be able to disable them upon chmod and ACL inheritance. We can turn them 
back on later by setting the corresponding bitflags in the mask attributes 
(explicitly, or implicitly by setting a new ACL without also providing mask 
attributes, see further below).

POSIX does not require that alternate file access mechanisms be either on or 
off completely (i.e., an on/off switch); we are free to turn alternate 
permissions on or off individually. (We must turn them all off upon chmod and 
permission inheritance, but that should be clear by now.)

> Actually, I think what is confusing me is that before, when talking
> about Additional and Alternate file access control mechanisms, you
> said that: " All others with ACE4_WRITE_ACL, ACE4_WRITE_OWNER,
> ACE4_DELETE_CHILD, and ACE4_DELETE are alternate."
>
> I just wonder how that statement  relates to the statement that
> "Alternate permissions in the ACL can be enabled by either setting an
> ACL without providing full mask entries, or by setting the
> appropriate bit(s) in the corresponding mask entry or entries."

My proposal was that a SETATTR of ACL that does not also set the mask 
attributes should automatically set all unspecified mask attributes to the 
union of all the ALLOW ACEs in the respective class. In other words, when a 
NFSv4.0 client executes an ACL SETATTR, all the ALLOW permissions in the ACL 
will automatically get set in the respective mask attributes as well, and 
will be effective. POSIX allows this behavior.


Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 18:57             ` [NFS] " J. Bruce Fields
@ 2006-07-10 22:26               ` Sam Falkner
  2006-07-10 22:39                 ` J. Bruce Fields
  0 siblings, 1 reply; 38+ messages in thread
From: Sam Falkner @ 2006-07-10 22:26 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: Brian Pawlowski, Spencer Shepler, nfs, nfsv4, Lisa Week


On Jul 10, 2006, at 1:57 PM, J. Bruce Fields wrote:

> On Mon, Jul 10, 2006 at 09:32:28AM -0600, Sam Falkner wrote:
>> On Jul 10, 2006, at 8:15 AM, J. Bruce Fields wrote:
>>> As Andreas says, this is what the posix draft would have you do.   
>>> It's
>>> also what Linux (and, I assume, Solaris) do in the case of posix  
>>> ACLs.
>>
>> Not on Solaris.  With POSIX-draft ACLs, adding user:friend:rw- to a
>> mode rw-r--r-- file still gives you rw-r--r--.  (And as you point out
>> later, these ACLs ain't POSIX.)
> ...
>>> That is how posix acl's work; again, the group mode bit really
>>> corresponds to the mask, not to the group acl entry:
> ...
>> Again, not so on Solaris.  I wasn't aware that it was on Linux.   
>> Sigh.
>
> Ugh, sorry, OK, I didn't understand that we had that difference.
>
> Personally, after seeing how complicated this can get, I almost think
> I'd rather translate mode bits to NFSv4 ACLs by translating them to  
> the
> obvious ACL with 3 ALLOW ACEs.  And I'd rather translate the mask by
> just masking out the bits in the obvious way, rather than adding DENY
> aces.
>
> At the very least, I'd rather not *forbid* such an implementation.   
> Yes,
> it makes chmod irreversible, and it's wrong in a few rare corner  
> cases,
> but there are advantages to being wrong in a way that's simple and  
> easy
> to document.
>
> If we're committed to getting the mask ace right, though, I would  
> prefer
> to adopt one of Andreas's solutions; they'd allow us to generate much
> simpler ACLs.  I actually prefer the first proposal (letting the  
> server
> use the mode bits to mask out permissions).  But if we're going to add
> explicit mask aces, then please, let's add only one.  I understand the
> theoretical advantage to masking out all three classes, but that's
> adding too much complexity for a few corner cases, and I don't think
> it's going to be easy for users to understand.

How would a scheme that uses one and only one mask ACE work?  Are you  
thinking of catching mode 077 via a

OWNER@:READ_DATA/WRITE_DATA/EXECUTE:DENY

but having no way to catch mode 707 (because GROUP@:READ_DATA/ 
WRITE_DATA/EXECUTE:DENY might catch the owner)?

> We could add a new ACE type (in addition to ALLOW, DENY, AUDIT,  
> ALARM),
> and then a client could query the server's ability to represent the  
> mask
> with the aclsupport attribute and decide whether it wants to add  
> DENY's
> to represent the mask, or just give up on chmod reversibility.

Please explain this further.  What would the fifth ACE type do?  What  
would it give you that DENY wouldn't?

- Sam


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 22:26               ` [nfsv4] " Sam Falkner
@ 2006-07-10 22:39                 ` J. Bruce Fields
  2006-07-10 22:43                   ` J. Bruce Fields
  2006-07-11  0:44                   ` Andreas Gruenbacher
  0 siblings, 2 replies; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-10 22:39 UTC (permalink / raw)
  To: Sam Falkner; +Cc: Brian Pawlowski, Spencer Shepler, nfs, nfsv4, Lisa Week

On Mon, Jul 10, 2006 at 05:26:32PM -0500, Sam Falkner wrote:
> 
> On Jul 10, 2006, at 1:57 PM, J. Bruce Fields wrote:
> >If we're committed to getting the mask ace right, though, I would
> >prefer to adopt one of Andreas's solutions; they'd allow us to
> >generate much simpler ACLs.  I actually prefer the first proposal
> >(letting the  server use the mode bits to mask out permissions).  But
> >if we're going to add explicit mask aces, then please, let's add only
> >one.  I understand the theoretical advantage to masking out all three
> >classes, but that's adding too much complexity for a few corner
> >cases, and I don't think it's going to be easy for users to
> >understand.
> 
> How would a scheme that uses one and only one mask ACE work?  Are you
> thinking of catching mode 077 via a
> 
> OWNER@:READ_DATA/WRITE_DATA/EXECUTE:DENY
> 
> but having no way to catch mode 707 (because GROUP@:READ_DATA/
> WRITE_DATA/EXECUTE:DENY might catch the owner)?

Andreas's proposal was actually to add something new to the protocol
(either a new attribute, or a new special entity (like "MASK@")) to
transfer the mask.  One of the advantages of doing that is that you'd no
longer have to use a bunch of DENY ACEs scattered through the ACL, all
carrying the same information.  E.g. you'd the client to include an ACE
like

	MASK@:READ_DATA:DENY

and modify the NFSv4 acl-permission-checking algorithm to mask out any
bitmasks anywhere other than OWNER@ or DENY@.

But Andreas was proposing that we actually add 3 different types of
masks, one for the OWNER@, one for EVERYONE@, and one for the others,
and I think that's overkill.  So that's what I'm arguing against.

> >We could add a new ACE type (in addition to ALLOW, DENY, AUDIT,
> >ALARM), and then a client could query the server's ability to
> >represent the  mask with the aclsupport attribute and decide whether
> >it wants to add  DENY's to represent the mask, or just give up on
> >chmod reversibility.
> 
> Please explain this further.  What would the fifth ACE type do?  What
> would it give you that DENY wouldn't?

It's just a way to pass the mask inside the ACL, but using a new ACE
type instead of a new special entity.

The advantage is that a client can actually probe to see if the server
supports it, so we wouldn't have to make it mandatory for a server to
support it.  But a separate attribute would also have that property.

--b.


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 22:39                 ` J. Bruce Fields
@ 2006-07-10 22:43                   ` J. Bruce Fields
  2006-07-11  0:44                   ` Andreas Gruenbacher
  1 sibling, 0 replies; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-10 22:43 UTC (permalink / raw)
  To: Sam Falkner; +Cc: nfs, Spencer Shepler, Brian Pawlowski, nfsv4, Lisa Week

On Mon, Jul 10, 2006 at 06:39:39PM -0400, J. Bruce Fields wrote:
> and modify the NFSv4 acl-permission-checking algorithm to mask out any
> bitmasks anywhere other than OWNER@ or DENY@.

(Err, I meant to say "OWNER@ or EVERYONE@", sorry....)

--b.


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 13:29       ` Sam Falkner
  2006-07-10 14:15         ` [nfsv4] " J. Bruce Fields
@ 2006-07-10 22:50         ` Andreas Gruenbacher
  2006-07-11  6:17           ` [nfsv4] " Sam Falkner
  1 sibling, 1 reply; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-10 22:50 UTC (permalink / raw)
  To: nfsv4; +Cc: Sam Falkner, Brian Pawlowski, Spencer Shepler, nfs, Lisa Week

On Monday, 10. July 2006 15:29, Sam Falkner wrote:
> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
> > On Saturday, 8. July 2006 05:45, Sam Falkner wrote:
> >> On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:
> >>> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
> >>>> Hello,
> >>>>
> >>>> I have been thinking about the problems of interaction between
> >>>> NFSv4 ACLs and POSIX, and particularly about the issue of masking
> >>>> permissions through chmod and after creating files or directories.
> >>>
> >>> Here is a follow-up after some personal feedback from Sam. I
> >>> believe that draft-ietf-nfsv4-acls-00 is not ready to become part
> >>> of the
> >>> NFSv4 Minor Version 1 RFC: some assumptions are not correct from
> >>> a POSIX
> >>> point of view, and the way how chmod and file create modes are
> >>> applied to
> >>> NFSv4 ACLs is weak and not guaranteed to be correct.
> >>
> >> I disagree -- see below.
> >
> > Here are some facts to back my points: Let's assume that a file
> > inherits the
> > following ACL when being created (I am using ^(...) here with the
> > meaning of
> > "all bitflags except ..."):
> >
> > 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
> > 	OWNER@:^(READ_DATA/WRITE_DATA)::DENY
> > 	GROUP@:READ_DATA::ALLOW
> > 	user@domain:READ_DATA/WRITE_DATA::ALLOW
> > 	GROUP@:^READ_DATA::DENY
> > 	user@domain:^(READ_DATA/WRITE_DATA)::DENY
> > 	EVERYONE@:READ_DATA::ALLOW
> >
> > This acl is "well structured" in the POSIX sense: OWNER@ will only
> > get the
> > owner permissions and none of the other permissions, user@domain
> > and GROUP@
> > will only get the permissions intended for them, and only others
> > (neither
> > OWNER@ nor user@domain nor GROUP@) will get EVERYONE@ permissions;
> > in other
> > words, the acl is even correct for non-monotonic permissions.
> >
> > According to section 5.1 of draft-ietf-nfsv4-acls [1], the
> > resulting file mode
> > permission bits for this acl shall be rw-r--r--.
>
> Your proposal would give this mode: rw-rw-r--.  I think we should
> consider this more carefully.
>
> > After a chmod or a file
> > create, alternate file access control mechanisms must be disabled
> > and only
> > additional file access control mechanisms may remain active.
> > According to
> > POSIX, additional file access control mechanisms require that no
> > user may be
> > granted more permissions than the respective file classes permit.
> > In this
> > case, user@domain clearly is not in the File Owner Class.
> > (According to
> > POSIX, user@domain must be in the File Group Class.) The
> > user@domain user is
> > granted WRITE_DATA though, which is *incorrect* from a POSIX point
> > of view.
>
> No, it is not granted WRITE_DATA after a chmod().  After a chmod 644,
> there will be a "user@domain:WRITE_DATA::DENY" prepended.  This is
> well defined in the current minorversion1.  So it is not "incorrect
> from a POSIX point of view."

Now that I look at the example again, I realize that I didn't define the 
create mode. With create mode 640 or less permissive, everything is fine. 
Let's assume create mode 664 though: then the file mode permission bits will 
still come out as rw-r--r--, but the ACL will grant WRITE_DATA to 
user@domain. That's the case I meant, and this case is not POSIX compliant.

> If your problem is with the computation of the mode, then we can
> discuss this some more.  But following create or chmod, user@domain
> is not granted WRITE_DATA.

My problems are these:

* the algorithm in 5.3 is based on an ACE classification closer to the one
  I proposed, while the algorithm in 5.1 is based on a different
  classsification. We need to straighten this out, and I have argued
  repeatedly now why the classification I proposed leads to consistent
  and correct results. Most of the little inconsistencies in
  draft-ietf-nfsv4-acls-00 will stick out quite clearly once we agree on
  the right classification, and they will be easy to fix.

* the DENY entries introduced to mask permissions bloat the ACL, and make
  the ACL look strange to non-POSIX systems. The algorithm in section 5.3
  may remove permissions from user-provided DENY entries in some cases,
  and it may introduce duplicate DENY entries in some situations such as
  when another system reorders ACEs.Some versions of Windows do that.

The alternative approach I am proposing has a clear classification of ACEs, 
separates the orthogonal aspects of classification vs. well-formed acls, and 
has none of the weaknesses that the mask DENY ACEs cause.

> > Next, let's assume than an ACL contains the following pair of user-
> > provided entries:
> >
> > 	GROUP@:WRITE_DATA::DENY
> > 	GROUP@:READ_DATA::ALLOW
> >
> > Clearly the user's intention is to deny WRITE_DATA access to GROUP@.
>
> Yes, that *was* the user's intention, at the time the user set the ACL.

Hm... not the best example because GROUP@ is the owning group, which 
corresponds to the group file mode permission bits in traditional POSIX. The 
problem is more difficult to see in this case, but I argue that the owhning 
group permissions and the group file mode permission bits are not the same
with ACLs: the file group mode permission bits restrict GROUP@ entries, and 
all user@domain and group@domain entries in the acl. For the sake of this 
example, substitute GROUP@ with user@domain though, and you'll see the 
problem more clearly: a user adds an explicit user@domain:WRITE_DATA::DENY 
entry to an acl which is followed by a user@domain:READ_DATA::ALLOW entry. 
After a chmod to 664 for example, this user suddenly has write access. The 
user clearly did not intend this to happen.

> > The algorithm to apply a mode to an existing ACL will remove the
> > WRITE_DATA bit
> > from the GROUP@:WRITE_DATA::DENY entry when a chmod(..., 0770) is done
> > though. This is counter to the user's intention, so I would call
> > that *wrong*
> > as well.
>
> You would call it wrong that a chmod 770 would allow WRITE_DATA to
> members of the file's owning group?!  The  user did a chmod -- the
> user changed the permissions on the file!

Yes. The user set the group file mode permission bits to rwx, in other words, 
ACEs in the File Group Class are limited to rwx after that. This does not 
imply that GROUP@ ACEs automatically have the equivalent of rwx though: the 
File Group Class contains several ACL entries, and you want to control the 
group file mode permission bits independently from the permissions of the 
owning group: otherwise, it wouldn't be possible to give the owning group 
fewer permissions than any user@domain or group@domain entry.

Let's look at this ACL:

	OWNER@:READ_DATA/WRITE_DATA::ALLOW
	GROUP@:READ_DATA::ALLOW
	user@domain:READ_DATA/WRITE_DATA::ALLOW
	EVERYONE@:READ_DATE::ALLOW

The GROUP@ and user@domain entries are in the File Group Class. After a chmod 
to 664, the ACL changes to this in Sam's proposal (some unnecessary 
permissions left out):

	OWNER@:EXECUTE::DENY
	OWNER@:READ_DATA/WRITE_DATA::ALLOW
	GROUP@:EXECUTE::DENY
	GROUP@:READ_DATA::ALLOW
	user@domain:EXECUTE::DENY
	user@domain:READ_DATA/WRITE_DATA::ALLOW
	EVERYONE@:WRITE_DATA/EXECUTE::DENY
	EVERYONE@:READ_DATE::ALLOW

In my proposal, the ACL would remain the same as before the chmod, but the 
owner_class_mask would become READ_DATA/WRITE_DATA, the group_class_mask 
would become READ_DATA/WRITE_DATA, and the other_class_mask would become 
READ_DATA. Note that the ACL does *not* grant write access to GROUP@ in 
either case.

> This is not a POSIX flaw, and this is not a design flaw of any kind.
> "chmod 770" grants the owning group permission to write the file,
> period.

No, see above. chmod 770 grants the File Group Class rwx, but ACLs act as an 
additional file access control mechanism here, and further limit the 
permissions granted to the owning group, which is a member of the File Group 
Class.

> > It also violates the principle of least surprise.
>
> Are you kidding?

I did not mean to.

> Consider a directory with this ACE in its ACL: 
> GROUP@:READ_DATA/WRITE_DATA:FILE_INHERIT:DENY
>
> With your proposal, open("foo", O_CREAT | O_RDWR, 0666) in this
> directory creates a file that the owning group is denied read and
> write permission.  Then:
>
> % chmod 664 foo
>
> Oops, owning group *still* cannot read or write the file!  Linux/*NIX
> has a long history of files having a mode attribute, and users using
> chmod to set permissions -- but not much history with NFSv4 ACLs.

To counter that argument, UNIX systems, including and foremost Solaris, but 
also others like Linux, have had POSIX ACLs for quite some time, and there 
the same "chmod doesn't fix my file" case exists, and it hasn't been a 
problem at all.

The GROUP@:READ_DATA/WRITE_DATA:FILE_INHERIT:DENY ace is a clear case of 
"doctor it hurts when I do this". As is an EVERYONE@:*::DENY ACL entry.

> Your proposal more or less requires that Linux/*NIX users immediately
> start using ACLs, or face the "chmod doesn't fix my file" problem.

Chmod by definition *cannot* fix all permission problems in the presence of 
ACLs unless it completely replaces the ACL with something like the six-entry 
acl pattern in draft-ietf-nfsv4-acls-00. We already know that it's not a good 
idea to have chmod destroy acls.

> I've spent quite some time over the last few days looking for flaws
> in your proposal, but I'll admit that I missed this one, and it's a
> big one.

May I ask you to come back to this issue in case you still feel the same way 
after this reply?

> > There really is no safe way to tell user-provided ACL entries from
> > artificially made up ACL entries.
>
> The semantics in draft-ietf-nfsv4-acls are well defined, predictable,
> consistent, and reasonable.

"Well defined": for one thing, draft-ietf-nfsv4-acls-00 is not explicit or 
clear about the ACE classification it is based on.

"Predictable": probably yes.

"Consistent": it uses different classifications in sections 5.1 and 5.3. 

"Reasonable": I don't like the DENY ACEs at all but that's a matter of taste. 
The problems which the DENY ACEs cause are no matter of taste though, and I 
would call the design unreasonable for that reason. Enforcing the DENY ACEs 
on thers when an alternative design exists that avoids the known problems 
that they have does not seem very reasonable to me, either.

The two proposals have two fundamental differences:

* My proposal tries to be clear in semantics, and separates orthogonal
  aspects from each other. draft-ietf-nfsv4-acls-00 has a number of
  weaknesses when it comes to clarity of semantics. I am positive that
  we will manage to clarify all these areas in draft-ietf-nfsv4-acls-00.
  At that point, the *only* essential difference that will remain between
  the two proposals will be that

* draft-ietf-nfsv4-acls-00 uses DENY ACL entries for masking permissions,
  while my proposal uses explicit mask attributes.

> > draft-ietf-nfsv4-acls is missing a clear classification of ACL
> > entries into the File Owner, File Group, and File Other classes. Every
> > ACL entry must be in one of the three classes in order to compute
> > appropriate file mode permission bits when setting an ACL, and after
> > inheriting permissions. This classification also determines which effect
> > chmod will have on an ACL. 
>
> I assume you mean "every ACE", not "every ACL".

	every ACL entry == every ACE

> As I mentioned above, I'm not sure whether or not this is a requirement,
> but it can be discussed further.

How else can a chmod 700 disable all but the owner permissions, a chmod 770 
disable all "others" to have access, and a chmod 000 disable all permissions 
if you don't know which ACEs each class applies to?

> However, if it turns out that draft-ietf-nfsv4-acls is wrong in this regard,
> then the only consequence is a minor change to 5.1.

I hope I can also convince you that the DENY entries to mask permissions are a 
really bad idea.

> > So draft-ietf-nfsv4-acls is *incorrect* and *wrong* from a POSIX
> > point of
> > view, while my alternative proposal is correct, apart from being
> > simpler to
> > implement. I hope that my emails and some background reading (like
> > the file
> > access related parts of the POSIX definitions volume [5], a paper that
> > explains POSIX ACLs and how they are implemented on Linux [6], and
> > perhaps
> > 1003.1e draft 17) will convince you about that.
>
> I am absolutely not convinced.

I would still recommend that you read [6] at least.

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 14:15         ` [nfsv4] " J. Bruce Fields
  2006-07-10 15:32           ` Sam Falkner
@ 2006-07-11  0:01           ` Andreas Gruenbacher
  2006-07-11  0:28             ` [nfsv4] " J. Bruce Fields
  1 sibling, 1 reply; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-11  0:01 UTC (permalink / raw)
  To: nfsv4
  Cc: Sam Falkner, Lisa Week, J. Bruce Fields, nfs, Spencer Shepler,
	Brian Pawlowski

On Monday, 10. July 2006 16:15, J. Bruce Fields wrote:
> On Mon, Jul 10, 2006 at 07:29:56AM -0600, Sam Falkner wrote:
> > On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
> > >According to section 5.1 of draft-ietf-nfsv4-acls [1], the
> > >resulting file mode
> > >permission bits for this acl shall be rw-r--r--.
> >
> > Your proposal would give this mode: rw-rw-r--.  I think we should
> > consider this more carefully.
>
> As Andreas says, this is what the posix draft would have you do.  It's
> also what Linux (and, I assume, Solaris) do in the case of posix ACLs.

We are not talking about the POSIX 1003.1e draft here, we are talking about 
the real POSIX standard.

> If the goals was compatibility with that posix draft, RFC3530 should
> have specified that owner, other, and group bits be kept in sync with
> (respectively) OWNER@, EVERYONE@, and the *maximum* of permissions given
> to any other entity, rather than with OWNER@, EVERYONE@, and GROUP@.

I argued why I think this is a misbelief, please scan for well-formed ACLs and 
non-monotonic permissions.

> > You would call it wrong that a chmod 770 would allow WRITE_DATA to
> > members of the file's owning group?!  The  user did a chmod -- the
> > user changed the permissions on the file!
>
> That is how posix acl's work; again, the group mode bit really
> corresponds to the mask, not to the group acl entry:
>
> 	bfields@pickle:~$ getfacl foo
> 	# file: foo
> 	# owner: bfields
> 	# group: bfields
> 	user::rw-
> 	user:bfields:r--
> 	group::r--
> 	mask::r--
> 	other::---
>
> 	bfields@pickle:~$ chmod 770 foo
> 	bfields@pickle:~$ getfacl foo
> 	# file: foo
> 	# owner: bfields
> 	# group: bfields
> 	user::rwx
> 	user:bfields:r--
> 	group::r--
> 	mask::rwx
> 	other::---
>
>
> Of course, "posix" acls aren't really posix, and we could do something
> else if seems simpler.  Neither behavior seems intuitive to me in all
> situations.

The issue is that you sometimes want to give the owning group fewer perissions 
than say, user:bfields in the above example. You can only do that by 
separating the owning group and mask permissions.

For this aspect of the problem (actually for all aspects except for those that 
the DENY entries cause because they are sometimes difficult or impossible to 
uniquely tell from other "ordinary" entries) it is totally irrelevant whether 
the mask is represented as a mask:: acl entry as in POSIX ACLs, as a series 
of DENY ACL entries, or as NFSv4 attributes.

(POSIX ACLs only need one mask entry because they can never grant more than 
rwx permissions anyway, and so the owner and other permissions are always 
identical to the owner and other file mode permission bits. That's no longer 
true with POSIX ACLs, and so there we also need mask entries for the owner 
and for others.)

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 15:32           ` Sam Falkner
  2006-07-10 18:57             ` [NFS] " J. Bruce Fields
@ 2006-07-11  0:15             ` Andreas Gruenbacher
  2006-07-11  5:42               ` [nfsv4] " Sam Falkner
  1 sibling, 1 reply; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-11  0:15 UTC (permalink / raw)
  To: nfsv4
  Cc: J. Bruce Fields, Lisa Week, Sam Falkner, nfs, Spencer Shepler,
	Brian Pawlowski

On Monday, 10. July 2006 17:32, Sam Falkner wrote:
> On Jul 10, 2006, at 8:15 AM, J. Bruce Fields wrote:
> > On Mon, Jul 10, 2006 at 07:29:56AM -0600, Sam Falkner wrote:
> >> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
> >>> According to section 5.1 of draft-ietf-nfsv4-acls [1], the
> >>> resulting file mode
> >>> permission bits for this acl shall be rw-r--r--.
> >>
> >> Your proposal would give this mode: rw-rw-r--.  I think we should
> >> consider this more carefully.
> >
> > As Andreas says, this is what the posix draft would have you do.  It's
> > also what Linux (and, I assume, Solaris) do in the case of posix ACLs.
>
> Not on Solaris.  With POSIX-draft ACLs, adding user:friend:rw- to a
> mode rw-r--r-- file still gives you rw-r--r--.  (And as you point out
> later, these ACLs ain't POSIX.)

Indeed, they are only pretty close. One other difference is that Solaris POSIX 
ACLs are always four-entry on some (all?) file systems, while Draft 17 ACLs 
as implemented on Irix, FreeBSD, Linux, and possibly others support 
three-entry ACLs as well (they are equivalent to the file mode permission 
bits.)

It would be bad to repeat the mistake of breaking POSIX assumptions.

> I think having chmod be functional, i.e. chmod 770 gives write
> permission to the owning group, and an "ls -l" shows "rwxrwx---",
> would be best by far.

It screws you when you want to give the owning group fewer permissions than 
other users in the File Group Class. This can be worked around by creating a 
dummy group with no members, or one group that only contains a single user 
for each user, and changing the owning group of files, but the owning group 
already has other defined uses in POSIX (think of SETGID for files and 
directories), and so it's not desirable and not always possible to change the 
owning group to such a dummy group.

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  0:01           ` Andreas Gruenbacher
@ 2006-07-11  0:28             ` J. Bruce Fields
  2006-07-11  0:48               ` Andreas Gruenbacher
  0 siblings, 1 reply; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-11  0:28 UTC (permalink / raw)
  To: Andreas Gruenbacher
  Cc: Lisa Week, nfsv4, Sam Falkner, nfs, Spencer Shepler, Brian Pawlowski

On Tue, Jul 11, 2006 at 02:01:42AM +0200, Andreas Gruenbacher wrote:
> The issue is that you sometimes want to give the owning group fewer perissions 
> than say, user:bfields in the above example. You can only do that by 
> separating the owning group and mask permissions.
> 
> For this aspect of the problem (actually for all aspects except for those that 
> the DENY entries cause because they are sometimes difficult or impossible to 
> uniquely tell from other "ordinary" entries) it is totally irrelevant whether 
> the mask is represented as a mask:: acl entry as in POSIX ACLs, as a series 
> of DENY ACL entries, or as NFSv4 attributes.
> 
> (POSIX ACLs only need one mask entry because they can never grant more than 
> rwx permissions anyway, and so the owner and other permissions are always 
> identical to the owner and other file mode permission bits. That's no longer 
> true with POSIX ACLs, and so there we also need mask entries for the owner 
> and for others.)

So you need this if and only if you want to be able to set OWNER@
permissions other than read, write, or execute, *and* want to be able to
recover from a chmod?

The argument for the reversibility of chmod seems a lot stronger when
the information that could be lost is a long list of users and
permissions than when it's just a few bits for the owner.

--b.


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 22:39                 ` J. Bruce Fields
  2006-07-10 22:43                   ` J. Bruce Fields
@ 2006-07-11  0:44                   ` Andreas Gruenbacher
  1 sibling, 0 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-11  0:44 UTC (permalink / raw)
  To: nfsv4
  Cc: Sam Falkner, Lisa Week, J. Bruce Fields, nfs, Spencer Shepler,
	Brian Pawlowski

On Tuesday, 11. July 2006 00:39, J. Bruce Fields wrote:
> On Mon, Jul 10, 2006 at 05:26:32PM -0500, Sam Falkner wrote:
> > On Jul 10, 2006, at 1:57 PM, J. Bruce Fields wrote:
> > >If we're committed to getting the mask ace right, though, I would
> > >prefer to adopt one of Andreas's solutions; they'd allow us to
> > >generate much simpler ACLs.  I actually prefer the first proposal
> > >(letting the  server use the mode bits to mask out permissions).  But
> > >if we're going to add explicit mask aces, then please, let's add only
> > >one.  I understand the theoretical advantage to masking out all three
> > >classes, but that's adding too much complexity for a few corner
> > >cases, and I don't think it's going to be easy for users to
> > >understand.
> >
> > How would a scheme that uses one and only one mask ACE work?  Are you
> > thinking of catching mode 077 via a
> >
> > OWNER@:READ_DATA/WRITE_DATA/EXECUTE:DENY
> >
> > but having no way to catch mode 707 (because GROUP@:READ_DATA/
> > WRITE_DATA/EXECUTE:DENY might catch the owner)?
>
> Andreas's proposal was actually to add something new to the protocol
> (either a new attribute, or a new special entity (like "MASK@")) to
> transfer the mask.  One of the advantages of doing that is that you'd no
> longer have to use a bunch of DENY ACEs scattered through the ACL, all
> carrying the same information.  E.g. you'd the client to include an ACE
> like
>
> 	MASK@:READ_DATA:DENY
>
> and modify the NFSv4 acl-permission-checking algorithm to mask out any
> bitmasks anywhere other than OWNER@ or DENY@.

Another benefit would be that we can tell what are MASK entries and which 
entries are not. That's not always possible with the DENY entries.

> But Andreas was proposing that we actually add 3 different types of
> masks, one for the OWNER@, one for EVERYONE@, and one for the others,
> and I think that's overkill.  So that's what I'm arguing against.

The reason for adding owner and other masks was this: we want to be able to 
turn off alternate permissions upon chmod and acl inheritance. We can already 
easily do that for the File Group Class by cleaning the alternate mask bits 
there; it's the same mechanism we also use for turning off additional mask 
bits for chmod, for example. We need to be able to turn off alternate and 
additional mode bits for the owner and for others as well in cases like 
chmod. Now we could devise a different mechanism for turning off alternate 
permissions for the owner and for others (like a bit somewhere), but that 
would still leave us with the problem of how to turn off additional mask 
bits. The NFSv4 ACL mask bits are more fine-grained that the POSIX mask bits, 
and we don't want to destroy the granularity of the NFSv4 ACL mask bits when 
masking permissions. Therefore, we need mask entries for the owner and for 
others as well.

Consider this ACL:

	OWNER@:READ_DATA/WRITE_DATA::ALLOW
	GROUP@:APPEND_DATA::DENY
	GROUP@:READ_DATA::ALLOW
	EVERYONE@:APPEND_DATA::ALLOW

The corresponding mode is 0642 (rw-r---w-). POSIX applications will know 
nothing about the fact that others are only allowed to append data to that 
file. Now consider that a user does a chmod(file, 0) followed by a 
chmod(file, 0642). Which permissions should others have after the chmod? Not 
full write access I assume; POSIX applications should not remove restrictions 
they are not even aware of by accident.

Using the same masking mechanism across all three classes and being able to 
selectively turn alternate mask bits on and off for all classes can only be a 
benefit.

> > >We could add a new ACE type (in addition to ALLOW, DENY, AUDIT,
> > >ALARM), and then a client could query the server's ability to
> > >represent the  mask with the aclsupport attribute and decide whether
> > >it wants to add  DENY's to represent the mask, or just give up on
> > >chmod reversibility.
> >
> > Please explain this further.  What would the fifth ACE type do?  What
> > would it give you that DENY wouldn't?
>
> It's just a way to pass the mask inside the ACL, but using a new ACE
> type instead of a new special entity.

Yes, that was one of the possible designs.

> The advantage is that a client can actually probe to see if the server
> supports it, so we wouldn't have to make it mandatory for a server to
> support it.  But a separate attribute would also have that property.

Advantages of attributes are that clients will never be bothered with ACE 
types they don't know. We can directly access attibutes, rather than scanning 
for the right ACEs, inserting ACEs in case they are missing, etc. There will 
be exactly three masks (or so I hope), and I don't see why we should need to 
add more classes later. We can store all three classes as a single attribute 
though; that may be more acceptable that three separate attributes.

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  0:28             ` [nfsv4] " J. Bruce Fields
@ 2006-07-11  0:48               ` Andreas Gruenbacher
  0 siblings, 0 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-11  0:48 UTC (permalink / raw)
  To: J. Bruce Fields
  Cc: Lisa Week, nfsv4, Sam Falkner, nfs, Spencer Shepler, Brian Pawlowski

On Tuesday, 11. July 2006 02:28, J. Bruce Fields wrote:
> On Tue, Jul 11, 2006 at 02:01:42AM +0200, Andreas Gruenbacher wrote:
> > The issue is that you sometimes want to give the owning group fewer
> > perissions than say, user:bfields in the above example. You can only do
> > that by separating the owning group and mask permissions.
> >
> > For this aspect of the problem (actually for all aspects except for those
> > that the DENY entries cause because they are sometimes difficult or
> > impossible to uniquely tell from other "ordinary" entries) it is totally
> > irrelevant whether the mask is represented as a mask:: acl entry as in
> > POSIX ACLs, as a series of DENY ACL entries, or as NFSv4 attributes.
> >
> > (POSIX ACLs only need one mask entry because they can never grant more
> > than rwx permissions anyway, and so the owner and other permissions are
> > always identical to the owner and other file mode permission bits. That's
> > no longer true with POSIX ACLs, and so there we also need mask entries
> > for the owner and for others.)
>
> So you need this if and only if you want to be able to set OWNER@
> permissions other than read, write, or execute, *and* want to be able to
> recover from a chmod?

I think I have answered this exhaustively in:

Subject: Re: [NFS] [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask,
         draft-ietf-nfsv4-acls-00 not ready
Date: Tue, 11 Jul 2006 02:44:30 +0200
Message-Id: <200607110244.31010.agruen@suse.de>

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  0:15             ` Andreas Gruenbacher
@ 2006-07-11  5:42               ` Sam Falkner
  2006-07-11  8:05                 ` Andreas Gruenbacher
  0 siblings, 1 reply; 38+ messages in thread
From: Sam Falkner @ 2006-07-11  5:42 UTC (permalink / raw)
  To: Andreas Gruenbacher
  Cc: Lisa Week, nfsv4, J. Bruce Fields, nfs, Spencer Shepler, Brian Pawlowski


On Jul 10, 2006, at 7:15 PM, Andreas Gruenbacher wrote:

> On Monday, 10. July 2006 17:32, Sam Falkner wrote:
>> On Jul 10, 2006, at 8:15 AM, J. Bruce Fields wrote:
>>> On Mon, Jul 10, 2006 at 07:29:56AM -0600, Sam Falkner wrote:
>>>> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
>>>>> According to section 5.1 of draft-ietf-nfsv4-acls [1], the
>>>>> resulting file mode
>>>>> permission bits for this acl shall be rw-r--r--.
>>>>
>>>> Your proposal would give this mode: rw-rw-r--.  I think we should
>>>> consider this more carefully.
>>>
>>> As Andreas says, this is what the posix draft would have you do.   
>>> It's
>>> also what Linux (and, I assume, Solaris) do in the case of posix  
>>> ACLs.
>>
>> Not on Solaris.  With POSIX-draft ACLs, adding user:friend:rw- to a
>> mode rw-r--r-- file still gives you rw-r--r--.  (And as you point out
>> later, these ACLs ain't POSIX.)
>
> Indeed, they are only pretty close. One other difference is that  
> Solaris POSIX
> ACLs are always four-entry on some (all?) file systems, while Draft  
> 17 ACLs
> as implemented on Irix, FreeBSD, Linux, and possibly others support
> three-entry ACLs as well (they are equivalent to the file mode  
> permission
> bits.)
>
> It would be bad to repeat the mistake of breaking POSIX assumptions.
>
>> I think having chmod be functional, i.e. chmod 770 gives write
>> permission to the owning group, and an "ls -l" shows "rwxrwx---",
>> would be best by far.
>
> It screws you when you want to give the owning group fewer  
> permissions than
> other users in the File Group Class. This can be worked around by  
> creating a
> dummy group with no members, or one group that only contains a  
> single user
> for each user, and changing the owning group of files, but the  
> owning group
> already has other defined uses in POSIX (think of SETGID for files and
> directories), and so it's not desirable and not always possible to  
> change the
> owning group to such a dummy group.

No -- if you want owning group to have fewer permissions than other  
users, you're using an ACL.  You use tools that manipulate ACLs.

Solaris' POSIX-draft ACLs have the property that chmod works (i.e.  
you can set group permissions), and you use setfacl if you want to  
change other entries.  It's perfectly easy to have owning group have  
fewer permissions than supplimental users.

The bottom line is that chmod must set the mode, rather than "set the  
mode, unless there's some sort of ACL thingy, in which case the group  
bits aren't the group bits but are instead the mask bits".

- Sam


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-10 22:50         ` Andreas Gruenbacher
@ 2006-07-11  6:17           ` Sam Falkner
  2006-07-11  8:45             ` Andreas Gruenbacher
  0 siblings, 1 reply; 38+ messages in thread
From: Sam Falkner @ 2006-07-11  6:17 UTC (permalink / raw)
  To: Andreas Gruenbacher
  Cc: nfs, Spencer Shepler, Brian Pawlowski, nfsv4, Lisa Week


On Jul 10, 2006, at 5:50 PM, Andreas Gruenbacher wrote:

> On Monday, 10. July 2006 15:29, Sam Falkner wrote:
>> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
>>> On Saturday, 8. July 2006 05:45, Sam Falkner wrote:
>>>> On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:
>>>>> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:

>>> Here are some facts to back my points: Let's assume that a file
>>> inherits the
>>> following ACL when being created (I am using ^(...) here with the
>>> meaning of
>>> "all bitflags except ..."):
>>>
>>> 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
>>> 	OWNER@:^(READ_DATA/WRITE_DATA)::DENY
>>> 	GROUP@:READ_DATA::ALLOW
>>> 	user@domain:READ_DATA/WRITE_DATA::ALLOW
>>> 	GROUP@:^READ_DATA::DENY
>>> 	user@domain:^(READ_DATA/WRITE_DATA)::DENY
>>> 	EVERYONE@:READ_DATA::ALLOW
>>>
>>> This acl is "well structured" in the POSIX sense: OWNER@ will only
>>> get the
>>> owner permissions and none of the other permissions, user@domain
>>> and GROUP@
>>> will only get the permissions intended for them, and only others
>>> (neither
>>> OWNER@ nor user@domain nor GROUP@) will get EVERYONE@ permissions;
>>> in other
>>> words, the acl is even correct for non-monotonic permissions.
>>>
>>> According to section 5.1 of draft-ietf-nfsv4-acls [1], the
>>> resulting file mode
>>> permission bits for this acl shall be rw-r--r--.
>>
>> Your proposal would give this mode: rw-rw-r--.  I think we should
>> consider this more carefully.
>>
>>> After a chmod or a file
>>> create, alternate file access control mechanisms must be disabled
>>> and only
>>> additional file access control mechanisms may remain active.
>>> According to
>>> POSIX, additional file access control mechanisms require that no
>>> user may be
>>> granted more permissions than the respective file classes permit.
>>> In this
>>> case, user@domain clearly is not in the File Owner Class.
>>> (According to
>>> POSIX, user@domain must be in the File Group Class.) The
>>> user@domain user is
>>> granted WRITE_DATA though, which is *incorrect* from a POSIX point
>>> of view.
>>
>> No, it is not granted WRITE_DATA after a chmod().  After a chmod 644,
>> there will be a "user@domain:WRITE_DATA::DENY" prepended.  This is
>> well defined in the current minorversion1.  So it is not "incorrect
>> from a POSIX point of view."
>
> Now that I look at the example again, I realize that I didn't  
> define the
> create mode. With create mode 640 or less permissive, everything is  
> fine.
> Let's assume create mode 664 though: then the file mode permission  
> bits will
> still come out as rw-r--r--, but the ACL will grant WRITE_DATA to
> user@domain. That's the case I meant, and this case is not POSIX  
> compliant.

Wrong.  The file mode permission bits will be rw-rw-r--.  There is no  
problem with POSIX compliance.

>> If your problem is with the computation of the mode, then we can
>> discuss this some more.  But following create or chmod, user@domain
>> is not granted WRITE_DATA.
>
> My problems are these:
>
> * the algorithm in 5.3 is based on an ACE classification closer to  
> the one
>   I proposed, while the algorithm in 5.1 is based on a different
>   classsification. We need to straighten this out, and I have argued
>   repeatedly now why the classification I proposed leads to consistent
>   and correct results. Most of the little inconsistencies in
>   draft-ietf-nfsv4-acls-00 will stick out quite clearly once we  
> agree on
>   the right classification, and they will be easy to fix.
>
> * the DENY entries introduced to mask permissions bloat the ACL,  
> and make
>   the ACL look strange to non-POSIX systems. The algorithm in  
> section 5.3
>   may remove permissions from user-provided DENY entries in some  
> cases,
>   and it may introduce duplicate DENY entries in some situations  
> such as
>   when another system reorders ACEs.Some versions of Windows do that.
>
> The alternative approach I am proposing has a clear classification  
> of ACEs,
> separates the orthogonal aspects of classification vs. well-formed  
> acls, and
> has none of the weaknesses that the mask DENY ACEs cause.
>
>>> Next, let's assume than an ACL contains the following pair of user-
>>> provided entries:
>>>
>>> 	GROUP@:WRITE_DATA::DENY
>>> 	GROUP@:READ_DATA::ALLOW
>>>
>>> Clearly the user's intention is to deny WRITE_DATA access to GROUP@.
>>
>> Yes, that *was* the user's intention, at the time the user set the  
>> ACL.
>
> Hm... not the best example because GROUP@ is the owning group, which
> corresponds to the group file mode permission bits in traditional  
> POSIX. The
> problem is more difficult to see in this case, but I argue that the  
> owhning
> group permissions and the group file mode permission bits are not  
> the same
> with ACLs: the file group mode permission bits restrict GROUP@  
> entries, and
> all user@domain and group@domain entries in the acl. For the sake  
> of this
> example, substitute GROUP@ with user@domain though, and you'll see the
> problem more clearly: a user adds an explicit  
> user@domain:WRITE_DATA::DENY
> entry to an acl which is followed by a user@domain:READ_DATA::ALLOW  
> entry.
> After a chmod to 664 for example, this user suddenly has write  
> access. The
> user clearly did not intend this to happen.

No -- after the chmod, the DENY still stands, unaltered.

- Sam


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-09 16:22     ` [nfsv4] " Andreas Gruenbacher
  2006-07-10 13:29       ` Sam Falkner
@ 2006-07-11  6:50       ` Lisa Week
  2006-07-11  8:55         ` Andreas Gruenbacher
  2006-07-27  0:59         ` Andreas Gruenbacher
  1 sibling, 2 replies; 38+ messages in thread
From: Lisa Week @ 2006-07-11  6:50 UTC (permalink / raw)
  To: nfsv4; +Cc: Sam Falkner, Brian Pawlowski, Spencer Shepler, nfs


[-- Attachment #1.1: Type: text/plain, Size: 16564 bytes --]


On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:

> On Saturday, 8. July 2006 05:45, Sam Falkner wrote:
>> On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:
>>> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
>>>> Hello,
>>>>
>>>> I have been thinking about the problems of interaction between
>>>> NFSv4 ACLs and POSIX, and particularly about the issue of masking
>>>> permissions through chmod and after creating files or directories.
>>>
>>> Here is a follow-up after some personal feedback from Sam. I
>>> believe that draft-ietf-nfsv4-acls-00 is not ready to become part  
>>> of the
>>> NFSv4 Minor Version 1 RFC: some assumptions are not correct from  
>>> a POSIX
>>> point of view, and the way how chmod and file create modes are  
>>> applied to
>>> NFSv4 ACLs is weak and not guaranteed to be correct.
>>
>> I disagree -- see below.
>
> Here are some facts to back my points: Let's assume that a file  
> inherits the
> following ACL when being created (I am using ^(...) here with the  
> meaning of
> "all bitflags except ..."):
>
> 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
> 	OWNER@:^(READ_DATA/WRITE_DATA)::DENY
> 	GROUP@:READ_DATA::ALLOW
> 	user@domain:READ_DATA/WRITE_DATA::ALLOW
> 	GROUP@:^READ_DATA::DENY
> 	user@domain:^(READ_DATA/WRITE_DATA)::DENY
> 	EVERYONE@:READ_DATA::ALLOW
>
> This acl is "well structured" in the POSIX sense: OWNER@ will only  
> get the
> owner permissions and none of the other permissions, user@domain  
> and GROUP@
> will only get the permissions intended for them, and only others  
> (neither
> OWNER@ nor user@domain nor GROUP@) will get EVERYONE@ permissions;  
> in other
> words, the acl is even correct for non-monotonic permissions.
>
> According to section 5.1 of draft-ietf-nfsv4-acls [1], the  
> resulting file mode
> permission bits for this acl shall be rw-r--r--. After a chmod or a  
> file
> create, alternate file access control mechanisms must be disabled  
> and only
> additional file access control mechanisms may remain active.  
> According to
> POSIX, additional file access control mechanisms require that no  
> user may be
> granted more permissions than the respective file classes permit.  
> In this
> case, user@domain clearly is not in the File Owner Class.  
> (According to
> POSIX, user@domain must be in the File Group Class.) The  
> user@domain user is
> granted WRITE_DATA though, which is *incorrect* from a POSIX point  
> of view.
>
> Next, let's assume than an ACL contains the following pair of user- 
> provided
> entries:
>
> 	GROUP@:WRITE_DATA::DENY
> 	GROUP@:READ_DATA::ALLOW
>
> Clearly the user's intention is to deny WRITE_DATA access to  
> GROUP@. The
> algorithm to apply a mode to an existing ACL will remove the  
> WRITE_DATA bit
> from the GROUP@:WRITE_DATA::DENY entry when a chmod(..., 0770) is done
> though. This is counter to the user's intention, so I would call  
> that *wrong*
> as well. It also violates the principle of least surprise. There  
> really is no
> safe way to tell user-provided ACL entries from artificially made  
> up ACL
> entries.
>
> draft-ietf-nfsv4-acls is missing a clear classification of ACL  
> entries into
> the File Owner, File Group, and File Other classes. Every ACL entry  
> must be
> in one of the three classes in order to compute appropriate file mode
> permission bits when setting an ACL, and after inheriting  
> permissions. This
> classification also determines which effect chmod will have on an ACL.
>
> So draft-ietf-nfsv4-acls is *incorrect* and *wrong* from a POSIX  
> point of
> view, while my alternative proposal is correct, apart from being  
> simpler to
> implement. I hope that my emails and some background reading (like  
> the file
> access related parts of the POSIX definitions volume [5], a paper that
> explains POSIX ACLs and how they are implemented on Linux [6], and  
> perhaps
> 1003.1e draft 17) will convince you about that.
>
> Note that in traditional POSIX, permissions from multiple file  
> classes will
> never accumulate: each user always is either granted the File Owner
> permission bits, the File Group permission bits, or the File Other  
> permission
> bits. (Additional file access control mechanisms may further limit the
> permissions granted, and alternative file access control mechanisms  
> may
> further limit or extend the permissions granted.) Permissions from  
> multiple
> acl entries accumulate in the NFSv4 ACL model though, and so unless  
> an acl is
> "well structured" in the above sense, permissions from multiple  
> classes may
> accumulate.

Yes, permissions may accumulate, but in the design in the minor  
version doc, after a chmod, any permissions that go beyond the mode  
bits being set will be disabled.  This is done via the algorithm in  
section 3.16.6.3 -  "Applying a Mode to an Existing ACL".  This makes  
sure that the permissions (ACE4_READ_DATA/ACE4_LIST_DIRECTORY,
ACE4_WRITE_DATA/ACE4_WRITE_DATA, ACE4_APPEND_DATA/ 
ACE4_ADD_SUBDIRECTORY and ACE4_EXECUTE... which is what the mode  
defines) that accumulate will NOT go beyond the mode bits being set.

>
>>> I will first try to clarify some of the points I tried to make in
>>> the previous posting and point out deficiencies in
>>> draft-ietf-nfsv4-acls-00. Then I will propose an alternative  
>>> design which
>>> is more correct than introducing DENY entries to mask  
>>> permissions. (As a
>>> bonus, it is easier to implement. too.)
>>>
>>>> On a UNIX system that supports NFSv4 ACLs natively, I think we
>>>> should try to accept as wide a range of NFSv4 ACLs as possible,  
>>>> but we
>>>> must make sure that we can preserve POSIX semantics. In  
>>>> particular, this
>>>> means that ACLs may contain ACEs for users other than OWNER@,  
>>>> GROUP@, and
>>>> EVERYONE@, and that chmod(2) must continue to provide the same  
>>>> kinds of
>>>> guarantees as without NFSv4 ACLs.
>>>>
>>>> I am assuming here that NFSv4 ACLs shall be an additional rather  
>>>> than an
>>>> alternate file access control mechanism in the POSIX sense:  
>>>> Alternate
>>>> file access control mechanisms must ``be enabled only by  
>>>> explicit user
>>>> action, on a per-file basis by the file owner or a user with the
>>>> appropriate privilege'', and must ``be disabled for a file after  
>>>> the file
>>>> permission bits are changed for that file with chmod( )''  
>>>> according to
>>>> POSIX. In other words, newly created files or directories would  
>>>> have
>>>> alternate file access control mechanisms disabled. This would  
>>>> render
>>>> NFSv4 ACLs essentially useless for UNIX processes, because they  
>>>> would
>>>> almost always be disabled, and would only work for remote  
>>>> processes until
>>>> a POSIX process chmods a file or creates a directory, which  
>>>> wouldn't get
>>>> us very far.
>>>
>>> As Sam pointed out, a subset of NFSv4 ACLs maps to an additional  
>>> file
>>> access control mechanism, while the rest goes beyond that, and  
>>> therefore
>>> is an alternate file access control mechanism.
>>
>> Yes -- ALLOW ACEs are alternate file access control, and DENY ACEs
>> are additional file access control.
>
> This classification makes no sense, and it also does not match what  
> you
> propose in section 5.3 of draft-ietf-nfsv4-acls, either: there are  
> acls that
> contain ALLOW entries which are still only an additional file  
> access control
> mechanism, so we really need to classify them as an additional file  
> access
> control mechanism in order to avoid having to disable them during  
> chmod or
> when inheriting permissions.

We clearly have a disagreement what "additional" and "alternate" file  
access control mechanisms mean to NFSv4 ACLs.

Without these fundamental things, we will never be able to reach  
consensus.  So lets try to up-level the discussion and see if we can  
get agreement on what the meanings of these two access control  
mechanisms are in the context of NFSv4...

I know this has been iterated over and over again, but bear with  
me...  hopefully this will give you a better idea of where we're  
coming from.

POSIX defines Additional Access Control Mechanism as follows:
"An implementation-defined mechanism that is layered upon the access  
control mechanisms defined here, but which do not grant permissions  
beyond those defined herein, although they may further restrict them."

POSIX defines Alternate Access Control Mechanisms are as follows:
"An implementation-defined mechanism that is independent of the  
access control mechanisms defined herein, and which if enabled on a  
file may either restrict or extend the permissions of a given user.  
IEEE Std 1003.1-2001 defines when such mechanisms can be enabled and  
when they are disabled."

So, the question that comes to my mind when reading that text is:  
What does it mean when they say "access mechanisms defined herein" in  
both of those definitions?  Well, the access mechanisms defined in  
the POSIX spec are the "File Access Permissions", right?  So, can we  
agree that "access mechanisms defined herein" would be the "File  
Access Permissions"?

Okay, the description of "File Access Permissions" says that "The  
standard file access control mechanism uses the file permission bits..."

So, what are the file permission bits?  They are read, write, execute/ 
search for the File Owner Class, File Group Class and File Other Class.

So, to put this together, Additional access control mechanisms are   
the ability to further restrict the read, write, execute/search  
permissions for the File Owner Class, File Group Class and File Other  
Class.  And, Alternate access control mechanisms are the ability to  
either restrict or extend the read, write, execute/search permissions  
for the File Owner, Group and Other Class.

Now, to classify NFSv4 ACLs into Additional and Alternate access  
control mechanisms...
Since we are only controlling the read, write, execute/search  
permissions, the only permissions we should classify in NFSv4 ACLs  
are the access mask bits that intersect with the file permission bits  
as defined by POSIX.  And for NFSv4 that means the following access  
mask bits are of interest:
ACE4_READ_DATA/ACE4_LIST_DIRECTORY
ACE4_WRITE_DATA/ACE4_WRITE_DATA, ACE4_APPEND_DATA/ACE4_ADD_SUBDIRECTORY
ACE4_EXECUTE.

(Actually, this is where the existing draft-ietf-acl-00 proposal is  
confusing.  It doesn't come right out and say this.  In the write up  
we had the assumptions that this was clear, but I know that it needs  
to be further specified.)

So, now in the NFSv4 ACL sense, Alternate access control mechanisms  
are used to further extend and Additional access control mechanisms  
are used to further restrict the following access mask bits:
ACE4_READ_DATA/ACE4_LIST_DIRECTORY
ACE4_WRITE_DATA/ACE4_WRITE_DATA, ACE4_APPEND_DATA/ACE4_ADD_SUBDIRECTORY
ACE4_EXECUTE.

How would one extend those access mask bits (Alternate)?  By putting  
them in an ALLOW ACE.
How would one restrict those access mask bits (Additional)?  By  
putting them in a DENY ACE.

As far as the other access mask bits...they aren't covered by the  
POSIX File Access Permissions so do they need a classification?  No,  
not really.  (More on this below...)

> If ALLOW ACEs were alternate in general, then we
> would have to disable them all after a chmod, and I think we agree  
> that this
> would make ACLs practically useless in combination with POSIX.
>
> The only classification that makes sense is by the permissions that  
> an ACL
> grants.

I would agree with that, but don't go putting further restrictions on  
us than POSIX defined in the first place.  As said before POSIX only  
defines what should happen with regard to the access control  
mechanisms that layer on top of or extend the *file permission  
bits*.  See more below.

> You have given an example of an ACL that clearly is an additional
> file access control mechanism only. With this kind of  
> classification, a
> significant subset of NFSv4 ACLs can be treated as an additional  
> file access
> control mechanism, which makes them actually useful even when POSIX  
> systems
> and Windows (or other systems with NFSv4 ACLs or similar) interact  
> and both
> change ACLs.


The thing that is still out there is that if you classify ACEs with  
ACE4_READ_DATA, for example, as an additional access control  
mechanism, you will never be able to give a arbitrary user or group  
the ACE4_READ_DATA permission without having the File Class that it  
belongs to also have at least those permissions.  That seems broken  
to me.


>
>>> It is important to understand how POSIX defines additional file
>>> access control mechanisms:
>>>
>>> [] 3.4 Additional File Access Control Mechanism
>>> [] An implementation-defined mechanism that is layered upon the
>>> [] access control mechanisms defined here, but which do not grant
>>> [] permissions beyond those defined herein, although they may  
>>> further
>>> [] restrict them.
>>>
>>> In other words, when a file has just been created and after chmod,
>>> the file mode permission bits define an upper bound to the  
>>> permissions
>>> granted to anyone on the system, and nobody has additional  
>>> permissions.
>>> Additional permissions (as an alternate file access control  
>>> mechanism) may
>>> be enabled explicitly, but the next chmod must disable them again.
>>
>> The use of the word "Additional" is confusing in the above
>> sentence.  :-)  I think you mean "more", or similar, but "Additional"
>> has a very specific meaning which (I think) isn't what you mean.
>
> I indeed meant more permissions as in additional mask bits granted,  
> as opposed
> to an additional file access control mechanism in the sense how  
> POSIX defines
> this term.
>
>>> We can classify the permissions that NFSv4 ACLs grant into  
>>> additional and
>>> alternate mechanisms as follows: everything covered by the POSIX
>>> read/write/execute permissions (such as ACE4_READ_DATA, but also
>>> ACE4_APPEND_DATA) is additional, while everything beyond that  
>>> (such as
>>> ACE4_WRITE_OWNER) is alternate.
>>
>> Note well: this is quite different from draft-ietf-nfsv4-
>> minorversion1-03.txt, i.e. this is an alternate proposal.
>
> Yes, this is a different approach of classifying NFSv4 ACLs into  
> additional
> and alternate file access control mechanisms, which complies to  
> POSIX as well
> as to the current NFSv4 RFC. It conflicts with draft-ietf-nfsv4- 
> acls, and by
> implication with draft-ietf-nfsv4-minorversion1-03 [4], which  
> includes the
> same text.
>
> Note that draft-ietf-nfsv4-acls is inconsistent in itself: the  
> algorithm in
> section 5.3 restricts which permissions an ACL grants by masking  
> permissions
> (which implies that you are classifying by permission as opposed to  
> turning
> off all ALLOW entries),

I give you this.  The wording about the classification of ACEs in  
draft-ietf-nfsv4-acls is not quite sufficient.  As I've said before,  
It makes some important assumptions, but isn't clear as to what those  
are.  It doesn't map to what the algorithm specifies.  With that  
said, it was not meant to be misleading in any way.

As documented in the algorithm definition in section 3.16.6.3 -  
"Applying a Mode to an Existing ACL" of the minor version doc, the  
following is a clarification of the classification:

ALLOW ACEs with ACE4_READ_DATA/ACE4_LIST_DIRECTORY, ACE4_WRITE_DATA/ 
ACE4_ADD_FILE, ACE4_APPEND_DATA/ACE4_ADD_SUBDIRECTORY, and  
ACE4_EXECUTE access mask bits are Alternate security mechanisms.   
These access mask bits will be disabled upon chmod.

DENY ACEs with those access mask bits are Additional access control  
mechanisms.  These access mask bits will be left unchanged  after a  
chmod, unless, as described in 3.16.6.3 it is one of the special  
identifiers, OWNER@, GROUP@, EVERYONE@.

All other access mask bits listed below are outside of the access  
control mechanisms specified by POSIX and are therefore unclassified  
and unrestricted:
ACE4_READ_NAMED_ATTRS
ACE4_WRITE_NAMED_ATTRS
ACE4_DELETE_CHILD
ACE4_READ_ATTRIBUTES
ACE4_WRITE_ATTRIBUTES
ACE4_DELETE
ACE4_READ_ACL
ACE4_WRITE_ACL
ACE4_WRITE_OWNER
ACE4_SYNCHRONIZE

This means that if an ACE defines one of those access mask bits, the  
access granted or denied will remain unchanged after a chmod.


> while section 14.4 says that "the ALLOW type of ACE
> is considered to be an alternate file access control mechanism  
> because it can
> further extend the permissions of a user".
>

Thoughts?

Thanks,
Lisa

[-- Attachment #1.2: Type: text/html, Size: 39771 bytes --]

[-- Attachment #2: Type: text/plain, Size: 375 bytes --]


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

[-- Attachment #3: Type: text/plain, Size: 140 bytes --]

_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  5:42               ` [nfsv4] " Sam Falkner
@ 2006-07-11  8:05                 ` Andreas Gruenbacher
  2006-07-11 12:29                   ` [nfsv4] " Sam Falkner
  0 siblings, 1 reply; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-11  8:05 UTC (permalink / raw)
  To: Sam Falkner
  Cc: Lisa Week, nfsv4, J. Bruce Fields, nfs, Spencer Shepler, Brian Pawlowski

On Tuesday, 11. July 2006 07:42, Sam Falkner wrote:
> >> I think having chmod be functional, i.e. chmod 770 gives write
> >> permission to the owning group, and an "ls -l" shows "rwxrwx---",
> >> would be best by far.
> >
> > It screws you when you want to give the owning group fewer permissions
> > than other users in the File Group Class. This can be worked around by
> > creating a dummy group with no members, or one group that only contains
> > a single user for each user, and changing the owning group of files, but
> > the owning group already has other defined uses in POSIX (think of SETG=
ID
> > for files and directories), and so it's not desirable and not always
> > possible to change the owning group to such a dummy group.
>
> No -- if you want owning group to have fewer permissions than other
> users, you're using an ACL.  You use tools that manipulate ACLs.

Sorry, but while this may look like a good idea at first, it doesn't work v=
ery=20
well. Let's look at an example:

	OWNER@:READ_DATA/WRITE_DATA::ALLOW
	GROUP@:READ_DATA/WRITE_DATA::ALLOW
	user@domain:READ_DATA/WRITE_DATA::ALLOW
	EVERYONE:READ_DATA::ALLOW

The mode is rw-rw-r--. Now we use ACL tools to change the ACL to give the=20
owning group fewer permissions than user@domain as you say:

	OWNER@:READ_DATA/WRITE_DATA::ALLOW
	GROUP@:READ_DATA::ALLOW
	user@domain:READ_DATA/WRITE_DATA::ALLOW
	EVERYONE:READ_DATA::ALLOW

The mode must still be rw-rw-r-- because otherwise, user@domain wouldn't ha=
ve=20
WRITE_DATA access. Now a nasty, evil POSIX application that doesn't know=20
anything about ACLs comes along and does a chmod(file, 0600), chmod(file,=20
0664). What should be the appropriate result? If changing the group file mo=
de=20
permission bits writes through to the GROUP@ entry as you say, then we woul=
d=20
end up with the following *effective* permissions:

	OWNER@:READ_DATA/WRITE_DATA::ALLOW
	GROUP@:READ_DATA/WRITE_DATA::ALLOW
	user@domain:READ_DATA/WRITE_DATA::ALLOW
	EVERYONE:READ_DATA::ALLOW

(The effective permissions are the same no matter how permissions are maske=
d=20
in the ACL, be it via DENY ACEs or via masks. In the case of DENY ACEs, the=
=20
ACL would contain DENY entries, but those wouldn't mask any permissions in=
=20
this case. The example is slightly more difficult to think through with DEN=
Y=20
ACEs because they contain some redudancy and potential for inconsistencies,=
=20
but the result is the same.)

=46rom the POSIX application's point of view, the file has the same permiss=
ions=20
before and after the chmod. The POSIX application cannot be held guilty;=20
after all it doesn't know about ACLs by definition. Yet the acl actually=20
grants more permissions after the chmods, and the change we did to give the=
=20
owning group fewer permissions with ACL tools is lost. This can be quite=20
serious.

We can play the same example with MAY_WRITE vs. MAY_APPEND: if the group fi=
le=20
mode permission bits write through to the owning group permissions, a POSIX=
=20
chmod may convert a MAY_APPEND owning group ACE into a MAY_WRITE owning gro=
up=20
ACE.

> Solaris' POSIX-draft ACLs have the property that chmod works (i.e.
> you can set group permissions), and you use setfacl if you want to
> change other entries. It's perfectly easy to have owning group have=20
> fewer permissions than supplimental users.

That's a bug, and draft 17 of POSIX 1003.1e (withdrawn) has this bug fixed.

> The bottom line is that chmod must set the mode, rather than "set the
> mode, unless there's some sort of ACL thingy, in which case the group
> bits aren't the group bits but are instead the mask bits".

We may be misunderstanding here: I agree that chmod must set the file mode=
=20
(permission bits as well as special bits). The point is that the group file=
=20
mode permission bits can no longer be the same as the owning group=20
permissions with ACLs, or else innocent POSIX applications may cause=20
unintended side effects as in the example.

Andreas

=2D-=20
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  6:17           ` [nfsv4] " Sam Falkner
@ 2006-07-11  8:45             ` Andreas Gruenbacher
  2006-07-11 12:44               ` [nfsv4] " Sam Falkner
  0 siblings, 1 reply; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-11  8:45 UTC (permalink / raw)
  To: Sam Falkner; +Cc: nfs, Spencer Shepler, Brian Pawlowski, nfsv4, Lisa Week

On Tuesday, 11. July 2006 08:17, Sam Falkner wrote:
> On Jul 10, 2006, at 5:50 PM, Andreas Gruenbacher wrote:
> > On Monday, 10. July 2006 15:29, Sam Falkner wrote:
> >> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
> >>> On Saturday, 8. July 2006 05:45, Sam Falkner wrote:
> >>>> On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:
> >>>>> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
> >>>
> >>> Here are some facts to back my points: Let's assume that a file inherits
> >>> the following ACL when being created (I am using ^(...) here with the
> >>> meaning of "all bitflags except ..."):
> >>>
> >>> 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
> >>> 	OWNER@:^(READ_DATA/WRITE_DATA)::DENY
> >>> 	GROUP@:READ_DATA::ALLOW
> >>> 	user@domain:READ_DATA/WRITE_DATA::ALLOW
> >>> 	GROUP@:^READ_DATA::DENY
> >>> 	user@domain:^(READ_DATA/WRITE_DATA)::DENY
> >>> 	EVERYONE@:READ_DATA::ALLOW
> >>>
> >>> This acl is "well structured" in the POSIX sense: OWNER@ will only get
> >>> the owner permissions and none of the other permissions, user@domain
> >>> and GROUP@ will only get the permissions intended for them, and only
> >>> others (neither OWNER@ nor user@domain nor GROUP@) will get EVERYONE@
> >>> permissions; in other words, the acl is even correct for non-monotonic
> >>> permissions. 
> >>>
> >>> According to section 5.1 of draft-ietf-nfsv4-acls [1], the resulting
> >>> file mode permission bits for this acl shall be rw-r--r--.
> >>
> >> Your proposal would give this mode: rw-rw-r--.  I think we should
> >> consider this more carefully.
> >>
> >>> After a chmod or a file create, alternate file access control mechanisms
> >>> must be disabled and only additional file access control mechanisms may
> >>> remain active. According to POSIX, additional file access control
> >>> mechanisms require that no user may be granted more permissions than the
> >>> respective file classes permit. In this case, user@domain clearly is not
> >>> in the File Owner Class. (According to POSIX, user@domain must be in the
> >>> File Group Class.) The user@domain user is granted WRITE_DATA though,
> >>> which is *incorrect* from a POSIX point of view.
> >>
> >> No, it is not granted WRITE_DATA after a chmod().  After a chmod 644,
> >> there will be a "user@domain:WRITE_DATA::DENY" prepended.  This is
> >> well defined in the current minorversion1.  So it is not "incorrect
> >> from a POSIX point of view."
> >
> > Now that I look at the example again, I realize that I didn't
> > define the create mode. With create mode 640 or less permissive,
> > everything is fine. Let's assume create mode 664 though: then the file
> > mode permission bits will still come out as rw-r--r--, but the ACL will
> > grant WRITE_DATA to user@domain. That's the case I meant, and this case is
> > not POSIX compliant.
>
> Wrong.  The file mode permission bits will be rw-rw-r--.  There is no
> problem with POSIX compliance.

Ah. And why should that be according to draft-ietf-nfsv4-acls-00? Because the 
group file mode permission bits write through to GROUP@ entries, and so the 
rw- group permissions in the create mask elevate the permissions given to the 
owning group in the ACL?

I hope that my reply from Tue, 11 Jul 2006 10:05:21 +0200 made it clear that 
writing through to the GROUP@ entries causes POSIX applications to 
accidentally remove restrictions from an ACL, and so we really must not do 
that. The same argument applies to writing through to OWNER@ and EVERYONE@ 
entries, by the way. The "The final six ACEs are adjusted according to the 
incoming mode" section of the algorithm described in 5.3 is a really bad 
idea.

> >>> Next, let's assume than an ACL contains the following pair of user-
> >>> provided entries:
> >>>
> >>> 	GROUP@:WRITE_DATA::DENY
> >>> 	GROUP@:READ_DATA::ALLOW
> >>>
> >>> Clearly the user's intention is to deny WRITE_DATA access to GROUP@.
> >>
> >> Yes, that *was* the user's intention, at the time the user set the
> >> ACL.
> >
> > Hm... not the best example because GROUP@ is the owning group, which
> > corresponds to the group file mode permission bits in traditional
> > POSIX. The problem is more difficult to see in this case, but I argue
> > that the owhning group permissions and the group file mode permission
> > bits are not the same with ACLs: the file group mode permission bits
> > restrict GROUP@ entries, and all user@domain and group@domain entries
> > in the acl. For the sake of this example, substitute GROUP@ with
> > user@domain though, and you'll see the problem more clearly: a user
> > adds an explicit user@domain:WRITE_DATA::DENY entry to an acl which
> > is followed by a user@domain:READ_DATA::ALLOW entry. After a chmod to
> > 664 for example, this user suddenly has write access. The
> > user clearly did not intend this to happen.
>
> No -- after the chmod, the DENY still stands, unaltered.

Great Sam, you have trapped me with another special case that is there only 
because of those pesky mask DENY entries: "the mask bits are a subset of the 
mask bits of the current ACE" [1].

My point still holds, just that the following ALLOW ACE must have the denied 
WRITE_DATA permission set as well:

	user@domain:WRITE_DATA::DENY
	user@domain:READ_DATA/WRITE_DATA::ALLOW

Do you *still* disagree?

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  6:50       ` Lisa Week
@ 2006-07-11  8:55         ` Andreas Gruenbacher
  2006-07-27  0:59         ` Andreas Gruenbacher
  1 sibling, 0 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-11  8:55 UTC (permalink / raw)
  To: nfsv4; +Cc: Sam Falkner, nfs, Spencer Shepler, Brian Pawlowski, Lisa Week

On Tuesday, 11. July 2006 08:50, Lisa Week wrote:
> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
> > Note that in traditional POSIX, permissions from multiple file
> > classes will never accumulate: each user always is either granted the
> > File Owner permission bits, the File Group permission bits, or the File
> > Other permission bits. (Additional file access control mechanisms may
> > further limit the permissions granted, and alternative file access
> > control mechanisms may further limit or extend the permissions granted.)
> > Permissions from multiple acl entries accumulate in the NFSv4 ACL model
> > though, and so unless an acl is "well structured" in the above sense,
> > permissions from multiple classes may accumulate.
>
> Yes, permissions may accumulate, but in the design in the minor
> version doc, after a chmod, any permissions that go beyond the mode
> bits being set will be disabled.  This is done via the algorithm in
> section 3.16.6.3 -  "Applying a Mode to an Existing ACL".  This makes
> sure that the permissions (ACE4_READ_DATA/ACE4_LIST_DIRECTORY,
> ACE4_WRITE_DATA/ACE4_WRITE_DATA, ACE4_APPEND_DATA/
> ACE4_ADD_SUBDIRECTORY and ACE4_EXECUTE... which is what the mode
> defines) that accumulate will NOT go beyond the mode bits being set.

Ack.

Andreas


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  8:05                 ` Andreas Gruenbacher
@ 2006-07-11 12:29                   ` Sam Falkner
  2006-07-11 13:46                     ` J. Bruce Fields
  0 siblings, 1 reply; 38+ messages in thread
From: Sam Falkner @ 2006-07-11 12:29 UTC (permalink / raw)
  To: Andreas Gruenbacher
  Cc: Lisa Week, nfsv4, J. Bruce Fields, nfs, Spencer Shepler, Brian Pawlowski


On Jul 11, 2006, at 4:05 AM, Andreas Gruenbacher wrote:

> On Tuesday, 11. July 2006 07:42, Sam Falkner wrote:
>>>> I think having chmod be functional, i.e. chmod 770 gives write
>>>> permission to the owning group, and an "ls -l" shows "rwxrwx---",
>>>> would be best by far.
>>>
>>> It screws you when you want to give the owning group fewer  
>>> permissions
>>> than other users in the File Group Class. This can be worked  
>>> around by
>>> creating a dummy group with no members, or one group that only  
>>> contains
>>> a single user for each user, and changing the owning group of  
>>> files, but
>>> the owning group already has other defined uses in POSIX (think  
>>> of SETGID
>>> for files and directories), and so it's not desirable and not always
>>> possible to change the owning group to such a dummy group.
>>
>> No -- if you want owning group to have fewer permissions than other
>> users, you're using an ACL.  You use tools that manipulate ACLs.
>
> Sorry, but while this may look like a good idea at first, it  
> doesn't work very
> well. Let's look at an example:
>
> 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
> 	GROUP@:READ_DATA/WRITE_DATA::ALLOW
> 	user@domain:READ_DATA/WRITE_DATA::ALLOW
> 	EVERYONE:READ_DATA::ALLOW
>
> The mode is rw-rw-r--. Now we use ACL tools to change the ACL to  
> give the
> owning group fewer permissions than user@domain as you say:
>
> 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
> 	GROUP@:READ_DATA::ALLOW
> 	user@domain:READ_DATA/WRITE_DATA::ALLOW
> 	EVERYONE:READ_DATA::ALLOW

> The mode must still be rw-rw-r-- because otherwise, user@domain  
> wouldn't have
> WRITE_DATA access. Now a nasty, evil POSIX application that doesn't  
> know
> anything about ACLs comes along and does a chmod(file, 0600), chmod 
> (file,
> 0664). What should be the appropriate result? If changing the group  
> file mode
> permission bits writes through to the GROUP@ entry as you say, then  
> we would
> end up with the following *effective* permissions:
>
> 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
> 	GROUP@:READ_DATA/WRITE_DATA::ALLOW
> 	user@domain:READ_DATA/WRITE_DATA::ALLOW
> 	EVERYONE:READ_DATA::ALLOW

That's not how Solaris works either.  Sorry, I should have explained  
it better.  In Solaris using POSIX-draft ACLs, chmod() changes both  
the group permissions and the mask, simultaneously.  I now understand  
why you were hesitant to have chmod affect the group permissions, but  
having it affect both mask and group solves both problems.

I realize that I'm talking about POSIX-draft ACLs, but the same  
design principles work for NFSv4 ACLs.  chmod() affects the GROUP@  
permissions directly, and also affects the mask, no matter how the  
mask is implemented.

- Sam


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  8:45             ` Andreas Gruenbacher
@ 2006-07-11 12:44               ` Sam Falkner
  0 siblings, 0 replies; 38+ messages in thread
From: Sam Falkner @ 2006-07-11 12:44 UTC (permalink / raw)
  To: Andreas Gruenbacher
  Cc: Brian Pawlowski, Spencer Shepler, nfs, nfsv4, Lisa Week

On Jul 11, 2006, at 4:45 AM, Andreas Gruenbacher wrote:

> On Tuesday, 11. July 2006 08:17, Sam Falkner wrote:
>> On Jul 10, 2006, at 5:50 PM, Andreas Gruenbacher wrote:
>>> On Monday, 10. July 2006 15:29, Sam Falkner wrote:
>>>> On Jul 9, 2006, at 10:22 AM, Andreas Gruenbacher wrote:
>>>>> On Saturday, 8. July 2006 05:45, Sam Falkner wrote:
>>>>>> On Jul 7, 2006, at 5:55 AM, Andreas Gruenbacher wrote:
>>>>>>> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
>>>>>
>>>>> Here are some facts to back my points: Let's assume that a file  
>>>>> inherits
>>>>> the following ACL when being created (I am using ^(...) here  
>>>>> with the
>>>>> meaning of "all bitflags except ..."):
>>>>>
>>>>> 	OWNER@:READ_DATA/WRITE_DATA::ALLOW
>>>>> 	OWNER@:^(READ_DATA/WRITE_DATA)::DENY
>>>>> 	GROUP@:READ_DATA::ALLOW
>>>>> 	user@domain:READ_DATA/WRITE_DATA::ALLOW
>>>>> 	GROUP@:^READ_DATA::DENY
>>>>> 	user@domain:^(READ_DATA/WRITE_DATA)::DENY
>>>>> 	EVERYONE@:READ_DATA::ALLOW
>>>>>
>>>>> This acl is "well structured" in the POSIX sense: OWNER@ will  
>>>>> only get
>>>>> the owner permissions and none of the other permissions,  
>>>>> user@domain
>>>>> and GROUP@ will only get the permissions intended for them, and  
>>>>> only
>>>>> others (neither OWNER@ nor user@domain nor GROUP@) will get  
>>>>> EVERYONE@
>>>>> permissions; in other words, the acl is even correct for non- 
>>>>> monotonic
>>>>> permissions.
>>>>>
>>>>> According to section 5.1 of draft-ietf-nfsv4-acls [1], the  
>>>>> resulting
>>>>> file mode permission bits for this acl shall be rw-r--r--.
>>>>
>>>> Your proposal would give this mode: rw-rw-r--.  I think we should
>>>> consider this more carefully.
>>>>
>>>>> After a chmod or a file create, alternate file access control  
>>>>> mechanisms
>>>>> must be disabled and only additional file access control  
>>>>> mechanisms may
>>>>> remain active. According to POSIX, additional file access control
>>>>> mechanisms require that no user may be granted more permissions  
>>>>> than the
>>>>> respective file classes permit. In this case, user@domain  
>>>>> clearly is not
>>>>> in the File Owner Class. (According to POSIX, user@domain must  
>>>>> be in the
>>>>> File Group Class.) The user@domain user is granted WRITE_DATA  
>>>>> though,
>>>>> which is *incorrect* from a POSIX point of view.
>>>>
>>>> No, it is not granted WRITE_DATA after a chmod().  After a chmod  
>>>> 644,
>>>> there will be a "user@domain:WRITE_DATA::DENY" prepended.  This is
>>>> well defined in the current minorversion1.  So it is not "incorrect
>>>> from a POSIX point of view."
>>>
>>> Now that I look at the example again, I realize that I didn't
>>> define the create mode. With create mode 640 or less permissive,
>>> everything is fine. Let's assume create mode 664 though: then the  
>>> file
>>> mode permission bits will still come out as rw-r--r--, but the  
>>> ACL will
>>> grant WRITE_DATA to user@domain. That's the case I meant, and  
>>> this case is
>>> not POSIX compliant.
>>
>> Wrong.  The file mode permission bits will be rw-rw-r--.  There is no
>> problem with POSIX compliance.
>
> Ah. And why should that be according to draft-ietf-nfsv4-acls-00?  
> Because the
> group file mode permission bits write through to GROUP@ entries,  
> and so the
> rw- group permissions in the create mask elevate the permissions  
> given to the
> owning group in the ACL?
>
> I hope that my reply from Tue, 11 Jul 2006 10:05:21 +0200 made it  
> clear that
> writing through to the GROUP@ entries causes POSIX applications to
> accidentally remove restrictions from an ACL, and so we really must  
> not do
> that. The same argument applies to writing through to OWNER@ and  
> EVERYONE@
> entries, by the way. The "The final six ACEs are adjusted according  
> to the
> incoming mode" section of the algorithm described in 5.3 is a  
> really bad
> idea.
>
>>>>> Next, let's assume than an ACL contains the following pair of  
>>>>> user-
>>>>> provided entries:
>>>>>
>>>>> 	GROUP@:WRITE_DATA::DENY
>>>>> 	GROUP@:READ_DATA::ALLOW
>>>>>
>>>>> Clearly the user's intention is to deny WRITE_DATA access to  
>>>>> GROUP@.
>>>>
>>>> Yes, that *was* the user's intention, at the time the user set the
>>>> ACL.
>>>
>>> Hm... not the best example because GROUP@ is the owning group, which
>>> corresponds to the group file mode permission bits in traditional
>>> POSIX. The problem is more difficult to see in this case, but I  
>>> argue
>>> that the owhning group permissions and the group file mode  
>>> permission
>>> bits are not the same with ACLs: the file group mode permission bits
>>> restrict GROUP@ entries, and all user@domain and group@domain  
>>> entries
>>> in the acl. For the sake of this example, substitute GROUP@ with
>>> user@domain though, and you'll see the problem more clearly: a user
>>> adds an explicit user@domain:WRITE_DATA::DENY entry to an acl which
>>> is followed by a user@domain:READ_DATA::ALLOW entry. After a  
>>> chmod to
>>> 664 for example, this user suddenly has write access. The
>>> user clearly did not intend this to happen.
>>
>> No -- after the chmod, the DENY still stands, unaltered.
>
> Great Sam, you have trapped me with another special case that is  
> there only
> because of those pesky mask DENY entries: "the mask bits are a  
> subset of the
> mask bits of the current ACE" [1].

I trapped you, but not out of malice.  The fact that you fell into  
the trap proves a point.  You tried to give an example as a  
reasonable pair of ACEs that a user would set, and fell into the trap  
of having the design deal with your ACEs correctly.  The design is to  
only manipulate DENY entries if the follow a very specific pattern, a  
pattern that an end-user is unlikely to set.  In other words, the  
design avoids manipulating DENYs unless the DENYs are redundant.

> My point still holds, just that the following ALLOW ACE must have  
> the denied
> WRITE_DATA permission set as well:
>
> 	user@domain:WRITE_DATA::DENY
> 	user@domain:READ_DATA/WRITE_DATA::ALLOW

Yes, there, the chmod would change the DENY ACE.  So if an end-user  
really did say WRITE_DATA:DENY, WRITE_DATA:ALLOW, albeit with other  
bits, then yes, the ACL can change as a result of the chmod.

> Do you *still* disagree?

I don't disagree that the DENY would be changed by a chmod(), but I  
do disagree that it's a major flaw.

I would rather live with the flaw of having redundant user-supplied  
ACEs manipulated upon chmod than to add new file attributes that  
NFSv4.0 clients and servers won't know about.

- Sam


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11 12:29                   ` [nfsv4] " Sam Falkner
@ 2006-07-11 13:46                     ` J. Bruce Fields
  2006-07-15 13:56                       ` [nfsv4] " Sam Falkner
  0 siblings, 1 reply; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-11 13:46 UTC (permalink / raw)
  To: Sam Falkner
  Cc: Lisa Week, nfsv4, nfs, Spencer Shepler, Brian Pawlowski,
	Andreas Gruenbacher

On Tue, Jul 11, 2006 at 08:29:21AM -0400, Sam Falkner wrote:
> That's not how Solaris works either.  Sorry, I should have explained  
> it better.  In Solaris using POSIX-draft ACLs, chmod() changes both  
> the group permissions and the mask, simultaneously.  I now understand  
> why you were hesitant to have chmod affect the group permissions, but  
> having it affect both mask and group solves both problems.

I think you're missing the point of his example.  The point is that a
chmod-using application may expect the sequence chmod(600) chmod(664) on
a file with mode 664 to be a no-op.

But if chmod() changes both group and mask bits ("owning group" and
"group file class" bits) then this sequence isn't a no-op any more in
his example.  It gives GROUP@ write permissions.

So Andreas is trying to ensure the property that any sequence of chmod's
that leaves the mode bits the same also leaves the ACL the same.  I
agree that that's a nice property.

What I'm not convinced of yet is that this is really worth caring about
much.  Is this common application behavior?  Have there been complaints
about this from people using Solaris's ACLs?

--b.

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [NFS] NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-07 11:55 ` NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready Andreas Gruenbacher
  2006-07-08  3:45   ` Sam Falkner
@ 2006-07-14 17:59   ` J. Bruce Fields
  2006-07-14 18:22     ` J. Bruce Fields
  2006-07-14 19:02     ` Andreas Gruenbacher
  1 sibling, 2 replies; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-14 17:59 UTC (permalink / raw)
  To: nfsv4; +Cc: Sam Falkner, nfs, Spencer Shepler, Brian Pawlowski

On Fri, Jul 07, 2006 at 01:55:30PM +0200, Andreas Gruenbacher wrote:
> On Monday, 3. July 2006 23:10, Andreas Gruenbacher wrote:
> > I have been thinking about the problems of interaction between NFSv4 ACLs
> > and POSIX, and particularly about the issue of masking permissions through
> > chmod and after creating files or directories.

So, omitting the details, the idea is to add 3 optional attributes
(owner_class_mask, group_class_mask, and other_class_mask) which limit
the permissions that an ACL can grant to different classes of entities.

For a client that doesn't support the new attributes, a server can apply
the mask attributes to the ACL before returning it.  I suppose a
multi-protocol server would do the same for CIFS clients.

For a server that doesn't support the new attributes, the client still
has available any of the current options: give up on non-destructive
chmod, or fall back on representing mask bits with DENIES.

When client and server support the new mask bits, we get a completely
non-destructive chmod without all the complicated DENY heuristics.

I agree that that would be an improvement.

--b.

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: [NFS] NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-14 17:59   ` [NFS] " J. Bruce Fields
@ 2006-07-14 18:22     ` J. Bruce Fields
  2006-07-14 19:02     ` Andreas Gruenbacher
  1 sibling, 0 replies; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-14 18:22 UTC (permalink / raw)
  To: nfsv4; +Cc: Sam Falkner, Brian Pawlowski, Spencer Shepler, nfs

On Fri, Jul 14, 2006 at 01:59:30PM -0400, J. Bruce Fields wrote:
> For a client that doesn't support the new attributes, a server can apply
> the mask attributes to the ACL before returning it.  I suppose a
> multi-protocol server would do the same for CIFS clients.

By the way, the proposed protocol behavior here is odd:  the server
returns a different ACL depending on whether the client requested any of
the new mask attributes in the same GETATTR.

But I suppose there are other cases (rdattr_error, maybe some migration
cases??) where what we return can depend in strange ways on which
attributes were requested, so maybe it's not totally without precedent?

--b.

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: [NFS] NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-14 17:59   ` [NFS] " J. Bruce Fields
  2006-07-14 18:22     ` J. Bruce Fields
@ 2006-07-14 19:02     ` Andreas Gruenbacher
  2006-07-14 19:13       ` J. Bruce Fields
  1 sibling, 1 reply; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-14 19:02 UTC (permalink / raw)
  To: nfsv4; +Cc: J. Bruce Fields, Sam Falkner, Spencer Shepler, nfs, Brian Pawlowski

On Friday, 14. July 2006 19:59, J. Bruce Fields wrote:
> For a server that doesn't support the new attributes, the client still
> has available any of the current options: give up on non-destructive
> chmod, or fall back on representing mask bits with DENIES.

Maybe not what you meant, but shouldn't the client rely on the server to do 
"the right thing" when it sees a mode SETATTR? I think it would be a bad idea 
for the client to guess such details as which exact file security model a 
server implements. Instead, the server should be responsible for doing what 
the client is asking for (and erring towards more restrictive permissions if 
necessary).

Andreas

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: [NFS] NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-14 19:02     ` Andreas Gruenbacher
@ 2006-07-14 19:13       ` J. Bruce Fields
  0 siblings, 0 replies; 38+ messages in thread
From: J. Bruce Fields @ 2006-07-14 19:13 UTC (permalink / raw)
  To: Andreas Gruenbacher
  Cc: Sam Falkner, Brian Pawlowski, Spencer Shepler, nfs, nfsv4

On Fri, Jul 14, 2006 at 09:02:44PM +0200, Andreas Gruenbacher wrote:
> On Friday, 14. July 2006 19:59, J. Bruce Fields wrote:
> > For a server that doesn't support the new attributes, the client still
> > has available any of the current options: give up on non-destructive
> > chmod, or fall back on representing mask bits with DENIES.
> 
> Maybe not what you meant, but shouldn't the client rely on the server to do 
> "the right thing" when it sees a mode SETATTR?

RFC 3530 allows a server to leave named users and groups with
permissions greater than the permissions in the group mode bit, so if a
client wants posix-like behavior it can't count on the server for that.

That said...

> I think it would be a bad idea for the client to guess such details as
> which exact file security model a server implements. Instead, the
> server should be responsible for doing what the client is asking for
> (and erring towards more restrictive permissions if necessary).

... I'm all for declaring 3530 wrong here and insisting that the mode bits
act like a mask, or just not worrying about it and telling users to
check their server's manual very carefully if they depend on the posix
behavior.

--b.

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11 13:46                     ` J. Bruce Fields
@ 2006-07-15 13:56                       ` Sam Falkner
  0 siblings, 0 replies; 38+ messages in thread
From: Sam Falkner @ 2006-07-15 13:56 UTC (permalink / raw)
  To: J. Bruce Fields
  Cc: Lisa Week, nfsv4, nfs, Spencer Shepler, Brian Pawlowski,
	Andreas Gruenbacher

On Jul 11, 2006, at 9:46 AM, J. Bruce Fields wrote:

> On Tue, Jul 11, 2006 at 08:29:21AM -0400, Sam Falkner wrote:
>> That's not how Solaris works either.  Sorry, I should have explained
>> it better.  In Solaris using POSIX-draft ACLs, chmod() changes both
>> the group permissions and the mask, simultaneously.  I now understand
>> why you were hesitant to have chmod affect the group permissions, but
>> having it affect both mask and group solves both problems.
>
> I think you're missing the point of his example.  The point is that a
> chmod-using application may expect the sequence chmod(600) chmod 
> (664) on
> a file with mode 664 to be a no-op.
>
> But if chmod() changes both group and mask bits ("owning group" and
> "group file class" bits) then this sequence isn't a no-op any more in
> his example.  It gives GROUP@ write permissions.

Okay, understood.

> So Andreas is trying to ensure the property that any sequence of  
> chmod's
> that leaves the mode bits the same also leaves the ACL the same.  I
> agree that that's a nice property.

Perhaps, but I think having chmod unable to set the mode to be a much  
more undesirable property, to put it mildly.

> What I'm not convinced of yet is that this is really worth caring  
> about
> much.  Is this common application behavior?  Have there been  
> complaints
> about this from people using Solaris's ACLs?

I did some more research, and found that the Solaris chmod() system  
call does pretty much what Linux does -- the group permissions of  
chmod() affect the mask, not the group permission bits.  Originally,  
the chmod command did the chmod() system call, and not much else.

There were many complaints about this.  So many that the chmod  
command line was changed to do the chmod() system call, and then, in  
the presence of an ACL, fix the permission bits.  In other words, the  
bug was fixed.

I have found no complaints about the current Solaris behavior, where  
chmod affects group permissions.

- Sam


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-11  6:50       ` Lisa Week
  2006-07-11  8:55         ` Andreas Gruenbacher
@ 2006-07-27  0:59         ` Andreas Gruenbacher
  2006-07-27  2:57           ` Andreas Gruenbacher
  2006-07-28  6:32           ` Lisa Week
  1 sibling, 2 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-27  0:59 UTC (permalink / raw)
  To: Lisa Week; +Cc: Sam Falkner, nfs, Spencer Shepler, Brian Pawlowski, nfsv4

Lisa,

On Tuesday, 11. July 2006 08:50, Lisa Week wrote:
> POSIX defines Additional Access Control Mechanism as follows:
> "An implementation-defined mechanism that is layered upon the access
> control mechanisms defined here, but which do not grant permissions
> beyond those defined herein, although they may further restrict them."
>
> POSIX defines Alternate Access Control Mechanisms are as follows:
> "An implementation-defined mechanism that is independent of the
> access control mechanisms defined herein, and which if enabled on a
> file may either restrict or extend the permissions of a given user.
> IEEE Std 1003.1-2001 defines when such mechanisms can be enabled and
> when they are disabled."
>
> So, the question that comes to my mind when reading that text is:
> What does it mean when they say "access mechanisms defined herein" in
> both of those definitions?  Well, the access mechanisms defined in
> the POSIX spec are the "File Access Permissions", right?  So, can we
> agree that "access mechanisms defined herein" would be the "File
> Access Permissions"?

the "access mechanisms defined herein" refer to all file access control 
mechanisms that POSIX defines. This includes permissions always granted to 
the owner such as chmod, but also mechanisms such as the restricted deletion 
flag bit (S_ISVTX) for directories, etc.

Trust me, POSIX is very careful about wording, and if "access mechanisms 
defined herein" did indeed refer to the file access permissions, then POSIX 
would say exactly that.

> I give you this.  The wording about the classification of ACEs in
> draft-ietf-nfsv4-acls is not quite sufficient.  As I've said before,
> It makes some important assumptions, but isn't clear as to what those
> are. It doesn't map to what the algorithm specifies.  With that 
> said, it was not meant to be misleading in any way.

I never meant to imply bad intentions ;-)

> As documented in the algorithm definition in section 3.16.6.3 -
> "Applying a Mode to an Existing ACL" of the minor version doc, the
> following is a clarification of the classification:
>
> ALLOW ACEs with ACE4_READ_DATA/ACE4_LIST_DIRECTORY, ACE4_WRITE_DATA/
> ACE4_ADD_FILE, ACE4_APPEND_DATA/ACE4_ADD_SUBDIRECTORY, and
> ACE4_EXECUTE access mask bits are Alternate security mechanisms.
> These access mask bits will be disabled upon chmod.
>
> DENY ACEs with those access mask bits are Additional access control
> mechanisms.  These access mask bits will be left unchanged  after a
> chmod, unless, as described in 3.16.6.3 it is one of the special
> identifiers, OWNER@, GROUP@, EVERYONE@.

No, that's still messed up. We don't care about permissions that are not 
granted, so we *could* only look at ALLOW ACEs, but this distinction is not 
at all relevant.

What counts is which access mask flags are equivalent to the POSIX Read, 
Write, and Execute permissions, and which are not: those are the access mask 
flags which may (sometimes) be used as additional access control mechanisms.

The other issue is which POSIX file class each ACE maps to. Let's assume for 
now that we only know that OWNER@ maps to the File Owner Class to keep this 
example short.

Together with these two classifications, we can determine whether an ACE is 
within the bounds of an additional file access control mechanism. Let's look 
at the following ACE, and a file which has a file mode of 0740 (rwxr-----):

  OWNER@:READ_DATA/APPEND_DATA/EXECUTE::ALLOW

The OWNER@ ACE maps to the File Owner Class. This means that as an additional 
access control mechanism, the ACE may not grant more than Read, Write, and 
Execute. The READ_DATA access mask flag is equivalent to POSIX Read, the 
APPEND_DATA access mask flag is a subset of POSIX Write, and the EXECUTE 
access mask flag is equivalent to POSIX Execute, so we are fine.

Now, let's assume that the user does a chmod to mode 0640 (rw-r-----). The 
permissions of the File Owner Class now no longer cover the EXECUTE 
permission. There are two options to fix this problem:

 1. either accept that the ACE cannot be part of an additional file
    access control mechanism, or

 2. disable the EXECUTE access mask flag, either temporarily or
    permanently, which gets us back into the bounds of additional file
    access control mechanisms.

In case 1, the only choice that remains is that the ACE must be part of an 
alternate file access control mechanism (see more on that below). POSIX 
states that we must disable alternate file access control mechanisms upon 
chmod and for new files, and they must only be re-enabled per explicit user 
action. So the EXECUTE permission would be just gone until the user 
explicitly re-enables it (with something other than a chmod). This would 
render ACLs practically useless under POSIX.

In case 2, the ACE still remains within the bounds of additional file access 
control mechanisms. If we disable EXECUTE only temporarily, then a future 
chmod back to mode 0740 can simply re-enable EXECUTE, and we will not have 
lost anything. (Remember, chmod does not disable additional file access 
control mechanisms.) 

There are several possibilities how we can disable access mode flags 
temporarily:

 1. we could add an explicit DENY ACE before the ALLOW ACE that has
    the affected access mask flags disabled (this is the
    draft-ietf-nfsv4-acls-00 approach),

 2. we could declare that all access mask flags which go beyond
    the corresponding File Class are automatically disabled, or

 3. we could introduce file masks as I am proposing.

The file masks have the advantage that the user can easily manually enable 
more access mask flags in them. This would construe an explicit user action 
as per POSIX. So depending on which flags the user enables, that may amount 
to an additional or alternate file access control mechanism. POSIX is 
perfectly fine with that, even for enabling flags such as WRITE_OWNER. The 
only thing we must ensure is that alternate flags are disabled upon chmod as 
well as for new files.

> All other access mask bits listed below are outside of the access
> control mechanisms specified by POSIX and are therefore unclassified
> and unrestricted:
> ACE4_READ_NAMED_ATTRS
> ACE4_WRITE_NAMED_ATTRS
> ACE4_DELETE_CHILD
> ACE4_READ_ATTRIBUTES
> ACE4_WRITE_ATTRIBUTES
> ACE4_DELETE
> ACE4_READ_ACL
> ACE4_WRITE_ACL
> ACE4_WRITE_OWNER
> ACE4_SYNCHRONIZE
>
> This means that if an ACE defines one of those access mask bits, the
> access granted or denied will remain unchanged after a chmod.

I am afraid this is impossible: there is no such thing as being outside the 
file access control mechanisms defined by POSIX. The reason is simple: POSIX 
applications absolutely *must* be able to rely on POSIX semantics in order to 
be able to keep the system secure.

Let's assume that ACE4_WRITE_OWNER was indeed outside of the access control 
mechanisms defined by POSIX as a counter example. A POSIX application does a 
chmod to mode 0600 (rw-------) in order to restrict access to the file owner. 
After that, the application can perfectly well write information that is 
confidential to the owner into the file -- after all, only the owner will 
have access, right?

Well, not quite, because an ACL might still grant ACE4_WRITE_OWNER to some 
other user on the system. That other user could simply take over ownership of 
the file, and do whatever he wants with it. Here we have it, a perfect 
security hole; all POSIX applications potentially broken!

Therefore, there cannot be any file access control mechanisms which are 
neither defined by POSIX, nor additional or alternate.

By definition, pure POSIX applications have no idea which additional or 
alternate file access control mechanisms a particular POSIX implementation 
may define, so they cannot know about such sideband mechanisms, and they also 
have no way of disabling them.

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-27  0:59         ` Andreas Gruenbacher
@ 2006-07-27  2:57           ` Andreas Gruenbacher
  2006-07-28  6:32           ` Lisa Week
  1 sibling, 0 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-07-27  2:57 UTC (permalink / raw)
  To: Lisa Week; +Cc: Sam Falkner, nfs, Spencer Shepler, Brian Pawlowski, nfsv4

Lisa,

On Thursday, 27. July 2006 02:59, Andreas Gruenbacher wrote:
> Let's assume that ACE4_WRITE_OWNER was indeed outside of the access control
> mechanisms defined by POSIX as a counter example. A POSIX application does
> a chmod to mode 0600 (rw-------) in order to restrict access to the file
> owner. After that, the application can perfectly well write information
> that is confidential to the owner into the file -- after all, only the
> owner will have access, right?
>
> Well, not quite, because an ACL might still grant ACE4_WRITE_OWNER to some
> other user on the system. That other user could simply take over ownership
> of the file, and do whatever he wants with it. Here we have it, a perfect
> security hole; all POSIX applications potentially broken!
>
> Therefore, there cannot be any file access control mechanisms which are
> neither defined by POSIX, nor additional or alternate.

I forgot to mention that an analogous case can be made for additional file 
access control mechanisms as well: POSIX applications cannot know which 
additional file access control mechanisms a particular implementation may 
support; they are free to rely on invariants under POSIX, such as a chmod 
from one mode to another, which should be a no-op. Additional file access 
control mechanisms must make sure that POSIX invariants will not change the 
permissions granted.

This contradicts with having a chmod write through to OWNER@, GROUP@, and 
EVERYONE@ ACEs: consider the same ACE we had before with a file mode of 0740 
(rwxr-----):

  OWNER@:READ_DATA/APPEND_DATA/EXECUTE::ALLOW

If a chmod to 0640 and back to 0740 writes through to the OWNER@ ACE, the 
entry will change to:

  OWNER@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW

So a POSIX application has added mask flags in a supposed invariant. That's 
also a security hole, but not one as severe as the first because the only 
mask flag affected is APPEND_DATA (I believe).

I have pointed this out before in Section 4.7. "Mode Changes and the OWNER@, 
GROUP@, and EVERYONE@ ACEs".

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-27  0:59         ` Andreas Gruenbacher
  2006-07-27  2:57           ` Andreas Gruenbacher
@ 2006-07-28  6:32           ` Lisa Week
  2006-08-01 10:36             ` [nfsv4] " Andreas Gruenbacher
  1 sibling, 1 reply; 38+ messages in thread
From: Lisa Week @ 2006-07-28  6:32 UTC (permalink / raw)
  To: Andreas Gruenbacher; +Cc: nfs, nfsv4

Hi Andreas,

Some initial comments inline...

Thanks,
Lisa

Andreas Gruenbacher wrote:

>Lisa,
>
>On Tuesday, 11. July 2006 08:50, Lisa Week wrote:
>  
>
>>POSIX defines Additional Access Control Mechanism as follows:
>>"An implementation-defined mechanism that is layered upon the access
>>control mechanisms defined here, but which do not grant permissions
>>beyond those defined herein, although they may further restrict them."
>>
>>POSIX defines Alternate Access Control Mechanisms are as follows:
>>"An implementation-defined mechanism that is independent of the
>>access control mechanisms defined herein, and which if enabled on a
>>file may either restrict or extend the permissions of a given user.
>>IEEE Std 1003.1-2001 defines when such mechanisms can be enabled and
>>when they are disabled."
>>
>>So, the question that comes to my mind when reading that text is:
>>What does it mean when they say "access mechanisms defined herein" in
>>both of those definitions?  Well, the access mechanisms defined in
>>the POSIX spec are the "File Access Permissions", right?  So, can we
>>agree that "access mechanisms defined herein" would be the "File
>>Access Permissions"?
>>    
>>
>
>the "access mechanisms defined herein" refer to all file access control 
>mechanisms that POSIX defines. This includes permissions always granted to 
>the owner such as chmod, but also mechanisms such as the restricted deletion 
>flag bit (S_ISVTX) for directories, etc.
>
>Trust me, POSIX is very careful about wording, and if "access mechanisms 
>defined herein" did indeed refer to the file access permissions, then POSIX 
>would say exactly that.
>
>  
>
>>As documented in the algorithm definition in section 3.16.6.3 -
>>"Applying a Mode to an Existing ACL" of the minor version doc, the
>>following is a clarification of the classification:
>>
>>ALLOW ACEs with ACE4_READ_DATA/ACE4_LIST_DIRECTORY, ACE4_WRITE_DATA/
>>ACE4_ADD_FILE, ACE4_APPEND_DATA/ACE4_ADD_SUBDIRECTORY, and
>>ACE4_EXECUTE access mask bits are Alternate security mechanisms.
>>These access mask bits will be disabled upon chmod.
>>
>>DENY ACEs with those access mask bits are Additional access control
>>mechanisms.  These access mask bits will be left unchanged  after a
>>chmod, unless, as described in 3.16.6.3 it is one of the special
>>identifiers, OWNER@, GROUP@, EVERYONE@.
>>    
>>
>
>No, that's still messed up. We don't care about permissions that are not 
>granted, so we *could* only look at ALLOW ACEs, but this distinction is not 
>at all relevant.
>  
>
What?  I don't understand how you can say that "we don't care about 
permissions that are not granted".  We definitely care about permissions 
that are explicitly not granted. 

Also, I believe it is relevant to make a distinction between ALLOW and 
DENY ACEs.  Here's why:

The reasoning behind classifying those DENY ACEs as additional access 
control mechanisms are 1.) because they further restrict the permissions 
of users and groups (which is what additional does by definition) and 
2.) we don't want them to have to be disabled upon chmod.  Try to think 
about it in a way that you have just set an explicit entry to deny 
certain permissions to a supplemental user or group.  It is important 
that those users or groups don't have their permissions elevated after 
chmod.

For example, if you have an ACL such as this:

fred:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::DENY
OWNER@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
GROUP@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
EVERYONE@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW


The mode would be 777.  User fred is denied the ability to read, write 
and execute because of the explicit deny ACE.  After chmod, fred should 
still not be able to read, write and execute.  That is the goal that we 
were trying to meet.

I realize that the mapping that you describe in section 4.4 of 
http://www.suse.de/~agruen/nfs4acl/mapping-nfsv4-acls-to-posix-00.html 
would also give us the capabilities that  I have described above.

With that said, I will go on to describe the capabilities that I feel 
the mapping in section 4.4 lacks.  The capabilities that it lacks is 
where the relevance of having those ALLOW ACEs that I described before 
be considered Alternate access control mechanisms comes in.

The mapping in section 4.4 makes it impossible to do the following by 
*only* modifying the ACL.

The mode of the file is 644 and you want to give fred the ability to 
read, write and execute.

fred:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
OWNER@:READ_DATA/WRITE_DATA/APPEND_DATA::ALLOW
OWNER@:EXECUTE::DENY
GROUP@:READ_DATA::ALLOW
GROUP@:WRITE_DATA/APPEND_DATA/EXECUTE::DENY
EVERYONE@:READ_DATA::ALLOW
EVERYONE@:WRITE_DATA/APPEND_DATA/EXECUTE::DENY

With the classification in 4.4, you can set that ACL, but it won't take 
effect until you also explicitly modify the file group class permissions 
(via a mask or whatever).

The capability to set the type of ACL that is above was the goal when 
classifying ALLOW ACEs as Alternate security access control mechanisms.  
We can do this because as Alternate is defined, it can extend the 
permissions of a user.  Therefore, setting the ACL attribute is all that 
is needed for this to take effect.

---

I am trying to figure out why there has been such a disagreement here 
and perhaps this is another thing that needs to be cleared up.  What 
does the disabling of an alternate access control mechanism mean?  
Certainly it is not that we have to get rid of everything that is in an 
ALLOW ACE every time a chmod is done.

If you had the following ACL:

fred:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
OWNER@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
GROUP@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
EVERYONE@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW

The mode would be 777.  Disabling can be meant that after the chmod, the 
user "fred" should not have more permissions that his respective class.  
So, after a chmod to 770, fred should still be allowed the ability to 
read, write and execute.  This is in how the permissions for fred are 
disabled.  They are being masked down to what the permissions of the 
file group class are.

>What counts is which access mask flags are equivalent to the POSIX Read, 
>Write, and Execute permissions, and which are not: those are the access mask 
>flags which may (sometimes) be used as additional access control mechanisms.
>  
>

What do you mean by sometimes.

>The other issue is which POSIX file class each ACE maps to. Let's assume for 
>now that we only know that OWNER@ maps to the File Owner Class to keep this 
>example short.
>
>Together with these two classifications, we can determine whether an ACE is 
>within the bounds of an additional file access control mechanism. Let's look 
>at the following ACE, and a file which has a file mode of 0740 (rwxr-----):
>
>  OWNER@:READ_DATA/APPEND_DATA/EXECUTE::ALLOW
> 
>
>The OWNER@ ACE maps to the File Owner Class. This means that as an additional 
>access control mechanism, the ACE may not grant more than Read, Write, and 
>Execute. The READ_DATA access mask flag is equivalent to POSIX Read, the 
>APPEND_DATA access mask flag is a subset of POSIX Write, and the EXECUTE 
>access mask flag is equivalent to POSIX Execute, so we are fine.
>
>Now, let's assume that the user does a chmod to mode 0640 (rw-r-----). The 
>permissions of the File Owner Class now no longer cover the EXECUTE 
>permission. There are two options to fix this problem:
>
> 1. either accept that the ACE cannot be part of an additional file
>    access control mechanism, or
>
> 2. disable the EXECUTE access mask flag, either temporarily or
>    permanently, which gets us back into the bounds of additional file
>    access control mechanisms.
>
>In case 1, the only choice that remains is that the ACE must be part of an 
>alternate file access control mechanism (see more on that below). POSIX 
>states that we must disable alternate file access control mechanisms upon 
>chmod and for new files, and they must only be re-enabled per explicit user 
>action. So the EXECUTE permission would be just gone until the user 
>explicitly re-enables it (with something other than a chmod). This would 
>render ACLs practically useless under POSIX.
>  
>

Why wouldn't the EXECUTE permission be able to be re-enabled with 
chmod?  Of course, it can.  If you are setting a mode of 740, that says 
that the owner can execute.  That is an explicit action and EXECUTE 
permission should be granted to the owner.

>In case 2, the ACE still remains within the bounds of additional file access 
>control mechanisms. If we disable EXECUTE only temporarily, then a future 
>chmod back to mode 0740 can simply re-enable EXECUTE, and we will not have 
>lost anything. (Remember, chmod does not disable additional file access 
>control mechanisms.)
>

> 
>
>There are several possibilities how we can disable access mode flags 
>temporarily:
>
> 1. we could add an explicit DENY ACE before the ALLOW ACE that has
>    the affected access mask flags disabled (this is the
>    draft-ietf-nfsv4-acls-00 approach),
>
> 2. we could declare that all access mask flags which go beyond
>    the corresponding File Class are automatically disabled, or
>
> 3. we could introduce file masks as I am proposing.
>
>The file masks have the advantage that the user can easily manually enable 
>more access mask flags in them. This would construe an explicit user action 
>as per POSIX. So depending on which flags the user enables, that may amount 
>to an additional or alternate file access control mechanism. POSIX is 
>perfectly fine with that, even for enabling flags such as WRITE_OWNER. The 
>only thing we must ensure is that alternate flags are disabled upon chmod as 
>well as for new files.
>
>  
>
>>All other access mask bits listed below are outside of the access
>>control mechanisms specified by POSIX and are therefore unclassified
>>and unrestricted:
>>ACE4_READ_NAMED_ATTRS
>>ACE4_WRITE_NAMED_ATTRS
>>ACE4_DELETE_CHILD
>>ACE4_READ_ATTRIBUTES
>>ACE4_WRITE_ATTRIBUTES
>>ACE4_DELETE
>>ACE4_READ_ACL
>>ACE4_WRITE_ACL
>>ACE4_WRITE_OWNER
>>ACE4_SYNCHRONIZE
>>
>>This means that if an ACE defines one of those access mask bits, the
>>access granted or denied will remain unchanged after a chmod.
>>    
>>
>
>I am afraid this is impossible: there is no such thing as being outside the 
>file access control mechanisms defined by POSIX. The reason is simple: POSIX 
>applications absolutely *must* be able to rely on POSIX semantics in order to 
>be able to keep the system secure.
>
>Let's assume that ACE4_WRITE_OWNER was indeed outside of the access control 
>mechanisms defined by POSIX as a counter example. A POSIX application does a 
>chmod to mode 0600 (rw-------) in order to restrict access to the file owner. 
>After that, the application can perfectly well write information that is 
>confidential to the owner into the file -- after all, only the owner will 
>have access, right?
>  
>
>Well, not quite, because an ACL might still grant ACE4_WRITE_OWNER to some 
>other user on the system. That other user could simply take over ownership of 
>the file, and do whatever he wants with it. Here we have it, a perfect 
>security hole; all POSIX applications potentially broken!
>
The owner of the file had taken *explicit* action to grant 
ACE4_WRITE_OWNER to another user on the system.  You say that it is a 
security hole if the user that was explicitly granted the ability to 
write owner is now able to do what they were told they could do?

>
>Therefore, there cannot be any file access control mechanisms which are 
>neither defined by POSIX, nor additional or alternate.
>
>By definition, pure POSIX applications have no idea which additional or 
>alternate file access control mechanisms a particular POSIX implementation 
>may define,
>


> so they cannot know about such sideband mechanisms, and they also 
>have no way of disabling them.
>
>Andreas
>
>  
>

_______________________________________________
nfsv4 mailing list
nfsv4@ietf.org
https://www1.ietf.org/mailman/listinfo/nfsv4

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [nfsv4] Re: NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready
  2006-07-28  6:32           ` Lisa Week
@ 2006-08-01 10:36             ` Andreas Gruenbacher
  0 siblings, 0 replies; 38+ messages in thread
From: Andreas Gruenbacher @ 2006-08-01 10:36 UTC (permalink / raw)
  To: Lisa Week; +Cc: nfs, nfsv4

On Friday 28 July 2006 08:32, Lisa Week wrote:
> >[...] We don't care about permissions that are not
> >granted, so we *could* only look at ALLOW ACEs, but this distinction is
> > not at all relevant.
>
> What?  I don't understand how you can say that "we don't care about
> permissions that are not granted".  We definitely care about permissions
> that are explicitly not granted.

What I mean is that when looking at which permissions go beyond additional 
file access control mechanisms, we don't need to consider DENY ACEs: DENY 
ACEs can only further restrict access, and so they are never alternate file 
access control mechanisms.

> Also, I believe it is relevant to make a distinction between ALLOW and
> DENY ACEs.  Here's why:
>
> The reasoning behind classifying those DENY ACEs as additional access
> control mechanisms are 1.) because they further restrict the permissions
> of users and groups (which is what additional does by definition) and
> 2.) we don't want them to have to be disabled upon chmod.  Try to think
> about it in a way that you have just set an explicit entry to deny
> certain permissions to a supplemental user or group.  It is important
> that those users or groups don't have their permissions elevated after
> chmod.

Yes.

> For example, if you have an ACL such as this:
>
> fred:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::DENY
> OWNER@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
> GROUP@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
> EVERYONE@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
>
>
> The mode would be 777.  User fred is denied the ability to read, write
> and execute because of the explicit deny ACE.  After chmod, fred should
> still not be able to read, write and execute.  That is the goal that we
> were trying to meet.

Yes.

> I realize that the mapping that you describe in section 4.4 of
> http://www.suse.de/~agruen/nfs4acl/mapping-nfsv4-acls-to-posix-00.html
> would also give us the capabilities that  I have described above.

Yes.

---

> With that said, I will go on to describe the capabilities that I feel
> the mapping in section 4.4 lacks.  The capabilities that it lacks is
> where the relevance of having those ALLOW ACEs that I described before
> be considered Alternate access control mechanisms comes in.
>
> The mapping in section 4.4 makes it impossible to do the following by
> *only* modifying the ACL.
>
> The mode of the file is 644 and you want to give fred the ability to
> read, write and execute.
>
> fred:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
> OWNER@:READ_DATA/WRITE_DATA/APPEND_DATA::ALLOW
> OWNER@:EXECUTE::DENY
> GROUP@:READ_DATA::ALLOW
> GROUP@:WRITE_DATA/APPEND_DATA/EXECUTE::DENY
> EVERYONE@:READ_DATA::ALLOW
> EVERYONE@:WRITE_DATA/APPEND_DATA/EXECUTE::DENY
>
> With the classification in 4.4, you can set that ACL, but it won't take
> effect until you also explicitly modify the file group class permissions
> (via a mask or whatever).

In Section 4.6. "Setting File Permissions, File Masks, and ACLs", 
http://www.suse.de/~agruen/nfs4acl/mapping-nfsv4-acls-to-posix-00.html reads:

[] When an ACL is set, the file masks may or may not be set in the same
[] operation. If they are not set in the same operation, each file mask shall
[] implicitly be set to the union of the mask bits of all ACEs that are in
[] the corresponding file class according to Table 1.
[]
[] When a file mask is set, either explicitly or implicitly by setting an ACL,
[] all permissions that active file mask bits correspond to in Table 2 shall
[] be set, and all other permissions shall be cleared.

So setting only the ACL will implicitly modify the file mode permission bits 
as needed. It is important to keep the masks in sync with the ACL, and to 
keep the file permission bits in sync with the masks. Without this behavior, 
setting permissions with ACLs would indeed be painful.

> The capability to set the type of ACL that is above was the goal when
> classifying ALLOW ACEs as Alternate security access control mechanisms.
> We can do this because as Alternate is defined, it can extend the
> permissions of a user.  Therefore, setting the ACL attribute is all that
> is needed for this to take effect.

I agree with you that setting an ACL is an explicit user action, and that this 
action may enable an alternate file access control mechanism. Whether the new 
ACL actually is an alternate file access control mechanism depends on which 
permissions the ACL allows: if it only allows permissions that map to Read, 
Write, and Execute and the file classes include those permissions, then the 
ACL does not actually go beyond additional file access control mechanisms. 
Otherwise, the ACL is an alternate file access control mechanism, and the 
alternate parts of it must be disabled upon chmod.

> ---
>
> I am trying to figure out why there has been such a disagreement here
> and perhaps this is another thing that needs to be cleared up.  What
> does the disabling of an alternate access control mechanism mean?
> Certainly it is not that we have to get rid of everything that is in an
> ALLOW ACE every time a chmod is done.

Indeed, we only have to disable what goes beyond an additional file access 
control mechanism.

> If you had the following ACL:
>
> fred:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
> OWNER@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
> GROUP@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
> EVERYONE@:READ_DATA/WRITE_DATA/APPEND_DATA/EXECUTE::ALLOW
>
> The mode would be 777.  Disabling can be meant that after the chmod, the
> user "fred" should not have more permissions that his respective class.
> So, after a chmod to 770, fred should still be allowed the ability to
> read, write and execute.  This is in how the permissions for fred are
> disabled.  They are being masked down to what the permissions of the
> file group class are.

Yes, exactly.

> >What counts is which access mask flags are equivalent to the POSIX Read,
> >Write, and Execute permissions, and which are not: those are the access
> > mask flags which may (sometimes) be used as additional access control
> > mechanisms.
>
> What do you mean by sometimes.

Consider your example ACL from above, and a chmod to 0750. In that case, we 
need to disable WRITE_DATA and APPEND_DATA for Fred and GROUP@, and 
READ_DATA, WRITE_DATA, APPEND_DATA, and EXECUTE for EVERYONE@. So when the 
File Group Class contains the Write permission, WRITE_DATA and APPEND_DATA 
are perfectly fine as an additional file access control mechanism. Removing 
Write from the File Group Class causes WRITE_DATA and APPEND_DATA to become 
Alternate, and we must make sure to disable them.

In mapping-nfsv4-acls-to-posix-00, I said the same thing like this:

[] Flags classified as additional are equivalent to or a subset of the
[] designated POSIX permission. If the file class of an ACE (see Section 4.1)
[] includes this permission, the ACE may grant this permission as part of an
[] additional file access control mechanism.

> >The other issue is which POSIX file class each ACE maps to. Let's assume
> > for now that we only know that OWNER@ maps to the File Owner Class to
> > keep this example short.
> >
> >Together with these two classifications, we can determine whether an ACE
> > is within the bounds of an additional file access control mechanism.
> > Let's look at the following ACE, and a file which has a file mode of 0740
> > (rwxr-----):
> >
> >  OWNER@:READ_DATA/APPEND_DATA/EXECUTE::ALLOW
> >
> >
> >The OWNER@ ACE maps to the File Owner Class. This means that as an
> > additional access control mechanism, the ACE may not grant more than
> > Read, Write, and Execute. The READ_DATA access mask flag is equivalent to
> > POSIX Read, the APPEND_DATA access mask flag is a subset of POSIX Write,
> > and the EXECUTE access mask flag is equivalent to POSIX Execute, so we
> > are fine.
> >
> >Now, let's assume that the user does a chmod to mode 0640 (rw-r-----). The
> >permissions of the File Owner Class now no longer cover the EXECUTE
> >permission. There are two options to fix this problem:
> >
> > 1. either accept that the ACE cannot be part of an additional file
> >    access control mechanism, or
> >
> > 2. disable the EXECUTE access mask flag, either temporarily or
> >    permanently, which gets us back into the bounds of additional file
> >    access control mechanisms.
> >
> >In case 1, the only choice that remains is that the ACE must be part of an
> >alternate file access control mechanism (see more on that below). POSIX
> >states that we must disable alternate file access control mechanisms upon
> >chmod and for new files, and they must only be re-enabled per explicit
> > user action. So the EXECUTE permission would be just gone until the user
> > explicitly re-enables it (with something other than a chmod). This would
> > render ACLs practically useless under POSIX.
>
> Why wouldn't the EXECUTE permission be able to be re-enabled with
> chmod?  Of course, it can.

Chmod must disable alternate file access control mechanisms as per the POSIX 
definitions, and so if we classified EXECUTE as alternate, a chmod could not 
re-enable it.

> If you are setting a mode of 740, that says that the owner can execute.

Yes. More precisely, it says the owner may be allowed to execute; additional 
file access control mechanisms may further restrict access, and deny the 
owner that permission.

> That is an explicit action and EXECUTE permission should be granted to the
> owner.

Ouch. Setting the mode to 740 is a chmod, right? Chmod is the one explicit 
action for which POSIX defines that it must disable alternate file access 
control mechanisms. The other explicit action that POSIX mentions is file 
creation, for which alternate file access control mechanisms must also be 
disabled. So please let's not mix things up here, and let's refrain from 
calling chmod an explicit action in this context.

> >In case 2, the ACE still remains within the bounds of additional file
> > access control mechanisms. If we disable EXECUTE only temporarily, then a
> > future chmod back to mode 0740 can simply re-enable EXECUTE, and we will
> > not have lost anything. (Remember, chmod does not disable additional file
> > access control mechanisms.)
> >
> >There are several possibilities how we can disable access mode flags
> >temporarily:
> >
> > 1. we could add an explicit DENY ACE before the ALLOW ACE that has
> >    the affected access mask flags disabled (this is the
> >    draft-ietf-nfsv4-acls-00 approach),
> >
> > 2. we could declare that all access mask flags which go beyond
> >    the corresponding File Class are automatically disabled, or
> >
> > 3. we could introduce file masks as I am proposing.
> >
> >The file masks have the advantage that the user can easily manually enable
> >more access mask flags in them. This would construe an explicit user
> > action as per POSIX. So depending on which flags the user enables, that
> > may amount to an additional or alternate file access control mechanism.
> > POSIX is perfectly fine with that, even for enabling flags such as
> > WRITE_OWNER. The only thing we must ensure is that alternate flags are
> > disabled upon chmod as well as for new files.
> >
> >>All other access mask bits listed below are outside of the access
> >>control mechanisms specified by POSIX and are therefore unclassified
> >>and unrestricted:
> >>ACE4_READ_NAMED_ATTRS
> >>ACE4_WRITE_NAMED_ATTRS
> >>ACE4_DELETE_CHILD
> >>ACE4_READ_ATTRIBUTES
> >>ACE4_WRITE_ATTRIBUTES
> >>ACE4_DELETE
> >>ACE4_READ_ACL
> >>ACE4_WRITE_ACL
> >>ACE4_WRITE_OWNER
> >>ACE4_SYNCHRONIZE
> >>
> >>This means that if an ACE defines one of those access mask bits, the
> >>access granted or denied will remain unchanged after a chmod.
> >
> >I am afraid this is impossible: there is no such thing as being outside
> > the file access control mechanisms defined by POSIX. The reason is
> > simple: POSIX applications absolutely *must* be able to rely on POSIX
> > semantics in order to be able to keep the system secure.
> >
> >Let's assume that ACE4_WRITE_OWNER was indeed outside of the access
> > control mechanisms defined by POSIX as a counter example. A POSIX
> > application does a chmod to mode 0600 (rw-------) in order to restrict
> > access to the file owner. After that, the application can perfectly well
> > write information that is confidential to the owner into the file --
> > after all, only the owner will have access, right?
> >
> >
> >Well, not quite, because an ACL might still grant ACE4_WRITE_OWNER to some
> >other user on the system. That other user could simply take over ownership
> > of the file, and do whatever he wants with it. Here we have it, a perfect
> > security hole; all POSIX applications potentially broken!
>
> The owner of the file had taken *explicit* action to grant ACE4_WRITE_OWNER
> to another user on the system. 

The owner takes explicit action to grant ACE4_WRITE_OWNER to another user on 
the system, which is beyond what POSIX defines. Then a POSIX process on 
behalf of the owner (or an admin) does a chmod to 0600. From all the POSIX 
process knows, the file can now only be accessed by the owner; there is 
nothing that keeps POSIX processes from making this assumption. To the POSIX 
process, chmod is a mechanism to enforce restricted access. Now if we let 
ACE4_WRITE_OWNER survive the chmod, we break this basic assumption, and 
nothing will guarantee that the intentions of the file owner combined with 
the valid assumptions of POSIX processes will lead to a secure system.

> You say that it is a security hole if the user that was explicitly granted
> the ability to write owner is now able to do what they were told they could
> do?

If that permission was granted by explicit user action without intervening 
chmod, no. After chmod, yes. It is not enough to look at the intentions of 
the file owner alone. We must also look at interactions with other actors 
that may have incomplete knowledge and different assumptions.

Andreas

-- 
Andreas Gruenbacher <agruen@suse.de>
Novell / SUSE Labs

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2006-08-01 10:40 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-07-03 21:10 NFSv4 ACL and POSIX interaction / mask Andreas Gruenbacher
2006-07-07 11:55 ` NFSv4 ACL and POSIX interaction / mask, draft-ietf-nfsv4-acls-00 not ready Andreas Gruenbacher
2006-07-08  3:45   ` Sam Falkner
2006-07-08  6:51     ` [nfsv4] " Lisa Week
2006-07-10 21:09       ` Andreas Gruenbacher
2006-07-08 14:32     ` Sam Falkner
2006-07-09 16:22     ` [nfsv4] " Andreas Gruenbacher
2006-07-10 13:29       ` Sam Falkner
2006-07-10 14:15         ` [nfsv4] " J. Bruce Fields
2006-07-10 15:32           ` Sam Falkner
2006-07-10 18:57             ` [NFS] " J. Bruce Fields
2006-07-10 22:26               ` [nfsv4] " Sam Falkner
2006-07-10 22:39                 ` J. Bruce Fields
2006-07-10 22:43                   ` J. Bruce Fields
2006-07-11  0:44                   ` Andreas Gruenbacher
2006-07-11  0:15             ` Andreas Gruenbacher
2006-07-11  5:42               ` [nfsv4] " Sam Falkner
2006-07-11  8:05                 ` Andreas Gruenbacher
2006-07-11 12:29                   ` [nfsv4] " Sam Falkner
2006-07-11 13:46                     ` J. Bruce Fields
2006-07-15 13:56                       ` [nfsv4] " Sam Falkner
2006-07-11  0:01           ` Andreas Gruenbacher
2006-07-11  0:28             ` [nfsv4] " J. Bruce Fields
2006-07-11  0:48               ` Andreas Gruenbacher
2006-07-10 22:50         ` Andreas Gruenbacher
2006-07-11  6:17           ` [nfsv4] " Sam Falkner
2006-07-11  8:45             ` Andreas Gruenbacher
2006-07-11 12:44               ` [nfsv4] " Sam Falkner
2006-07-11  6:50       ` Lisa Week
2006-07-11  8:55         ` Andreas Gruenbacher
2006-07-27  0:59         ` Andreas Gruenbacher
2006-07-27  2:57           ` Andreas Gruenbacher
2006-07-28  6:32           ` Lisa Week
2006-08-01 10:36             ` [nfsv4] " Andreas Gruenbacher
2006-07-14 17:59   ` [NFS] " J. Bruce Fields
2006-07-14 18:22     ` J. Bruce Fields
2006-07-14 19:02     ` Andreas Gruenbacher
2006-07-14 19:13       ` J. Bruce Fields

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.