1. Introduction

Users, Groups, and Files & Directories

  • At a basic level, permissions in Linux are a relationship between users, groups, and files & directories.

  • Users can belong to multiple groups.

  • Groups can have multiple users.

  • Every file and directory defines its permissions in terms of a user, a group, and “others” (all other users).

Users

  • User accounts are configured in the /etc/passwd file.

  • User password hashes are stored in the /etc/shadow file.

  • Users are identified by an integer user ID (UID).

  • The “root” user account is a special type of account in Linux.

    • It has an UID of 0, and the system grants this user access to every file.

Groups

  • Groups are configured in the /etc/group file.

  • Users have a primary group, and can have multiple secondary (or supplementary) groups.

  • By default, a user’s primary group has the same name as their user account.

Files & Directories

  • All files & directories have a single owner and a group.

  • Permissions are defined in terms of read, write, and execute operations.

  • There are three sets of permissions, one for the owner, one for the group, and one for all “other” users (can also be referred to as “world”).

  • Only the owner can change permissions.


Permissions

File Permissions

  • Read – when set, the file contents can be read.

  • Write – when set, the file contents can be modified.

  • Execute – when set, the file can be executed (i.e. run as some kind of process).

Directory Permissions

  • Execute – when set, the directory can be entered. Without this permission, neither the read nor write permissions will work.

  • Read – when set, the directory contents can be listed.

  • Write – when set, files and subdirectories can be created in the directory.

Special Permissions

  1. setuid (SUID) bit

    • When set, files will get executed with the privileges of the file owner

  2. setgid (SGID) bit

    • When set on a file, the file will get executed with the privileges of the file group.

    • When set on a directory, files created within that directory will inherit the group of the directory itself.

Viewing Permissions

The ls command can be used to view permissions:

$ ls -l /bin/date
-rwxr-xr-x 1 root root 60416 Apr 28 2010 /bin/date
  • The first 10 characters indicate the permissions set on the file or directory.

  • The first character simply indicates the type (e.g. '-' for file, 'd' for directory).

  • The remaining 9 characters represent the 3 sets of permissions (owner, group, others).

  • Each set contains 3 characters, indicating the read (r), write (w), and execute (x) permissions.

  • SUID/SGID permissions are represented by an 's' in the execute position.


Real, Effective, & Saved UID/GID

Each user has 3 user IDs in Linux (real, effective, and saved).

Real UID/GID

  • A user’s real ID is who they actually are (the ID defined in /etc/passwd). Ironically, the real ID is actually used less often to check a user’s identity

Effective UID/GID

  • A user’s effective ID is normally equal to their real ID, however when executing a process as another user, the effective ID is set to that user’s real ID.

  • The effective ID is used in most access control decisions to verify a user, and commands such as whoami use the effective ID.

Saved UID/GID

The saved ID is used to ensure that SUID processes can temporarily switch a user’s effective ID back to their real ID and back again without losing track of the original effective ID.

Viewing UID/GID

Print real and effective user / group IDs using id command:

# id
uid=1000(user) gid=1000(user) euid=0(root) egid=0(root)
groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)

Print real, effective, saved, and file system user / group IDs of the current process (i.e. our shell):

# cat /proc/$$/status | grep "[UG]id"
Uid:	1000	0	0	0
Gid:	1000	0	0	0

Last updated