1 ACL(5)                Standards, Environments, and Macros               ACL(5)
   2 
   3 
   4 
   5 NAME
   6        acl - Access Control Lists
   7 
   8 DESCRIPTION
   9        Access control lists (ACLs) are discretionary access control mechanisms
  10        that grant and deny access to files and directories. Two different ACL
  11        models are supported in the Solaris release: POSIX-draft ACLs and NFSv4
  12        ACLs.
  13 
  14 
  15        The older, POSIX-draft model is supported by the UFS file system. This
  16        model is based on a withdrawn ACL POSIX specification that was never
  17        standardized. It was subsequently withdrawn by the POSIX committee.
  18 
  19 
  20        The other model is based on the standards of the NFSv4 working group
  21        and is an approved standard from the Internet Engineering Task Force
  22        (IETF). The ZFS file system uses the NFSv4 model, and provides richer
  23        semantics and finer grained permission capabilities than the POSIX-
  24        draft model.
  25 
  26    POSIX-draft ACLs
  27        POSIX-draft ACLs provide an alternative security mechanism to basic
  28        UNIX file permissions in the Solaris release. Their purpose is to
  29        further restrict access to files and directories or to extend
  30        permissions to a particular user. ACLs can be used to change the
  31        permissions for the standard owner, group and other class bits of a
  32        file's mode. ACLs can give additional users and groups access to the
  33        file. A directory can also have a special kind of ACL called a default
  34        ACL, which defines ACL entries to be inherited by descendents of the
  35        directory. POSIX-draft ACLs have an ACL entry called mask. The mask
  36        defines the maximum permissions that can be granted to additional user
  37        and group entries. Whenever a file is created or its mode is changed by
  38        chmod(1) or chmod(2), the mask is recomputed. It is recomputed to be
  39        the group permission defined in the mode passed to chmod(2).
  40 
  41 
  42        The POSIX-draft ACL model uses the standard rwx model of traditional
  43        UNIX permissions.
  44 
  45 
  46        An ACL is represented as follows:
  47 
  48          acl_entry[,acl_entry]...
  49 
  50 
  51 
  52 
  53        Each acl_entry contains one ACL entry. An ACL entry is represented by
  54        two or three colon-separated(:) fields.
  55 
  56        user:[uid]:perms
  57                             If uid blank, it represents the file owner.
  58 
  59 
  60        group:[gid]:perms
  61                             If gid is blank, it represents the owning group.
  62 
  63 
  64        other:perms
  65                             Represents the file other class.
  66 
  67 
  68        mask:perms
  69                             Defines the MAX permission to hand out.
  70 
  71 
  72 
  73        For example to give user joe read and write permissions, the ACL entry
  74        is specified as:
  75 
  76          user:joe:rw-
  77 
  78 
  79 
  80    NFSv4 ACLs
  81        NFSv4 ACL model is based loosely on the Windows NT ACL model. NFSv4
  82        ACLs provide a much richer ACL model than POSIX-draft ACLs.
  83 
  84 
  85        The major differences between NFSv4 and POSIX-draft ACLs are as
  86        follows:
  87 
  88            o      NFSv4 ACLs provide finer grained permissions than the rwx
  89                   model.
  90 
  91            o      NFSv4 ACLs allow for both ALLOW and DENY entries.
  92 
  93            o      NFSv4 ACLs provide a rich set of inheritance semantics.
  94                   POSIX ACLs also have inheritance, but with the NFSv4 model
  95                   you can control the following inheritance features:
  96 
  97                o      Whether inheritance cascades to both files and
  98                       directories or only to files or directories.
  99 
 100                o      In the case of directories, you can indicate whether
 101                       inheritance is applied to the directory itself, to just
 102                       one level of subdirectories, or cascades to all
 103                       subdirectories of the directory.
 104 
 105            o      NFSv4 ACLs provide a mechanism for hooking into a system's
 106                   audit trail.  Currently, Solaris does not support this
 107                   mechanism.
 108 
 109            o      NFSv4 ACLs enable administrators to specify the order in
 110                   which ACL entries are checked. With POSIX-draft ACLs the
 111                   file system reorders ACL entries into a well defined, strict
 112                   access, checking order.
 113 
 114 
 115        POSIX-draft ACL semantics can be achieved with NFSv4 ACLs. However,
 116        only some NFSv4 ACLs can be translated to equivalent POSIX-draft ACLs.
 117 
 118 
 119        Permissions can be specified in three different chmod ACL formats:
 120        verbose, compact, or positional. The verbose format uses words to
 121        indicate that the permissions are separated with a forward slash (/)
 122        character. Compact format uses the permission letters and positional
 123        format uses the permission letters or the hyphen (-) to identify no
 124        permissions.
 125 
 126 
 127        The permissions for verbose mode and their abbreviated form in
 128        parentheses for compact and positional mode are described as follows:
 129 
 130        read_data (r)
 131                                Permission to read the data of the file
 132 
 133 
 134        list_directory (r)
 135                                Permission to list the contents of a directory.
 136 
 137 
 138        write_data (w)
 139                                Permission to modify a file's data anywhere in
 140                                the file's offset range. This includes the
 141                                ability to grow the file or write to any
 142                                arbitrary offset.
 143 
 144 
 145        add_file (w)
 146                                Permission to add a new file to a directory.
 147 
 148 
 149        append_data (p)
 150                                The ability to modify the file's data, but only
 151                                starting at EOF. Currently, this permission is
 152                                not supported.
 153 
 154 
 155        add_subdirectory (p)
 156                                Permission to create a subdirectory to a
 157                                directory.
 158 
 159 
 160        read_xattr (R)
 161                                The ability to read the extended attributes of
 162                                a file or do a lookup in the extended
 163                                attributes directory.
 164 
 165 
 166        write_xattr (W)
 167                                The ability to create extended attributes or
 168                                write to the extended attributes directory.
 169 
 170 
 171        execute (x)
 172                                Permission to execute a file.
 173 
 174 
 175        read_attributes (a)
 176                                The ability to read basic attributes (non-ACLs)
 177                                of a file. Basic attributes are considered to
 178                                be the stat level attributes. Allowing this
 179                                access mask bit means that the entity can
 180                                execute ls(1) and stat(2).
 181 
 182 
 183        write_attributes (A)
 184                                Permission to change the times associated with
 185                                a file or directory to an arbitrary value.
 186 
 187 
 188        delete (d)
 189                                Permission to delete the file.
 190 
 191 
 192        delete_child (D)
 193                                Permission to delete a file within a directory.
 194 
 195 
 196        read_acl (c)
 197                                Permission to read the ACL.
 198 
 199 
 200        write_acl (C)
 201                                Permission to write the ACL or the ability to
 202                                execute chmod(1) or setfacl(1).
 203 
 204 
 205        write_owner (o)
 206                                Permission to change the owner or the ability
 207                                to execute chown(1) or chgrp(1).
 208 
 209 
 210        synchronize (s)
 211                                Permission to access a file locally at the
 212                                server with synchronous reads and writes.
 213                                Currently, this permission is not supported.
 214 
 215 
 216 
 217        The following inheritance flags are supported by NFSv4 ACLs:
 218 
 219        file_inherit (f)
 220                                  Inherit to all newly created files in a
 221                                  directory.
 222 
 223 
 224        dir_inherit (d)
 225                                  Inherit to all newly created directories in a
 226                                  directory.
 227 
 228 
 229        inherit_only (i)
 230                                  Placed on a directory, but does not apply to
 231                                  the directory itself, only to newly created
 232                                  files and directories. This flag requires
 233                                  file_inherit and/or dir_inherit to indicate
 234                                  what to inherit.
 235 
 236 
 237        no_propagate (n)
 238                                  Placed on directories and indicates that ACL
 239                                  entries should only be inherited one level of
 240                                  the tree. This flag requires file_inherit
 241                                  and/or dir_inherit to indicate what to
 242                                  inherit.
 243 
 244 
 245        successful_access (S)
 246                                  Indicates whether an alarm or audit record
 247                                  should be initiated upon successful accesses.
 248                                  Used with audit/alarm ACE types.
 249 
 250 
 251        failed_access (F)
 252                                  Indicates whether an alarm or audit record
 253                                  should be initiated when access fails. Used
 254                                  with audit/alarm ACE types.
 255 
 256 
 257        inherited (I)
 258                                  ACE was inherited.
 259 
 260 
 261        -
 262                                  No permission granted.
 263 
 264 
 265 
 266        An NFSv4 ACL is expressed using the following syntax:
 267 
 268          acl_entry[,acl_entry]...
 269 
 270              owner@:<perms>[:inheritance flags]:<allow|deny>
 271              group@:<perms>[:inheritance flags]:<allow|deny>
 272              everyone@:<perms>[:inheritance flags]:<allow|deny>
 273              user:<username>:<perms>[:inheritance flags]:<allow|deny>
 274              usersid:<sid string>:<perms>[:inheritance flags]:<allow|deny>
 275              group:<groupname>:<perms>[:inheritance flags]:<allow|deny>
 276              groupsid:<sid string>:<perms>[:inheritance     flags]:<allow|deny>
 277              sid:<sid string>:<perms>[:inheritance flags]:<allow|deny>
 278 
 279 
 280        owner@
 281                  File owner
 282 
 283 
 284        group@
 285                  Group owner
 286 
 287 
 288        user
 289                  Permissions for a specific user
 290 
 291 
 292        group
 293                  Permissions for a specific group
 294 
 295 
 296 
 297        Permission and inheritance flags are separated by a / character.
 298 
 299 
 300        ACL specification examples:
 301 
 302          user:fred:read_data/write_data/read_attributes:file_inherit:allow
 303          owner@:read_data:allow,group@:read_data:allow,user:tom:read_data:deny
 304 
 305 
 306 
 307 
 308        Using the compact ACL format, permissions are specified by using 14
 309        unique letters to indicate permissions.
 310 
 311 
 312        Using the positional ACL format, permissions are specified as
 313        positional arguments similar to the ls -V format. The hyphen (-), which
 314        indicates that no permission is granted at that position, can be
 315        omitted and only the required letters have to be specified.
 316 
 317 
 318        The letters above are listed in the order they would be specified in
 319        positional notation.
 320 
 321 
 322        With these letters you can specify permissions in the following
 323        equivalent ways.
 324 
 325          user:fred:rw------R------:file_inherit:allow
 326 
 327 
 328 
 329 
 330        Or you can remove the - and scrunch it together.
 331 
 332          user:fred:rwR:file_inherit:allow
 333 
 334 
 335 
 336 
 337        The inheritance flags can also be specified in a more compact manner,
 338        as follows:
 339 
 340          user:fred:rwR:f:allow
 341          user:fred:rwR:f------:allow
 342 
 343 
 344 
 345    Shell-level Solaris API
 346        The Solaris command interface supports the manipulation of ACLs. The
 347        following Solaris utilities accommodate both ACL models:
 348 
 349        chmod
 350                    The chmod utility has been enhanced to allow for the
 351                    setting and deleting of ACLs. This is achieved by extending
 352                    the symbolic-mode argument to support ACL manipulation. See
 353                    chmod(1) for details.
 354 
 355 
 356        compress
 357                    When a file is compressed any ACL associated with the
 358                    original file is preserved with the compressed file.
 359 
 360 
 361        cp
 362                    By default, cp ignores ACLs, unless the -p option is
 363                    specified.  When -p is specified the owner and group id,
 364                    permission modes, modification and access times, ACLs, and
 365                    extended attributes if applicable are preserved.
 366 
 367 
 368        cpio
 369                    ACLs are preserved when the -P option is specified.
 370 
 371 
 372        find
 373                    Find locates files with ACLs when the -acl flag is
 374                    specified.
 375 
 376 
 377        ls
 378                    By default ls does not display ACL information. When the -v
 379                    option is specified, a file's ACL is displayed.
 380 
 381 
 382        mv
 383                    When a file is moved, all attributes are carried along with
 384                    the renamed file.  When a file is moved across a file
 385                    system boundary, the ACLs are replicated. If the ACL
 386                    information cannot be replicated, the move fails and the
 387                    source file is not removed.
 388 
 389 
 390        pack
 391                    When a file is packed, any ACL associated with the original
 392                    file is preserved with the packed file.
 393 
 394 
 395        rcp
 396                    rcp has been enhanced to support copying. A file's ACL is
 397                    only preserved when the remote host supports ACLs.
 398 
 399 
 400        tar
 401                    ACLs are preserved when the -p option is specified.
 402 
 403 
 404        unpack
 405                    When a file with an ACL is unpacked, the unpacked file
 406                    retains the ACL information.
 407 
 408 
 409    Application-level API
 410        The primary interfaces required to access file system ACLs at the
 411        programmatic level are the acl_get() and acl_set() functions. These
 412        functions support both POSIX draft ACLs and NFSv4 ACLs.
 413 
 414    Retrieving a file's ACL
 415          int acl_get(const char *path, int flag, acl_t **aclp);
 416          int facl_get(int fd, int flag, acl_t **aclp);
 417 
 418 
 419 
 420        The acl_get(3SEC) and facl_get(3SEC) functions retrieves an ACL on a
 421        file whose name is given by path or referenced by the open file
 422        descriptor fd. The flag argument specifies whether a trivial ACL should
 423        be retrieved. When the flag argument equals ACL_NO_TRIVIAL then only
 424        ACLs that are not trivial are retrieved. The ACL is returned in the
 425        aclp argument.
 426 
 427    Freeing ACL structure
 428          void acl_free(acl_t *aclp)s;
 429 
 430 
 431 
 432        The acl_free() function frees up memory allocated for the argument
 433        aclp;.
 434 
 435    Setting an ACL on a file
 436          int acl_set(const char *path, acl_t *aclp);
 437          int facl_set(int fd, acl_t *aclp);
 438 
 439 
 440 
 441        The acl_set(3SEC) and facl_get(3SEC) functions are used for setting an
 442        ACL on a file whose name is given by path or referenced by the open
 443        file descriptor fd. The aclp argument specifies the ACL to set. The
 444        acl_set(3SEC) translates an POSIX-draft ACL into a NFSv4 ACL when the
 445        target file systems supports NFSv4 ACLs. No translation is performed
 446        when trying to set an NFSv4 ACL on a POSIX-draft ACL supported file
 447        system.
 448 
 449    Determining an ACL's trivialness
 450          int acl_trivial(const char *path);
 451 
 452 
 453 
 454        The acl_trivial() function is used to determine whether a file has a
 455        trivial ACL.
 456 
 457    Removing all ACLs from a file
 458          int acl_strip(const char *path, uid_t uid, gid_t gid, mode_t mode);
 459 
 460 
 461 
 462        The acl_strip() function removes all ACLs from a file and replaces them
 463        with a trivial ACL based off of the passed in argument mode. After
 464        replacing the ACL the owner and group of the file are set to the values
 465        specified in the uid and gid parameters.
 466 
 467    Converting ACLs to/from external representation
 468          int acl_fromtext(const char *path, acl_t **aclp);
 469          char *acl_totext(acl_t *aclp, int flags);
 470 
 471 
 472 
 473        The acl_totext() function converts an internal ACL representation
 474        pointed to by aclp into an external representation. See DESCRIPTION for
 475        details about external representation.
 476 
 477 
 478        The acl_fromtext() functions converts and external representation into
 479        an internal representation. See DESCRIPTION for details about external
 480        representation.
 481 
 482 EXAMPLES
 483        The following examples demonstrate how the API can be used to perform
 484        basic operations on ACLs.
 485 
 486        Example 1 Retrieving and Setting an ACL
 487 
 488 
 489        Use the following to retrieve an ACL and set it on another file:
 490 
 491 
 492          error = acl_get("file", ACL_NO_TRIVIAL, &aclp);
 493 
 494          if (error == 0 && aclp != NULL) {
 495                  error = acl_set("file2", aclp);
 496                  acl_free(aclp);
 497          }
 498          ...
 499 
 500 
 501        Example 2 Retrieving and Setting Any ACLs
 502 
 503 
 504        Use the following to retrieve any ACL, including trivial ACLs, and set
 505        it on another file:
 506 
 507 
 508          error = acl_get("file3", 0, &aclp);
 509          if (error == 0) {
 510                  error = acl_set("file4", aclp);
 511                  acl_free(aclp);
 512          }
 513          ...
 514 
 515 
 516        Example 3 Determining if a File has a Trivial ACL
 517 
 518 
 519        Use the following to determine if a file has a trivial ACL:
 520 
 521 
 522          char *file = "file5";
 523          istrivial = acl_trivial(file);
 524 
 525          if (istrivial == 0)
 526                  printf("file %s has a trivial ACL\n", file);
 527          else
 528                  printf("file %s has a NON-trivial ACL\n", file);
 529          ...
 530 
 531 
 532        Example 4 Removing all ACLs from a File
 533 
 534 
 535        Use the following to remove all ACLs from a file, and set a new mode,
 536        owner, and group:
 537 
 538 
 539          error = acl_strip("file", 10, 100, 0644);
 540          ...
 541 
 542 
 543 SEE ALSO
 544        chgrp(1), chmod(1), chown(1), cp(1), cpio(1), find(1), ls(1), mv(1),
 545        tar(1), setfacl(1), chmod(2), acl(2), stat(2), acl_get(3SEC),
 546        aclsort(3SEC), acl_fromtext(3SEC), acl_free(3SEC), acl_strip(3SEC),
 547        acl_trivial(3SEC)
 548 
 549 
 550 
 551                                November 24, 2014                        ACL(5)