一张脑图吃透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 干货

相关推荐
dessler1 天前
Hadoop HDFS-读写流程
linux·运维·hdfs
做运维的阿瑞2 天前
15 分钟图解 Linux 内核到发行版:运维选型不再纠结
linux
用户31187945592183 天前
Kylin Linux 10 安装 glib2-devel-2.62.5-7.ky10.x86_64.rpm 方法(附安装包)
linux
涛啊涛3 天前
Centos7非LVM根分区容量不足后扩容,对调硬盘挂载/
linux·磁盘管理
CYRUS_STUDIO4 天前
用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析
android·linux·逆向
熊猫李4 天前
rootfs-根文件系统详解
linux
dessler4 天前
Hadoop HDFS-高可用集群部署
linux·运维·hdfs
泽泽爱旅行4 天前
awk 语法解析-前端学习
linux·前端
轻松Ai享生活5 天前
5 节课深入学习Linux Cgroups
linux