The Role of setfacl Command in Linux Directory ACLs
The setfacl (set file access control lists) command in
Linux provides fine-grained permission management for files and
directories beyond the traditional owner-group-others model implemented
by chmod. When applied to directories, setfacl
enables administrators to grant specific read, write, and execute
permissions to multiple individual users or groups and establish
inheritance rules for newly created contents. This article explains the
primary functions of setfacl on directories, key command
flags, and how default access control lists (ACLs) streamline multi-user
directory management.
Moving Beyond Traditional Permissions
Standard Linux permissions restrict access control to three entities: the owning user, the owning group, and everyone else. When multiple users or separate teams require different access levels to a single shared directory, standard permissions often require complex group structures.
The setfacl command resolves this limitation by allowing
administrators to append distinct access rules to a directory for any
arbitrary user or group without altering the primary ownership or broad
group memberships.
Modifying Directory Access
with -m
The primary role of setfacl is modifying existing
permissions using the -m option. When applied to a
directory, it grants or restricts access directly.
- User Permissions: To give a specific user access to
a directory:
setfacl -m u:alice:rwx /shared/projects - Group Permissions: To give an entire secondary
group access:
setfacl -m g:developers:rx /shared/projects
Once applied, the directory displays a + symbol at the
end of its permission string in ls -l output, indicating
active ACLs that can be viewed with
getfacl /shared/projects.
Managing Inheritance
with Default ACLs (-d)
A critical capability of setfacl when applied
specifically to directories is the implementation of default ACLs.
Standard access rules only apply to the directory itself, but default
ACLs act as a blueprint for inheritance.
By using the -d flag or prepending d: to
the rule specification, any new file or subdirectory created within that
directory automatically inherits the defined permissions:
setfacl -d -m g:developers:rwx /shared/projectsWithout default ACLs, files created within a shared directory
typically adopt the creator's default umask, which often
locks out other collaborators. Default ACLs ensure consistent
permissions without manual intervention.
Applying Recursive Changes
with -R
To apply permissions across an existing directory hierarchy,
setfacl supports the -R (recursive) flag. This
updates the target directory and all existing files and subdirectories
underneath it:
setfacl -R -m u:auditor:r-x /shared/projectsAdministrators often combine -R and -d when
configuring shared environments to secure existing assets while
enforcing rules on future assets.
Removing Access Rules with
-x and -b
The setfacl command also handles the revocation of ACL
configurations:
- Remove Specific Entries (
-x): Deletes a specific rule from a directory without affecting others:setfacl -x u:alice /shared/projects - Remove All Entries (
-b): Strips all extended ACL entries and default rules, reverting the directory to standard POSIX permissions:setfacl -b /shared/projects
By enabling granular permissions, recursive assignment, and inherited
defaults, setfacl serves as the primary tool for securing
collaborative environments and enforcing the principle of least
privilege on Linux directories.