The Most Powerful Command You’ll Use
sudo is the gatekeeper between regular user actions and root-level system changes. Use it correctly, and you maintain security while getting work done. Use it carelessly, and you create vulnerabilities that keep security teams awake at night.
Most people know sudo as “the thing you put before commands to make them work.” That’s like saying a car key is “the thing that makes the car go.” Technically true, dangerously incomplete.
Understanding sudo properly means understanding privilege escalation, audit logging, and the principle of least privilege—security concepts that separate administrators from engineers.
What sudo Actually Does
When you run sudo command, several things happen:
- sudo checks if you’re in the sudoers file (allowed to use sudo)
- It prompts for your password (not root’s password)
- It logs the command to /var/log/auth.log
- It executes the command as root (or another specified user)
- It caches your authentication for a timeout period (usually 15 minutes)
Every sudo command is logged. This is crucial for security auditing and incident response.
# See who's been using sudo
sudo grep "sudo:" /var/log/auth.log | tail -20
Essential sudo Usage
Basic Commands
# Run command as root
sudo apt update
# Run command as different user
sudo -u www-data whoami
# Open root shell (use sparingly)
sudo -i
# Run command preserving environment
sudo -E command
# List your sudo privileges
sudo -l
Editing Files Safely
# Edit with sudo (don't use 'sudo nano')
sudoedit /etc/nginx/nginx.conf
# Or equivalently
sudo -e /etc/nginx/nginx.conf
Why sudoedit? It creates a temporary copy, lets you edit it as your user, then replaces the original. This prevents issues with editor plugins running as root and keeps audit logs clean.
Running Multiple Commands
# Chain commands (each needs sudo)
sudo apt update && sudo apt upgrade
# Or use a root shell for multiple commands
sudo bash -c 'apt update && apt upgrade'
Understanding the sudoers File
The sudoers file (/etc/sudoers) controls who can run what. Always edit it with visudo—it checks syntax before saving.
# Edit sudoers safely
sudo visudo
Reading sudoers Syntax
# Basic format:
# user host=(run_as) commands
# Allow alice to run all commands as any user
alice ALL=(ALL:ALL) ALL
# Allow bob to run only specific commands
bob ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl
# Allow group "admins" full access
%admins ALL=(ALL:ALL) ALL
# Allow without password prompt
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
| Part | Meaning |
|---|---|
alice |
Username (or %groupname) |
ALL (first) |
From any host |
(ALL:ALL) |
As any user:group |
ALL (last) |
Any command |
Common Configurations
# Web developer: restart web services only
webdev ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, \
/usr/bin/systemctl restart php-fpm
# Database admin: manage PostgreSQL
dbadmin ALL=(postgres) ALL
dbadmin ALL=(ALL) /usr/bin/systemctl restart postgresql
# Read-only access to logs (for support team)
support ALL=(ALL) /usr/bin/tail -f /var/log/*, \
/usr/bin/less /var/log/*
# Deny specific commands (deny takes precedence)
developer ALL=(ALL) ALL, !/usr/bin/passwd, !/bin/su
Security Best Practices
Principle of Least Privilege
Grant only the permissions needed, nothing more:
# Bad: Give everyone full sudo
developers ALL=(ALL:ALL) ALL
# Better: Specific commands only
developers ALL=(ALL) /usr/bin/docker, /usr/bin/docker-compose
Avoid NOPASSWD for Sensitive Commands
# Acceptable: Restart a specific service without password
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp
# Dangerous: Full access without password
deploy ALL=(ALL) NOPASSWD: ALL
Use Groups, Not Individual Users
# In /etc/sudoers:
%docker-users ALL=(ALL) /usr/bin/docker
# Manage access via group membership:
sudo usermod -aG docker-users newuser
Audit sudo Usage
# Check recent sudo activity
sudo grep "sudo" /var/log/auth.log | tail -50
# Who ran what commands?
sudo grep "COMMAND" /var/log/auth.log
# Failed sudo attempts (possible intrusion)
sudo grep "authentication failure" /var/log/auth.log
Common sudo Mistakes
Mistake 1: Running Everything as Root
# Wrong: Opens a root shell and stays there
sudo su -
# Then run commands...
# Better: Run specific commands with sudo
sudo apt update
sudo systemctl restart nginx
Running a persistent root shell means you lose audit trails and increase risk of accidental damage.
Mistake 2: Piping to sudo
# This doesn't work:
cat file.txt | sudo tee /etc/config
# This also doesn't work as expected:
echo "text" | sudo cat > /protected/file
# What you actually need:
echo "text" | sudo tee /protected/file > /dev/null
# Or:
sudo bash -c 'echo "text" > /protected/file'
Mistake 3: sudo with GUI Applications
# Avoid: Can cause permission issues
sudo gedit /etc/nginx/nginx.conf
# Better: Use sudoedit or CLI editors
sudoedit /etc/nginx/nginx.conf
sudo nano /etc/nginx/nginx.conf
Mistake 4: Overly Broad sudo Rules
# Dangerous: User can edit sudoers
developer ALL=(ALL) /usr/bin/vim *
# They can run: sudo vim /etc/sudoers
# Then give themselves full access
# Safer: Use sudoedit for specific files
developer ALL=(ALL) sudoedit /etc/nginx/nginx.conf
Timeout and Session Configuration
# Check current timeout
sudo -l | grep timestamp
# Extend timeout (in /etc/sudoers)
Defaults timestamp_timeout=30 # 30 minutes
# Require password every time
Defaults timestamp_timeout=0
# Reset your cached credentials
sudo -k
# Kill cached credentials and require password now
sudo -K
Privilege Escalation Paths
Understanding how privileges escalate helps you secure systems:
Legitimate Escalation
| Method | Use Case | Audit Trail |
|---|---|---|
| sudo command | Single privileged operation | Full logging |
| sudo -i | Extended root session | Session logged |
| sudo -u user | Run as service account | Logged with target user |
Potential Abuse Vectors
# If user can run vim/nano/less with sudo, they can escape to shell
sudo vim # Then type :!/bin/bash
# If user can run python/perl/ruby with sudo
sudo python -c 'import os; os.system("/bin/bash")'
# If user can modify scripts that run as root
# Edit the script to include malicious commands
Important: This is why specific command restrictions matter. “They can only edit config files” isn’t safe if they can edit files that get executed as root.
Interview Questions
- “What’s the difference between su and sudo?”
- Answer: “
suswitches to another user entirely—you become that user with their environment. It requires the target user’s password.sudoexecutes a single command as another user, using your own password, and logs everything. sudo is preferred because it follows least privilege and provides audit trails.” - “How would you give a developer permission to restart services but nothing else?”
- Answer: “I’d add a sudoers rule like
developer ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart php-fpm. Only those specific commands, no wildcards. If they need more services later, I’d update the explicit list rather than using patterns.” - “Someone’s been running commands as root. How do you find out what happened?”
- Answer: “Check
/var/log/auth.logfor sudo entries—it logs every command. grep for ‘COMMAND=’ to see what was run, by whom, and when. If they usedsudo -ifor a shell session, you’ll see fewer individual commands but can still correlate timing.” - “Is NOPASSWD ever acceptable?”
- Answer: “For specific, non-destructive commands in automation scenarios—like letting a deploy script restart a specific service. Never for broad access, and never for commands that could be abused for privilege escalation.”
Quick Reference
# Basic usage
sudo command # Run as root
sudo -u user command # Run as specific user
sudo -i # Root shell
sudo -l # List your privileges
# Session management
sudo -k # Reset cached credentials
sudo -v # Extend timeout
# Editing
sudoedit /path/to/file # Safe file editing
sudo visudo # Edit sudoers
# Audit
grep "sudo" /var/log/auth.log # Check sudo usage
grep "COMMAND" /var/log/auth.log # See what was run
# Common sudoers patterns
user ALL=(ALL) command # Allow specific command
%group ALL=(ALL) command # Group access
user ALL=(ALL) NOPASSWD: cmd # No password required
user ALL=(ALL) ALL, !command # Deny specific command
The Career Translation
| Understanding | Demonstrates | Role Level |
|---|---|---|
| Uses sudo to run commands | Basic Linux operation | Any Linux role |
| Understands sudoers configuration | Security awareness | Junior/Mid Sysadmin (£32-42k) |
| Designs least-privilege access | Security engineering | Mid-Senior (£42-55k) |
| Auditing, compliance, PAM integration | Enterprise security | Senior/Security (£55k+) |
Security thinking shows in how you use and configure sudo. “chmod 777 and sudo everything” is helpdesk mentality. Designing proper access controls is engineering.
Next Steps
- PAM (Pluggable Authentication Modules) – How Linux authentication really works
- SELinux/AppArmor – Mandatory access controls beyond sudo
- Centralized sudo logging – Aggregating audit logs
- sudo alternatives – doas, PolicyKit for different use cases
Privilege management is a security fundamental. Master sudo and you’ve proven you think about security, not just functionality.
Part 6 of the Linux Fundamentals series. Next: Linux directory navigation essentials—the commands you’ll use hundreds of times a day.
Linux Fundamentals Series – Part 6 of 12
Previous: Network Troubleshooting Commands

