一张脑图吃透Linux用户权限:useradd、usermod、umask、setfacl、chmod特殊位、chown、chage连招大全

Linux 用户权限 7 大核心命令脑图详解(含排错口诀)

💡 文章亮点:一文掌握Linux权限管理全套技能,从基础到进阶,从理论到实战!

📚 建议收藏:本文长期更新,建议点赞收藏,需要时快速查阅!

📑 目录导航

  • [第一章:用户管理基础 - useradd与usermod](#第一章:用户管理基础 - useradd与usermod "#%E7%AC%AC%E4%B8%80%E7%AB%A0%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80---useradd%E4%B8%8Eusermod")
  • [第二章:默认权限掌控 - umask与setfacl](#第二章:默认权限掌控 - umask与setfacl "#%E7%AC%AC%E4%BA%8C%E7%AB%A0%E9%BB%98%E8%AE%A4%E6%9D%83%E9%99%90%E6%8E%8C%E6%8E%A7---umask%E4%B8%8Esetfacl")
  • [第三章:高级权限管理 - chmod特殊权限、chown与chage](#第三章:高级权限管理 - chmod特殊权限、chown与chage "#%E7%AC%AC%E4%B8%89%E7%AB%A0%E9%AB%98%E7%BA%A7%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86---chmod%E7%89%B9%E6%AE%8A%E6%9D%83%E9%99%90chown%E4%B8%8Echage")
  • 第四章:权限管理实战案例
  • 第五章:Linux权限管理脑图

第一章:用户管理基础 - useradd与usermod

1.1 useradd命令详解

🔍 核心功能:创建新用户账户,是Linux系统管理员必备技能

1.1.1 常用选项速查表
选项 功能 实用指数
-b, --base-dir BASE_DIR 指定新用户主目录的基目录 ⭐⭐
-c, --comment COMMENT 添加用户的描述或注释(存储在/etc/passwd的备注栏) ⭐⭐⭐
-d, --home-dir HOME_DIR 指定用户的主目录路径 ⭐⭐⭐⭐
-D, --defaults 显示或修改默认的useradd配置 ⭐⭐
-e, --expiredate EXPIRE_DATE 设置用户账户的过期日期(格式:YYYY-MM-DD) ⭐⭐⭐
-f, --inactive INACTIVE 设置密码过期后的宽限期天数 ⭐⭐
-g, --gid GROUP 指定用户的主组(组名或GID) ⭐⭐⭐⭐
-G, --groups GROUPS 指定用户的附加组(多个组用逗号分隔) ⭐⭐⭐⭐⭐
-m, --create-home 自动创建用户的主目录 ⭐⭐⭐⭐⭐
-M, --no-create-home 不创建用户的主目录 ⭐⭐
-s, --shell SHELL 指定用户的登录Shell ⭐⭐⭐⭐
-u, --uid UID 指定用户的UID ⭐⭐⭐

🧠 记忆口诀:「创用户,记CGSM」 - Comment描述、Group组别、Shell终端、Make主目录

1.1.2 常见使用场景

🔹 基础用户创建

bash 复制代码
# 创建基本用户(自动创建主目录)
sudo useradd -m testuser

# 创建用户并设置密码(一步到位)
sudo useradd -m testuser && sudo passwd testuser

🔹 创建特定配置用户

bash 复制代码
# 创建开发人员账户(指定主目录、组、Shell)
sudo useradd -m -d /home/developers/alice -g developers -G docker,sudo -s /bin/bash -c "开发工程师" alice

# 创建临时账户(设置过期时间)
sudo useradd -m -e 2023-12-31 -c "临时访客" tempuser

🔹 创建系统服务账户

bash 复制代码
# 创建系统用户(无主目录、无登录Shell)
sudo useradd -r -s /sbin/nologin -c "Web服务账户" webservice

⚠️ 坑位预警

  1. 创建用户后别忘记设置密码,否则账户无法登录
  2. 默认情况下,不加-m选项不会创建主目录
  3. 系统用户和普通用户的UID范围不同,使用-r创建系统用户时会自动分配合适的UID

1.2 usermod命令:用户信息修改利器

🔍 核心功能:修改已存在用户的各种属性,是用户管理的瑞士军刀

1.2.1 常用选项速查表
选项 功能 实用指数
-a, --append 与-G一起使用,追加新组而不替换现有组 ⭐⭐⭐⭐⭐
-c, --comment COMMENT 修改用户的描述或注释 ⭐⭐⭐
-d, --home HOME_DIR 修改用户的主目录 ⭐⭐⭐⭐
-e, --expiredate EXPIRE_DATE 修改账户过期日期 ⭐⭐⭐
-g, --gid GROUP 修改用户的主组 ⭐⭐⭐⭐
-G, --groups GROUPS 修改用户的附加组(多个组用逗号分隔) ⭐⭐⭐⭐⭐
-l, --login NEW_LOGIN 修改用户名 ⭐⭐⭐
-L, --lock 锁定用户账户 ⭐⭐⭐⭐
-m, --move-home 与-d一起使用,移动用户文件到新主目录 ⭐⭐⭐⭐
-s, --shell SHELL 修改用户的登录Shell ⭐⭐⭐⭐
-U, --unlock 解锁用户账户 ⭐⭐⭐⭐

🧠 记忆口诀:「改用户,记AGS」 - Append追加组、Group主组、Shell终端

1.2.2 常见使用场景

🔹 修改用户组

bash 复制代码
# 添加用户到新的附加组(保留原有组)
sudo usermod -aG docker,sudo testuser

# 修改用户的主组
sudo usermod -g developers testuser

🔹 修改用户Shell和主目录

bash 复制代码
# 修改用户的登录Shell
sudo usermod -s /bin/zsh testuser

# 修改用户的主目录并移动文件
sudo usermod -d /newhome/testuser -m testuser

🔹 账户安全管理

bash 复制代码
# 锁定用户账户(临时禁用)
sudo usermod -L testuser

# 解锁用户账户
sudo usermod -U testuser

# 设置账户过期时间
sudo usermod -e 2023-12-31 testuser

⚠️ 坑位预警

  1. 使用-G修改附加组时,不加-a替换所有现有附加组,而非追加
  2. 修改主目录时,不加-m选项不会自动移动用户文件
  3. 修改用户属性后,用户需要重新登录才能生效

第二章:默认权限掌控 - umask与setfacl

2.1 umask:默认权限掩码

🔍 核心功能:控制新建文件和目录的默认权限,是权限管理的基础设置

2.1.1 umask基本原理

umask值决定了新建文件和目录的默认权限:

  • 目录默认权限 = 777 - umask
  • 文件默认权限 = 666 - umask(文件默认无执行权限)
2.1.2 常用umask值及对应权限
umask值 目录权限 文件权限 安全级别 适用场景
0022 755 (rwxr-xr-x) 644 (rw-r--r--) 中等 默认值,适合个人用户
0027 750 (rwxr-x---) 640 (rw-r-----) 较高 团队协作,限制其他用户访问
0077 700 (rwx------) 600 (rw-------) 最高 敏感数据,仅用户本人可访问
0002 775 (rwxrwxr-x) 664 (rw-rw-r--) 较低 协作环境,允许组内写入
2.1.3 umask使用示例
bash 复制代码
# 查看当前umask值(数字格式)
umask

# 查看当前umask值(符号格式)
umask -S

# 临时设置umask值(当前会话有效)
umask 0027

# 永久设置umask(添加到~/.bashrc或/etc/profile)
echo "umask 0027" >> ~/.bashrc

🧠 记忆口诀:「umask取反算,目录777文件666」
⚠️ 坑位预警

  1. umask只影响新建文件/目录,不影响已存在的文件/目录
  2. 不同用户可能有不同的默认umask值
  3. 文件权限计算时,即使umask允许执行权限,新文件默认也不会有执行权限

2.2 setfacl:访问控制列表

🔍 核心功能:提供比传统权限更精细的访问控制,可针对特定用户/组设置独立权限

2.2.1 ACL基本概念

ACL (Access Control List) 突破了传统"用户/组/其他人"三级权限的限制,允许为任意用户或组设置独立权限。

2.2.2 常用选项速查表
选项 功能 实用指数
-m, --modify 添加或修改ACL规则 ⭐⭐⭐⭐⭐
-x, --remove 删除指定ACL规则 ⭐⭐⭐⭐
-b, --remove-all 删除所有ACL规则 ⭐⭐⭐
-R, --recursive 递归操作(包括子目录和文件) ⭐⭐⭐⭐⭐
-d, --default 设置默认ACL(影响后续新建项) ⭐⭐⭐⭐
2.2.3 ACL规则格式
ruby 复制代码
[d[efault]:][u[ser]:|g[roup]:|o[ther]:|m[ask]:]name:permissions
  • u:用户名:权限 - 针对特定用户
  • g:组名:权限 - 针对特定组
  • d:u:用户名:权限 - 默认ACL,影响新建文件/目录
2.2.4 常见使用场景

🔹 为特定用户/组设置权限

bash 复制代码
# 为用户alice添加读写权限
sudo setfacl -m u:alice:rw /shared/project.txt

# 为开发组添加读写执行权限
sudo setfacl -m g:developers:rwx /opt/app

🔹 递归设置权限

bash 复制代码
# 递归为用户bob添加读写权限
sudo setfacl -Rm u:bob:rw /var/www/html

# 递归为组设置权限
sudo setfacl -Rm g:webadmin:rx /etc/nginx

🔹 设置默认ACL(权限继承)

bash 复制代码
# 设置目录默认ACL,新建文件自动继承权限
sudo setfacl -dm u:alice:rw /shared/projects

# 同时设置当前和默认ACL
sudo setfacl -m u:alice:rwx,d:u:alice:rwx /shared/projects

🔹 查看和管理ACL

bash 复制代码
# 查看文件/目录的ACL
getfacl /shared/project.txt

# 删除特定ACL规则
sudo setfacl -x u:bob /shared/project.txt

# 删除所有ACL规则
sudo setfacl -b /shared/project.txt

🧠 记忆口诀:「ACL精细控,u用户g组d默认」
⚠️ 坑位预警

  1. 文件系统必须支持ACL(大多数现代文件系统默认支持)
  2. 复制文件时,ACL可能会丢失(使用cp -p保留权限)
  3. 默认ACL只影响新建文件/目录,不影响已存在的文件/目录
  4. 如果ACL设置不生效,检查SELinux是否阻止了操作

第三章:高级权限管理 - chmod特殊权限、chown与chage

3.1 chmod特殊权限位

🔍 核心功能:设置特殊权限位(SUID/SGID/Sticky Bit),实现高级权限控制

3.1.1 特殊权限位详解
权限位 数字表示 符号表示 作用 典型应用
SUID 4 u+s 执行文件时临时获得文件所有者权限 passwd, sudo
SGID 2 g+s 文件:执行时获得所属组权限 目录:新建文件继承目录组 共享目录
Sticky Bit 1 o+t 只有文件所有者和root可删除文件 /tmp目录
3.1.2 设置特殊权限位
bash 复制代码
# 数字模式设置(推荐,更清晰)
chmod 4755 /path/to/file  # 设置SUID
chmod 2755 /path/to/dir   # 设置SGID
chmod 1777 /path/to/dir   # 设置Sticky Bit
chmod 6755 /path/to/file  # 同时设置SUID和SGID

# 符号模式设置
chmod u+s /path/to/file   # 设置SUID
chmod g+s /path/to/dir    # 设置SGID
chmod o+t /path/to/dir    # 设置Sticky Bit
3.1.3 特殊权限应用场景

🔹 SUID应用场景

SUID主要用于允许普通用户临时获得文件所有者(通常是root)的权限执行特定操作:

bash 复制代码
# 查看系统中的SUID程序
find / -perm -4000 -type f 2>/dev/null

# 常见SUID程序
ls -l /usr/bin/passwd    # 允许普通用户修改自己的密码
ls -l /usr/bin/sudo      # 允许授权用户执行root命令

🔹 SGID应用场景

SGID在目录上特别有用,用于团队协作:

bash 复制代码
# 创建共享目录,设置SGID
mkdir /shared/project
chgrp developers /shared/project
chmod 2775 /shared/project  # rwxrwsr-x

# 测试:新建文件自动继承目录组
touch /shared/project/test.txt
ls -l /shared/project/test.txt  # 组应为developers

🔹 Sticky Bit应用场景

Sticky Bit用于共享目录,防止用户删除他人文件:

bash 复制代码
# 设置公共临时目录
mkdir /public/temp
chmod 1777 /public/temp  # rwxrwxrwt

# 系统中的典型应用
ls -ld /tmp  # 应显示sticky bit (t)

🧠 记忆口诀:「特权421,S执行G继承T防删」
⚠️ 坑位预警

  1. SUID只对二进制可执行文件有效,对脚本无效
  2. 随意设置SUID可能导致严重安全漏洞,尤其是给shell设置SUID
  3. SGID对目录和文件的作用不同,目录更常用
  4. 特殊权限位在ls -l输出中显示为s、S、t或T,小写表示同时有执行权限

3.2 chown:所有权管理

🔍 核心功能:修改文件/目录的所有者和所属组,是权限管理的基础操作

3.2.1 基本语法
bash 复制代码
chown [选项] 用户[:组] 文件/目录
3.2.2 常用选项
选项 功能 实用指数
-R, --recursive 递归修改(包括子目录和文件) ⭐⭐⭐⭐⭐
-h, --no-dereference 修改符号链接本身而非目标 ⭐⭐⭐
--from=当前用户:当前组 仅当当前所有者匹配时修改 ⭐⭐
-v, --verbose 显示详细操作信息 ⭐⭐⭐
3.2.3 常见使用场景

🔹 修改文件所有者

bash 复制代码
# 修改单个文件的所有者
sudo chown alice file.txt

# 同时修改所有者和所属组
sudo chown alice:developers file.txt

# 只修改所属组
sudo chown :developers file.txt
# 或使用chgrp命令
sudo chgrp developers file.txt

🔹 递归修改所有权

bash 复制代码
# 递归修改目录及其内容的所有者和组
sudo chown -R webuser:www-data /var/www/html

# 有条件地递归修改
sudo chown -R --from=olduser:oldgroup newuser:newgroup /path

🧠 记忆口诀:「chown用户冒号组,-R递归一锅烩」
⚠️ 坑位预警

  1. 只有root用户或文件所有者可以更改文件所有权
  2. 修改大型目录时,-R选项可能导致性能问题
  3. 修改符号链接时,默认修改链接目标而非链接本身

3.3 chage:密码策略管理

🔍 核心功能:管理用户密码的生命周期,增强系统安全性

3.3.1 基本语法
bash 复制代码
chage [选项] 用户名
3.3.2 常用选项
选项 功能 实用指数
-l 显示用户的密码策略信息 ⭐⭐⭐⭐⭐
-d 日期 设置上次密码更改日期 ⭐⭐⭐
-E 日期 设置账户过期日期 ⭐⭐⭐⭐
-I 天数 设置密码过期后账户被锁定前的宽限天数 ⭐⭐⭐
-m 天数 设置密码更改之间的最小天数 ⭐⭐⭐
-M 天数 设置密码的最大有效天数 ⭐⭐⭐⭐⭐
-W 天数 设置密码过期前的警告天数 ⭐⭐⭐⭐
3.3.3 常见使用场景

🔹 查看密码策略

bash 复制代码
# 查看用户的密码策略
sudo chage -l username

输出示例:

yaml 复制代码
最近一次密码修改时间                    :8月 01, 2023
密码过期时间                            :从不
密码失效时间                            :从不
帐户过期时间                            :从不
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :99999
在密码过期之前警告的天数                :7

🔹 设置密码有效期

bash 复制代码
# 设置密码90天后过期,提前7天警告
sudo chage -M 90 -W 7 username

# 强制用户下次登录时修改密码
sudo chage -d 0 username

# 设置账户过期日期
sudo chage -E 2023-12-31 username

🔹 锁定过期账户

bash 复制代码
# 设置密码过期7天后锁定账户
sudo chage -I 7 username

# 立即使账户过期
sudo chage -E $(date +%Y-%m-%d) username

🧠 记忆口诀:「chage密码周期管,-M最长-m最短-W警告」
⚠️ 坑位预警

  1. 修改密码策略不会影响已登录的用户会话
  2. 设置-d 0强制修改密码时,用户必须有权限修改密码
  3. 日期格式必须是YYYY-MM-DD,否则可能导致意外结果

第四章:权限管理实战案例

4.1 案例一:构建安全的多用户开发环境

需求:创建一个共享开发环境,多个开发人员需要协作编辑代码,但各自的文件不应被其他人修改。

解决方案

  1. 创建开发组和用户:
bash 复制代码
# 创建开发组
sudo groupadd developers

# 创建开发用户
sudo useradd -m -G developers -s /bin/bash dev1
sudo useradd -m -G developers -s /bin/bash dev2
sudo useradd -m -G developers -s /bin/bash dev3

# 设置密码
sudo passwd dev1
sudo passwd dev2
sudo passwd dev3
  1. 创建共享目录结构:
bash 复制代码
# 创建项目目录
sudo mkdir -p /opt/project/{shared,dev1,dev2,dev3}

# 设置基础权限
sudo chown -R root:developers /opt/project
sudo chmod 2775 /opt/project  # 设置SGID

# 设置个人目录权限
sudo chown dev1:developers /opt/project/dev1
sudo chown dev2:developers /opt/project/dev2
sudo chown dev3:developers /opt/project/dev3
sudo chmod 0750 /opt/project/dev{1,2,3}

# 设置共享目录权限
sudo chown root:developers /opt/project/shared
sudo chmod 2775 /opt/project/shared
  1. 使用ACL设置精细权限:
bash 复制代码
# 允许所有开发者读取彼此的目录
sudo setfacl -m g:developers:r-x /opt/project/dev{1,2,3}

# 设置共享目录的默认ACL
sudo setfacl -dm g:developers:rwx /opt/project/shared
sudo setfacl -m g:developers:rwx /opt/project/shared
  1. 设置密码策略:
bash 复制代码
# 设置90天密码过期策略
sudo chage -M 90 -W 7 -I 14 dev{1,2,3}

4.2 案例二:Web服务器权限优化

需求:配置一个安全的Web服务器环境,允许开发人员更新网站内容,但保护配置文件。

解决方案

  1. 创建用户和组:
bash 复制代码
# 创建Web服务用户和组
sudo groupadd www-data
sudo useradd -r -s /sbin/nologin -g www-data www-data

# 创建开发者组和用户
sudo groupadd webdev
sudo useradd -m -G webdev -s /bin/bash webuser1
sudo passwd webuser1
  1. 设置Web目录权限:
bash 复制代码
# 创建Web目录结构
sudo mkdir -p /var/www/{html,logs,config}

# 设置基本权限
sudo chown -R www-data:www-data /var/www
sudo chmod -R 0750 /var/www

# 设置内容目录SGID和权限
sudo chown -R www-data:webdev /var/www/html
sudo chmod 2775 /var/www/html
sudo find /var/www/html -type d -exec chmod 2775 {} \;
sudo find /var/www/html -type f -exec chmod 0664 {} \;
  1. 使用ACL设置精细权限:
bash 复制代码
# 允许开发者访问日志但不能修改
sudo setfacl -m g:webdev:r-x /var/www/logs
sudo setfacl -m g:webdev:r-- /var/www/logs/*

# 保护配置目录
sudo setfacl -m g:webdev:--- /var/www/config
  1. 设置umask:
bash 复制代码
# 为webdev组用户设置适当的umask
echo "umask 0002" | sudo tee -a /home/webuser1/.bashrc

4.3 案例三:临时权限提升

需求:允许普通用户临时执行特定的管理任务,而不给予完全的sudo权限。

解决方案

  1. 创建自定义脚本:
bash 复制代码
# 创建脚本目录
sudo mkdir -p /usr/local/admin-scripts

# 创建重启服务的脚本
cat << 'EOF' | sudo tee /usr/local/admin-scripts/restart-web.sh
#!/bin/bash
# 重启Web服务的脚本
systemctl restart nginx
echo "Nginx服务已重启"
exit 0
EOF

# 设置权限
sudo chown root:root /usr/local/admin-scripts/restart-web.sh
sudo chmod 0755 /usr/local/admin-scripts/restart-web.sh
  1. 配置sudo特定权限:
bash 复制代码
# 编辑sudoers文件
sudo visudo -f /etc/sudoers.d/web-admins

# 添加以下内容
# 允许web-admin组用户无密码执行特定脚本
%web-admin ALL=(root) NOPASSWD: /usr/local/admin-scripts/restart-web.sh
  1. 创建用户组并添加用户:
bash 复制代码
# 创建管理组
sudo groupadd web-admin

# 将用户添加到组
sudo usermod -aG web-admin username
  1. 使用方法:
bash 复制代码
# 用户现在可以执行
sudo /usr/local/admin-scripts/restart-web.sh

第五章:Linux权限管理脑图

总结与最佳实践

权限管理黄金法则

  1. 最小权限原则:只给用户完成任务所需的最小权限
  2. 职责分离:使用组和ACL实现权限分离
  3. 定期审计 :使用find命令定期检查特殊权限文件
  4. 密码策略 :使用chage强制实施密码更新策略
  5. 文档化:记录所有权限设置,便于维护和审计

常见命令速查表

任务 命令 示例
创建用户 useradd sudo useradd -m -G sudo username
修改用户组 usermod sudo usermod -aG docker username
设置默认权限 umask umask 0027
设置精细权限 setfacl sudo setfacl -m u:user:rwx file
设置特殊权限 chmod sudo chmod 2775 /shared
修改所有者 chown sudo chown -R user:group /path
设置密码策略 chage sudo chage -M 90 -W 7 username

权限排错口诀

当遇到权限问题时,按以下顺序检查:

  1. 查看基本权限ls -l 检查文件/目录权限
  2. 检查所有者ls -l 查看所有者和组是否正确
  3. 检查ACLgetfacl 查看是否有ACL规则影响
  4. 检查父目录:目录需要有执行权限才能访问其内容
  5. 检查SELinuxgetenforce 查看SELinux是否阻止访问
  6. 检查特殊权限:查看是否需要SUID/SGID/Sticky Bit

🧠 记忆口诀:「权限排错六步走:基本权限看所有,ACL父目录加SELinux,特权位置最后求」


🐧 感谢阅读!如果这篇文章对你有帮助,请点赞收藏支持一下!

📝 作者: 做运维的阿瑞 🔗 更多精彩内容: 关注我获取更多 Linux 干货

相关推荐
虾..2 小时前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙3 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
hkhkhkhkh1234 小时前
Linux设备节点基础知识
linux·服务器·驱动开发
HZero.chen6 小时前
Linux字符串处理
linux·string
张童瑶6 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功1236 小时前
什么是SELinux
linux
石小千6 小时前
Linux安装OpenProject
linux·运维
柏木乃一6 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-30906 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
百年渔翁_肯肯7 小时前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix