ACLs and Extended Attributes
Standard permissions grant exactly one owner, one group, and "everyone else" - ACLs extend that to arbitrary additional users and groups on a single file, while extended attributes attach arbitrary metadata, including the immutable bit that overrides permissions entirely.
File Permissions and Ownership covers the standard model: one owner, one group, one "other" bucket. That's enough for most cases, but breaks down the moment you need "user alice AND the developers group AND user bob, but with different access for each" on a single file - which is exactly what ACLs add.
The limitation ACLs solve
A file can only belong to one group at a time, so granting different
access to two different groups on the same file is impossible with
chmod/chgrp alone - the usual workaround is creating a new group
that's the union of the two, which doesn't scale as access needs get
more specific. ACLs (Access Control Lists) let you grant permissions to
any number of additional specific users or groups, on top of the
standard owner/group/other bits.
Viewing and setting ACLs
getfacl report.csv
# file: report.csv
# owner: alice
# group: alice
user::rw-
group::r--
other::---
Adding an extra user with read access, without changing alice's ownership or the standard permission bits at all:
setfacl -m u:bob:r-- report.csv
getfacl report.csv
user::rw-
user:bob:r--
group::r--
mask::r--
other::---
setfacl -m g:auditors:r-- report.csv # grant a group
setfacl -x u:bob report.csv # remove bob's entry
setfacl -b report.csv # remove all ACL entries
ls -l shows a + after the permission bits on any file with an ACL
set, as a hint that getfacl is needed for the full picture:
-rw-r--r--+ 1 alice alice 1234 Aug 29 10:00 report.csv
Default ACLs: inherited by new files
Set on a directory, a default ACL automatically applies to every new
file created inside it afterward - useful for a shared project
directory where every new file should be group-readable without
remembering to chmod each one individually:
setfacl -d -m g:developers:rwx /srv/project/
Extended attributes (xattrs)
Beyond permissions entirely, extended attributes attach arbitrary name/value metadata to a file, used by specific tools and kernel features rather than typed by hand day-to-day - ACLs themselves are actually implemented as an extended attribute under the hood:
getfattr -d report.csv
setfattr -n user.comment -v "reviewed 2026-08" report.csv
The immutable bit: chattr
One specific, genuinely useful extended attribute: the immutable flag, which blocks modification or deletion even by root, overriding standard permissions entirely:
sudo chattr +i /etc/resolv.conf
lsattr /etc/resolv.conf
----i---------e------- /etc/resolv.conf
A common real use: preventing a network manager or DHCP client from
silently overwriting a manually-configured /etc/resolv.conf. Remove
it the same way before the file needs to be editable again:
sudo chattr -i /etc/resolv.conf
When to reach for these
Standard permissions handle the vast majority of cases and are simpler
to reason about - ACLs are worth it specifically when access genuinely
doesn't fit into one owner and one group, and chattr +i is worth
knowing for the specific case of a config file that keeps getting
overwritten by something else on the system.