home *** CD-ROM | disk | FTP | other *** search
/ Hackers Toolkit v2.0 / Hackers_Toolkit_v2.0.iso / HTML / archive / Rainbow / ncsc / grayncsc.txt < prev    next >
Text File  |  1999-11-04  |  144KB  |  3,282 lines

  1. TRUSTED UNIX WORKING GROUP 
  2.  
  3. (TRUSIX) RATIONALE FOR SELECTING ACCESS
  4. CONTROL LIST FEATURES FOR THE UNIX SYSTEM
  5.  
  6. NCSC-TG₧020-A 
  7.  
  8. Library No. 5-232,508 
  9.  
  10. FOREWORD
  11.  
  12. The National Computer Security Center (NCSC) formed the Trusted UNIX
  13. Working Group (TRUSIX) in 1987 to provide technical guidance to vendors
  14. and evaluators involved in the development of Trusted Computer System
  15. Evaluation Criteria (TCSEC) class B3 trusted UNIX* systems. The NCSC
  16. specifically targeted the UNIX operating system for this guidance because
  17. of its growing popularity among the government and vendor communities. By
  18. addressing the class B3 issues, the NCSC believes that this information
  19. will also help vendors understand how evaluation interpretations will be
  20. made at the levels of trust below this class. TRUSIX is making no attempt
  21. to address the entire spectrum of technical problems associated with the
  22. development of division B systems; rather, the intent is to provide
  23. examples of implementations of those security features discernible at the
  24. user interface that will be acceptable at this level of trust. 
  25.  
  26. TRUSIX is not intended to be a standards body. nor does it intend to
  27. produce a de facto standard to compete against POSIX. Additionally, the
  28. TRUSIX documents are not to be construed as supplementary requirements to
  29. the TCSEC. The TCSEC is the only metric against which the trustworthiness
  30. of an operating system will be evaluated. 
  31.  
  32. This document, "Rationale for Selecting Access Control List (ACL) Features
  33. for the UNIX System," is the first in a series of companion documents
  34. being produced by TRUSIX. The guidelines described in this document
  35. provide alternative methods for implementing ACLs in the UNIX system. 
  36.  
  37. UNIX is a registered trademark of AT&T 
  38.  
  39. Recommendations for revision to this guideline are encouraged and will be
  40. reviewed periodically by the NCSC. Address all proposals for revision
  41. through appropriate channels to: 
  42.  
  43.      National Computer Security Center 
  44.      9800 Savage Road 
  45.      Fort George G. Meade. MD 20755-6000 
  46.  
  47. Attention: Chief, Technical Guidelines Division 
  48.  
  49. 18 August 1989 
  50.  
  51.      Patrick R. GALLAGHER JR 
  52.      Director 
  53.      National Computer Security Center 
  54.  
  55. ACKNOWLEDGMENTS
  56.  
  57. Special recognition is extended to those members of the TRUSIX Working
  58. Group who participated in the Access Control List Subcommittee. Members of
  59. this subcommittee were: Craig Rubin. AT&T Bell Laboratories (Co-Chair);
  60. Holly Traxler, National Computer Security Center (NCSC)/Institute for
  61. Defense Analyses (IDA) (Co-Chair); Bruce Calkins. NCSC; and Casey
  62. Schaufler9 Sun Microsystems. Recognition is also extended to the following
  63. members of TRUSIX who provided input through discussion and comments:
  64. Bernie Badger, Harris Corporation; Caralyn Crescenzi, NCSC; Cynthia
  65. Irvine, Gemini Computers; Howard Israel, AT&T Bell Laboratories; Frank
  66. Knowles. MITRE; James Menendez. NCSC; Dr. Eric Roskos, IDA; Rick
  67. Siebenaler. NCSC, Lucy Stasiak, AT&T Bell Laboratories; Albert Tao, Gemini
  68. Computers; Dr. Charles Testa, Infosystems Technology, Incorporated (IT!),
  69. Mario Tinto, NCSC; Grant Wagner. NCSC; Larry Wehr, AT&T Bell Laboratories;
  70. and Bruce D. Wilner. IT!. 
  71.  
  72. Acknowledgment is also extended to the members of the POSIX P1003.6
  73. Security Subcommittee and to those members of the computer security
  74. community who contributed their time and expertise by actively
  75. participating in the review of this document. 
  76.  
  77. EXECUTIVE SUMMARY
  78.  
  79. The Trusted UNIX Working Group (TRUSIX) has examined the issues
  80. surrounding implementation of access control lists (ACLs) in the UNIX
  81. System and has identified a set of recommendations for implementors of ACL
  82. features. These recommendations balance issues of compatibility with
  83. existing applications, ease of use and acceptability to the end user9 and
  84. architectural simplicity with the requirements for systems evaluated
  85. according to the Trusted Computer System Evaluation Criteria (TCSEC). The
  86. recommendations reflect the collected opinions and analyses of the
  87. participating vendors, evaluators, and researchers regarding
  88. implementation of ACL features. 
  89.  
  90. The recommendations of TRUSIX with regard to ACLs are as follows: 
  91.  
  92.      ₧ ACLs are required for files9 IPC objects, and UNIX system domain
  93.      sockets. 
  94.  
  95.      Access control for sockets that use name spaces other than those
  96.      local to the UNIX system (UDP, TCP) must be addressed in the
  97.      specification and evaluation of the system involved, and are neither
  98.      explicitly recommended nor exempted. 
  99.  
  100.      ₧ Access modes specifiable via ACLs should include read, write, and
  101.      execute; other modes should be allowed to be added as desired, but no
  102.      additional modes should be required to be supported. 
  103.      ₧ Each ACL entry should specify permissions for either a user or a
  104.      group, but not both. 
  105.      ₧ Permissions granted by an ACL entry are masked by the group class
  106.      file permission bits. 
  107.      ₧ Multiple concurrent groups should be supported. In addition, some
  108.      method of group subsetting should be provided. It is recommended that
  109.      this subsetting allow the user to become a member of only one group
  110.      at login time, then to dynamically add groups to or delete groups
  111.      from the working group set as required. 
  112.      ₧ A system-defined ordering of ACL evaluation that evaluates from
  113.      most specific to least specific is recommended. Where multiple
  114.      concur~nt groups are in use, and more than one matching group is
  115.      found in the ACL, permissions granted by all matching groups should
  116.      be ORed together. 
  117.      ₧ Modifications to mechanisms that change ownership, change the file
  118.      permission bits, or access object attributes are not recommended. 
  119.  
  120. Existing mechanisms for object access, inquiry, and deletion should not be
  121. changed, and new parameters should not be added. Instead, new mechanisms
  122. should be created that make use of existing ones.- The interface for
  123. mechanisms that create objects should not be changed, except for the
  124. possible creation of a default ACL. 
  125.  
  126.      ₧ For the new mechanisms that are added to support ACL operations,
  127.      get/set operations should be used. These operations should be
  128.      implemented via a single system call with command arguments to
  129.      specify the various operations. For commands at the user interface,
  130.      the names getacl and setacl are recommended. 
  131.      ₧ Named ACLs need not be supported. 
  132.      ₧ Provision of default ACLs for file system objects is recommended,
  133.      along with a user-specifiable mechanism for indicating whether or not
  134.      they should be used. 
  135.      ₧ Provision of default ACLs for [PC objects is not recommended. 
  136.      ₧ Default ACLs should be provided on a per-directory basis.
  137.      Newly-created subdirectories should inherit the default ACL of the
  138.      parent directory. 
  139.      ₧ When a new object is created and ACL entries are attached via a
  140.      default ACL. the file group-class permission bits are not affected
  141.      unless an explicit mechanism is provided. 
  142.  
  143. The preceding list summarizes the recommendations of the Trusted UNIX
  144. Working Group. The main body of this document discusses the rationale for
  145. these recommendations and gives further details of the recommendations
  146. themselves. The appendix, the TRUSIX ACL Worked Example, gives an example
  147. of how these recommendations might be implemented. 
  148.  
  149. introduction
  150.  
  151. The intent of this document is to explore the issues involved in extending
  152. the UNIX System discretionary access control (DAC) mechanism. DAC is a
  153. means of controlling access to an object based on the identity of subjects
  154. and/or groups to which they belong. The controls are discretionary in the
  155. sense that they are chosen by the object owner. 
  156.  
  157. The DAC mechanism employed in the current UNIX System was designed for
  158. efficiency, flexibility. and ease of use. This mechanism allows and
  159. encourages the sharing of information, but at a very coarse granularity,
  160. via the use of file permission bits. File permission bits are associated
  161. with three classes: owner (sometimes referred to as "user"), group. and
  162. other. Access for each class is represented by a three-bit field allowing
  163. for read, write, and execute-permissions. 
  164.  
  165. Several methods exist for allowing discretionary access control on
  166. objects. These methods include capabilities, profiles. access control
  167. lists (ACLs), protection bits, and password DAC mechanisms. The intent was
  168. to select a DAC mechanism with finer granularity than the current file
  169. permission bits, while maximizing the compatibility with both the current
  170. mechanism and POSIX P1003.1. Review of the 
  171.  
  172. methods described in A Guide to Understanding Discretionary Access Control
  173. in Trusted Systems(2], and of the desired outcome, point to the use of
  174. ACLs. It should be noted that ACLs can be considered a straightforward
  175. extension of the existing 
  176.  
  177.      UNIX is a registered trademark of AT&T 
  178.  
  179. UNIX system protection bits, since the protection bits may be interpreted
  180. to be a limited form of an ACL, which always contains three entries. It
  181. has been suggested that the fine granularity of coritrol provided by ACLs
  182. may be simulated in UNIX systems by using the group mechanism. Groups are
  183. lists of users which may be used to specify who may access a file. In the
  184. worst case9 all possible combinations of users would have to be
  185. represented in order to fully implement these lists. This corresponds to
  186. (2'₧"M-1) groups, where M is the number of bits in the group-ID. Since the
  187. number of possible combinations of users needed to implement this scheme
  188. for N users is (2"N-1), the maximum number of users which could
  189. effectively utilize such a system would be limited to the number of bits
  190. in the group-ID. This number (often 16 or 32) is an unreasonably small
  191. number for most UNIX systems and the management of the groups by users
  192. would be difficult. Also, this scheme does not allow for individual users
  193. in the lists to have different access rights. All users in the group would
  194. be forced to have the access rights given by the file group class
  195. permission bits. Some differences in access rights could be simulated by
  196. using the file other class permission bits, but not with the same
  197. functionality as provided by conventional ACLs. 
  198.  
  199. The DAC features explored in this rationale are based on the DAC features
  200. requested by customers, the class B3 DAC requirements described in the DoD
  201. Trusted Computer Systems Evaluation Criteria [1] (TCSEC), and the DAC
  202. mechanisms used in existing trusted systems (e.g., Multics). Based on
  203. these inputs9 it has been determined that the current DAC mechanism in the
  204. UNIX System is adequate for most needs and that the only enhancement
  205. required is to allow reasonable, finer-grained control of objects. This
  206. provides the capability to share or deny access to individually specified
  207. users and/or groups and meets the class B3 requirements of the TCSEC. 
  208.  
  209. The issues explored in this document will deal primarily with ACLs. Much
  210. of the terminology has been adopted from the P1003.1 document and the
  211. TCSEC; however, new terms will be defined when used. For most of the
  212. issues identified, alternative solutions are given along with a
  213. recommendation. Although an attempt was made to consider the' issues
  214. independently, it should be noted that sole of the issues are actually
  215. very dependent on each other and recommendations `made in some areas
  216. greatly influenced later recommendations. 
  217.  
  218. Goals
  219.  
  220. The primary goal in extending discretionary access control in the UNIX
  221. system is to provide a finer graninlarity of control in specifying user
  222. and/or group access to objects. This can be achieved through the addition
  223. of access control lists. The following is a list of additional goals for
  224. the extended DAC mechanism: 
  225.  
  226.      ₧ The mechanism should provide compatibility with the existing
  227.      (currently P1003.1) and emerging POSIX standards and with the current
  228.      UNIX System DAC mechanism. In the unlikely event of a conflict
  229.      between the current UNIX System DAC mechanism and POSIX, the POSIX
  230.      interpretation will be used. In addition. the semantics of existing
  231.      interfaces should be maintained. 
  232.      ₧ The following requirements for DAC in the TCSEC at class B3 should
  233.      be fulfilled. "The TCB shall define and control access between named
  234.      users and named objects (e.g., files and programs) in the ADP system.
  235.      The enforcement mechanism (e .g., access control lists) shall allow
  236.      users to specify and control sharing of those objects, and shall
  237.      provide controls to limit propagation of access rights. The
  238.      discretionary access control mechanism shall either by explicit user
  239.      action or by default, provide that objects are protected from
  240.      unauthorized access. These access controls shall be capable of
  241.      specifying, for each named object, a list of named individuals and a
  242.      list of groups of named individuals with their respective modes of
  243.      access to that object. Furthermore. for each such named object, it
  244.      shall be possible to specify a list of named individuals and a list
  245.      of groups of named individuals for which no access to the object is
  246.      to be given. Access permissions to an object by users not already
  247.      possessing access permission shall only be assigned by authorized
  248.      users." 
  249.      ₧ Reasonable vendor extensions to the DAC mechanism should not be
  250.      precluded. 
  251.  
  252.      For example, the specification of read, write and execute permissions
  253.      should be supported. Other permissions should not be required nor
  254.      should they be precluded as extensions. 
  255.  
  256.      ₧ A minimum set of new interfaces and error codes should be provided.
  257.      The new command interfaces provided for the user must be easy to use
  258.      and the existing interfaces should continue to work as expected. 
  259.      ₧ Intermixing use of the existing and newly-defined DAC
  260.      functions/commands should provide reasonable results. Security should
  261.      be maximized by opting for more restrictive rather than less
  262.      restrictive decisions ~h~ff₧' a choice must be made. 
  263.      ₧ When changing DAC on an object, at no time shall access be more
  264.      permissive than either the initial or resulting access. 
  265.  
  266. ACLs On Objects
  267.  
  268. A system can support several different types of objects, e.g., system
  269. objects, public objects, named objects. System objects are entities
  270. internal to the TCB (e.g., system data structures) not directly accessible
  271. by the normal user and, as such, do not require discretionary access
  272. control. Public objects are objects readable but unmodifiable to the
  273. normal user (e.g., system clock)9 and thus also do not require
  274. discretionary access control. Named objects are objects readable and
  275. modifiable at the user interface (e.g., text files). The TCSEC class B3
  276. requirement for DAC states that access control must be enforced on all
  277. named objects in the system [1]. Although there may be some variance among
  278. different UNIX system implementations, there are two common classes of
  279. named objects that require ACLs. These classes are files (including
  280. regular. directory. special. and named pipes), and named IPC objects
  281. (including shared memory, message queues, semaphores, and sockets). 
  282.  
  283. It is these classes of objects that will be protected by the discretionary
  284. access control alternatives described later in the paper. It should be
  285. pointed out, however, that discretionary access can not always be
  286. completely determined solely by the file permission bits and the ACL
  287. associated with the object. It is possible to have objects which have been
  288. administratively configured for a specific access and thus not completely
  289. affected by user DAC, e.g., a file system mounted read-only. There are
  290. other instances where discretionary access of objects may be
  291. time-dependent and thus not completely based on a current DAC setting.
  292. Examples of this would be the inability to write a shared-text file while
  293. it is being executed or trying to execute a file while it is open for
  294. writing. These situations are acknowledged special cases and will not be
  295. considered in the general discussion of determining effective
  296. discretionary access. 
  297.  
  298. ACLs On IPC Objects
  299.  
  300. IPC objects are named objects and are thus require ACLs at class B3. Note
  301. that this does not include unnamed pipes which can only be used to connect
  302. related processes. Although the semantics of IPC mechanisms are slightly
  303. different from those of file system objects, a DAC scheme similar to that
  304. used for file sky5~~~ objects should easily be adaptable to IPC objects.
  305. For example, message queues utilize both a creator and an owner of an IPC
  306. object and maintain creator and owner UIDs and G[Ds (cuid,uid, cgid,gid).
  307. User access is checked against the cuid and the uid, and group access is
  308. checked against the cgid and gid. This situation can easily be represented
  309. with ACLs by using additional ACL entries to represent the creator U[D and
  310. GID. Additionally, some access modes associated with file system objects,
  311. such as execute, may not be applicable to IPC objects. This does not cause
  312. a problem as long as the modes are a subset of those defined for file
  313. system objects. 
  314.  
  315. ACLs On Sockets
  316.  
  317. Sockets are named objects and would thus require ACLs at class 83. UNIX
  318. system domain sockets use the file system name space for access control
  319. decisions and currently have file permission bits associated with them.
  320. Thus, domain sockets would also need to have ACLs associated with them.
  321. Other types of sockets which use other name spaces (UDP. TCP) are
  322. currently not protected with any type of access control. Since it is not
  323. clear whether these types of sockets could currently be included in an
  324. evaluated configuration, they will not be addressed at this time. 
  325.  
  326. Additional Access Modes
  327.  
  328. Existing UNIX systems support three access modes: read, ivrite, and
  329. execute/search. Additional access modes are conceivable, and may be
  330. convenient to add while adding ACLs. Various possibilities include: 
  331.  
  332.      ₧ read attributes of object 
  333.      ₧ write attributes of object 
  334.      ₧ append only to object 
  335.      ₧ truncate data of object 
  336.      ₧ delete object 
  337.      ₧ lock object 
  338.      ₧ restrict setuid execution of object 
  339.      ₧ restrict access of object based on time. 
  340.  
  341. Note that this is not an' all-inclusive list. 
  342.  
  343. In this and subsequent sections, alternative implementations of a given
  344. topic are examined, followed by the TRUSIX recommendation. 
  345.  
  346. Require Additional Access Modes
  347.  
  348. In this approach to handling additional access modes, new access modes
  349. would be defined and required. This limits the availability of compliant
  350. implementations and impacts compatibility. 
  351.  
  352. Prohibit Additional Access Modes
  353.  
  354. In this approach, new access modes would explicitly not be allowed. Due to
  355. loss of flexibility, compliance with this scheme would limit
  356. implementation. 
  357.  
  358. 43 Allow Additional Access Modes (With Control) 
  359.  
  360. In this approach, new access modes would not be defined. Instead. the
  361. concept of and mechanism for adding new access modes would be defined.
  362. This allows a vendor to produce whatever additional access modes are
  363. desired. Since the mechanism for doing so is defined there is little
  364. chance of collisions or contradictions. The mechanisms must be defined and
  365. agreed upon by some regulating body which allocates access bits. Note no
  366. such body currently exists which has been tasked to allocate access bits. 
  367.  
  368. Allow Additional Access Modes (Without Control)
  369.  
  370. In this approach, additional access modes are neither defined nor
  371. precluded. This method allows a vendor to produce whatever additional
  372. access modes are desired, but there is no mechanism provided for adding
  373. new modes. There would be no control on the access modes vendors might
  374. add. 
  375.  
  376. Recommendation
  377.  
  378. We recommend allowing additional access modes, without control. There
  379. should be nothing precluding the addition of new access modes if desired.
  380. However, since there is nothing currently in the POSIX P1003.1 standard
  381. concerning additional access modes, no new access modes or mechanisms need
  382. be defined. 
  383.  
  384. ACL Entry Type And Format
  385.  
  386. The manner in which an ACL entry refers to a user or group of users is an
  387. important factor in the usability of an ACL mechanism. The alternatives
  388. are to have an ACL entry contain either a user or group in an entry. or to
  389. have an ACL entry contain both a user and group. The issue is which of the
  390. alternatives is more suitable to a system utilizing ACLs. 
  391.  
  392. 5.1 User And Group Entries
  393.  
  394. A user and group entry contains a reference to both a specific user and a
  395. specific group together as a [UID,GID] pair. The UID-specific and
  396. GID-specific entries can be represented as special "wildcard" cases
  397. (denoted by *) meaning any user or group will match that entry. Using this
  398. method, an ACL entry may refer to one user in a particular group
  399. [UID,GID], one user in any group [UID,*], any user in a particular group
  400. [*,GID], or any user in any group [*,*] which is equivalent to the file
  401. other class permission bits. A typical ACL utilizing entries of this type
  402. might look like the following: 
  403.  
  404. user1.projA rw- 
  405.  
  406. user2.projB r- 
  407.  
  408. user3.* rwx 
  409.  
  410. *.projA r- 
  411.  
  412. *.* --- 
  413.  
  414. Implementations of protected subsystems is the only clear example that
  415. suggests using user and group ACL entries as a pair. Using the UNIX system
  416. setgid-on-exec feature, it is possible to build protected subsystems.
  417. Consider the following example which makes use of this feature. 
  418.  
  419. A database of tapes is maintained in /etc/tapedata. The database
  420. administrator (DBA) of the database wishes to produce a utility to control
  421. access to this database. To begin with, there are some rules for dealing
  422. with the database. Some users should have read and write access, others
  423. just read access, and still others should have no access to the database.
  424. Readers should only see data about their own tapes. In addition, since
  425. other database utilities have poor error handling, all updates to the
  426. database need to be made in the correct format. 
  427.  
  428. The DBA has written a utility named tapedb which can read and update the
  429. database. /etc/tapedata and tapedb both have the group tape associated
  430. with them, and tapedb has the set-group-id bit on. The DBA has also
  431. created an ACL for letc/tapedata which contains the following entries: 
  432.  
  433. userl.tape r- 
  434.  
  435. user2.tape r- 
  436.  
  437. user3.tape rv- 
  438.  
  439. user4.tape rv- 
  440.  
  441. *.* 
  442.  
  443. All users named in the ACL (in group tape) may read the database Only
  444. user3 and user4 (in group tape) may update the database. If the only way
  445. for a user to be a member of group tape is by executing tapedb, then the
  446. DBA is satisfied that letc/tapedata is adequately protected. 
  447.  
  448. While this example suggests a useful application of user and group ACL
  449. entries, there are other ways to implement the example which do not
  450. require this ACL entry type functionality. As described in the following
  451. section, the same effect can be achieved through ACLs containing user or
  452. group entries.` 
  453.  
  454. Additionally, identification by a user and group pair is not used in a
  455. UNIX System. In some systems, a user is identified by a userID,group~ID
  456. pair. In Multics, for example, a user is identified by a user-ID,
  457. project-ID pair. where a project-ID is equivalent to a group-ID on the
  458. UNIX system. Userl in projA. on a Multics system, is distinct from userl
  459. in projB. Since Multics users do not have the capability to change groups9
  460. the only way for a user to be identified with another project would be to
  461. log in with another group-ID. In UNIX systems, however. a user is really
  462. only identified by the user-ID. Also, a user can easily change group-ID
  463. through the neivgrp command or be associated with several groups at the
  464. same time if using a system with multiple groups. Thus, controlling access
  465. for a user while in a specific group is not as useful in a UNIX system. 
  466.  
  467. User Or Group Entries
  468.  
  469. A user or group entry contains a reference to either a specific user or a
  470. specific group, but only one at a time. Consider the following example,
  471. where u indicates the user class, g indicates the group class, and o
  472. indicates the other class: 
  473.  
  474. u:userl rw- 
  475.  
  476. u:user2 r- 
  477.  
  478. u:user3 rw- 
  479.  
  480. u:user4 rw- 
  481.  
  482. g:projA r- 
  483.  
  484. g:projs rw- 
  485.  
  486. o: rw- 
  487.  
  488. To address the protected subsystem implementation, consider again the tape
  489. database example described in the previous section. Rather than
  490. controlling access to the data, access can be controlled on two
  491. subprograms; one which reads data, the other which updates data. The ACL
  492. on the database, /etc/tapedata would be: 
  493.  
  494. g:tapereaders r- 
  495.  
  496. g:tapewriters rw- 
  497.  
  498. o: 
  499.  
  500. The user interface for access to the database is tapedb. The program
  501. tapedb is not setgid, however, it invokes two other programs, tapedbread
  502. and tapedb\vrite, that are setgid. Only users allowed to read the database
  503. have execute permission on topedbread, while only those allowed to update
  504. the database may execute tapedb_write. The ACL on tapedbread would be: 
  505.  
  506. u:userl --x 
  507.  
  508. u:user2 --x 
  509.  
  510. u:user3 --x 
  511.  
  512. u:user4 --x 
  513.  
  514. o: 
  515.  
  516. The ACL on tapedb_write would be: 
  517.  
  518. u:user3 --x 
  519.  
  520. u:user4 --x 
  521.  
  522. o: 
  523.  
  524. The program tapedb_read runs setgid to the group tapereaders, and the
  525. program taped_vrite runs setgid to the group tapewriters. 
  526.  
  527. Thus, the same protected subsystem can be provided through ACLs of type
  528. user or group. 
  529.  
  530. The main advantage of this scheme is that it provides more clarity for the
  531. user. This is considered to be a very important advantage as a user's
  532. understanding of such a mechanism is essential in promoting its correct
  533. usage. Additionally, this scheme removes the need for wildcard specifiers,
  534. thus eliminating the potential problems of picking an unused character as
  535. a specifier. 
  536.  
  537. Recommendation
  538.  
  539. User or group entries in ACLs are recommended. Since there is no clear
  540. need for the user-group paired entry scheme and there are several
  541. advantages to the user or group scheme, the user or group scheme is the
  542. preferred alternative. Examples were examined which claimed to require the
  543. use of user-group paired entries. One such example deals with protected
  544. subsystems as described above. Protected subsystems, a useful and
  545. important feature in a trusted system, can be implemented through other
  546. means not requiring user-group paired entries. We have "found that this is
  547. a limited class of applications and may be implemented with the user or
  548. group scheme with minimal effort. For UNIX systems with multiple groups,
  549. the user and group scheme becomes more difficult when determining access.
  550. Additionally, the user or group scheme follows the idea in UNIX systems
  551. that a user is only identified by user-ID and gives no special meaning to
  552. what a user can do while only in a certain group. Finally, although
  553. simplicity is a very subjective measure, in comparing the two alternatives
  554. the advantage of simplicity outweighs the ability to specify both a user
  555. and a group in a single entry. 
  556.  
  557. Relationship Of ACL And File Permission Bits
  558.  
  559. ACLs expand upon the discretionary access control facility which is
  560. already provided by the file permission bits. Although file permission
  561. bits do not meet the TCSEC class B3 requirement for DAC, they are
  562. sufficient for many uses and are the only mechanism available to existing
  563. applications. Existing applications that are security-conscious use file
  564. permission bits to control access. The relationship between the ACL and
  565. the file permission bits is important to existing programs in order to
  566. maintain compatibility. For example, use of chmod("object" 0) should
  567. continue to work, denying subsequent opens to an object. The following
  568. sections discuss possible approaches to handling the interaction of ACLs
  569. with file permission bits. Any references to default ACLs will be fully
  570. described in the Default ACLs section. 
  571.  
  572. ACL Always Replaces File Permission Bits (Pure ACL)
  573.  
  574. In this approach, the file permission bits are no longer consulted for DAC
  575. decisions. 
  576.  
  577. Instead, each object always has an ACL and the ACL completely determines
  578. access. Consider the following example illustrating this scheme. Assume
  579. Userl and User2 are members of the group "GroupA" and User3 and User4 are
  580. not. 
  581.  
  582. file Owner/Group User2/GroupA 
  583.  
  584. file permission bits: rwxr-x-x 
  585.  
  586. ACL Entries: 
  587.  
  588. User1 rwx 
  589.  
  590. User2 r- 
  591.  
  592. User3 rwx 
  593.  
  594. User4 --- 
  595.  
  596. In this example the file permission bits would have no effect on the
  597. access control decision. User3 is able to read, write and execute the
  598. file. User2 is able to read it, but not to execute or write to the file.
  599. The file permission bits are completely ignored. 
  600.  
  601. The resulting pure ACL system does not have to worry about interactions
  602. between the ACL and the file permission bits, since the latter are not
  603. used for access control decisions. A single, well defined access policy is
  604. employed. Applications which should make use of DAC are forced to
  605. understand the new rules. The major disadvantage of this scheme, however,
  606. is that compatibility is lost. Every DAC cognizant progr&m, and that
  607. should be every program that manipulates the discretionary access control
  608. information on an object needs to be changed to understand ACLs. 
  609.  
  610. Owner Selects ACL Or File Permission Bits
  611.  
  612. In this approach, either the file permission bits or the ACL are consulted
  613. for the access control decision on a per object basis. The owner
  614. determines whether the file permission bits or the ACL is used. The system
  615. call chmod returns an indicative error if the object has an ACL, but
  616. otherwise sets the file permission bits. Consider the two following
  617. examples which illustrate this approach. Once again assume Userl and User2
  618. are members of the group "GroupA" and User3 and User4 are not. 
  619.  
  620. Example A (ACL selected): 
  621.  
  622. file Owner/Group User2/GroupA 
  623.  
  624. file Permission bits: rwxr-x-x 
  625.  
  626. ACL Entries: 
  627.  
  628. Userl rwx 
  629.  
  630. User2 r- 
  631.  
  632. User3 rvx 
  633.  
  634. User4 
  635.  
  636. Since there is an ACL on this file the access control is the same as in
  637. the previous example. 
  638.  
  639. Example B (file permission bits selected): 
  640.  
  641. file Owner/Group User2/GroupA 
  642.  
  643. file permission bits: rwxr-x-X 
  644.  
  645. ACL Entries: NONE 
  646.  
  647. Since there are no ACL entries on this file the access control ~r
  648. determined by the permission bits. User2 (owner) has all access
  649. permissions to the file. Userl (a user in GroupA) is allowed read and
  650. execute access. User3 and User4 ("other" users) can only execute the file.
  651.  
  652. The resulting system behaves like a file permission bit based system if no
  653. one ever sets ACLs and like the pure ACL system if a default ACL mechanism
  654. is in use. Thus, either environment can be supported. The compatibility
  655. issues raised in the previous section apply here as well. In addition, the
  656. programs have to determine which access control mechanism applies to each
  657. object created and set the DAC accordingly. 
  658.  
  659. Independent ACL And File Permission Bits (AND)
  660.  
  661. In this approach, both the file permission bits and the ACL are consulted
  662. for the discretionary access control decision on a per object basis.
  663. Access is granted if and only if it is granted by both the ACL and the
  664. file permission bits. Consider the following example9 which illustrates
  665. this approach. For this example9 assume only User2 is in GroupA. 
  666.  
  667. file Owner/Group User2/GroupA 
  668.  
  669. file permission bits: rwxr-x-x 
  670.  
  671. ACL Entries: 
  672.  
  673. Userl rwx 
  674.  
  675. User2 r- 
  676.  
  677. User3 Tx 
  678.  
  679. User4 
  680.  
  681. In the example above, the file permission bits imply that Userl has
  682. execute permission, whereas the permissions specified in the ACL imply
  683. that Userl has full access. Without knowing which group User 1 is in, one
  684. cannot predict whether or not Userl can read the file. If Userl is in
  685. group GroupA, then Userl will have read and execute permissions. If Userl
  686. is not in group GroupA, then only execute permission will be granted.
  687. Similarly, without knowing User3"s group, one cannot predict whether or
  688. not User3 has read access. User4 will have no possibility of access, due
  689. to no permissions specified in the ACL entry. As the example illustrates,
  690. there is no way to get a full ACL view with this scheme. 
  691.  
  692. With this scheme, some compatibility is maintained. Calls to chmod have
  693. the desired effect from the restrictive point of view. ACL entries can
  694. further restrict access. Making use of the ACL as the effective access
  695. control mechanism requires that the file permission bits be set wide-open
  696. (i.e., read, write, and execute bits are set for user, group and other).
  697. In situations where ACLs are not properly set, a new object will become
  698. generally accessible. Likewise, if the ACL is removed then the object will
  699. again be generally accessible. This scheme also allows for misleading
  700. status information given to programs which only use the existing
  701. mechanism. 
  702.  
  703. Independent ACL And File Permission Bits (OR)
  704.  
  705. In this approach, both the file permission bits and the ACL are consulted
  706. for the discretionary access control decision on a per object basis.
  707. Access is granted if it is granted by either the ACL or the file
  708. permission bits. The ACL is used to grant access beyond what is set in the
  709. file permission bits. 
  710.  
  711. Consider the following example illustrating this approach. Assume only
  712. User2 is in GroupA. 
  713.  
  714. file Owner/Group vser2/GroupA 
  715.  
  716. file permission bits: rwxr-x-X 
  717.  
  718. ACL EntrieS: 
  719.  
  720. insert rwx 
  721.  
  722. inser2 r- 
  723.  
  724. inser3 rwx 
  725.  
  726. User4 
  727.  
  728. Userl, User2, and User3 have read, write, and execute access. User4 has
  729. execute access. 
  730.  
  731. Again, some compatibility is maintained. Calls to chmod have the desired
  732. effect from the permissive point of view. The previous alternative's
  733. problem of leaving the permission bits wide-open is thus avoided. 
  734.  
  735. The problem with this scheme, however, is that a chmod call which would
  736. deny all access (chmod("object", 0)) in a system without ACLs will not do
  737. so here. 
  738.  
  739. File Permission Bits Contained Within ACL
  740.  
  741. In this approach, only the ACL is consulted for discretionary access
  742. control decisions. The file permission bits are replaced by three "base"
  743. entries in the ACL. Calls to chmod modify the owner, group, and other
  744. entries contained in the ACL. 
  745.  
  746. Calls to stat read this information from the ACL. 
  747.  
  748. In the following two examples assume the owner entry is evaluatefl before
  749. additional user entries, and the group entry is evaluated before
  750. additional gr1oup entries. 
  751.  
  752. Example A: 
  753.  
  754. file Owner/Group inser2/GroupA 
  755.  
  756. file permission bits: rwxr-x-x 
  757.  
  758. ACL Entries: 
  759.  
  760. owner rwx 
  761.  
  762. User1 rvx 
  763.  
  764. User2 r- 
  765.  
  766. User3 r-x 
  767.  
  768.      User4 
  769.  
  770. group r-x 
  771.  
  772. other --x 
  773.  
  774. In this example. it is not clear what permissions User2 is to be granted,
  775. since a particular method for determining owner access has not been
  776. specified for the case where an additional user entry also names the
  777. owner. User2 could be granted read, write, and execute access as the
  778. owner. read access only, as per the explicit entry for User2, or some
  779. combination of the two (e.g., the AND or OR of the two). Userl, User3, and
  780. User4 get their access from their ACL entries. 
  781.  
  782. Example B: (After a chmod("object", 0)) 
  783.  
  784.      file Owner/Group inser2/GroupA 
  785.      file permission bits: 
  786.  
  787. ACL Entries: 
  788.  
  789. owner 
  790.  
  791. User1 rwx 
  792.  
  793. User2 r- 
  794.  
  795. User3 r-x 
  796.  
  797.      User4 
  798.      group - 
  799.      other 
  800.  
  801. Changing the file permission bits to zero does not change the permissions
  802. granted to Userl, User3, and User4, since their access is based on ACL
  803. entries. User2's access may change depending on how owner access is
  804. determined when additional user entries naming the owner also exist. 
  805.  
  806. If no additional entries are added to the ACLs, this system looks like a
  807. system without ACLs. The literal meaning of the file permission bits is
  808. preserved in the ACL. 
  809.  
  810.      ₧ As in the previous alternative, however, a chmod call which would
  811.      deny all access (cbmod("object", 0)) in a system without ACLs will
  812.      not do so here. 
  813.  
  814. ACL Masked By File Permission/ Bits
  815.  
  816. In this approach, both the file permission bits and the ACL are used for
  817. determining the discretionary access control decision. The access
  818. indicated in the ACL entry is logically ANDed (masked) with one or more of
  819. the file permission bit classes (file owner, file group, or file other
  820. class) to determine the effective DAC permission. 
  821.  
  822. Example: 
  823.  
  824. file Owner/Group User2/GroupA 
  825.  
  826. file permission bits: rwxr-x-x 
  827.  
  828. ACL Entries: 
  829.  
  830. User1 rwx 
  831.  
  832. User2 r- 
  833.  
  834. User3 rx 
  835.  
  836. User4 --- 
  837.  
  838. Assume that the group file permission bits are chosen as the mask, i.e.,
  839. all ACL entries will be ANDed against the file group class permission
  840. bits. User2, being the owner, gets read, write, and execute access to the
  841. file. User3 is allowed read and execute access. Userl is allowed read and
  842. execute access, the write access is disallowed by the file permission
  843. bits. User4 is not allowed any access to the file. Calls to chmod have the
  844. desired effect from the restrictive point of view but not necessarily from
  845. the permissive point of view. Since the bits of the masked field will most
  846. likely be set wide-open, the literal meaning of the field chosen for the
  847. mask appears to be lost. The POSIX standard, however, allows for the
  848. extended meaning of the group class permission. bits. 
  849.  
  850. Recommendation
  851.  
  852. We recommend the AcL Masked By File Permission Bits approach. This is the
  853. most reasonable approach when trying to balance security and
  854. compatibility. The question of designating the masking field must still be
  855. resolved. The file group class permission bits are the preferred masking
  856. field, even though they encourage permissive default access by the owning
  857. group. This choice must be made because the use of the file owner class
  858. would cause compatibility problems in programs which attempt to establish
  859. "owner-only" access, whereas the designation of the file other class could
  860. leave objects open to attack were an ACL removed or never present. An
  861. additional option of masking user entries with the file owner class
  862. permission bits and group entries with the file group class permission
  863. bits has the same disadvantages as masking against only the file owner
  864. class. When masking against the file group class, the permissions indicate
  865. the least upper bound of the permissions allowed for the ACL entries and
  866. the user and other fields retain their previous semantics. 
  867.  
  868. To summarize the approaches identified in this section: 
  869.  
  870. The ACL Masked By File Permission Bits approach is a compromise for both
  871. security and compatibility. 
  872.  
  873. The Independent ACL And File Permission Bits (AND) approach suffers from
  874. the serious flaw that the file permission bits must be set very
  875. permissively in order to allow the ACL entries to predominate in the
  876. discretionary access calculation. A simple mistake in setting the ACL
  877. could grant object access to significantly more users than was intended. 
  878.  
  879. The Independent ACL And File Permission Bits (OR) approach may require
  880. that both ACL and the file permission bits be changed in order to deny a
  881. particular access. Thus, existing programs could believe that they had
  882. prevented access when they, in fact, had not. Similarly, in the File
  883. Permission Bits Contained Within ACL approach, removing "other" permission
  884. might not have the desired effect9 since, the owner, group, and other
  885. entries may not be the only ones in the ACL. In neither case does a call
  886. to chmod with a zero argument unequivocally revoke access from all users
  887. as might be expected. 
  888.  
  889. Whichever DAC scheme is ultimately selected, an appropriate balance must
  890. be struck between the mutually conflicting concerns of compatibility and
  891. security. In a DAC scheme where chmod cooperates with ACLs, chmod must not
  892. grant inappropriate access or require unreasonable (i.e., permissive
  893. public access) defaults. 
  894.  
  895. Barring compatibility, the alternatives of ACLs replacing file permission
  896. bits (Pure ACLs and On Demand) would be the most elegant way of enhancing
  897. DAC for UNIX systems. By abandoning file permission bits, however, these
  898. schemes have been rendered incompatible with existing systems. Thus, they
  899. are not considered for a POSIX-compliant UNIX system DAC scheme. 
  900.  
  901. Group Semantics
  902.  
  903. There are various ways of using the UNIX system group mechanism when
  904. grouping system users. In designing ACLs it is important to understand the
  905. possible semantics and provide enough flexibility to properly support
  906. these semantics. Initially, there are no restrictions on how users can be
  907. grouped. Various possibilities include: 
  908.  
  909.      ₧ a shorthand way of referring to groups of subjects 
  910.      ₧ a method of grouping project work by group access rights 
  911.      ₧ privileged roles 
  912.      ₧ accountability (file ownership) 
  913.  
  914. The issue arises. however, of how to deal with user membership when
  915. considering these possible grouping mechanisms. For example, should a user
  916. be permitted to be a member of more than one group at any given time? If
  917. so. should there be a mechanism provided to allow the user to control
  918. group membership? These issues will be addressed in the following
  919. sections. 
  920.  
  921. Single Group Membership
  922.  
  923. Under a single membership scheme, a user can only be a member of one
  924. specific group at any given time. All discretionary access checks will be
  925. made with respect to the user's OlD and a single GID. A user will only be
  926. able to change his/her group through the use of the newgrp command. This
  927. scheme is easy to implement and introduces no additional complexity with
  928. respect to evaluating access within an ACL. Additionally. it would
  929. certainly be acceptable in a class B3 system. 
  930.  
  931. Multiple Concurrent Group Membership
  932.  
  933. Under a multiple concurrent group scheme, a user can be a member of more
  934. than one group at the same time. This scheme introduces some complexity
  935. when evaluating user access by allowing more than one ACL entry of equal
  936. specificity to apply to a user simultaneously. For example, if a user is a
  937. member of several groups at the same time and tries to access an object
  938. with an ACL containing entries which match the user on more than one
  939. group, what will the resulting access be? There are several ways of
  940. determining the resulting access in such a case. These are discussed under
  941. ACL Evaluation. 
  942.  
  943. Another concern with the use of multiple concurrent groups is the
  944. possibility of violating the least privilege principle. With multiple
  945. concurrent groups if a user is in several groups at once, he/she is
  946. granted access to all of those groups at all times rather than to just the
  947. ones he/she needs at any given time. This could be contrary to the idea of
  948. a user having a minimal set of privileges necessary to perform a
  949. particular function at any given time. 
  950.  
  951. It can be argued, however, that the least privilege requirement in the
  952. TCSEC only applies to TCB architecture, making this issue irrelevant for
  953. DAC. On the other hand there may be a problem with a system which
  954. implements privileged roles through the group mechanism. The TCSEC class
  955. B3 Trusted Facility Management requirement states that separate roles must
  956. be assigned to operator and adinistrator functions and that each role be
  957. restricted to performing only those functions necessary for that role.
  958. Given a system, therefore, which uses the group mechanism to assign roles
  959. and grant access basedon role identity to parts of the system which would
  960. otherwise be inaccessible, it is clear that least privilege could be
  961. violated through the use of multiple concurrent groups. The violation
  962. would occur if the user who was a member of the group assigned to a
  963. privileged role could also be a member of one or more additional groups.
  964. Proper administration of these privileged groups, however. could still
  965. allow for the use of multiple groups. but a subsetting capability, as
  966. described in the next subsection9 would then be required. 
  967.  
  968. Improperly controlled multiple concurrent groups with groups representing
  969. privileged roles could therefore be a violation of the least privilege
  970. principle. This would result in a failure to meet the class B3
  971. requirements. This is only one specific implementation, however, and it is
  972. certainly conceivable that multiple concurrent groups could be implemented
  973. in such a way as to not be a violation of least privilege. The multiple
  974. concurrent group scheme is currently a feature in some UNIX systems and is
  975. thought to be an extremely useful and necessary feature to those who use
  976. it. 
  977.  
  978. Multiple concurrent groups would also be compatible with the POSIX
  979. standard 
  980.  
  981. Multiple Concurrent Groups With Subsetting
  982.  
  983. Another problem associated with multiple concurrent groups arises from the
  984. fact that currently when a user logs on to a system he/she automatically
  985. becomes a member of all of the groups that he/she is allowed membership
  986. in. There is no way for the user to only be active in a subset of his/her
  987. possible group set. Although there is no explicit requirement in the TCSEC
  988. precluding this, the TCSEC does seem to imply that a user should by
  989. default have a minimal amount of access rights atlogin. 
  990.  
  991. There are several ways of approaching this problem; any of these methods
  992. would be a possible and acceptable means of resolving this problem. First,
  993. it is necessary to consider whether a user should be able to add or delete
  994. groups from his/her group set and if so, with what restrictions. A user
  995. should certainly not be allowed to add groups for which he/she is not
  996. authorized. Therefore each user should have an "allowable group set" which
  997. consists of all groups that user has been given authorization to be a
  998. member of. Adding groups other than those which appear in this allowable
  999. group set would be unacceptable. 
  1000.  
  1001. There are at least two ways to allow a user to work with a subset of
  1002. his/her allowable group set. The first would be to keep the current scheme
  1003. where a user becomes a member of all of his/her groups at login, but
  1004. provide the user with a means (through some system call or command) to
  1005. drop specific groups if desired and work as a member of some subset of
  1006. his/her allowable group set. A command would allow a user the capability
  1007. but require an explicit action to do so. A system call, on the other hand,
  1008. would provide the means for restriction through a program which could be
  1009. set up to run automatically for the user. This would mean, however, that
  1010. the set of groups would either be hardcoded into the program or be set
  1011. through some type of configuration file. Another possible approach would
  1012. be to provide a mechanism that would cause a program's groups to be
  1013. restricted when that program is executed. Although this eliminates the
  1014. user having to remember to restrict his/her groups or having to hardcode a
  1015. group set into a program, it would add further complexity to the system. 
  1016.  
  1017. Recommendation
  1018.  
  1019. We recommend that the multiple concurrent group capability be provided
  1020. along with some method of subsetting. The preferred method would be to
  1021. only allow the user to become a member of one group at login and provide
  1022. him/her with a means of dynamically adding/deleting to his/her working
  1023. group set. This recommendation, of course, may conflict with
  1024. implementations which use the group mechanism for privilege roles. 
  1025.  
  1026. ACL Evaluation
  1027.  
  1028. This issue deals with how an ACL is evaluated to determine access rights
  1029. of a subject to a particular object. There are several possible ordering
  1030. methods for ACL evaluation, as well as several different ways to evaluate
  1031. multiple group entries. Two levels of ordering must actually be considered
  1032. when deriving an ACL evaluation scheme; the ordering of the classes (user,
  1033. group, other), and then the ordering of the entries within each class. 
  1034.  
  1035. Ordering Of Classes
  1036.  
  1037. It would certainly be possible to specify an ordering of any combination
  1038. of the the three classes, user, group, and other. However, since both the
  1039. POSIX standard and all current UNIX systems specify a "user, then group,
  1040. then other" ordering, (or most-to-least specific), when evaluating access
  1041. with permissiori bits, this ordering should be maintained for ACLs as
  1042. well. 
  1043.  
  1044. The method of evaluating an ACL in a most-to-least specific manner can be
  1045. described as follows. The owner identity of the object is first checked
  1046. against the effective identity of the subject. If there is a match the
  1047. search stops. Next, a check is made against the owning group identity of
  1048. the object and the effective group of the subject. If there is a match and
  1049. the subject does not have multiple groups, the search stops. Otherwise the
  1050. rest of the group entries are searched next. If the subject has multiple
  1051. groups, the group entries are evaluated as presented in the Multiple Group
  1052. Evaluation section, otherwise they are searched in order as the user
  1053. entries are. Finally, if no user or group entries were found to match the
  1054. effective identity of the subject, access is determined based on the other
  1055. entry. 
  1056.  
  1057. For the following discussion on the ordering of ACL entries9 it will be
  1058. assumed that the classes will be ordered and follow this most-to-least
  1059. specific regime. 
  1060.  
  1061. User-Defined Ordering
  1062.  
  1063. In this method, entries are considered according to the ordering given by
  1064. the user. The first entry as specified by the user is considered first,
  1065. the second entry next, and soon. 
  1066.  
  1067. As long as the "user, then group, then other" order is followed, the only
  1068. security relevant problem with this method occurs when evaluating group
  1069. entries with multiple groups. If a user is a member of multiple groups and
  1070. matches more than one of the group entries, the resulting access may be
  1071. dependent upon the ordering of the group entries. See the Multiple Group
  1072. Evaluation section for various possibilities. 
  1073.  
  1074. Unless all matching group entries are considered when determining access,
  1075. the burden is placed on the user to correctly order the group entries.
  1076. This method may appear to be more convenient for users, however, it may
  1077. require the user to have extensive knowledge of group membership.
  1078. Additionally, it does not allow for very efficient access evaluation as
  1079. discussed in the following section. 
  1080.  
  1081. System-Defined Ordering
  1082.  
  1083. In this method, entries are considered according to a system-defined
  1084. ordering. Although the user does not have the flexibility of choosing an
  1085. arbitrary order of entries, a system-defined ordering gives consistency to
  1086. ACLs throughout the system and may also allow for quicker access
  1087. determination. 
  1088.  
  1089. The system may use any of a variety of ordering methods, two of which are
  1090. alphabetical ordering by user or group name and numeric ordering by user
  1091. or group ID. An ordering of lowest to highest UID or GID, or vice-versa,
  1092. is recommended as it provides an efficient way to check for redundant
  1093. entries. Redundant entries should not be allowed in an ACL. 
  1094.  
  1095. It is important to mention that actual sorting need not be done by the
  1096. kernel itself as long as the kernel enforces the specified ordering. In
  1097. other words, the sorting can be achieved through the use of library
  1098. routines. The ACL commands would automatically use the library sorting
  1099. routines and users would also be encouraged to do so when writing their
  1100. own programs which manipulate ACLs. When an ACL is passed to the kernel,
  1101. the kernel verifies that the entries are sorted or else a failure will
  1102. occur. In this manner, efficiency is achieved while still enforcing a
  1103. system-defined ordering. 
  1104.  
  1105. This alternative is simple. reduces the possibility of user error, and
  1106. allows for more efficient access determination. 
  1107.  
  1108. Multiple Group Evaluation
  1109.  
  1110. When a subject is a member of multiple groups, there are several ways the
  1111. group entries may be evaluated, regardless of the ordering of the entries.
  1112. The following methods may be used to evaluate access when multiple groups
  1113. are used: 
  1114.  
  1115. The first entry which matches one of the subject's groups might be used to
  1116. determine access. While this is an efficient method, it does not take
  1117. notice of the possibility of other groups granting access. 
  1118.  
  1119. The entry which matches one of the subject's groups and grants the least
  1120. access might be used. This method does not recognize the possibility that
  1121. all the groups together might grant or deny the desired access. 
  1122.  
  1123. The entry which matches one of the subject's groups and grants the most
  1124. access might be used. This method also does not recognize the possibility
  1125. that all the groups together might grant or deny access. 
  1126.  
  1127. ANDing the permissions of all the entries which match groups of the
  1128. subject is another possible method. This approach may be considered too
  1129. restrictive, since even one entry which grants access may be overruled by
  1130. other entries which deny access. 
  1131.  
  1132. ORing the permissions of all the entries which match groups of the subject
  1133. is also a possibility. This method may be considered too permissive, since
  1134. the maximum permissions allowed by all the matching entries taken together
  1135. is the result. 
  1136.  
  1137. However, the same effect can be achieved currently, through the user
  1138. simply invoking the newgrp command to change to the group with the
  1139. d1esired access or by opening the same file twice from two different
  1140. groups which together provide the desired access. 
  1141.  
  1142. Recommendation
  1143.  
  1144. A system-defined ordering which evaluates ACLs entries from most-to-least
  1145. specific is recommended. Since multiple groups were designed to be
  1146. permissive and permissive results can be achieved through other means
  1147. anyway, the method which ORs the permissions of all matching group entries
  1148. is recommended for systems implementing multiple groups. 
  1149.  
  1150. Concern has been expressed that this scheme violates the wording in the
  1151. TCSEC, for DAC at class B3. The TCSEC states: Furthermore, for each such
  1152. named object, it shall be possible to specify a list of named individuals
  1153. and a list of groups of named individuals for tvhich no access to the
  1154. object is to be given. The ORing of groups, however, does not present a
  1155. conflict with the class B3 DAC requirement, as it still allows the user to
  1156. specify groups that shall have no access. 
  1157.  
  1158. DAC Compatibility
  1159.  
  1160. Designing an ACL mechanism requires that attention be given to the use of
  1161. system calls which check or modify the existing DAC mechanisms, and to the
  1162. additional use of ACL mechanisms in system calls. The classes of DAC
  1163. mechanisms which return or change the value of the discretionary access
  1164. control information are those mechanisms which: change ownership of an
  1165. object9 change the file permission bits. create objects, access object
  1166. attributes. and access object data. Each of these classes will now be
  1167. examined and a determination will be made of what changes, if any9 are
  1168. required for inclusion in a system with ACLs. For each class, we provide
  1169. alternative solutions and identify the preferred choice. 
  1170.  
  1171. Changing Ownership Of An Object
  1172.  
  1173. Mechanisms which change ownership of an object (e.g., chown, msgctl,
  1174. semctl, shmctl) could create a new user or group entry for the object
  1175. owner or group, with the same access permissions as the original entry for
  1176. the object owner or group. The original entry would become an additional
  1177. user or group entry. The problem with this alternative is that by leaving
  1178. the original entry for the object owner or group behind as an additional
  1179. user or group entry, the mechanism will always create an ACL for an object
  1180. which did not have one to begin with. 
  1181.  
  1182. The preferred alternative is for these calls to suffer no additional side
  1183. effects due to the presence of ACLs. This can be achieved by not storing
  1184. explicit IDs in the owner and owning group ACL entries. An advantage of
  1185. this altern'ative is that the ACL entries for object owner and object
  1186. owning group can be readily distinguished syntactically from the other
  1187. user and group entries. 
  1188.  
  1189. Changing The File Permission Bits
  1190.  
  1191. Mechanisms which change the file permission bits (e.g., chmod, msgctl,
  1192. semctl, shmctl) might be changed so that they fail, or partially fail,
  1193. when presented with an object that has an ACL. 
  1194.  
  1195. Complete failure is a poor alternative since these mechanisms change the
  1196. file mode, not just the file permission bits. For example, a program
  1197. should be able to do a legitimate operation such as changing the setgid
  1198. bit on any file. Partial failure means that these mechanisms would make
  1199. the requested changes but return an error value different from -1. This is
  1200. a poor alternative for two reasons: it does not make good sense to succeed
  1201. while returning failure. and programs often do not differentiate between
  1202. error return values. 
  1203.  
  1204. Other alternatives attempt to minimize surprises to the caller by changing
  1205. ACL entries. The first of these alternatives is to mask the access
  1206. permissions in all the object's additional entries. Access permissions for
  1207. entries with specific user and specific group are ANDed with the supplied
  1208. user and group access permissions. Access permissions for entries with
  1209. only a specific user are ANDed with supplied permissions for the user, and
  1210. permissions for entries with only a specific group are ANDed with supplied
  1211. permissions for the group. While this meets POSIX requirements, programs
  1212. that wish to change only the file mode (non-access) bits will have the
  1213. masking occur as an undesirable side effect. Another alternative is to
  1214. disable the additional entries. This implicitly requires a new mechanism
  1215. to enable entries that have been disabled. POSIX requirements are also
  1216. satisfied by this alternative, but the same problems exist as in the
  1217. previous alternative; programs using these mechanisms to change the
  1218. non-access file mode bits will have entries disabled as an undesirable
  1219. side effect. Still another alternative is to delete the additional
  1220. entries. This has similar advantages and disadvantages as ACL entry
  1221. disabling. It is simpler since there is no need for an ACL entry enabling
  1222. mechanism. Information given by the user, however, is deleted without
  1223. warning. 
  1224.  
  1225. The preferred method is to make no changes to these mechanisms. The
  1226. mechanisms will affect only file permission bits and ACL entries for the
  1227. object owner or group. While this does not provide non-ACL cognizant
  1228. programs with expected results for operations on objects with ACLs, it is
  1229. not perceived as a serious problem. This alternative is consistent with
  1230. the preferred alternative for mechanisms which access object attributes as
  1231. well (see below). 
  1232.  
  1233. Creating Objects
  1234.  
  1235. Mechanisms which create or truncate objects (e.g., creat, open, mkfifo,
  1236. mkdir, msgget, semget, shmget) should work as they currently do, except
  1237. that they may create an ACL as part of the default ACL mechanism. Please
  1238. refer to the section on default ACLs for more information. Note that
  1239. default protection on newly-created objects will be accomplished via the
  1240. umask and/or default ACLs. 
  1241.  
  1242. It may also be desirable to add other types of ACL features to mechanisms.
  1243. For example, one might wish to add the capability during file creation to
  1244. adopt a specific ACL. For changes of this type, parameters of existing
  1245. mechanisms should not be changed9 and new parameters should not be added.
  1246. New mechanisms should be created which make use of existing ones. For
  1247. example. creat may need to be modified to take ACLs into account, but the
  1248. parameter list should not change. Instead of adding an ACL parameter to
  1249. creat. a new system call (i.e.. with some other name) should be used.
  1250. which takes the ACL as a parameter and then uses creat. 
  1251.  
  1252. Accessing Object Attributes
  1253.  
  1254. Mechanisms which access object attributes (e.g. stat, msgctl, semctl,
  1255. shmctl) could be modified to fail when applied to an object with an ACL.
  1256. This is an unacceptable alternative since these mechanisms return more
  1257. information than simply the file mode. Thus. non-functionality would
  1258. require a new mechanism to return the additional information for objects
  1259. with ACLs. 
  1260.  
  1261. Another alternative is to find all the entries in the ACL that apply to
  1262. the user-ID and group-ID of the subject, just like a permissive access
  1263. check. Then OR all the associated permissions together, and return the
  1264. results in the appropriate file permission bits (user, group, and other).
  1265. While this alternative integrates the idea of ACLs into mechanisms that
  1266. access object attributes9 the context of the mechanisms affects the result
  1267. returned to the point where the meaning of what the mechanisms return is
  1268. somewhat clouded. 
  1269.  
  1270. The preferred alternative is to make no changes to these mechanisms. The
  1271. mechanisms will continue to return the file permission bits as if ACLs did
  1272. not exist. Another mechanism must then be used to find out if the file has
  1273. an ACL, and if so, what its entries are. While this alternative does not
  1274. provide all information to subjects that don't know about ACLs, it does
  1275. not change the current behavior of these mechanisms. 
  1276.  
  1277. Accessing Object Data
  1278.  
  1279. There are a number of system calls which will need to have AFL
  1280. functionality added to them (i.e., for access checking). These calls
  1281. include all those taking file system object names as parameters, as well
  1282. as those IPC mechanisms which perform access checks. Examples of some of
  1283. these calls are: open, msgsnd, msgrcv, semop, and shmat. 
  1284.  
  1285. It is also important for portability that programs use the available
  1286. access control mechanisms in an appropriate manner, so that the security
  1287. policy is interpreted correctly. For instance, at the system call level,
  1288. the permission information returned by the use of stat may not be
  1289. sufficient to determine allowed access; other information such as ACL
  1290. contents may have to be evaluated as well. 
  1291.  
  1292. Recommendation
  1293.  
  1294. The following is a summary of the preferred alternatives stated in this
  1295. section. Regarding compatibility with existing DAC mechanisms that either
  1296. 1) change ownership or group of an object. 2) change file permission bits,
  1297. or 3) access object attributes should remain unchanged and not affect an
  1298. existing ACL on the object or create an ACL where one did not exist
  1299. before. 
  1300.  
  1301. Regarding the addition of ACL functionality, existing mechanisms should
  1302. not be changed, and new parameters should not be added. Instead, new
  1303. mechanisms should be created which make use of existing ones. 
  1304.  
  1305. ACL System Calls And Commands
  1306.  
  1307. This issue addresses what the naming conventions and functionality for ACL
  1308. system calls and commands should be. 
  1309.  
  1310. For system calls, there are at least two alternative types of designs.
  1311. Each depends on how the ACL is viewed. In one approach, the ACL is a
  1312. series of independent records which can be individually manipulated using
  1313. calls similar to open, read, write. and close. This approach has a nice
  1314. parallel to the way files are read and written, but may be viewed as
  1315. overly complicated given the relative infrequency of ACL modification. In
  1316. the other approach. the ACL is considered a single unit and is not changed
  1317. record-by-record, but instead always manipulated as a whole. This approach
  1318. uses a "get" and "set" concept for ACL operations, where an ACL, as a
  1319. whole, is retrieved, modified locally, and then replaced [3]. This
  1320. approach is simple and reflects the growing trend towards get/set type
  1321. operations. 
  1322.  
  1323. It may also be reasonable to extend the "get" and "set" concept to apply
  1324. to default ACLs as well as to the ACL associated with an object. This is a
  1325. natural extension of the way ACLs would be manipulated, and default ACL
  1326. operations may be easily added to the recommended system call interface
  1327. described below,; 
  1328.  
  1329.  
  1330. There are also two possible methods for implementing these calls. One
  1331. option is to use separate system calls for each of the ACL operations
  1332. (i.e., getacl, setacl). The other option is to have one ACL system call
  1333. that can be invoked with a number of command arguments indicating the
  1334. desired ACL operation [3]. An example of a useful additional command
  1335. argument is one that would return the number of entries in the ACL. This
  1336. method conserves the number of system calls, and provides the flexibility
  1337. to add ACL commands via command arguments. Additionally, using this
  1338. method, designers are free to implement library functions based on the
  1339. system call with particular command flags. 
  1340.  
  1341. For commands, the same issues apply as for system calls. In a system with
  1342. ACLs9 however, there will be a need for commands to not only manipulate
  1343. ACLs. but also to show and manipulate all discretionary access control
  1344. information. These commands should include. at a minimum: 
  1345.  
  1346.      ₧ command(s) to retrieve and set file permission and mode bits (Is,
  1347.      chmod) 
  1348.      ₧ command(s) to retrieve and set ACL information (new) 
  1349.      ₧ command(s) to retrieve effective discretionary access to files
  1350.      (new) 
  1351.  
  1352. In addition, there may be useful features to add to existing utilities
  1353. (e.g., the ability to find a file according to its ACL [12]) so that they
  1354. might be able to conform to the enhanced DAC mechanisms. 
  1355.  
  1356. Recommendation
  1357.  
  1358. For the ACL system call interface, get/set ACL type operations should be
  1359. used9 and should be implemented with a unified system call with command
  1360. arguments used to implement the various operations. For commands. the
  1361. names getacl and setacl are recommended since they follow from the get/set
  1362. concept. 
  1363.  
  1364. Named ACLs
  1365.  
  1366. A named ACL, as described in A Guide to Understanding Discretionary Access
  1367. Control in Trusted Systems [2], is an ACL that can be shared or referred
  1368. to by name. They may be implemented in one of two ways; either as a
  1369. template copied into a user's ACL or shared through a pointer from the
  1370. user's ACL space (shared ACL). A change to a shared ACL results in a
  1371. change to the discretionary access on all objects using this ACL. This
  1372. result may be considered to be a side-effect or a desired feature
  1373. depending on the circumstance. Additionally, it may be difficult to
  1374. determine which objects are sharing a specific named ACL, and a user may
  1375. mistakenly grant access to an object that was not intended. Another
  1376. problem with named ACLs is that as objects they may themselves be required
  1377. to contain discretionary access controls. This suggests the idea of
  1378. recursive ACLs, a situation to be avoided. 
  1379.  
  1380. Recommendation
  1381.  
  1382. Named ACLs need not be supported. but a system that does should be no less
  1383. secure or less flexible than one that does not. Absolute Siexibility of
  1384. ACLs can be achieved, however, through the use of default ACLs as
  1385. discussed in the following section. There is no strong case one way or the
  1386. other for named ACLs. There are advantages and disadvantages to both
  1387. alternatives and it would really depend on the environment as to whether
  1388. named ACLs would be of any benefit. 
  1389.  
  1390. Default ACLs
  1391.  
  1392. When considering ACLs, an issue arises as to whether a predesignated set
  1393. of ACL entries should be assigned to an object automatically at the time
  1394. of creation. The following alternatives present the possible ways to
  1395. address this issue. 
  1396.  
  1397. No Default ACLs
  1398.  
  1399. In this approach, no ACL is assigned at object creation time. The process
  1400. umask will limit the file permission bits, as it currently does, to
  1401. provide some default protection on an object. 
  1402.  
  1403. While this alternative maintains compatibility with existing programs, it
  1404. is not a very practical solution. Depending on the relationship of the
  1405. file permission bits and the ACL, the absence of default ACLs may not make
  1406. sense. For instance, in a pure ACL implementation, the absence of default
  1407. ACLs would result in no initial protection on newly created files.
  1408. Additionally, this alternative would not encourage the use of ACLs by new
  1409. programs, and would prevent ACL creation by old programs. ACLs could not
  1410. propagate through the system and hence their usability would be lost. 
  1411.  
  1412. Require Default ACLs
  1413.  
  1414. In this approach, an ACL would always be assigned at object creation time.
  1415. This would allow for initial finer grained control on an object. 
  1416.  
  1417. Requiring default ACLs may cause incompatibilities for an old program that
  1418. only looks at the file permission bits when it creates an object. Also,
  1419. for many users, the umask may be a sufficient tool for limiting the
  1420. permissions on an object when it is created. The main advantage of
  1421. requiring default ACLs is that the usability of ACLs is greatly improved.
  1422. Additionally, since an ACL is associated with an object in a single atomic
  1423. operation, the possibility of a temporarily insecure state is avoided. 
  1424.  
  1425. Provide Default ACLs
  1426.  
  1427. A mechanism is provided to put default ACLs on new objects. However9 not
  1428. all new objects need to have default ACLs. This alternative allows
  1429. specification of a default `ACL, giving a finer granularity of access
  1430. control than that provided by the file permission bits, and, at the same
  1431. time allows, where desired, compatibility with existing programs. 
  1432.  
  1433. Recommendation
  1434.  
  1435. Providing default ACLs and mechanisms to specify whether or not to use
  1436. them is the best solution. This allows both classes of users, those who
  1437. want default ACLs and those who do not (even those who want no ACLs at
  1438. all), the flexibility to specify the scheme that they find most
  1439. appropriate. Although in many cases the process umask would be sufficient
  1440. to assign default permissions, systems and/or users making explicit use of
  1441. ACLs will desire default ACLs. The default ACL scheme used should be
  1442. straightforward to the user and should sensibly interact with the existing
  1443. DAC mechanisms, including the ilmask mechanism. Note that even if an
  1444. object is created with no default ACL, ACL entries may still be added to
  1445. the object. 
  1446.  
  1447. This section has really only addressed default ACLs on file system
  1448. objects. IPC objects are not part of the file system name space, and
  1449. therefore require further consideration. IPC objects are relatively short
  1450. lived. and are generally not manipulated by users at the command level as
  1451. are files. Based on these characteristics default ACLs on IPC objects are
  1452. probably not needed, and their use is not recommended. 
  1453.  
  1454. Location Of Default ACLs
  1455.  
  1456. Consider the following possibilities for the origination of the default
  1457. ACL. 
  1458.  
  1459. System Wide
  1460.  
  1461. In this approach, one specific default ACL is assigned to any object
  1462. created on the system by any subject. This is a very inflexible solution
  1463. and misses the intent that discretionary access be set at the discretion
  1464. of the user. 
  1465.  
  1466. Per Process
  1467.  
  1468. In this approach, each user process defines a default ACL, similar to the
  1469. umask currently used. This is a somewhat restrictive approach since this
  1470. allows the user to set only a single set of defaults for all files
  1471. created. It is likely that a user will wish to associate different default
  1472. ACLs with files created for different projects. Additionally, the default
  1473. ACL entries would have to be stored in the process area. The amount of
  1474. process space required to hold the entries would vary based on the number
  1475. of entries. 
  1476.  
  1477. Per GID Of Created File
  1478.  
  1479. A default ACL could be associated with each GID. If GIDs are viewed as
  1480. project identifiers, the effect is to associate a unique default ACL
  1481. within each project subtree of the file system hierarchy. Further, in some
  1482. UNIX Systems, where GIDs propagate to newly created objects based on the
  1483. GID of the creating directory (rather than upon that of the creating
  1484. subject), default protection very naturally distributes across the file
  1485. system. However this variant imposes a somewhat restrictive viewpoint on
  1486. the utility of groups. 
  1487.  
  1488. Per Directory
  1489.  
  1490. This approach would allow the object's default ACL to originate from the
  1491. containing directory of the object. A directory would contain both an ACL
  1492. to be used for access checking and a default ACL to be used when a new
  1493. object is created in the directory. All objects created in the directory
  1494. would be assigned the default ACL. Newly created subdirectories would
  1495. inherit the default ACL of the parent directory. In this manner, the
  1496. default will propagate down through the file system structure resulting in
  1497. much duplication of ACLs, possibly using much space. However, the
  1498. utilization of such space is a small price to pay for enhanced security
  1499. and usability, so the default should probably continue to propagate until
  1500. the user takes some explicit action to stop the propagation. 
  1501.  
  1502. Recommendation
  1503.  
  1504. A user typically arranges objects per directory representing project work
  1505. or areas of interest. Since it is desirable, then, for similar objects to
  1506. contain the same ACL, the per-directory approach becomes the preferred
  1507. mechanism. Newly-created subdirectories should inherit the default ACL of
  1508. the parent directory, so that defaults are propagated down the file
  1509. system, unless explicitly turned off. 
  1510.  
  1511. Default ACL Entries At File Creation
  1512.  
  1513. Currently, when a file is created a user can specify its initial
  1514. pe'rmissions, however the access can be further restricted by the umask
  1515. mechanism. The uniask specifies the default protection bit settings when a
  1516. file is created. Any bits set in the umask will be cleared in the bit
  1517. settings on the newly created file. It is important, then, to consider how
  1518. the default permission bit settings should interact with the entries in a
  1519. default ACL. 
  1520.  
  1521. Consider the following options in the context of masking the ACL entries
  1522. by the file group class permission bits as recommended in the ACL
  1523. Evaluation section. Also note that these options are discussed with
  1524. respect; to the ACL entry types as described in the ACL Entry Type and
  1525. Format section. Additional mechanisms in the ACL which allow direct
  1526. modification of the file group class permission bits at file creation are
  1527. not precluded. 
  1528.  
  1529. OR File Group Class Permission Bits
  1530.  
  1531. Add the default entries to the file and change the file group class
  1532. permission bits to reflect the maximum permissions allowed in the ACL.
  1533. This could result in more permission than was specified in the creation
  1534. call. It is not reasonable to assume that the default permission bit
  1535. settings can be ignored and completely overridden by the ACL. For example,
  1536. if a default entry exists for user "fred" with the specified permissions
  1537. of "rwx" but the file is not executable, then this permission should not
  1538. be given. 
  1539.  
  1540. AND File Group Class Permission Bits
  1541.  
  1542. Add the default entries to the file but change the permissions of the ACL
  1543. entries so that they are no greater than the file group class permission
  1544. bits. This is a reasonable alternative, but it may present a compatibility
  1545. problem for some applications. An example of this problem would be when a
  1546. C compiler creates a file. The file would not originally be created with
  1547. execute permission, therefore no ACL entries on the file (which were
  1548. default entries copied from the directory) would have execute permission.
  1549. The last step for the compiler would be to make the file executable,
  1550. however at this point, execute permission' which may have been specified
  1551. in the default ACL entry is lost. 
  1552.  
  1553. No Change To File Group Class Permission Bits
  1554.  
  1555. Add the default entries to the file but do not change the file group class
  1556. permission bits. This may result in ACL entries which are restricted by
  1557. the file group class permission bits. 
  1558.  
  1559. Recommendation
  1560.  
  1561. The No Change To File Group Class Permission Bits is recommended since it
  1562. is a reasonable alternative which does not present any problems of
  1563. compatibility for some applications. 
  1564.  
  1565. Summary
  1566.  
  1567. This document has provided an analysis of key issues involved in extending
  1568. the discretionary access control in the UNIX system. For oach of the
  1569. issues identified, the paper has suggested alternative solutions,
  1570. discussed the pros and cons of each, and then provided a recommendation. 
  1571.  
  1572. The following is a review of some of the important recommendations
  1573. presented in the paper. An access control list mechanism was chosen to
  1574. extend the current DAC mechanism. When considering the types of access
  1575. provided in the UNIX system, additional access modes need not be defined,
  1576. however they should also not be precluded. The recommended ACL entry type
  1577. was that of user or group entries. The main advantages of this solution
  1578. are conformance with the UNIX system method of identification through
  1579. either the user-ID or the group-ID, and simplicity for the user. The
  1580. method in which file protection bits and ACLs interact is a very important
  1581. and complex issue given the conflicting goals of security and
  1582. compatibility. The recommendation of masking the ACL entries by the group
  1583. field of the protection bits was chosen as the most accommodating solution
  1584. considering these goals. A system defined ordering of the ACL entries was
  1585. preferred and it was recommended that the access allowed for a user in
  1586. multiple groups should be the sum of all access allowed for each group
  1587. represented in the ACL. Considering other multiple group issues9 it was
  1588. recommended to provide the multiple concurrent group capability along with
  1589. some method of subsetting. It was also recommended that default ACLs be
  1590. provided and that they originate from the parent directory of the newly
  1591. created object. 
  1592.  
  1593. It is important to note that although these and other specific
  1594. recommendations were given, it is certainly possible to design an
  1595. acceptable class B3, POSIX-compliant UNIX system following some of the
  1596. other alternatives. In fact, there are issues where the recommended
  1597. solution may not be superior to another alternative and the designer
  1598. should consider his/her own specific requirements when making a choice in
  1599. those areas. It must also be pointed out that building a system following
  1600. all the recommendations presented in this paper will not guarantee a full
  1601. class B3 system. There are many additional class B3 requirements that go
  1602. beyond the interface specification. 
  1603.  
  1604. APPENDIX: Worked Example
  1605.  
  1606. Introduction and Overview
  1607.  
  1608. This worked example describes one particular Implementation following the
  1609. recommendations in the TRUSIX rationale. 
  1610.  
  1611. Discretionary Access Control
  1612.  
  1613. Discretionary access control (DAC) provides for the controlled sharing of
  1614. objects (e.g., files, IPC objects) between subjects (e.g., processes).
  1615. With discretionary access control, the owner of an object can grant
  1616. permissions to other users. The discretionary access control mechanism
  1617. uses object owner, object group, file permission bits (nine permission
  1618. bits) and the access control list (ACL) of an object to determine the
  1619. discretionary access to the object. 
  1620.  
  1621. This document will detail the DAC interfaces and their run-time behavior. 
  1622.  
  1623. The goals of this ACL mechanism were: 
  1624.  
  1625.      ₧ compatibility with the current UNIX System DAC mechanism and POSIX 
  1626.  
  1627. P1003.1
  1628.  
  1629.      ₧ user command interfaces that are easy to use and understand 
  1630.      ₧ adhere to the "principle of least astonishment" 
  1631.      ₧ interfaces should continue to work as expected 
  1632.      ₧ chmod 000 file - no access to file 
  1633.      ₧ chmod 700 file - only owner access to file 
  1634.      ₧ chmod 444 file - denies write and execute access to file 
  1635.  
  1636. In addition, intermixing use of the existing and new DAC commands should
  1637. give reasonable results. For instance chmod should not fail due to ACLs,
  1638. and when chmod x file is executed (x is an octal permission) Is -l
  1639. displays x as the permissions. The current output of Is -l displays the
  1640. file permission bits as a constant width set of nine characters: 
  1641.  
  1642. rwxrwxrwx 
  1643.  
  1644. However, an ACL, which consists of one or more user entries, one or more
  1645. group entries, one class entry, and one other entry, is not a constant
  1646. length (in the following example, indicates zero or more occurrences of
  1647. the preceding entry type): 
  1648.  
  1649.      # file: filename 
  1650.      # owner: uid 
  1651.      #group:gid 
  1652.      user::rwx 
  1653.      user:uid:rwx 
  1654.  
  1655.  
  1656.      group::rwx 
  1657.      group:gid:rwx 
  1658.  
  1659.  
  1660.      class:rwx 
  1661.      other:rwx 
  1662.  
  1663. The file permission bits shown by the Is command have the following
  1664. meaning: (note the following "class" definitions are from the IEEE POSIX
  1665. Std 1003.1-1988): 
  1666.  
  1667.      1. the first 3 bits (high order) represent the file owner class and
  1668.      define the permissions for the object owner, 
  1669.      2. the middle 3 bits (commonly called the group permission bits),
  1670.      represent the file group class. This class includes the owning group
  1671.      of the file and will be extended to include additional user and
  1672.      additional group ACL entries. 
  1673.      3. the last 3 bits (low order) represent the file other class and
  1674.      define the permissions for other (those that did not fall into 1 or 2
  1675.      above). 
  1676.  
  1677. These nine bits indicate the maximum discretionary permissions for an
  1678. object. The actual permissions may always be less than indicated. For
  1679. instance, the permission may indicate write access on an object by a
  1680. specific subject, but the file system may be mounted read only. If an ACL
  1681. mechanism is used these bits will continue to indicate the maximum
  1682. discretionary permissions for the object and the ACL may further restrict
  1683. permissions. 
  1684.  
  1685. There is a direct mapping between the ACL and the file permission bits.
  1686. Specifically, the file owner class permission bits will always be equal to
  1687. the permissions of the ACL entry for the object owner (they may be the
  1688. same bits depending upon the implementation). Additionally, the file other
  1689. class permission bits will always be equal to the ACL other entry
  1690. permissions. And the file group class permission bits will always be equal
  1691. to the ACL class entry permissions. Typically, the file group class
  1692. permission bits are set to the maximum permissions allowed to the
  1693. additional user entries, the owning group entry, and the additional group
  1694. entries. 
  1695.  
  1696. Whenever a file is created on a file system that supports ACLs, the ACL
  1697. will contain a user entry for the object owner, a group entry for the
  1698. object owning group, a class entry for the file group class permissions,
  1699. and an other entry for the rest of the world. For compatibility with the
  1700. current mechanism, if the ACL contains no additional user or additional
  1701. group entries, the permissions in the group entry for the object owning
  1702. group and the class entry must be the same. 
  1703.  
  1704. Use of Access Control Lists
  1705.  
  1706. The use of DAC with ACLs will be explained by comparing it to how a user
  1707. of a non-ACL supporting UNIX System (as currently exists) would use DAC.
  1708. To use the current DAC mechanism a user usually first executes Is -l and
  1709. based on the output decides what the permissions must be changed to. in
  1710. order to allow the desired access (for example the user may want to make
  1711. the file executable, or only allow the owner to have write permission). 
  1712.  
  1713. EXAMPLE:
  1714.  
  1715. $ ls -l foo 
  1716.  
  1717.      ₧ rw-rw-rw- 1 craig demo 53 Mar 6 17:37 foo S chmod 600 foo $ ls -l
  1718.      foo 
  1719.      ₧ rw 1 craig demo 53 Mar 617:37 foo 
  1720.  
  1721. In the new DAC mechanism, using a pure ACL, there will be two new commands
  1722. getacl and setacl (there will be a new function, acl, for which these
  1723. commands provide a user interface). The getacl command will be used to
  1724. display the ACL and the setacl command will be used to change the ACL. 
  1725.  
  1726. These commands will be used in much the same way that Is and chmod are
  1727. used. A user would first execyte getacl to look at the ACL and then use
  1728. setacl to make the desired changes. Because the ACL is not a fixed size,
  1729. it may be difficult to manipulate. In order to simplify the use of ACLs
  1730. the following example shows how the ACL may be easily manipulated using a
  1731. text editor to give greater flexibility (note that changes may also be
  1732. specified on the setacl command line). 
  1733.  
  1734. EXAMPLE:
  1735.  
  1736.      #the output of getacl is redirected to the file tmp 
  1737.      $ getacl bar > tmp 
  1738.      #the file tmp is edited and the line in italics is inserted 
  1739.      $ vi tmp 
  1740.      # file: bar 
  1741.      # owner: craig 
  1742.      # group: demo 
  1743.      user::rw- 
  1744.      group::rw- 
  1745.      group:guest:r- 
  1746.      class:rw- 
  1747.      other:rw- 
  1748.      #setacl is executed and the contents of the file tmp become the new
  1749.      ACL for bar 
  1750.      $ setacl -f tmp bar 
  1751.      #the output from getacl for the file bar is displayed 
  1752.      $ getacl bar 
  1753.      # file: bar 
  1754.      # owner: craig 
  1755.      group: demo 
  1756.      user::rw- 
  1757.      group::rw- 
  1758.      group guest :r- 
  1759.      class:rw- 
  1760.      other:rw- 
  1761.  
  1762. Structure of Access Control Lists
  1763.  
  1764. The ACL consists of the following types of entries, which must be in the
  1765. following order: 
  1766.  
  1767.      1. user entry - This type of entry contains a user ID and the
  1768.      permissions associated with it. There must always exist one entry of
  1769.      th1is type, which will represent the object owner, and will be
  1770.      denoted by a null (unspecified) user ID. There may be additional user
  1771.      entries specified; however, no two additional user entries will have
  1772.      the same user ID and there may not be any additional entries with a
  1773.      null user ID. The term "additional user entries" will be used to
  1774.      indicate all user entries except the entry for the object owner. 
  1775.      2. group entry - This type of entry contains a group ID and the
  1776.      permissions associated with it. There must always exist one entry of
  1777.      this type, which will represent the object owning group, and will be
  1778.      denoted by a null (unspecified) group ID. There may be additional
  1779.      group entries specified; however. no two additional group entries may
  1780.      have the same group ID and there may not be any additional entries
  1781.      with a null group ID. The term "additional group entries" will be
  1782.      used to indicate all group entries except the entry for the object
  1783.      owning group. 
  1784.      3. class entry - This type of entry contains the maximum permissions
  1785.      granted to the file group class. There is exactly one of these
  1786.      entries in an ACL. 
  1787.      4. other entry - This type of entry contains the permissions granted
  1788.      to a subject if none of the above entries have been matched. There is
  1789.      exactly one of these entries in an ACL. 
  1790.      5. default entry - This type of entry may only exist on a directory.
  1791.      These entries are similar to the entries described above, except that
  1792.      they are never used in an access check, but are used to indicate the
  1793.      non-default ACL entries that should be added to a file created within
  1794.      the directory. Default entries are optional9 but no two default
  1795.      entries may have the same type and ID. 
  1796.  
  1797. Within each category the entries must be ordered as follows: 
  1798.  
  1799. Entries in the user category shall be sorted numerically by user ID from
  1800. lowest to highest, except for the object owner entry9 which always
  1801. precedes all other user entries. 
  1802.  
  1803. Entries in the group category shall be sorted numerically by group ID from
  1804. lowest to highest, except for the object owning group entry, which always
  1805. precedes all other group entries. 
  1806.  
  1807. Entries in the default:user category shall be sorted numerically by user
  1808. ID from lowest to highest, except for the default object owner entry,
  1809. which always precedes all other default user entries. Entries in the
  1810. default:group category shall be sorted numerically by group ID from lowest
  1811. to highest, except for the default object owning group entry, which always
  1812. precedes all other default group entries. The proper ordering of entries
  1813. required by the acl function can be obtained by the use of the aclsort
  1814. function. ACL entries given as input to the setacl command need not be
  1815. sorted; the sorting will be performed by the setacl command. 
  1816.  
  1817. The permissions that may be specified in an ACL entry are read(R),
  1818. write(w), and execute/search(x). When the setacl command is executed, the
  1819. file owner class permission bits will be set to the permissions specified
  1820. for the owner and the file other class permission bits will be set to the
  1821. permissions specified for other. As an option, the file group class
  1822. permission bits will be manipulated such that they reflect the maximum
  1823. permission that the ACL permits to members of the file group class (any
  1824. ACL entry other than the object owner or other). Otherwise, the file group
  1825. class permission bits will be set to the permissions specified by the
  1826. class entry. Therefore, if the file group class only allows read
  1827. permission then additional user entries and any group entries in the ACL
  1828. will not grant write or execute permission. 
  1829.  
  1830. This ACL scheme supports finer discretionary access controls than the
  1831. current mechanism, while maintaining compatibility with the current
  1832. permissions mechanism. The DAC information may be changed in one atomic
  1833. operation, avoiding the possibility of an intermediate insecure state.
  1834. Finer controls can be specified via the ACL, including explicit
  1835. specification of users disallowed any access to the object. Additionally,
  1836. the file permission bits provide a summary of all access rights. 
  1837.  
  1838. Rationale: The ACL scheme described here will allow entries to be either
  1839. permissive or restrictive. In general, an entry that results in less
  1840. permission than the file other class permissions would grant would be
  1841. considered restrictive. An entry that results in more permission than the
  1842. file other class permissions would grant would be considered permissive.
  1843. In the event that a file with an ACL is exported to a non-ACL system, the
  1844. loss of permissive entries would not present a security problem; however,
  1845. the absence of support for restrictive entries may allow a process to have
  1846. permission that it would not have been granted on a system with ACLs. This
  1847. behavior must be described in the documentation. 
  1848.  
  1849. Discretionary Access Check Algorithm
  1850.  
  1851. A process may request read, write, or execute/search access permissions to
  1852. a file. Each access mode is logically checked separately using the
  1853. following algorithm. The process request is granted if all individually
  1854. requested modes are granted. Otherwise, the access request is denied. 
  1855.  
  1856. Note, this is a logical description of the access check. The physical code
  1857. sequence may be different for better performance. 
  1858.  
  1859. Discretionary Access Check Algorithm: 
  1860.  
  1861.      I. File Owner Class: If the effective user ID of the process matches
  1862.      the user ID of the owner of the file, the process is in the file
  1863.      owner class. If the requested access mode bit is set in the file
  1864.      owner class permission bits, this access mode is granted. Otherwise,
  1865.      access is denied. 
  1866.  
  1867. Note, the user ACL entry for the object owner matches the file owner class
  1868. permission bits. 
  1869.  
  1870.      II. File Group Class: If the process is not in she- file owner class
  1871.      and if the effective user ID of the process matches the user ID of an
  1872.      additional user ACL entry or the effective group ID or any of the
  1873.      supplementary group IDs of the process matches the group ID of any
  1874.      group ACL entry9 the process is in the file group class. If the
  1875.      process matched an additional user ACL entry, only that entry is used
  1876.      as the matching ACL entry; otherwise, the matching group ACL entry or
  1877.      entries are used. If the requested access mode bit is set in the file
  1878.      group class permission bits and is set in a matching ACL entry, this
  1879.      access mode is granted. Otherwise, access is denied. 
  1880.      Note, the permissions of the additional user or group ACL entries
  1881.      further restrict the access specified by the file group class
  1882.      permission bits. Also, the class ACL entry matches the file group
  1883.      class permission bits. 
  1884.      III. File Other Class: If the process is not in the file owner class
  1885.      or file group class, the process is in the file other class. If the
  1886.      requested access mode bit is set in the file other class permission
  1887.      bits, this access mode is granted. Otherwise9 access is denied. 
  1888.  
  1889.      Note, the other ACL entry matches the file other class permission
  1890.      bits. 
  1891.  
  1892. The following examples show ACL use and the results of applying current
  1893. and new DAC commands. 
  1894.  
  1895. EXAMPLE 1:
  1896.  
  1897.      $create file foo 
  1898.      $ > foo 
  1899.      #execute ls -l and getacl on the file foo 
  1900.      $ Is -l foo 
  1901.           ₧ rw-r-r-- 1 craig demo 0 Mar 620:27 foo 
  1902.  
  1903.      $ getacl foo 
  1904.      $ file: foo 
  1905.      $ owner: Craig 
  1906.      $ group: demo 
  1907.      user::rw- 
  1908.      group::r- 
  1909.      class:r- 
  1910.      other:r- 
  1911.  
  1912. EXAMPLE 2:
  1913.  
  1914. #execute getacl and Is -I on the file, run.sh, with added ACL entries 
  1915.  
  1916. S Is -I run.sh 
  1917.  
  1918.      ₧ rwxr-xr-x+ 1 Craig demo 73 Mar 620:27 run.sh 
  1919.           $ getacl run.sh 
  1920.           # file: run.sh 
  1921.           # owner: Craig 
  1922.           # group: demo 
  1923.           user::rwx 
  1924.           user:fred:r-x 
  1925.           user:larry:--x 
  1926.           group::r-x 
  1927.           group guest:--- 
  1928.           class:r-x 
  1929.           other:r-x 
  1930.  
  1931. EXAMPLE 3:
  1932.  
  1933. #use the chmod command on a file with an ACL 
  1934.  
  1935. #use getacl to report both the ACL entries and the effective permissions 
  1936.  
  1937.      $ chmod 644 run.sh 
  1938.      S Is -l run.sh 
  1939.           ₧ rw-r-r--+ 1 craig demo 73 Mar 620:27 run.sh 
  1940.      $ getacl run.sh 
  1941.      # file: run.sh 
  1942.      # owner: craig 
  1943.      #group: demo 
  1944.      user::rw- 
  1945.  
  1946. user:fred:r-x #effective:r- 
  1947.  
  1948. user:larry:--x #effective:--- 
  1949.  
  1950. group::r-x #effective:r- 
  1951.  
  1952.      group guest:--- 
  1953.      class:r- - 
  1954.      other:r- 
  1955.  
  1956. File Object Creation
  1957.  
  1958. When a new object (regular files, special files, directories, named pipes)
  1959. is created in 
  1960.  
  1961. the file system, there are several important attributes that must be
  1962. initialized. These are the user ID of the owner of the file, the group ID
  1963. associated with the file, the file permission bits, and the ACL. 
  1964.  
  1965. The user ID of the file is set to the effective user ID of the invoking
  1966. process. The group ID of the file depends upon the mode of the containing
  1967. directory. If the S_ISGID bit is not set on the directory, the group ID of
  1968. the file is set to the effective group ID of the invoking process. If the
  1969. S_ISGID bit is set on the directory, the group ID of the file is set to
  1970. the group ID of the containing directory. 
  1971.  
  1972. Each function that creates a new file supplies an initial value for the
  1973. file permission bits. This initial value is then merged with the file mode
  1974. creation mask (umask) of the invoking process and with any default ACL
  1975. entries of the containing directory to form the file permission bits and
  1976. ACL of the new file. 
  1977.  
  1978. Although in many cases the process umask is sufficient to assign default
  1979. permissions, users making explicit use of ACLs may desire default ACLs.
  1980. The default ACL scheme must sensibly interact with the existing DAC
  1981. mechanism, including umask. The default ACL entries specify permissions
  1982. for users and/or groups and/or others, that will be assigned to a new
  1983. file. These default ACL entries are associated with a directory. Note, an
  1984. ACL on a directory may contain entries that control access to the
  1985. directory and entries (defaults) used for new file creation in that
  1986. directory. 
  1987.  
  1988. The process of creating the file permission bits and the ACL for the new
  1989. file is called "ACL Merge". First, any mode parameter is transformed into
  1990. the equivalent ACL form. For example, the mode 0664 is equivalent to
  1991. user::rw-, group::rw-, class:rw-, other:r--. Also, the complement of the
  1992. umask is used to obtain the equivalent ACL. Thus, the umask 022 is
  1993. equivalent to user::rwx, group::r-x, class:r-x, other:r-x. 
  1994.  
  1995. Two ACLs are merged by first logically sorting both ACLs into one ACL.
  1996. Then any pair of matching entries are replaced with an entry that has
  1997. permissions formed by ANDing the matched entries. Thus a permission is in
  1998. the merged entry only if it was previously in both entries. 
  1999.  
  2000. The first ACL merge is with the initial mode from the file creation
  2001. function and with the process file mode creation mask. The second ACL
  2002. merge is with any default entries from the containing directory. The
  2003. result is the ACL for the new file. The file permission bits are then set
  2004. from the user, class, and other ACL entries. Note, this may be different
  2005. from the setacl command with the -r option since this merge does not set
  2006. the file group class permission bits to the maximum permission of the file
  2007. group class entries. 
  2008.  
  2009. Finally, if the new object is a directory, then any default entries from
  2010. the containing directory are copied to the new ACL. That is, the default
  2011. ACL entries of the new directory are the same as the default ACL entries
  2012. of the containing directory. 
  2013.  
  2014. An example of the ACL merge operation is shown in the following figure: 
  2015.  
  2016. 000666::rw 
  2017.  
  2018. user::rw- 
  2019.  
  2020. creat("file", 0666) .. . .. . group::rw- 
  2021.  
  2022.      class:rw- 
  2023.      other:rw- ACL Merge 
  2024.  
  2025. Operation 
  2026.  
  2027. umask 002 user::rwx 
  2028.  
  2029. group::rwx 
  2030.  
  2031. class:rwx 
  2032.  
  2033. other:r-w 
  2034.  
  2035.      0664 
  2036.      user::rw- 
  2037.      group::rw- 
  2038.      class :rw- 
  2039.           other:r- 
  2040.  
  2041. Directory .... user:gamma:r-- 
  2042.  
  2043. default ACL group::r- 
  2044.  
  2045. entries .. .. . group:alpha:rw- 
  2046.  
  2047. qroup:beta:--- 0664 
  2048.  
  2049. user::rw- 
  2050.  
  2051. user:gamma:r- 
  2052.  
  2053.      group::r- 
  2054.      group:alpha:rw- 
  2055.      group:beta:--- 
  2056.      class:rw- 
  2057.      other:r- 
  2058.  
  2059. IPC Object Creation
  2060.  
  2061. When an IPC object is created (by shmget for shared memory, by semget for
  2062. semaphores, by msgget for messages), its cuid and uid will be set equal to
  2063. the effective user ID of the invoking process and its cgid and gid will be
  2064. set equal to the effective group ID of the invoking process. The initial
  2065. permissions are set equal to the specified permissions in the flag
  2066. argument to the *get calls (shmflg, semflg, and msgflg, respectively).
  2067. Note that default ACLs do not apply to IPC~' objects, although ACLs may be
  2068. added explicitly to an IPC object via the acllpc call. 
  2069.  
  2070. Compatibility Requirements
  2071.  
  2072. A user will generally use the current DAC commands (Is and chmod) or the
  2073. new DAC commands (getacl and setacl). However, the use of these commands
  2074. are likely to still be inter-mixed, and they must all give correct
  2075. information. 
  2076.  
  2077. The entire interface to the current discretionary access control
  2078. information must continue to function as it currently does. For example,
  2079. chmod must still be able to modify the file permission bits and Is must
  2080. still be able to report them. 
  2081.  
  2082. Note that although Is will still report these permissions. they will not
  2083. be the only permissions evaluated during an access check. The output of Is
  2084. will continue to be the maximum permission that may be granted, but there
  2085. may be additional discretionary access control information (ACL entries)
  2086. that was added to the object. In order to indicate that additional entries
  2087. exist, Is-I will display the character "+" to the right of the current
  2088. permissions display if an ACL is present. Therefore, when additional
  2089. discretionary access control information has been added, in the form of
  2090. ACL entries (as shown in the examples on previous pages), a user will need
  2091. to use the newly provided command, getacl, to get a full view of the
  2092. current discretionary access controls in effect. Although chmod will still
  2093. modify the file permission bits, it will not change any additional
  2094. discretionary access control information (i .e., ACL entries for
  2095. additional users and additional groups) added to the object. To change
  2096. these additional entries if they exist, the user will need to use the
  2097. setacl command. 
  2098.  
  2099. When the owner of an object is changed, the result will be identical to
  2100. the current behavior. If the owner is changed to a user ID for which an
  2101. additional user entry already exists in the ACL, the additional user entry
  2102. is not changed but the user entry for the object owner will take
  2103. precedence during an access check. When the group of an object is changed.
  2104. the result will be identical to the current behavior. If the group is
  2105. changed to a group ID for which an additional group entry already exists
  2106. in the ACL, the additional group entry is not changed but the group entry
  2107. for the object owning group will take precedence during an access check
  2108. (except in the case of multiple concurrent groups, where all group entries
  2109. are given equal treatment). 
  2110.  
  2111. When the ACL contains no additional user or additional group entries, the
  2112. permissions in the group entry for the object owning group and in the
  2113. class entry must be the same. This behavior is the same as the current
  2114. mechanism since the file permission bits can only specify at most three
  2115. different permissions. 
  2116.  
  2117. Documentation Requirements
  2118.  
  2119. The ACL mechanism and its proper use must be fully described in the
  2120. Trusted Facility Manual and manual pages must be created for the Security
  2121. Features User's Guide and Security Features Programmer's Guide for all new
  2122. commands and functions. 
  2123.  
  2124. Commands and Functions
  2125.  
  2126. setacl Command
  2127.  
  2128. DESCRIPION: The setacl command will support the changing of discretionary 
  2129.  
  2130. permission information associated with a file. It will allow the file
  2131. owner or a process with appropriate permission or appropriate privilege to
  2132. perform the following functions: 
  2133.  
  2134.      1. replace an entire ACL, including the default ACL entries on a
  2135.      directory, 
  2136.      2. add, change, or delete an ACL or default ACL entry or entries. 
  2137.  
  2138. This command gives the user an interface to a pure ACL mechanism, allowing
  2139. a finer granularity for file access. 
  2140.  
  2141. Note that this command only supports the file system objects: e.g.,
  2142. regular files, special files, directories, and named pipes. For
  2143. simplicity, these objects are referred to as "files". 
  2144.  
  2145. SYNOPSIS:
  2146.  
  2147. setacl [-r] [ -rn (u[ser]::operm Jperm[,]] 
  2148.  
  2149.      [rn[ser]:uid:operm perm[,...]] 
  2150.      [g[roup]::operm perm[9]] 
  2151.      [g[roup]:gid:operm perm[,...]] 
  2152.      [c[lass]:operm perm[,]] 
  2153.      [o[ther]:operm perm[,]] 
  2154.      [d[efault]:u[ser]::operm perm] 
  2155.      [d[efault]:u[ser]:uid:operm perm[....]] 
  2156.      [d[efault]:g[roup]::operm perm] 
  2157.      [d[efault]:g[roup]:gid:operm perm[....]] 
  2158.      [d[efault]:c[lass]:operm perm] 
  2159.      [d[efault]:o[ther]:operm perm] 
  2160.  
  2161.      ₧ d [u[ser]:uid[,...]][g[roup]:gid[,...]] [d [efault]:u[ser]:[,...]] 
  2162.           [d[efault]:u[ser]:uid[,...]] [d[efault]:g[roup]:[,...]] 
  2163.           [d[efault]:g[roup]:gid[,...]] [d[efault]:c[lass]:[,...]] 
  2164.           [d[efault]:o[ther]:[,...]]] 
  2165.  
  2166. file 
  2167.  
  2168. or 
  2169.  
  2170. setacl [-r] -s u[ser]::operm perm[,] 
  2171.  
  2172.      [u[ser]:uid:operm perm[,...]] 
  2173.      g[roup]::operm perm[,] 
  2174.      [g[roup]:gid:operm perm[,...]] 
  2175.      c [lass]:operm perm [,] 
  2176.      o[ther]:operm perm[,] 
  2177.      [d[efault]:u[ser]::operm perm] 
  2178.      [dl[ef&Wt]:u[ser]:uid:operm perm[,...]] 
  2179.      [d[efault]:g[roup]::operm perm] 
  2180.      [d[efault]:g[roup]:gid:operm perm[,...]] 
  2181.      [d[efault]:c[lass]:operm perm] 
  2182.      [d[efault]:o[ther]:operm perm] 
  2183.  
  2184. file... 
  2185.  
  2186. or 
  2187.  
  2188. setacl [-r] -f acljile file 
  2189.  
  2190. where: 
  2191.  
  2192. operm = octal representation of permissions 
  2193.  
  2194. (Note: for an ACL entry one octal digit is required) 
  2195.  
  2196. perm = a permissions string composed of the 
  2197.  
  2198. characters r (read). w (write), x (execute/search), or - (no permission).
  2199. The permission string must be at least 1 character and no more than 3
  2200. characters. The characters r. w, and x may only be in the string at most
  2201. once. The characters may be in any order within the string. 
  2202.  
  2203. uid = user identity (i.e., login name or user ID) gid = group identity
  2204. (i.e., group name or group ID) 
  2205.  
  2206. When the -f option is specified, it will take the access control
  2207. information stored in the file acljile and assign it to the file file. See
  2208. the PROCESSING section below for further information on the format of the
  2209. file acljile. 
  2210.  
  2211. PROCESSING: A unique ACL will exist for each file on the system. There are
  2212. four 
  2213.  
  2214. types of ACL entries, consisting of user, group, class, and other. The
  2215. user entry for the file owner, the group entry for the file owning group,
  2216. the class entry for the file group class, and the entry for other must
  2217. always be in the ACL. 
  2218.  
  2219.      1. user entry - This type of entry contains a user ID and the
  2220.      associated permissions that will be granted to the user. There must
  2221.      always exist one entry of this type, which will represent the file
  2222.      owner, and will be denoted by a null (unspecified) user ID. There may
  2223.      be additional user entries specified; however each entry must specify
  2224.      a unique user ID and there may not be any additional entries with a
  2225.      null user ID. If there is a user entry with a user ID equal to the
  2226.      file owner the file owner entry will take precedence when an access
  2227.      check is performed. 
  2228.      2. group entry - This type of entry contains a group ID and the
  2229.      associated permissions that will be granted to the group. There must
  2230.      always exist one entry of this type, which will represent the file
  2231.      owning group, and will be denoted by a null (unspecified) group ID.
  2232.      There may be additional group entries specified; however, each entry
  2233.      must have a unique group ID and there may not be any additional
  2234.      entries with a null group ID. 
  2235.      3. class entry - This type of entry contains the maximum permissions
  2236.      for the file group class. There is exactly one of these entries in an
  2237.      ACL. 
  2238.      4. other entry - This type of entry contains the permissions granted
  2239.      to a subject if none of the above entries have been matched. There is
  2240.      exactly one of these entries in an ACL. 
  2241.  
  2242. When the setacl command is used to change the ACL. it may result in
  2243. changes to the file permission bits. Specifically. when the user ACL entry
  2244. for the file owner is modified the file owner class permission bits will
  2245. be modified. When the class ACL entry is modified, the file group class
  2246. permission bits will be modified. When the other ACL entry is modified the
  2247. file other class permission bits will be modified. 
  2248.  
  2249. When the additional user entries or additional group entries of the ACL
  2250. are modified, the file group class permission bits may also need to be
  2251. modified to reflect the maximum permission allowed by these entries. 
  2252.  
  2253. The -r, recalculate, option will result in the permissions specified in
  2254. the class entry being ignored and replaced by the maximum permission
  2255. needed for the file group class. For example, if there are no additional
  2256. user entries or additional group entries, the permission of the group
  2257. entry for the file owning group is used for the class entry. 
  2258.  
  2259. A directory may contain default ACL entries. These entries may be of the
  2260. type default:user. default:group, default:class, or default:other. For
  2261. default:user entries, if no user ID is specified, this entry will apply to
  2262. the file owner permissions. Additional default:user entries must have a
  2263. unique user ID specified. For default:group entries, if no group ID is
  2264. specified, this entry will apply to the file owning group permissions.
  2265. Additional default:group entries must have a unique group ID specified. If
  2266. there are no additional default:user entries or additional default:group
  2267. entries, then the permissions of the default group and the default class
  2268. must be the same. 
  2269.  
  2270. If a file is created in a directory which contains default ACL entries the
  2271. entries will be added to the newly created file. Note that the default
  2272. permissions specified for the file owner class, file group class, and file
  2273. other class will be constrained by the umask and the mode( specified in
  2274. the file creation call. If default ACL entries are specified for a file
  2275. which is not a directory the command will fail (11), see ERRORS AND
  2276. RETURNS. 
  2277.  
  2278. With no options and arguments (1), see ERRORS AND RETURNS. If the MAC or
  2279. DAC check fails when a request is made to modify the ACL (2), see ERRORS
  2280. AND RETURNS. If the file named file does not exist (6), see ERRORS AND
  2281. RETURNS. 
  2282.  
  2283. If options are specified, the validity of the option-arguments will be
  2284. checked. If an invalid option is specified (3a), see ERRORS AND RETURNS.
  2285. The arguments must be processed in the order specified (e.g., if the
  2286. modify option is specified with a user, followed by the delete option with
  2287. ihe same user, the entry will be deleted). 
  2288.  
  2289. For the -m. -s, and -d options, if uid is not a valid login name or a
  2290. valid user ID (3b), or if gid is not a valid group name or a valid group
  2291. ID (3c), or if a specified perrn is not r. w. x, -, or a specified operm
  2292. is not an octal digit (3d), see ERRORS AND RETURNS. 
  2293.  
  2294. The -m option is used to add a new ACL entry or change an existing ACL
  2295. entry. 
  2296.  
  2297. If an entry already exists for the specified uid or gid. the specified
  2298. permissions (perm operm) will replace the current permissions. If an entry
  2299. does not exist for the specified uid or gid, an entry will be created.
  2300. Note that an entry with no permissions will result in the specified uid or
  2301. gid being denied access (any permissions) to the file. To specify no
  2302. access in an entry being modified or added, either 0 should be specified
  2303. for operm or - should be specified for perm. 
  2304.  
  2305. The -s option is used to replace the ACL information on a file. The effect
  2306. of using this option is that all entries are removed, and replaced by the
  2307. newly specified ACL. If -s is specified with -d, -f, or -m (ST, see ERRORS
  2308. AND RETURNS. There must be exactly one user entry specified for the file
  2309. owner, exactly one group entry specified for the file owning group,
  2310. exactly one class entry specified for the file group class, and exactly
  2311. one other entry specified. If there is no user entry specified for the
  2312. file owner. or no group entry specified for the file owning group9 or no
  2313. class entry specified for the file group class, or no other entry
  2314. specified (8), see ERRORS AND RETURNS. There may be additional user ACL
  2315. entries and additional group ACL entries specified. If duplicate entries
  2316. are specified (9), see ERRORS AND RETURNS. 
  2317.  
  2318. The -d option is used to delete an existing entry from the ACL. If a
  2319. matching entry is not found (4a), see ERRORS AND RETURNS. Othdrwise, the
  2320. matching entry will be deleted. The user entry for the file owner, the
  2321. group entry for the file owning group, the class entry, and the other
  2322. entry may not be deleted from the ACL. If an attempt is made to delete one
  2323. of these entries (4b), see ERRORS AND RETURNS. 
  2324.  
  2325. (Note: deleting an entry may have different effects than removing all the
  2326. specified permissions for an entry. If an entry is deleted and a search is
  2327. later done for the user or group identity that appeared in the entry, this
  2328. identity might match another entry and then be given the permissions
  2329. specified in this other entry. If the original entry remained with no
  2330. permissions and a search was done for this identity. the search might
  2331. match this entry and the subject would be denied access.) 
  2332.  
  2333. The -f option is used to assign the ACL information contained in the file
  2334. named acljile to the specified file(s). If -f is specified with -d. -s. or
  2335. -m (5), see ERRORS AND RETURNS. If the file named acljile does not exist
  2336. (6), see ERRORS AND RETURNS. The file named acljile must be readable by
  2337. the invoking subject. If it is not readable (2), see ERRORS AND RETURNS.
  2338. If the entire file named aclJile contains correct external
  2339. representation(s) for ACL entries, the ACL for the specified file(s) will
  2340. be (removed and) replaced with the ACL whose external representation is
  2341. contained in the file named acljile. Each external representation of an
  2342. ACL entry, contained in the file named acljile, must be on a separate line
  2343. and must be in the following format: 
  2344.  
  2345.      u[ser]::operm perm 
  2346.      [u[ser]:uid:operm perm] 
  2347.      g[roup]::operm perm 
  2348.      [g[roup]:gid:operm perm] 
  2349.      c[lass]:operm perm 
  2350.      o[ther]:operm perm 
  2351.      [d[efault]:u[ser]::operm perm] 
  2352.      [d[efault]:u[ser]:uid:operm perm[,...]] 
  2353.      [d[efault]:g[roup]::operm perm] 
  2354.      [d[efault]:g[roup]:gid:operm perm[,...]] 
  2355.      [d[efarnlt]:c[lass]:operm perm] 
  2356.      [d[efault]:o[ther]:operm perm] 
  2357.  
  2358. The entries are not required to be in any specific order within the file.
  2359. There must be exactly one user entry specified for the file owner, exactly
  2360. one group entry specified for the file owning group, exactly one class
  2361. entry specified for the file group class, and exactly one other entry
  2362. specified. If not, see ERRORS AND RETURNS. There may be additional user
  2363. ACL entries and additional group ACL entries specified. If duplicate
  2364. entries are specified (9), see ERRORS AND RETURNS.` Validity checks are
  2365. performed on all entries. If an invalid entry isencountered (7); see
  2366. ERRORS AND RETURNS. If the exact problem can bedetermined an additional
  2367. message may be displayed (3b)(3c)(3d), see ERRORS 
  2368.  
  2369. AND RETURNS.
  2370.  
  2371. The character "#" will be used to indicate a comment. All characters
  2372. starting with the #. to the end of the line will be ignored. Note that
  2373. this includes any effective permissions (#effective:rwx) displayed by
  2374. getacl. This command may be executed on a file system that does not
  2375. support ACLs. If ACL entries are specified which do not map into the base
  2376. permissions (10), see ERRORS AND RETURNS, otherwise the base permissions
  2377. will be set. 
  2378.  
  2379. ERRORS AND RETURNS: Following is a list of error conditions and the 
  2380.  
  2381. corresponding error message that should be output when this condition
  2382. occurs. 
  2383.  
  2384. usage: setacl [-r] [ -m [rn(ser]::operm perm[.]] 
  2385.  
  2386.      [rn[ser]:uid:operm perm[,...J] 
  2387.      [g[roup]::operm perm[9]] 
  2388.      [g(roup]:gid:operm perm[....]] 
  2389.      [c[Iass]:operm perm[₧]] 
  2390.      [o[ther]:operm perm[,]] 
  2391.      [d(efault]:u[ser]::operm perm] 
  2392.      (d(efarnlt]:u[ser]:uid:operm perm(9...]] 
  2393.      [d[efault]:g[roup]::operm perm] 
  2394.      [d[efault]:g[roup]:gid:operm perm[,...]] 
  2395.      [d[efault]:c[lass]:operm perm] 
  2396.      [d[efault]:o[ther]:operm perm] 
  2397.  
  2398.      ₧ d [rn[ser]:uid(,...]][g[roup]:gid(,...]] [d [e?ault]:u(ser]:] fd
  2399.      [efault]:u[ser]:uid[,...]] [d[efault]:g[roupj:[,...]] 
  2400.  
  2401.      [d[efault]:g(roup]:gid] [d[efarnlt]:o[ther]:]] 
  2402.  
  2403. file... 
  2404.  
  2405. or 
  2406.  
  2407. setacl [-r] -s rn(ser]::operm perm[,] 
  2408.  
  2409.      [rn[ser']:uid:operm perm[,...]] 
  2410.      g[roup]::operm perm(.] 
  2411.      [g[roup]:gid:operm perm[,...]] 
  2412.      c[lass]:operm perm[,] 
  2413.      o[ther]:operm perm[,] 
  2414.      [d[efault]:u[ser]::operm perm] 
  2415.      [d[efault]:u[ser]:uid:operm perm[9...]] 
  2416.      [d[efault]:g[roup]::operm perm] 
  2417.      [d[efault]:g[roup]:gid:operm perm[....]] 
  2418.      [d[efault]:c[lass]:operm perm] 
  2419.      [d[efault]:o[ther]:operm \perm] 
  2420.  
  2421. file 
  2422.  
  2423. or 
  2424.  
  2425. setacl [-r] -f acljile file 
  2426.  
  2427. (1) No options or arguments:
  2428.  
  2429.      UX:setacl: ERROR: incorrect usage 
  2430.      usage:... 
  2431.  
  2432. (2) If MAC or DAC check fails on the specified file:
  2433.  
  2434. UX:setacl: ERROR: permission denied for `jilename" 
  2435.  
  2436. (3) invalid option-arguments:
  2437.  
  2438.      (a) incorrect/unknown option specified: 
  2439.  
  2440.      UX:setacl: ERROR: illegal option-"-option" 
  2441.           usage: 
  2442.  
  2443.      (b) invalid user ID: 
  2444.  
  2445. UX:setacl: ERROR: unknown user-id "uid"
  2446.  
  2447.      (c) invalid group ID: 
  2448.  
  2449.      UX:setacl: ERROR: unknown group-id "gid" (dJ invalid permission: 
  2450.  
  2451. UX:setacl: ERROR: unknown permission "permission" 
  2452.  
  2453. usage:... 
  2454.  
  2455. (4) invalid attempt to delete an ACL entry:
  2456.  
  2457.      (a) attempt to delete a non-existent entry from an ACL: 
  2458.      UX:setacl: ERROR: matching entry not found in ACL 
  2459.      (b) attempt to delete file owner, file owning group. class. or other 
  2460.      ACL entries: 
  2461.      UX:setacl: ERROR: file owner, file group, "class". and "other"
  2462.      entries 
  2463.      may not be deleted 
  2464.  
  2465. (5) the options specified are mutually exclusive:
  2466.  
  2467. UX:setacl: ERROR: incompatible options specified 
  2468.  
  2469. usage: 
  2470.  
  2471. (6) filename does not exist:
  2472.  
  2473. UX:setacl: ERROR: file `jile,name" not found
  2474.  
  2475. (7) an invalid ACL entry encountered in the file acljile: 
  2476.  
  2477. UX:setacl: ERROR: "acljile", line line; invalid ACL entry
  2478.  
  2479. (8) required entry for file owner, file owning group, class, or
  2480. other missing:
  2481.  
  2482. UX:setacl: ERROR: required entry for file owner, file group, "class", or
  2483. "other" not specified usage: 
  2484.  
  2485. (9) duplicate ACL entries specified:
  2486.  
  2487. UX:setacl: ERROR: duplicate entries: "acl,entry" 
  2488.  
  2489. (10) the file system does not have ACLs, and additional entries
  2490. are specified:
  2491.  
  2492. UX:setacl: ERROR: only file owner, file group, "class" or "other" 
  2493.  
  2494. entries may be specified 
  2495.  
  2496. (11) the specified file is not a directory, and default e('ntries
  2497. have been specified:
  2498.  
  2499. UX:setacl: ERROR: default ACL entries may only be set on directories 
  2500.  
  2501. OUTPIIT: None 
  2502.  
  2503. getacl Command
  2504.  
  2505. DEsCRII'TION: The getacl command will support (he displaying of
  2506. discretionary 
  2507.  
  2508. information associated with a file. It will allow the file owner or a
  2509. process with appropriate permission or appropriate privilege to perform
  2510. the following functions: 
  2511.  
  2512.      1. display the owner, group, and ACL for the specified file(s), 
  2513.      2. display the default ACL for a directory. 
  2514.  
  2515. Note that this command only supports the file system objects: e.g.,
  2516. regular files, special files, directories. and named pipes. For
  2517. simplicity, these objects are referred to as "files". 
  2518.  
  2519. SYNOPSIS:
  2520.  
  2521. getacl [-ad] file 
  2522.  
  2523. PROCESSING: With no arguments (1), see ERRORS AND RETURNS. If MAC or 
  2524.  
  2525. DAC check fails when a request is made to display the ACL information (2),
  2526. see ERRORS AND RETU'RNS. With invalid options (3), see ERRORS AND RETURNS.
  2527. If the file named file does not exist (4), see ERRORS AND REtuRNS. 
  2528.  
  2529. With the -a option specified, the filename, owner, group, and the ACL of
  2530. the file will be displayed. With the -d option specified, the filename,
  2531. owner, group, and the default ACL of the file will be displayed, if it
  2532. exists. If the specified file does not support default ACLs (e.g., it is
  2533. not a directory) only the filename, owner, and group will be displayed.
  2534. With no option specified, both the ACL and the default ACL (if it exists)
  2535. of the file will be displayed. This command may be executed on a file
  2536. system that does not support ACLs. 
  2537.  
  2538. It will report the ACL based on the base permission bits. 
  2539.  
  2540. ERRORS AND RETURNS: Following is a list of error conditions and the 
  2541.  
  2542. corresponding error message that should be output when [his condition
  2543. occurs. 
  2544.  
  2545. usage: getacl [-ad] file 
  2546.  
  2547. (1) No arguments:
  2548.  
  2549.      UX:getacl: ERROR: incorrect usage 
  2550.      usage:... 
  2551.  
  2552. (2) If MAC or DAC check fails when a request is made to display
  2553. the ACL information:
  2554.  
  2555. UX:getacl: ERROR: permission denied for `file" - (3) incorrect/unknown
  2556. option specified: 
  2557.  
  2558.      UX:getacl: ERROR: illegal option-"-optio,t" 
  2559.           usage:... 
  2560.  
  2561. (4) file does not exist:
  2562.  
  2563. UX:setacl: ERROR: file `file" not found
  2564.  
  2565. OUTPUT: When an ACL is displayed, the external representation of the ACL
  2566. will 
  2567.  
  2568.      be as follows: 
  2569.      # file: filename 
  2570.      # owner: uid 
  2571.      # group: gid 
  2572.      user::perm 
  2573.      inser:uid:perm 
  2574.      group::perm 
  2575.      group:gid:perm 
  2576.      class:perm 
  2577.      other:perm 
  2578.      default :user: :perm 
  2579.      default :user:uid:perm 
  2580.      defai,lt :group: :perm 
  2581.      default :group :gid :perm 
  2582.      default :class :perm 
  2583.      default :other :perm 
  2584.  
  2585. The ACL entries will be displayed in the order listed above (the user
  2586. entry for the file owner, followed by zero or more additional user
  2587. entries, followed by the group entry [or the file owning group, followed
  2588. by zero or more additional group entries, followed by the class entry for
  2589. the file group class, followed by the entry for other). When the specified
  2590. file is a directory the entries described above may be followed by default
  2591. entries (the default user entry for the file owner, followed by zero or
  2592. more additional d~efault:user entries, followed by the default:group entry
  2593. for the file owning group, followed by zero or more additional
  2594. defarnlt:group entries, followed by the default:class entry for the file
  2595. group class, followed by the entry for default:other). Note that these
  2596. default ACL entries are never used in an access check. If more than one
  2597. file is specified, a blank line will be displayed before the ACL of the
  2598. next file is displayed. 
  2599.  
  2600. The first line displays the name of the file, next the file owner, and
  2601. then the file owning group. The user entry without a user ID indicates the
  2602. permissions -that will be granted to the owner of the file. The additional
  2603. user entries indicate the permissions that will be granted to the
  2604. specified user. The group entry without a group indicates the permissions
  2605. that will be granted to the group of the file. The additional group
  2606. entries indicate the permissions that will be granted to the specified
  2607. group. The class entry indicates the permissions that will be granted to
  2608. the file group class. The other entry indicates the permissions that will
  2609. be granted to others. 
  2610.  
  2611. The default entries (default user, default group, default:class, and
  2612. default:other) may only exist for directories, and indicate the default
  2613. user, group, class, and other entries respectively that will be merged
  2614. with the ACL for a new file created within the directory. 
  2615.  
  2616. The uid is a login name, or a user ID (only if there is no login name
  2617. associated with the user ID); gid is a group name. or a group ID (only if
  2618. there is no group name associated with the group ID); and perm is a three
  2619. character string composed of the letters representing the separate
  2620. discretionary access controls, r (read). w (write), x (execute/search), or
  2621. the character -. The perm will be displayed in the following order: rwx.
  2622. If a permission is not granted by this ACL entry. the placeholder. "-",
  2623. will appear. For example. if the user does not have write permission. but
  2624. does have read and execute permission, r-x will be output. 
  2625.  
  2626. The file group class permission bits constrain the ACL (represent the most
  2627. access that any entry in the ACL may have). If a user executes the chmod
  2628. command and changes the file group class permission bits this may change
  2629. the permissions that would be granted based on the ACL alone. This
  2630. behavior is necessary for the save-restore model (all permissions are
  2631. temporarily removed via chmod 000 file and then restored) to work
  2632. correctly. In order to indicate that the file permission bits are more
  2633. restrictive than an ACL entry, getacl will display the ACL entry as
  2634. described above with an additional tab followed by a sharp sign and the
  2635. effective permissions. 
  2636.  
  2637. Note that output from getacl will be in the correct format for input to
  2638. setacl. Therefore, if the output is redirected into a file (e.g., getacl
  2639. junk > entries), this file can be used as input to setacl (e.g., setacl -f
  2640. entries junk.new). In this way, a user can easily assign one file's ACL
  2641. information to another file. 
  2642.  
  2643. EXAMPLES:
  2644.  
  2645. 1) File with several ACL entries:
  2646.  
  2647.      #file:fred 
  2648.      #owner:craig 
  2649.      # group: demo 
  2650.      user::rwx 
  2651.      user:spy:--- 
  2652.      user:larry:rw- 
  2653.      group::r- 
  2654.      class:rw- 
  2655.      other:--- 
  2656.  
  2657. 2) Same file. after a "chmod 700 fred":
  2658.  
  2659.      #file:fred 
  2660.      $ owner: craig 
  2661.      $ group: demo 
  2662.      user::rwx 
  2663.      user:spy:--- 
  2664.  
  2665. user:larry:rw- #effective:--- 
  2666.  
  2667. group::r-- $effective:--- 
  2668.  
  2669.      class:--- 
  2670.      other:--- 
  2671.  
  2672. 3) Directory with ACL entries including default ACL entries: 
  2673.  
  2674.      $ file: foodir 
  2675.      $ owner: craig 
  2676.      $ group: demo 
  2677.      user::rwx 
  2678.      user:spy:--- 
  2679.      user:larry:rwx 
  2680.      group::r-x 
  2681.      class:rwx 
  2682.      other:r- 
  2683.      default:user::rwx 
  2684.      default user :larry :rwx 
  2685.      default:rnser:worm:- -- 
  2686.      default :group:demo:r - 
  2687.      default:other:--- 
  2688.  
  2689. A.23 4
  2690.  
  2691. DESCRIPTION: The act call will support the getting and setting of
  2692. discretionary 
  2693.  
  2694.      ₧ permission information associated with a file. It will allow the
  2695.      file owner or a process with appropriate permission or appropriate
  2696.      privilege to perform the following functions: 
  2697.           1. get or set a file's ACL information in an atomic operation. 
  2698.           2. return the number of entries contained in an file's ACL. 
  2699.  
  2700. Note that this call only supports the file system objects: e.g., regular
  2701. files, special files, directories, and named pipes. For simplicity, these
  2702. objects are referred to as "files". 
  2703.  
  2704. SYNOPSIS:
  2705.  
  2706. #include <tbd.h> 
  2707.  
  2708. int acl(const char *path, int cmd. int nentries, struct acl "aclbufp) 
  2709.  
  2710. Three values for cmd will be supported: ACLSET, ACLGET, and ACL_CNT. The
  2711. value of nentries is the number of ACL entries that can fit in the
  2712. user-supplied ACL buffer for an ACL_GET or the number actually present for
  2713. an ACL_SET; and aclbufp is a pointer to the user-supplied buffer of ACL
  2714. entry structures. The buffer will consist of an array of four (USEROBJ,
  2715. GROUPOBJ, CLASSOBJ, and OTHEROBJ entries are required) or more occurrences
  2716. of the following structure: 
  2717.  
  2718.      struct acl [ 
  2719.      intatype; 
  2720.      uidt aid; 
  2721.      ushort a_perm; 
  2722.  
  2723. Twelve values of arype will be supported to specify the type of entry:
  2724. (six for access checking and six for defaults), USEROBJ, USER, GROUPOBJ,
  2725. GROUP, CLASSoBJ, OTHERoBJ, DEF_USER_OBJ, DEF&SER, DEFGROUPoBJ, DEFGROUP,
  2726. DEFCLASSoBJ, and DEFoTHERoBJ. When arype is USER or DEF,USER, aid will be
  2727. a user id, and when atype is GROUP or DEFGROUP, aid will be a group id.
  2728. When atype is USERoBJ, GROUPoBJ, CLASSoBJ, OTHER_OBJ, DEF_USERoBJ,
  2729. DEFGROUPoB,l, DEFCLASSoBJ, or DEF_OTHER_OBJ, aid will not be used. The
  2730. permissions for the entry will be contained in a~erm. 
  2731.  
  2732.      ₧ 56 - 
  2733.  
  2734. PROCESSING: When the specified cmd is ACL,CNT, the return value from the
  2735. call 
  2736.  
  2737. will be the number of ACL entries for the filename pointed to by path. The
  2738. values of nentries and ac'bitfp will be ignored. ff the user does not pass
  2739. the DAC and MAC checks to see the ACL. the act call will fail (see ERRORS
  2740. AND RETURNS). 
  2741.  
  2742. When the specified cmd is ACL_GET. the ACL information for the filename
  2743. pointed to by path will be retrieved and the ACL entries will be placed in
  2744. the buffer pointed to by actbttjp. The value of nentries is the number of
  2745. entries that can be held in the allocated buffer. If the number of ACL
  2746. entries in the ACL is greater than the value of ttentries (that is. the
  2747. buffer space allocated to hold the files ACL entries is less than nentries
  2748. times the size of an entry), the acl call will fail (see ERRORS AND
  2749. RETURNS). On success. the return value from this call will be the number
  2750. of ACL entries retrieved. On any error. the contents of the acl structures
  2751. pointed to by actbufp are indeterminate. If the user does not pass the DAC
  2752. and MAC checks to see the ACL, the act call will fail (see ERRORS AND
  2753. RETURNS). 
  2754.  
  2755. When the specified cmd is ACL_SET, ACL entries currently in the buffer
  2756. pointed to by actbufp, for the filename pointed to by path, will be set if
  2757. all required checks are passed. The contents of nentries shall be the
  2758. number of ACL entries in the buffer, pointed to by aclbufp, to be copied.
  2759. On success. the return value from this call will be 0. If the invoking
  2760. user does not pass the DAC and MAC checks to set an ACL, the act call will
  2761. fail (see ERRORS AND RETURNS). If an error occurs, either due to DAC and
  2762. MAC checks or the validation check listed below. there will be no change
  2763. to the current ACL information. Before the ACL entries are actually set,
  2764. validation checks will be performed to determine that the ACL entries are
  2765. in the following order: 
  2766.  
  2767.      a) a user entry for the file owner (USEROBJ), 
  2768.      b) additional user entries (USER), 
  2769.      c) a group entry for the file owning group (GROUPOBJ), 
  2770.      d) additional group entries (GROUP), 
  2771.      e) a class entry for the file group class (CLASSOBJ), 
  2772.      f) an entry for other (OTHEROBJ), 
  2773.      g) default user entry for the file owner (DEFLySEROBJ), 
  2774.      h) default additional user entries (DEFLSER), 
  2775.      i) default group entry for the file owning group (DEF,GROUPOBJ), 
  2776.      j) default additional group entries (DEFGROUP), 
  2777.      k) default class entry for file group class (DEFCLASSOIBJ). 
  2778.      l) default entry for other (DEFOTHEROBJ), 
  2779.  
  2780. The entry in classes a), c), e), and f) must always exist. The entry for
  2781. classes a), c)9 e), f), g), i), k), and l) do not use the aid field.
  2782. Classes b) and h) may contain zero or more entries and the entries must be
  2783. sorted by uid (lowest to highest). Classes d) and j) may contain zero or
  2784. more entries and the entries must be sorted by gid (lowest to highest).
  2785. (this ordering should be done with the aclsort function). 
  2786.  
  2787. Class g). h), i), j), k) and l) entries are only applicable for
  2788. directories. If an attempt is made to set default ACL entries on a file
  2789. that is not a directory, the call will fail (see ERRORS AND RETURNS). 
  2790.  
  2791. Validation of the ACL will be performed. If entries containing duplicate
  2792. uids or gids are found, or there is not exactly one user entry specified
  2793. for the file owner, one group entry specified for the file owning group.
  2794. one class entry specified for the file group class, and one other entry
  2795. specified, or there are no additional user and group entries and the
  2796. permissions of the class entry are not equal to the permissions of the
  2797. group entry, or there are no additional default:user and default:group
  2798. entries and the permissions of the default:class entry is not equal to the
  2799. permissions of the default:group entry, the call will fail (see ERRORS AND
  2800. RETURNS). 
  2801.  
  2802. The file owner class permission bits will be changed, such that they are
  2803. equal to the permissions specified for the user entry of the file owner in
  2804. the ACL. The file group class permission bits will be changed, such that
  2805. they are equal to the permissions specified for the class ACL entry. The
  2806. file other class permission bits will be changed, such that they are equal
  2807. to the permissions specified for the other ACL entry. 
  2808.  
  2809. This function may be executed on a file system that d~s not support ACLs.
  2810. With ACLGET as the cmd it will report the ACL& based on the file
  2811. permission bits. With ACLSET as the cmd, if ACL entries are specified
  2812. which do not map into the file permission bits, see ERRORS AND RETURNS,
  2813. otherwise the file permission bits will be set. 
  2814.  
  2815. A design may constrain the maximum number of ACL entries that are 
  2816.  
  2817. written, with a system-wide tunable parameter, aclmax. If the number of 
  2818.  
  2819. ACL entries exceeds the value of aclmax the function will fail (see ERRORS
  2820. AND RETURNS). 
  2821.  
  2822. ERRORS Ah₧D RETURNS: If the act call is unsuccessful, a value of -I will
  2823. be 
  2824.  
  2825. returned and errno will be set to indicate the error. Only
  2826. implementation-independent errnos are presented. 
  2827.  
  2828. Under the following conditions, the function act will fail and will set
  2829. errno to the specified value (note: unless otherwise stated. the errno
  2830. applies to ACLCNT, ACLGET, and ACLSET): 
  2831.  
  2832. ENOTDIR if a component of the path prefix is not a directory 
  2833.  
  2834. ENOTDIR if an attempt is made to set a default ACL on a file type 
  2835.  
  2836. other than a directory 
  2837.  
  2838. ENOENT if a component of the pathname should exist but does not 
  2839.  
  2840. EACCES if the DAC and/or MAC check fails 
  2841.  
  2842. EINVAL if cmd is not ACLCNT, ACLGET, or ACLSET 
  2843.  
  2844. EINVAL if cmd is ACLSET and the ACL entries do not pass the 
  2845.  
  2846. validation check 
  2847.  
  2848. ENOSPC if cmd is ACLGET and the space required for the 
  2849.  
  2850. file's ACL entries exceeds nentries 
  2851.  
  2852. ENOSPC if cmd is ACL,SET and there is insufficient space 
  2853.  
  2854. in the file system to store the ACL 
  2855.  
  2856. EINVAL if the number of acl entries exceeds the value of aclmax 
  2857.  
  2858. ENOSYS if the file system type does not support ACLs, and 
  2859.  
  2860. additional entries are specified 
  2861.  
  2862. aclsort Function
  2863.  
  2864. DESCRIPTION: The aclsort function will take as input a buffer containing
  2865. ACL 
  2866.  
  2867. entries (including default ACL entries) and sort them into the correct
  2868. order to be accepted by the act or the aclipc function. It will optionally
  2869. calculate the maximum permissions needed for the object group class and
  2870. set the class ACL entry. 
  2871.  
  2872. SYNOPSIS:
  2873.  
  2874. $include <tbd.h> int aclsort(int nentries, int calclass, struct acl
  2875. *aclbufp) Where the value of nentries is the number of ACL entries, the
  2876. value of calclass if non-zero indicates to recalculate the class entry,
  2877. and aclbufp is a pointer to ACL entry structures. 
  2878.  
  2879. PROCESSING: A call to aclsort will result in the contents of the buffer
  2880. being sorted 
  2881.  
  2882. in the following order: 
  2883.  
  2884.      a) a user entry for the object owner, 
  2885.      b) additional user entries. 
  2886.      c) a group entry for the object owning group, 
  2887.      d) additional group entries, 
  2888.      e) a class entry for the file group class, 
  2889.      f) an entry for other, 
  2890.      g) default user entry for the object owner. 
  2891.      h) default additional user entries, 
  2892.      i) default group entry for the object owning group. 
  2893.      j) default additional group entries, 
  2894.      k) default class entry for the file group class, 
  2895.      l) default entry for other. 
  2896.  
  2897. Classes a), c), e), and f) must each have exactly one entry, if not, see
  2898. ERRORS AND RETURNS. Classes g), i), k), and l) must have zero or one
  2899. entry, if not, see ERRORS AND RETURNS. Entries will be sorted in
  2900. increasing order, by user ID in classes b) and h), and by group ID in
  2901. classes d) and j). Following sorting, a check will be performed to verify
  2902. that no duplicate entries (more than one entry containing the same user ID
  2903. or the same group ID) exist. If duplicate entries are found, see ERRORS
  2904. AND RETURNS. If there are no entries in classes b) and d). the function
  2905. will set the permission field, a~er'n. in the class entry e) to that of
  2906. the group entry c). If there are entries in classes b) or d) and the
  2907. calclass argument is non-zero, the function will set the permission field,
  2908. a~erm, of the class entry to the maximum permission of the entries in the
  2909. file group class. Otherwise, the class entry permissions will remain
  2910. unchanged. 
  2911.  
  2912. If there are no entries in classes h) and j), the function will set the
  2913. permissions in the default class entry k) to that of the default entry i).
  2914. Upon success. aclsort will return the value 0. 
  2915.  
  2916. ERRORS AND RETURhS: If the aclsort function is unsuccessful due to
  2917. duplicate 
  2918.  
  2919. entries, the return value will be the position (entry number) of the first
  2920. duplicate entry. If there is less than one user entry for the object
  2921. owner, group entry for the object owning group, class entry for the file
  2922. group class. or other entry specified, a value of -1 will be returned. If
  2923. there is more than one user entry for the object owner. group entry for
  2924. the object owning group, class entry for the file group class. or other
  2925. entry specified, they will be treated as duplicate entries, and the return
  2926. value will be the position of the duplicate entry. 
  2927.  
  2928. If the aclsort function is unsuccessful for any other reason, a value of
  2929. -1 will be returned. 
  2930.  
  2931. chmod Function
  2932.  
  2933. DESCRIPTION: The chmod function supports the following functionality: 
  2934.  
  2935.      1. it allows a subject to change the file mode. including the
  2936.      permissions for the file owner class. the file group class, and the
  2937.      file other class of a file. Note that the chmod command will not
  2938.      require any modifications. 
  2939.  
  2940. SYNOPSIS: No change. 
  2941.  
  2942. PROCESSING: Any permissions changes made with the chmod command or
  2943. function 
  2944.  
  2945. will update the file permission bits. This includes changing the file
  2946. owner ACL entry. the class ACL entry, and the other ACL entry if the
  2947. corresponding group(s) of bits are changed by this call. Any additional
  2948. ACL entries will not be affected. Note. the permissions granted by such
  2949. additional entries are constrained by the file group class permission
  2950. bits. If no additional user and no additional group entries exist, the
  2951. file group class permission bits will also represent the permissions for
  2952. the owning group of the file. 
  2953.  
  2954. ERRORS AND RETURNS: No change. 
  2955.  
  2956. OUTPUT: No change. 
  2957.  
  2958. chown Function
  2959.  
  2960. DESCRIPTION: The choivn function supports the following functionality: 
  2961.  
  2962.      1. it allows a subject to change the owner and/or group of a file. 
  2963.  
  2964. Note that the chotin system call/command and the chgrp command will not
  2965. require any modifications. 
  2966.  
  2967. SYNOPSIS: No change. 
  2968.  
  2969. PROCESSING: When the owner of a file is changed, the result will be
  2970. identical to 
  2971.  
  2972. the current behavior. If the owner is changed to a user ID. for which an
  2973. additional user entry already exists in the ACL, the additional user entry
  2974. is not changed but the user entry for the file owner will take precedence
  2975. during an access check. When the group of a file is changed. the result
  2976. will be identical to the current behavior. lithe group is changed to a
  2977. group ID, for which an additional group entry already exists in the ACL,
  2978. the additional group entry is not changed but the group entry for the file
  2979. owning group will take precedence during an access check (except in the
  2980. case of multiple concurrent groups, where all group entries are given
  2981. equal treatment). 
  2982.  
  2983. ERRORS AND RETURNS: No change. 
  2984.  
  2985. OUTPUT: No change. 
  2986.  
  2987. EXAMPLES: The following examples illustrate the operation of the cho\L'n
  2988. function. 
  2989.  
  2990. For each example, there is a "before" state showing the output of getacl,
  2991. the chown function that is executed, and the "after" state output. 
  2992.  
  2993.      EXAMPLE 1: 
  2994.      BEFORE: 
  2995.      $ file: filel 
  2996.      $ owner: larry 
  2997.      $ group: guest 
  2998.      user::rwx 
  2999.      group::r- 
  3000.      class:r- - 
  3001.      other:--- 
  3002.      CALL: chown(filel, lisa, demo) 
  3003.  
  3004.      AFTER: 
  3005.      $file:filel 
  3006.      $ owner: lisa 
  3007.      $ group: demo 
  3008.      user::rwx 
  3009.      group::r- 
  3010.      class:r- 
  3011.      other:--- 
  3012.      EXAMPLE 2: 
  3013.      BEFORE: 
  3014.      $ file: file2 
  3015.      $ owner: tarry 
  3016.      $ group: guest 
  3017.      user::rwx 
  3018.      user:fred:r- 
  3019.      group::r- 
  3020.      group:dev:r- 
  3021.      class:r- 
  3022.      other:- - 
  3023.  
  3024. CALL: chown(file2. lisa demo) 
  3025.  
  3026.      AFTER: 
  3027.      $ file: file2 
  3028.      $ owner: lisa 
  3029.      $ group: demo 
  3030.      user::rwx 
  3031.      user:fred:r- - 
  3032.      group::r- 
  3033.      group:dev:r- 
  3034.      class:r- 
  3035.      other:--- 
  3036.      EXAMPLE 3: 
  3037.      BEFORE: 
  3038.      $ file: file3 
  3039.      $ owner: larry 
  3040.      $ group: guest 
  3041.      user::rwx 
  3042.      user:lisa:r- 
  3043.      user:fred:r- 
  3044.      group::r- 
  3045.      group:dev:r- 
  3046.      group:demo:r- 
  3047.      class:r- 
  3048.      other:-- - 
  3049.      CALL: chown(file3. lisa, demo) 
  3050.  
  3051.      AFTER: 
  3052.      $ file: file3 
  3053.      $ owner: lisa 
  3054.      $ group: demo 
  3055.      user::rwx 
  3056.      user:lisa:r- 
  3057.      user:fred:r- 
  3058.      group::r- 
  3059.      group:dev:r- 
  3060.      group:demo:r- 
  3061.      class:r- 
  3062.      other:--- 
  3063.  
  3064. Note in EXAMPLE 3, a user entry contains a user ID that is the same as the
  3065. file owner. In this case the file owner entry takes precedence. Also in
  3066. EXAMPLE 3, a group entry contains a group ID that is the same as the
  3067. owning group of the file. If multiple concurrent groups are not being
  3068. used, the object owning group entry takes precedence. 
  3069.  
  3070. aclipc Function
  3071.  
  3072. DESCRIPTION: The actipc call will support the getting and setting of
  3073. discretionary 
  3074.  
  3075. `permission information associated with an IPC o6ject. It will allow the
  3076. object owner or a process with appropriate permission or appropriate
  3077. privilege to perform the following functions: 
  3078.  
  3079.      1. get or set an IPC object's ACL information in an atomic operation.
  3080.      2. return the number of entries contained in an IPC object's ACL. 
  3081.  
  3082. Note that this call only supports the IPC objects: e.g., shared memory
  3083. segments. semaphores. and message queues. For simplicity, these objects
  3084. are referred to as "IPC objects" in the remainder of this description. 
  3085.  
  3086. SYNOPSIS: 
  3087.  
  3088. #include <tbd.h> int aclipc(int type, int id, int cmd, int nentries,
  3089. struct acl *aclbufp) Three values for type will be supported: IPCSHM,
  3090. IPCSEM, and IPCMSG. If type is IPC_$HM, id must be a valid shmid returned
  3091. by shmget. If type is IPC,SEM. id must be a valid semid returned by
  3092. semget. If type is IPC,MSG, id must be a valid msgid returned by msgget.
  3093. Three values for cmd will be supported: ACLSET. ACLGET, and ACL_CNT. The
  3094. value of nentries is the number of ACL entries that can fit in the
  3095. user-supplied ACL buffer for an ACLGET or the number actually present for
  3096. an ACLSET; and aclbufp is a pointer to the user-supplied buffer of ACL
  3097. entry structures. The buffer will consist of an array of four (USEROBJ,
  3098. GROUPOBJ, CLASSOBJ, and OTHEROBJ entries are required) or more occurrences
  3099. of the following structure: 
  3100.  
  3101.      struct acl ( 
  3102.      intatype; 
  3103.      uidt aid; 
  3104.      ushort aperm; 
  3105.  
  3106. Six values of ajype will be supported to specify the type of entry: 
  3107.  
  3108. USERoBJ, USER, GROUPOBJ, GROUP, CLASSOBJ, and OTHEROBJ. When ajype is
  3109. USER, aid will be a user id, and when ajype is GROUP, aid will be a group
  3110. id. When ajype is USEROBJ, GROUPOBJ, CLASSOBJ, or OTHEROBJ, aid will not
  3111. be used. The permissions for the entry will be contained in ajerm. 
  3112.  
  3113. PROCESSING: When the specified cmd is ACLCNT, the return value from the
  3114. call 
  3115.  
  3116. will be the number of ACL entries for the IPC object specified by type and
  3117. id. The values of net!tries and aclbufp will be ignored. If the invoking
  3118. user does not pass the DAC or MAC checks to see the ACL. the aclipc call
  3119. will fail (see ERRORS AND RETURNS). 
  3120.  
  3121. When the specified cmd is ACLGET the ACL information for the IPC object
  3122. specified by type and id will be retrieved and the ACL entries will be
  3123. placed in the buffer pointed to by aclbufp. The value of i;entries is the
  3124. number of entries that can be held in the buffer. If the number of ACL
  3125. entries in the ACL is greater than the value of nentries (the buffer space
  3126. allocated to hold the file's ACL entries is less than nentries times the
  3127. size of an entry), the aclipc call will fail (see ERRORS AND RETURNS). On
  3128. success. the return value from this call will be the number of ACL entries
  3129. retrieved. On any error, the contents of the acl structures pointed to by
  3130. aclbiifp are indeterminate. If the user does not pass the DAC and MAC
  3131. checks to see the ACL, the aclipc call will fail (see ERRORS AND RETURNS).
  3132.  
  3133. When the specified cmd is ACLSET, ACL entries currently in the buffer,
  3134. pointed to by aclbufp, for the IPC object specified by type and id, will
  3135. be set if all required checks are passed. The contents of nentries shall
  3136. be the number of ACL entries in the buffer pointed to by aclbufp to be
  3137. copied. On success, the return value from this call will be 0. If the
  3138. invoking subject does not pass the DAC and MAC checks to set an ACL the
  3139. aclipc call will fail (see ERRORS AND RETURNS). If an error occurs, either
  3140. due to DAC or MAC checks or the validation check listed below, there will
  3141. be no change to the current ACL information. Before the ACL entries are
  3142. actually set, validation checks will be performed to determine that the
  3143. ACL entries are in the following order: 
  3144.  
  3145.      a) a user entry for the IPC object owner (USEROBJ), 
  3146.      b) additional user entries (USER), 
  3147.      c) a group entry for the IPC object owning group (GR,OUPOBJ), 
  3148.      d) additional group entries (GROUP), 
  3149.      e) a class entry for the IPC group class (CLASSOBJ), 
  3150.      f) an entry for other (OTHEROBJ). 
  3151.  
  3152.      The entries in class a), c), e), and f) must always exist. The entry
  3153.      for class a), 
  3154.  
  3155. c), e), and f) do not use the aid field. Class b) may contain zero or more
  3156. entries and the entries must be sorted by uld (lowest to highest). Class
  3157. d) may contain zero or more entries and the entries must be sorted by gid
  3158. (lowest to - highest). (this ordering should be done with the aclsort
  3159. function). Validation of the ACL will be performed. If entries containing
  3160. duplicate ttids or gids are found. or there is not exactly; one user entry
  3161. for the object owner. one group entry for the object owning group. one
  3162. class entry for the IPC group class, or one other entry specified. or
  3163. there are no additional user and group entries and the permissions of the
  3164. class entry are not equal to the permissions of the group entry, the call
  3165. will fail (see ERRORS AND RETL'RNS). The IPC owner permission bits will be
  3166. changed, such that they are equal to the permissions specified for the
  3167. user entry of the object owner in the ACL. The IPC group class permission
  3168. bits will be changed, such that they are equal to the permissions
  3169. specified for the class ACL entry. The IPC other class permission bits
  3170. will be changed, such that they are equal to the permissions specified for
  3171. the other ACL entry. 
  3172.  
  3173. A design may constrain the maximum number of ACL entries that are written,
  3174. with a system-wide tunable parameter, aclmax. If the number of ACL entries
  3175. exceeds the value of aclmax the function will fail (see ERRORS AND
  3176. RETURNS). 
  3177.  
  3178. ERRORS AND RETURNS: If the aclipc call is unsuccessful, a value of -I will
  3179. be 
  3180.  
  3181. returned and errno will be set to indicate the error. Only
  3182. implementation-independent errnos are presented. 
  3183.  
  3184. Under the following conditions, the function aclipc will fail and will set
  3185. errno to the specified value (note: if cmd is unspecified, the errno
  3186. applies to ACLCNT, ACLGET, and ACLSET): 
  3187.  
  3188. EINVAL if type is not IPC,SHM, IPC,SEM, or IPC,MSG 
  3189.  
  3190. EINVAL if the value of id is (1) not a valid messagequeueldentifier and 
  3191.  
  3192. the type was IPCMSG, (2) not a valid semapho~e1dentifier and 
  3193.  
  3194. the type was IPCSEM, or (3) not a valid sharedmemory,dentifier 
  3195.  
  3196. and the type was IPCSHM 
  3197.  
  3198. EINVAL if cmd is not ACLCNT, ACL_GET, or ACLSET 
  3199.  
  3200. EINVAL if cmd is ACLSET and the ACL entries do not pass 
  3201.  
  3202. the validation check 
  3203.  
  3204. EACCES if the DAC and/or MAC check fails 
  3205.  
  3206. ENOSPC if cmd is ACLGET and the space required for the 
  3207.  
  3208. IPC's object ACL entries exceeds nentries 
  3209.  
  3210. ENOMEM if cmd is ACL_SET and there is insufficient 
  3211.  
  3212. space to store the ACL 
  3213.  
  3214. EINVAL if the number of acl entries exceeds the value of aclmax 
  3215.  
  3216. shmctl, semctl, & msgctl Functions
  3217.  
  3218. DESCRIPTION: The shmctl. semctl, and msgctl functions support the
  3219. following 
  3220.  
  3221. functionality: 
  3222.  
  3223.      1. they allow a subject to change the user ID. group ID, and
  3224.      permissions on IPC objects. 
  3225.  
  3226. SYNOPSIS: No change. 
  3227.  
  3228. PROCESSING: No change. 
  3229.  
  3230. ERRORS AND RETURNS: No change. 
  3231.  
  3232. REFERENCES
  3233.  
  3234. [1] Department of Defense Trusted Computer Systems Evaluation Criteria.
  3235. DoD 5200.28-STD, December 1985. 
  3236.  
  3237. [2] National Computer Security Center, A Guide to Understanding
  3238. Discretioiiary Access Control in Trusted Systems, NCSC-TG-003 Version-I,
  3239. September 1987. [3] UNIX System Access Control List Proposal, C. Rubin,
  3240. AT&T. May 15. 1988. [4] Adding Access Control Lists To UNIX, A.
  3241. Silverstein, B. McMahon. G. Nuss, Hewlett-Packard Co.. March 12. 1988. 
  3242.  
  3243. [5] Discretionary Access Control System Functions, D. H. Steves, IBM,
  3244. March 14, 1988. 
  3245.  
  3246. [6] P1003 .6 Security Extension Proposal: Discretionary Access Control
  3247. Semantics, W. Olin Sibert. Oxford Systems Inc., May 18. 1988. 
  3248.  
  3249. [7] PlOO3.6 Supplementary Document: Discretionary Access Control..
  3250. Problems in P1003.1 Draft 12 , W. Olin Sibert, Oxford Systems Inc.. May
  3251. 18, 1988. [8] P1003.6 Supplementary Document: Comments on Hewlett-Packard
  3252. ACL Proposal, W. Olin Sibert. Oxford Systems Inc., May 18,1988. 
  3253.  
  3254. [9] Extending The UNIX Protection Model with Access Control Lists, G.
  3255. Fernandez, L. Allen, Apollo Computer Inc., June 1988. 
  3256.  
  3257. [10] On Incorporating Access Control Lists into the UNIX Operating System
  3258. S. M. Kramer, SecureWare Inc., June 1988. 
  3259.  
  3260. [11] Trusted UNIX Discretionary Ac~ss and Privilege Control Mechanisms,
  3261. B.D. 
  3262.  
  3263. Wilner, Infosystems Technology Inc.. June 2,1988. 
  3264.  
  3265. (12] Access Control List Design, Hewlett Packard, October 21, 1988. 
  3266.  
  3267. [13] Proposal for Adding Access Control Lists to POSIX, P. B. Flinn,
  3268. SecureWare Inc., July 25, 1988. 
  3269.  
  3270. [14] Discretionary Access Control Proposal, H. L. Hall, Digital Equipment
  3271. Corporation, Oct. 1988. 
  3272.  
  3273. [15] Portable Operating System Interface for Computer Environments IEEE
  3274. Std. 1003.1-1988 
  3275.  
  3276.  
  3277.  
  3278.  
  3279.