Chapter 5: File Permissions and Ownership

The Digital Fortress: Understanding Linux Security Architecture

In the vast digital landscape of Linux systems, every file and directory stands as a fortress, protected by an intricate system of permissions and ownership that has evolved over decades of Unix heritage. Like ancient castles with their drawbridges, moats, and guard towers, Linux employs a sophisticated security model that determines who can enter, what they can do once inside, and how they can interact with the treasures within.

Imagine walking through a medieval town where every building, every room, and every chest has its own unique set of keys and access rights. Some doors swing open freely to all visitors, while others remain locked to all but their rightful owners. This is the world of Linux file permissions—a realm where understanding the rules of access control can mean the difference between a secure, well-functioning system and one vulnerable to chaos and intrusion.

The Trinity of Access: Understanding Permission Types

The Three Pillars of File Access

Linux file permissions rest upon three fundamental pillars, each representing a different type of access that can be granted or denied. These permissions form the backbone of system security, creating layers of protection that have stood the test of time.

Read Permission (r): The gateway to information, read permission allows users to peer into the contents of files and directories. When granted read access to a file, a user can open it, view its contents, and copy the information within. For directories, read permission enables users to list the contents—to see what files and subdirectories exist within that digital container.

# Viewing file contents with read permission

cat important_document.txt

less configuration_file.conf

head -n 10 logfile.log

Write Permission (w): The power to modify and transform, write permission grants users the ability to alter file contents, create new files, and delete existing ones. This permission carries significant responsibility, as it allows users to permanently change or destroy data. For directories, write permission enables the creation and deletion of files within that directory.

# Modifying files with write permission

echo "New content" >> document.txt

nano configuration.conf

rm temporary_file.tmp

Execute Permission (x): The key to action, execute permission allows users to run programs and scripts, transforming static code into dynamic processes. For directories, execute permission—sometimes called "traverse" permission—allows users to enter the directory and access files within it, provided they have the appropriate permissions for those files.

# Executing files with execute permission

./my_script.sh

/usr/bin/python3 program.py

cd /home/user/projects/

The Hierarchy of Users

Linux organizes users into three distinct categories, each with its own relationship to files and directories:

Owner (u): The sovereign ruler of the file, typically the user who created it. The owner possesses the ultimate authority over the file's permissions and can grant or revoke access to others. This relationship mirrors the concept of property ownership in the physical world.

Group (g): A collective of users who share common access needs. Groups allow system administrators to efficiently manage permissions for multiple users who require similar access levels. Think of groups as departments in a company, where all members need access to certain shared resources.

Others (o): The general public of the system—all users who are neither the owner nor members of the file's group. This category represents the broadest level of access control, determining what strangers to the file can and cannot do.

Deciphering the Permission Code: Reading File Attributes

The Language of ls -l

When you execute the ls -l command, Linux reveals the hidden world of file permissions through a cryptic but logical string of characters. Understanding this notation is like learning to read an ancient script that holds the keys to system security.

ls -l

-rw-r--r-- 1 alice developers 1024 Nov 15 14:30 project_plan.txt

drwxr-xr-x 2 alice developers 4096 Nov 15 14:25 documents/

-rwxr-x--- 1 bob admin 2048 Nov 15 13:45 backup_script.sh

Let's dissect this mystical string character by character:

Position 1: The file type indicator

- - indicates a regular file
- d indicates a directory
- l indicates a symbolic link
- c indicates a character device
- b indicates a block device

Positions 2-4: Owner permissions (user)

Positions 5-7: Group permissions

Positions 8-10: Other permissions

Each trio follows the same pattern: read (r), write (w), execute (x). When a permission is denied, a dash (-) appears in its place, creating a visual map of access rights.

Practical Permission Reading Examples

# A file readable and writable by owner, readable by group and others

-rw-r--r-- 1 alice users 1024 Nov 15 14:30 readme.txt

 

# A directory with full access for owner, read/execute for group and others

drwxr-xr-x 2 alice users 4096 Nov 15 14:25 public_folder/

 

# An executable script with restricted access

-rwx------ 1 alice users 512 Nov 15 14:20 private_script.sh

The Numeric Language: Octal Permission Notation

Understanding the Binary Foundation

Linux permissions can also be expressed using octal (base-8) notation, where each permission type receives a numeric value:

- Read (r) = 4
- Write (w) = 2
- Execute (x) = 1

These values combine additively to create permission sets:

- 7 (4+2+1) = rwx (full permissions)
- 6 (4+2) = rw- (read and write)
- 5 (4+1) = r-x (read and execute)
- 4 = r-- (read only)
- 3 (2+1) = -wx (write and execute)
- 2 = -w- (write only)
- 1 = --x (execute only)
- 0 = --- (no permissions)

Common Permission Combinations

# 755: Owner has full control, group and others can read and execute

chmod 755 script.sh

 

# 644: Owner can read/write, group and others can only read

chmod 644 document.txt

 

# 600: Only owner can read and write, no access for others

chmod 600 private_file.txt

 

# 777: Full permissions for everyone (use with extreme caution)

chmod 777 shared_resource

Mastering the chmod Command: Changing Permissions

Symbolic Mode: The Human-Readable Approach

The chmod command accepts symbolic notation that mirrors natural language, making it intuitive for users to modify permissions:

# Grant execute permission to owner

chmod u+x script.sh

 

# Remove write permission from group

chmod g-w document.txt

 

# Set read-only for others

chmod o=r file.txt

 

# Add read permission for all users

chmod a+r public_info.txt

 

# Complex permission changes

chmod u+rwx,g+rx,o-rwx sensitive_script.sh

Symbolic Operators:

- + adds permissions
- - removes permissions
- = sets exact permissions

User Categories:

- u for owner (user)
- g for group
- o for others
- a for all users

Recursive Permission Changes

When dealing with directory structures, the -R flag enables recursive permission changes:

# Apply permissions to directory and all contents

chmod -R 755 /home/user/public_html/

 

# Recursively remove write access for group and others

chmod -R go-w /home/user/documents/

Advanced chmod Techniques

# Conditional execute permission (only if already executable by someone)

chmod a+X directory_structure/

 

# Copy permissions from one file to another

chmod --reference=template.txt new_file.txt

 

# Verbose output showing changes made

chmod -v u+x *.sh

The chown Command: Transferring Ownership

Basic Ownership Changes

The chown command allows authorized users to transfer file ownership, changing both user and group associations:

# Change owner only

chown alice file.txt

 

# Change owner and group

chown alice:developers file.txt

 

# Change group only (alternative syntax)

chown :developers file.txt

Recursive Ownership Changes

# Recursively change ownership of directory and contents

chown -R alice:users /home/alice/projects/

 

# Change ownership with verbose output

chown -v bob:admin important_script.sh

The chgrp Command: Group-Specific Changes

For situations requiring only group changes, chgrp provides a focused approach:

# Change group ownership

chgrp developers project_files/

 

# Recursive group change

chgrp -R admin /var/log/application/

Special Permissions: Beyond the Basics

The Setuid Bit

The setuid (Set User ID) bit allows programs to run with the privileges of their owner, regardless of who executes them:

# Set the setuid bit

chmod u+s program

chmod 4755 program # Octal notation with setuid

 

# Example: passwd command runs with root privileges

ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 68208 Nov 15 12:00 /usr/bin/passwd

The Setgid Bit

The setgid (Set Group ID) bit serves dual purposes:

- On executable files: runs with group privileges
- On directories: new files inherit the directory's group

# Set the setgid bit

chmod g+s directory/

chmod 2755 directory/ # Octal notation with setgid

The Sticky Bit

The sticky bit prevents users from deleting files they don't own in shared directories:

# Set the sticky bit

chmod +t /tmp/shared/

chmod 1755 /tmp/shared/ # Octal notation with sticky bit

 

# Example: /tmp directory with sticky bit

ls -ld /tmp

drwxrwxrwt 12 root root 4096 Nov 15 15:30 /tmp

Practical Scenarios and Best Practices

Securing Web Server Files

# Set appropriate permissions for web content

chmod -R 644 /var/www/html/*.html

chmod -R 755 /var/www/html/cgi-bin/

chown -R www-data:www-data /var/www/html/

Creating Shared Project Directories

# Create a collaborative workspace

mkdir /shared/project

chgrp developers /shared/project

chmod 2775 /shared/project # setgid + group write access

Securing Configuration Files

# Protect sensitive configuration files

chmod 600 /etc/ssh/ssh_host_rsa_key

chmod 644 /etc/ssh/ssh_config

chown root:root /etc/passwd

Troubleshooting Permission Issues

Common Permission Problems

Access Denied Errors:

# Check current permissions

ls -l problematic_file

 

# Verify ownership

ls -l directory/

 

# Check parent directory permissions

ls -ld parent_directory/

Script Won't Execute:

# Add execute permission

chmod +x script.sh

 

# Verify shebang line

head -n 1 script.sh

Using umask for Default Permissions

The umask command sets default permissions for newly created files:

# View current umask

umask

 

# Set restrictive umask (only owner has access)

umask 077

 

# Set moderate umask (owner full, group read)

umask 027

Advanced Permission Management

Access Control Lists (ACLs)

For more granular permission control, Linux supports Access Control Lists:

# Set ACL for specific user

setfacl -m u:alice:rwx file.txt

 

# Set ACL for specific group

setfacl -m g:developers:rw file.txt

 

# View ACL settings

getfacl file.txt

File Attributes

Extended file attributes provide additional security layers:

# Make file immutable

chattr +i important_file.txt

 

# View file attributes

lsattr important_file.txt

 

# Remove immutable attribute

chattr -i important_file.txt

Conclusion: The Guardian's Wisdom

Understanding Linux file permissions and ownership is like mastering the art of digital guardianship. Every permission setting, every ownership change, and every access control decision contributes to the overall security posture of your system. The commands and concepts covered in this chapter—chmod, chown, chgrp, and the intricate permission notation system—form the foundation of Linux security administration.

As you continue your journey through the Linux command line, remember that with great power comes great responsibility. The ability to modify permissions and ownership affects not just individual files, but the entire ecosystem of users and processes that depend on proper access control. Practice these concepts in safe environments, understand the implications of each change, and always consider the principle of least privilege—granting only the minimum access necessary for users to accomplish their tasks.

The digital fortress of Linux awaits your stewardship. Armed with the knowledge of permissions and ownership, you now possess the keys to maintaining security, enabling collaboration, and ensuring that your system remains both functional and protected against unauthorized access.

---

Notes and Commands Reference

Essential Commands Summary

Command

Purpose

Example

ls -l

Display detailed file information

ls -l /home/user/

chmod

Change file permissions

chmod 755 script.sh

chown

Change file ownership

chown alice:users file.txt

chgrp

Change group ownership

chgrp developers project/

umask

Set default permissions

umask 022

Permission Notation Quick Reference

Octal

Binary

Symbolic

Description

0

000

---

No permissions

1

001

--x

Execute only

2

010

-w-

Write only

3

011

-wx

Write and execute

4

100

r--

Read only

5

101

r-x

Read and execute

6

110

rw-

Read and write

7

111

rwx

Full permissions

Special Permission Bits

Bit

Octal

Symbol

Purpose

Setuid

4000

s (user)

Execute with owner privileges

Setgid

2000

s (group)

Execute with group privileges

Sticky

1000

t (others)

Prevent deletion by non-owners