用户与权限管理:useradd, chmod, sudo | User & Permission Management

章节概述

核心理念:Linux 是多用户操作系统,用户和权限管理是系统安全的基石。理解 UID/GID、文件权限、sudo 机制和 ACL,就像理解 C 语言的访问控制——谁能读、谁能写、谁能执行,都必须精确控制。


第1节:用户管理命令

1.1 useradd 创建用户

# 创建用户(默认设置)
sudo useradd username
 
# 创建用户并设置主目录
sudo useradd -m -s /bin/bash username
 
# 创建用户并指定 UID 和组
sudo useradd -m -u 1500 -g developers -s /bin/bash username
 
# 创建系统用户(无主目录,UID < 1000)
sudo useradd -r -s /usr/sbin/nologin serviceuser
 
# 设置密码
sudo passwd username
选项说明
-m创建主目录
-s指定 shell
-u指定 UID
-g指定主组
-G指定附加组
-e账户过期日期
-c用户注释
-r创建系统用户

1.2 usermod 修改用户

# 将用户添加到附加组
sudo usermod -aG sudo username
 
# 修改用户 shell
sudo usermod -s /bin/zsh username
 
# 锁定用户账户
sudo usermod -L username
 
# 解锁用户账户
sudo usermod -U username
 
# 修改用户名
sudo usermod -l newname oldname
 
# 设置账户过期
sudo usermod -e 2026-12-31 username

1.3 userdel 删除用户

# 删除用户(保留主目录)
sudo userdel username
 
# 删除用户及其主目录
sudo userdel -r username
 
# 强制删除(即使用户在线)
sudo userdel -rf username

第2节:文件权限管理

2.1 chmod 权限修改

# 符号模式
chmod u+x script.sh      # 所有者添加执行权限
chmod g-w file.txt       # 组用户移除写权限
chmod o=r file.txt       # 其他用户只读
chmod a+r file.txt       # 所有用户添加读权限
 
# 数字模式(八进制)
chmod 755 script.sh      # rwxr-xr-x
chmod 644 file.txt       # rw-r--r--
chmod 700 private.sh     # rwx------
chmod 600 secret.key     # rw-------
 
# 递归修改
chmod -R 755 /var/www/
权限数字说明
r4读取
w2写入
x1执行
-0无权限

2.2 chown 所有权修改

# 修改所有者
sudo chown username file.txt
 
# 修改所有者和组
sudo chown username:groupname file.txt
 
# 递归修改
sudo chown -R www-data:www-data /var/www/
 
# 仅修改组
sudo chgrop groupname file.txt

第3节:sudo 配置

3.1 /etc/sudoers 文件

# 编辑 sudoers 文件(必须使用 visudo)
sudo visudo
 
# 授予用户 sudo 权限
username ALL=(ALL:ALL) ALL
 
# 授予用户免密码 sudo
username ALL=(ALL) NOPASSWD: ALL
 
# 授予用户特定命令的 sudo 权限
username ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/tail -f /var/log/syslog
 
# 授予组 sudo 权限
%sudo ALL=(ALL:ALL) ALL
 
# 授予用户执行特定命令(不需要密码)
username ALL=(root) NOPASSWD: /usr/bin/apt-get update, /usr/bin/apt-get upgrade

3.2 sudo 安全实践

# 查看用户 sudo 历史
sudo grep sudo /var/log/auth.log
 
# 查看当前用户的 sudo 权限
sudo -l
 
# 测试 sudo 配置
sudo -v
 
# 查看 sudo 日志
sudo journalctl _COMM=sudo

第4节:ACL(访问控制列表)

4.1 ACL 基本操作

# 查看文件 ACL
getfacl file.txt
 
# 设置 ACL(给用户)
setfacl -m u:username:rwx file.txt
 
# 设置 ACL(给组)
setfacl -m g:groupname:rx file.txt
 
# 设置默认 ACL(对新文件生效)
setfacl -d -m g:groupname:rwx directory/
 
# 移除 ACL
setfacl -x u:username file.txt
 
# 移除所有 ACL
setfacl -b file.txt

4.2 ACL 权限掩码

# ACL 掩码限制最大权限
getfacl file.txt
# 输出示例:
# user::rwx
# user:username:rwx    # 有效权限
# group::r-x
# mask::r-x            # 掩码(最大权限)
# other::r--
 
# 修改掩码
setfacl -m m::rwx file.txt

第5节:UID/GID 理解

5.1 查看 UID/GID

# 查看当前用户信息
id
# 输出: uid=1000(username) gid=1000(username) groups=1000(username),27(sudo)
 
# 查看特定用户
id username
 
# 查看 UID 范围
cat /etc/login.defs | grep -E "^UID_|^GID_"
 
# UID 范围说明:
# 0:        root
# 1-999:    系统用户
# 1000+:    普通用户

5.2 /etc/passwd 和 /etc/shadow

# /etc/passwd 格式
cat /etc/passwd
# username:x:1000:1000:Comment:/home/username:/bin/bash
# 字段: 用户名:密码占位:UID:GID:注释:主目录:Shell
 
# /etc/shadow(密码哈希,需要 root 权限)
sudo cat /etc/shadow
# username:$6$xxxx:19845:0:99999:7:::
 
# /etc/group
cat /etc/group
# groupname:x:GID:user1,user2,user3

第6节:批量用户管理

6.1 批量创建用户

#!/bin/bash
# 从文件批量创建用户
while IFS=: read -r username fullname; do
    sudo useradd -m -c "$fullname" -s /bin/bash "$username"
    echo "$username:$(openssl rand -base64 12)" | sudo chpasswd
    echo "Created user: $username"
done < users.txt
 
# users.txt 格式:
# john:John Doe
# jane:Jane Smith

6.2 用户信息收集

# 列出所有普通用户
awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $3, $6, $7}' /etc/passwd
 
# 列出登录过的用户
lastlog | grep -v "Never logged in"
 
# 列出当前登录用户
who
 
# 列出所有组
getent group | awk -F: '$3 >= 1000 {print $1, $3}'