🚀 Update your knowledge with this new Linux Blog Post
Managing users and groups is a fundamental skill for anyone working with Linux — from sysadmins to DevOps engineers.
In my latest post, I walk through the essential commands for adding, modifying, and deleting users and groups, with real-world examples and pro tips for safer account handling (like disabling login access properly).
Introduction
Managing users and groups is one of the fundamental responsibilities of Linux system administration. Whether you’re setting up a personal workstation or managing a server with multiple users, understanding how Linux handles user accounts and group permissions is essential for maintaining system security and organization. This guide covers the core concepts, commands, and best practices for effective user and group management in Linux environments.
Linux’s multi-user nature allows multiple users to access the system simultaneously, with each user having specific permissions and restrictions. This design offers both security and flexibility through a robust permission system built around users and groups.
Essential Commands for User Management
Creating Users
# Create a new user sudo useradd username # Create a user with specific settings sudo useradd -m -d /home/customhome -s /bin/bash -c "Full Name" username # Add a user with a specific user ID sudo useradd -u 1500 username
Modifying User Accounts
# Change a user's home directory sudo usermod -d /new/home/dir username # Change a user's shell sudo usermod -s /bin/zsh username # Change a user's UID sudo usermod -u 1001 username # Add a user to additional groups sudo usermod -aG group1,group2 username
Managing Passwords
# Set or change a user's password sudo passwd username # Set password expiration information sudo chage -E 2023-12-31 -m 30 -M 90 -W 7 username
Disabling User Accounts
# Method 1: Lock the user's password sudo passwd -l username # Method 2: Set the account expiration date to a past date sudo usermod -e 1970-01-01 username # OR sudo chage -E 0 username # Method 3: Change the user's shell to nologin sudo usermod -s /usr/sbin/nologin username # OR sudo usermod -s /bin/false username # Method 4: Combine multiple approaches for stronger security sudo passwd -l username && \ sudo usermod -s /usr/sbin/nologin username && \ sudo chage -E 0 username # Verify account status sudo chage -l username
Re-enabling Disabled Accounts
# Check the current state of the account sudo chage -l username sudo grep "^username:" /etc/passwd sudo passwd -S username # Step 1: Unlock the password if it was locked sudo passwd -u username # Step 2: Reset account expiration (remove expiry or set to future date) sudo chage -E -1 username # No expiration # OR sudo usermod -e "" username # No expiration # OR set to a future date sudo chage -E $(date -d "+1 year" +%Y-%m-%d) username # Step 3: Restore the original shell if it was changed sudo usermod -s /bin/bash username # For bash users # OR sudo usermod -s /bin/zsh username # For zsh users # Check default shell in /etc/default/useradd if unsure # Step 4: Reset the password if necessary sudo passwd username # Step 5: Verify the changes sudo chage -l username sudo passwd -S username getent passwd username
Deleting Users
# Delete a user sudo userdel username # Delete a user and their home directory sudo userdel -r username
Group Management Commands
Creating and Modifying Groups
# Create a new group sudo groupadd groupname # Create a group with specific GID sudo groupadd -g 1500 groupname # Change a group's name sudo groupmod -n newname oldname # Change a group's GID sudo groupmod -g 1600 groupname
Managing Group Membership
# Add a user to a group sudo gpasswd -a username groupname # Remove a user from a group sudo gpasswd -d username groupname # Set a list of users as members of a group sudo gpasswd -M user1,user2,user3 groupname
Deleting Groups
# Delete a group sudo groupdel groupname
User and Group Information Commands
# Display user information id username # Show current user's groups groups # Show groups for a specific user groups username # List all users cat /etc/passwd # Find a specific user grep '^username:' /etc/passwd # List all groups cat /etc/group # Who is currently logged in who # Show detailed information about users logged in w
Practical Use Cases with Hands-on Examples
# Create a group for the team sudo groupadd developers # Add users to the group sudo gpasswd -a alex developers sudo gpasswd -a sam developers sudo gpasswd -a taylor developers # Create a shared directory sudo mkdir -p /opt/projects/team-project # Set group ownership sudo chgrp developers /opt/projects/team-project # Set directory permissions with SGID bit sudo chmod 2775 /opt/projects/team-project
The SGID bit (2) ensures that all files created in this directory inherit the group ownership, making collaboration seamless.
Setting Up a System Service Account
# Create a system user without login privileges sudo useradd -r -s /usr/sbin/nologin -d /opt/appservice svcappuser1 # Create app directories sudo mkdir -p /opt/appservice/data # Set proper ownership sudo chown -R appuser:appuser /opt/appservice
This creates a service account that applications can run under, enhancing security by isolating service processes.
Setting Up a User for Contractor Account
# Step 1: Create the user account with basic settings sudo useradd -m -s /bin/bash -c "Contractor - Expires Dec 2025" contractor_name # Step 2: Set initial password sudo passwd contractor_name # Step 3: Configure all password and account expiration policies sudo chage -E 2025-12-31 -M 90 -m 30 -W 7 contractor_name
Let me break down what this chage
command does:
-E 2025-12-31
: Sets the account expiration date to December 31, 2025. After this date, the account will be automatically disabled.-M 90
: Sets maximum password age to 90 days (force password rotation every 3 months)-m 30
: Sets minimum password age to 30 days (prevents changing password more than once in 30 days)-W 7
: Sets the warning period to 7 days (warns user 7 days before password expires)
You can verify these settings with:
sudo chage -l contractor_name Last password change : [current date] Password expires : [current date + 90 days] Password inactive : never Account expires : Dec 31, 2025 Minimum number of days between password change : 30 Maximum number of days between password change : 90 Number of days of warning before password expires : 7
Additional security tips:
# Add the contractor to only necessary groups sudo usermod -aG project_group contractor_name # Consider setting up a custom login message to # remind them of the temporary nature of the account sudo touch /home/contractor_name/.bash_login echo 'echo "Notice: This is a temporary account expiring on December 31, 2025"' | \ sudo tee -a /home/contractor_name/.bash_login sudo chown contractor_name:contractor_name /home/contractor_name/.bash_login
Implementing User Quotas
# Install quota tools sudo apt-get install quota # Enable quotas in /etc/fstab # Add usrquota,grpquota to mount options # Remount filesystem with quota support sudo mount -o remount /home # Initialize quota database sudo quotacheck -cugm /home # Turn quotas on sudo quotaon -v /home # Set quota for a user (soft limit: 5GB, hard limit: 6GB) sudo setquota -u username 5242880 6291456 0 0 /home
Properly Disabling a User Account Before Deletion
# Step 1: Check for running processes by the user ps -u username # Step 2: Lock the password sudo passwd -l username # Step 3: Expire the account immediately sudo chage -E 0 username # Step 4: Change the shell to prevent login sudo usermod -s /usr/sbin/nologin username # Step 5: Remove the user from any sensitive groups (especially sudo) sudo gpasswd -d username sudo sudo gpasswd -d username admin sudo gpasswd -d username wheel # Step 6: Check for files owned by the user before deletion sudo find / -user username -ls 2>/dev/null # Step 7: Consider backing up the user's home directory sudo tar -czf username-backup-$(date +%Y%m%d).tar.gz /home/username # Once you've verified it's safe, delete the user account sudo userdel -r username
Recovering an Accidentally Disabled Account
# Scenario: Critical user account "dbadmin" was mistakenly disabled # Step 1: Verify how the account was disabled sudo passwd -S dbadmin # Check if locked (L flag) sudo chage -l dbadmin # Check expiration sudo grep "^dbadmin:" /etc/passwd # Check shell # Step 2: Comprehensive recovery sudo passwd -u dbadmin # Unlock password sudo chage -E -1 dbadmin # Remove expiration sudo usermod -s /bin/bash dbadmin # Restore shell sudo usermod -U dbadmin # Alternative way to unlock # Step 3: Verify original group memberships and restore if needed # First check what groups the user should be in sudo grep -E ":[^:]*dbadmin" /etc/group # or from backups if available # Then add back to critical groups sudo usermod -aG sudo,dba,developers dbadmin # Step 4: Test the account su - dbadmin # Try to switch to the user # Check if they can execute their normal tasks
Things to Remember
- User and Group IDs: System users typically have UIDs below 1000, while regular users have UIDs 1000 and above. Keep UID/GID assignments consistent across systems for easier file sharing.
- Password Policies: Implement strong password policies using PAM modules and
chage
for password expiration. - Primary vs. Supplementary Groups: Every user has one primary group (specified in /etc/passwd) and can belong to multiple supplementary groups (listed in /etc/group).
- Special Permission Bits: Understand SGID and SUID bits for advanced permission management.
- Home Directory Management: When deleting users, decide whether to keep or remove their home directories based on your data retention policies.
- Backup User Data: Before making significant changes to user accounts, back up important files.
- Sudo Access: Manage administrative privileges carefully using
/etc/sudoers
or preferably files in/etc/sudoers.d/
. - Name Service Switch: If using centralized authentication (LDAP, NIS, etc.), understand how NSS works via
/etc/nsswitch.conf
. - Disabling vs. Deleting: Always disable accounts before deleting them. This provides a grace period to ensure no critical services are disrupted.
- Check for Running Processes: Before disabling or deleting accounts, check for and properly handle any running processes owned by that user.
- Document User Changes: Keep logs of all user account changes, especially for system or service accounts. This documentation is invaluable during troubleshooting.
- Regular Audit: Periodically audit user accounts and group memberships to ensure they align with current access requirements.
Final Thoughts
Effective user and group management is foundational to Linux system administration. By mastering these concepts and commands, you can maintain a secure, organized, and efficient multi-user environment. Remember that user management strategies should evolve with your organization’s needs while maintaining security best practices.
As your systems grow, consider implementing centralized authentication mechanisms like LDAP, Active Directory integration, or FreeIPA for more scalable user management across multiple systems.
Further Reading
- Linux System Administrator’s Guide (Chapter on User Management)
- The Linux Documentation Project: User and Group Administration
- Red Hat/Ubuntu/Debian documentation on user management (specific to your distribution)
- “Linux Administration Handbook” by Evi Nemeth
- “UNIX and Linux System Administration Handbook” by Evi Nemeth et al.
0 Comments