三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

CentOS 7 用户管理全解析:从基础命令到安全实践

CentOS 7 用户管理全解析:从基础命令到安全实践

1. 项目概述:用户管理的基石与核心价值

在任何一个多用户的操作系统环境中,用户管理都是最基础、最核心的系统管理任务之一。对于使用 CentOS 7 的运维工程师、系统管理员,甚至是个人开发者而言,熟练地掌握用户和用户组的增、删、改、查,就如同厨师要熟悉自己的刀具一样,是开展一切后续工作的前提。这个项目标题——“Centos7 添加删除用户和用户操作命令”——看似简单,背后却涵盖了从系统安全、权限隔离到资源分配、审计追踪等一系列关键概念。

我见过不少新手管理员,一上来就喜欢用root账号“为所欲为”,这其实埋下了巨大的安全隐患。一次误操作rm -rf,或者一个配置不当的服务以root权限运行被攻破,都可能导致灾难性的后果。因此,建立清晰、规范的用户管理体系,为不同的任务、不同的使用者创建独立的、权限最小化的账户,是构建稳定、安全系统的第一道防线。本文将带你深入 CentOS 7 的用户管理世界,不仅告诉你useradduserdel怎么用,更会拆解每个命令背后的参数含义、配置文件的作用,以及在实际生产环境中,如何规划用户、设置权限、排查登录问题。无论你是刚接触 Linux 的新手,还是需要梳理知识体系的老手,这些内容都将是你工具箱里最常用、也最不该出错的“螺丝刀”。

2. 用户管理核心思路与设计哲学

2.1 理解 Linux 用户与用户组模型

在动手敲命令之前,我们必须先理解 Linux 设计用户管理的底层逻辑。Linux 是一个真正的多用户、多任务操作系统,其权限控制的核心是“用户(User)”“用户组(Group)”。每个文件、目录、进程都归属于一个特定的用户和用户组,系统通过比对访问者(用户)与资源所有者(用户/组)的关系,来决定是否允许其执行读(r)、写(w)、执行(x)操作。

用户(UID):每个用户都有一个唯一的数字标识符,称为 UID。root用户的 UID 是 0,这是系统中最特殊、权限最高的用户。普通用户的 UID 通常从 1000 开始(在 CentOS 7/RHEL 7 及以后版本中),由系统自动分配或管理员指定。

用户组(GID):为了便于权限管理,用户可以被加入到一个或多个用户组中。每个组也有一个唯一的数字标识符 GID。一个用户有一个“主组(Primary Group)”,在创建文件时,文件的默认属组就是用户的主组。同时,用户还可以属于多个“附加组(Supplementary Group)”,从而获得这些组所拥有的权限。

这种设计的精妙之处在于“权限继承与共享”。例如,你可以创建一个名为developers的组,将所有开发人员加入该组,然后设置某个项目目录的属组为developers并赋予写权限。这样,所有开发人员都能在该目录下协作,而无需为每个人单独设置权限,也避免了使用root或过于宽松的权限(如 777)。

2.2 关键配置文件解析

用户和组的信息并非凭空存在,而是记录在几个关键的文本配置文件中。理解这些文件,是进行高级管理和故障排查的基础。

/etc/passwd:用户账户信息数据库。每一行代表一个用户,由冒号:分隔为7个字段。

username:x:UID:GID:GECOS:home_directory:login_shell

例如:zhangsan:x:1001:1001:Zhang San:/home/zhangsan:/bin/bash

  • username:登录名。
  • x:历史上这里存放加密后的密码,现在密码已移至/etc/shadow,这里用x占位。
  • UID:用户ID。
  • GID:主组ID。
  • GECOS:用户全名或描述信息,可选。
  • home_directory:用户的家目录路径。
  • login_shell:用户登录后默认启动的shell,如/bin/bash(可登录)、/sbin/nologin(禁止登录)。

注意:直接编辑/etc/passwd文件是危险的,可能导致系统无法登录。务必使用vipw命令(它会在保存时进行语法检查)或标准的用户管理命令。

/etc/shadow:用户密码及有效期信息。权限为---------(000),只有root可读。每一行对应/etc/passwd中的一个用户。

username:encrypted_password:last_change:min:max:warn:inactive:expire:reserved
  • encrypted_password:加密后的密码。如果为!!*,表示账户被锁定或未设置密码。
  • last_change:上次修改密码的天数(从1970年1月1日算起)。
  • min/max:密码最短/最长使用天数。
  • warn:密码过期前多少天开始警告用户。
  • inactive:密码过期后,账户被彻底禁用前的宽限天数。
  • expire:账户绝对过期日期(自1970年1月1日的天数),过后账户将无法登录。

/etc/group:用户组信息数据库。

group_name:x:GID:user_list

例如:developers:x:1002:zhangsan,lisi

  • group_name:组名。
  • x:组密码占位符(极少使用)。
  • GID:组ID。
  • user_list:属于该组的用户列表(附加组),用逗号分隔。注意,这里列出的用户,其主组不一定是该组。

/etc/gshadow:组密码信息文件,类似/etc/shadow

2.3 用户生命周期与规划策略

在实际运维中,用户管理不是一次性的操作,而是一个覆盖“创建 -> 配置 -> 维护 -> 注销”全生命周期的过程。一个良好的规划策略至关重要:

  1. 命名规范:制定统一的用户名命名规则,如使用姓名全拼(zhangsan)、工号、或“部门-姓名缩写”(dev-zs)。避免使用易混淆的字符(如l1,O0)。
  2. UID/GID 规划:为不同类别的用户预留 UID 范围。例如:系统用户(1-999),本地普通用户(1000-60000),这符合系统默认配置。对于需要跨服务器同步用户的环境(如 NIS、LDAP),规划一致的 UID/GID 尤为重要。
  3. 主目录规划:默认家目录在/home/username。对于有特殊存储需求的用户(如数据库管理员、FTP用户),可以指定到其他位置,如/var/www/username/data/username
  4. 默认 Shell:对于只需要运行特定服务、无需交互登录的“系统用户”或“服务账户”,应将其 shell 设置为/sbin/nologin/bin/false,以增强安全性。
  5. 权限模型:优先使用用户组来管理权限。创建功能组(如webadmin,dba,backup),将用户加入相应组,然后通过设置目录的组权限来实现访问控制。

3. 核心命令详解与实操要点

3.1 用户添加:useradd命令的深度使用

useradd是创建新用户的主要工具。它的默认行为由/etc/default/useradd/etc/login.defs文件定义。但依赖默认值往往不符合生产需求,我们必须掌握其关键参数。

基本语法useradd [选项] 用户名

常用选项解析

  • -u UID:手动指定用户的 UID。必须确保唯一性,可通过cat /etc/passwd | cut -d: -f3 | sort -n查看已使用的 UID。
  • -g GID/组名:指定用户的主组。可以给 GID 或组名。如果指定的组不存在,命令会失败。不指定时,系统会创建一个与用户名同名的新组作为其主组
  • -G 组名1,组名2,...:指定用户的附加组列表。用户将同时拥有这些组的权限。
  • -d 目录路径:指定用户的家目录。目录通常应事先不存在useradd会创建它并从/etc/skel复制初始文件。
  • -s Shell路径:指定用户的登录 Shell。如/bin/bash,/bin/zsh,/sbin/nologin
  • -c “注释信息”:为用户添加一段描述,通常填写全名或部门职位。这会记录在/etc/passwd的 GECOS 字段。
  • -m:强制创建家目录。即使/etc/login.defsCREATE_HOME设置为no,也会创建。在 CentOS 7 中,默认行为是创建家目录,所以此参数常被省略,但明确写出是好习惯
  • -M创建家目录。适用于创建系统用户或不需要家目录的场景。
  • -r:创建系统用户。系统用户的 UID 会在一个特定范围内(通常 1-999),且默认不创建家目录 (-M)。用于运行系统服务,如apache,mysql

实操示例与对比

# 示例1:创建一个最普通的用户 wangwu,使用所有默认值。 sudo useradd wangwu # 查看结果 id wangwu # 输出:uid=1001(wangwu) gid=1001(wangwu) groups=1001(wangwu) # 系统创建了用户 wangwu,主组也是 wangwu,家目录 /home/wangwu,shell 是 /bin/bash。 # 示例2:创建一个运维用户 ops01,指定 UID 为 2001,主组为 wheel(管理员组),附加组为 docker, sshuser,并添加全名注释。 sudo useradd -u 2001 -g wheel -G docker,sshuser -c “Operations Staff 01” -m ops01 # 查看结果 id ops01 # 输出:uid=2001(ops01) gid=10(wheel) groups=10(wheel),981(docker),1002(sshuser) # 注意:wheel, docker, sshuser 组必须已存在。 # 示例3:创建一个系统用户 nginx,用于运行 Nginx 服务,不创建家目录。 sudo useradd -r -s /sbin/nologin nginx id nginx # 输出:uid=997(nginx) gid=995(nginx) groups=995(nginx) # UID/GID 在系统用户范围内,shell 为 /sbin/nologin,无法交互登录。

实操心得:创建用户后,立即用id [用户名]命令验证。这个命令会清晰显示 UID、GID、主组和所有附加组,是检查用户属性是否按预期设置的最快方法。很多权限问题都源于用户没有加入正确的附加组。

3.2 用户删除:userdel命令的风险控制

删除用户比创建用户风险更高,因为涉及到用户文件的处理。userdel命令默认是“保守”的。

基本语法userdel [选项] 用户名

常用选项

  • -r删除用户的同时,一并删除其家目录和邮件池(/var/spool/mail/username。这是最常用的选项,用于彻底清理用户。
  • -f:强制删除。即使用户当前已登录,也强制删除。此选项非常危险,可能导致已登录用户的数据丢失或进程异常,仅在极端情况下使用

实操示例与警告

# 示例1:安全删除用户 wangwu 及其所有数据。 # 首先,确保用户已退出登录,并且没有正在运行的进程。 sudo pkill -u wangwu # 终止用户所有进程(谨慎操作,确认业务已停止) sudo userdel -r wangwu # 示例2:仅删除用户账户,保留其家目录和文件。 sudo userdel wangwu # 执行后,/home/wangwu 目录及其文件仍然存在,但属主和属组会变为原用户的 UID/GID 数字。 # 此时,该目录变成了一个“无主”的目录,需要管理员后续处理。

重要警告:在生产环境中,执行userdel -r前,务必进行备份。一个良好的习惯是,先将用户的家目录打包归档,再执行删除。你可以写一个简单的脚本:

BACKUP_DIR="/backup/deleted_users" sudo tar -czf “$BACKUP_DIR/$(date +%Y%m%d)_wangwu_home.tar.gz” /home/wangwu sudo userdel -r wangwu

永远不要假设目录里没有重要数据。

3.3 用户属性修改:usermod命令的灵活运用

用户创建后,其属性可能需要变更,如修改主组、添加附加组、更改家目录、锁定账户等。usermod命令就是用于此目的。

基本语法usermod [选项] 用户名

常用选项解析

  • -g GID/组名:修改用户的主组。
  • -G 组名1,组名2,...覆盖式地修改用户的附加组列表。这意味着原有的附加组会被新的列表替换。如果只想添加一个组而不影响其他,需要结合-a选项。
  • -aG 组名(最常用组合)将用户追加(Append)到一个或多个附加组中,而不移除原有的其他附加组。忘记-a是导致用户意外丢失权限的最常见原因!
  • -d 新家目录路径:修改用户的家目录路径。此选项不会自动移动或创建新目录,需要配合-m选项。
  • -m:与-d一起使用,将旧家目录的内容移动到新的家目录。如果新目录不存在,则创建。
  • -s Shell路径:修改用户的登录 Shell。
  • -l 新用户名:修改用户的登录名。这不会自动重命名其家目录,需要手动处理。
  • -L:锁定用户账户。在/etc/shadow文件的密码字段前添加!,使密码失效。
  • -U:解锁用户账户。

实操示例

# 示例1:将用户 zhangsan 加入到 docker 组(附加组)。 sudo usermod -aG docker zhangsan # 验证 id zhangsan # 输出中应包含 docker 组。 # 示例2:修改用户 lisi 的家目录从 /home/lisi 到 /data/lisi,并移动文件。 sudo mkdir -p /data # 确保父目录存在 sudo usermod -d /data/lisi -m lisi # 操作后,原 /home/lisi 的内容会移动到 /data/lisi。 # 示例3:锁定和解锁用户账户。 sudo usermod -L zhangsan # 锁定 sudo passwd -S zhangsan # 查看状态,会显示 “Password locked.” sudo usermod -U zhangsan # 解锁

3.4 密码管理:passwdchage

创建用户后,必须设置密码。passwd命令不仅用于设置密码,还能管理密码策略。

passwd命令

  • sudo passwd username:root 为用户设置新密码(无需原密码)。
  • passwd:普通用户修改自己的密码(需要输入原密码)。
  • -l username:锁定用户密码(同usermod -L)。
  • -u username:解锁用户密码(同usermod -U)。
  • -S username:显示账户密码状态(是否锁定、密码过期时间等)。
  • -e:使用户密码立即过期,强制用户下次登录时修改密码。常用于新用户初始化或安全事件后
  • -d username:删除用户密码,使其可以无密码登录(极度危险,仅用于特定自动化场景,生产环境禁用)。

chage命令:更精细地管理密码过期策略,直接操作/etc/shadow文件。

  • chage -l username:列出用户的所有密码和账户过期信息。
  • chage -M 天数 username:设置密码最长有效天数。
  • chage -m 天数 username:设置密码最短有效天数(期间不能修改)。
  • chage -W 天数 username:设置密码过期前多少天开始警告。
  • chage -I 天数 username:设置密码过期后,账户被禁用的宽限天数。
  • chage -E YYYY-MM-DD username:设置账户的绝对过期日期。
  • chage -d 0 username:强制用户下次登录时必须更改密码(同passwd -e)。

实操示例:为新员工设置账户

# 创建用户 sudo useradd -m -c “New Employee John” john # 设置初始密码 sudo passwd john # 输入两次强密码... # 强制他第一次登录时修改密码 sudo chage -d 0 john # 或使用 sudo passwd -e john # 查看他的密码策略 sudo chage -l john

4. 用户组管理命令精讲

用户组是权限管理的枢纽。管理组通常使用groupadd,groupdel,groupmod命令,逻辑与用户管理类似,但更简单。

groupadd创建组

  • -g GID:指定自定义 GID。
  • -r:创建系统组(GID 在系统范围内)。
sudo groupadd -g 2000 developers sudo groupadd -r mysqld

groupdel删除组

  • 只能删除不是任何用户主组的组。如果组是某个用户的主组,需要先修改该用户的主组或删除该用户。
sudo groupdel developers

groupmod修改组

  • -g 新GID:修改组ID。
  • -n 新组名:修改组名。
sudo groupmod -n devteam developers

查看组信息

  • getent group 组名:查看特定组信息。
  • groups 用户名:查看用户属于哪些组。
  • id -Gn 用户名:以空格分隔列出用户所在的所有组名。

5. 高级操作与组合技巧

5.1 批量用户操作

当需要创建或修改大量用户时,手动操作效率低下且易错。我们可以利用 Shell 脚本或newuserschpasswd命令进行批量处理。

使用newusers命令批量创建newusers命令可以读取一个格式与/etc/passwd相同的文件来批量创建用户。

  1. 创建一个文本文件user_list.txt
    user1:x:1001:1001:User One:/home/user1:/bin/bash user2:x:1002:1002:User Two:/home/user2:/bin/bash
    注意:密码字段是x,创建后用户没有有效密码,需要用chpasswd单独设置。
  2. 执行批量创建:
    sudo newusers user_list.txt

使用chpasswd命令批量设置密码chpasswd从标准输入读取用户名:密码对来批量修改密码。

# 方法1:使用 Here Document sudo chpasswd << EOF user1:MySecurePass123! user2:AnotherSecurePass456! EOF # 方法2:从文件读取 echo -e “user1:MySecurePass123!\nuser2:AnotherSecurePass456!” | sudo chpasswd

安全警告:密码在命令历史或脚本中是明文!在生产环境中,应使用其他更安全的方式初始化密码,如让用户首次登录时通过passwd -e强制修改,或使用随机密码并通过安全渠道发送。

5.2 用户环境与初始文件/etc/skel

当使用-m选项创建用户时,系统会将/etc/skel目录下的所有文件(包括隐藏文件)复制到新用户的家目录中。这是定制新用户默认环境的绝佳位置。

  • 你可以将公司的.bashrc别名、.vimrc配置、.ssh/authorized_keys公钥(需谨慎)或标准的.profile文件放在这里。
  • 修改/etc/skel只影响之后创建的用户,对已存在的用户无效。

5.3 检查用户登录与进程

作为管理员,经常需要知道谁登录了系统,以及某个用户在运行什么进程。

  • whow:查看当前登录系统的用户及其来源、登录时间、正在执行的命令。
  • lastlastlog:查看历史登录记录或所有用户最后一次登录时间。
  • ps -u usernamepgrep -u username:查看属于特定用户的进程。
  • pkill -u username:终止属于特定用户的所有进程(操作前务必确认)。

6. 常见问题排查与安全实践

6.1 用户无法登录

这是最常见的问题之一,排查思路如下:

  1. 账户是否存在且未锁定?
    id username # 检查用户是否存在 sudo passwd -S username # 检查密码状态,是否锁定(L) sudo grep username /etc/shadow # 查看shadow文件,密码字段开头是否有`!`或`*`
  2. Shell 是否正确?检查/etc/passwd中用户的 shell 字段。如果是/sbin/nologin/bin/false,则禁止交互登录。
  3. 家目录是否存在且权限正确?家目录应存在且用户对其有读写权限。检查/home/username的权限(应为drwx------drwxr-xr-x,属主对应用户)。
  4. 是否在允许登录的范围内?检查/etc/security/access.conf或 PAM 配置(如/etc/pam.d/login),看是否有访问控制列表限制了该用户。
  5. 磁盘空间是否已满?使用df -h检查家目录所在分区的使用情况。如果磁盘满了,用户登录后可能无法写入配置文件而失败。

6.2 用户没有某个命令或文件的权限

通常是因为用户不在拥有该权限的组里。

  1. 检查文件/目录的权限:ls -l /path/to/file
  2. 检查文件的属组:ls -l /path/to/file | awk ‘{print $4}’
  3. 检查用户所在组:id username
  4. 如果文件属组是developers,而用户不在该组,则需要将其加入:sudo usermod -aG developers username用户需要重新登录才能使新的组生效(因为组信息在登录时加载到会话中)。

6.3 安全最佳实践

  1. 最小权限原则:永远不要给用户超出其工作所需的权限。能用普通用户完成的任务,绝不用root
  2. 使用sudo代替共享root:为需要特权的用户配置sudo权限,而不是告知他们root密码。通过/etc/sudoers文件(使用visudo编辑)精细控制每个用户可以执行的命令。
  3. 强密码策略:通过/etc/security/pwquality.conf/etc/pam.d/system-auth配置密码复杂度要求(最小长度、字符种类等)。定期用chage强制更换密码。
  4. 禁用无用账户:对于离职员工或临时账户,第一时间锁定或删除。对于系统服务账户,确保其 shell 为/sbin/nologin
  5. 审计与监控:定期检查/var/log/secure日志,关注认证失败、sudo提权等安全事件。使用lastlastb(记录失败登录)查看登录历史。
  6. 家目录权限:确保用户家目录权限为700(drwx------),防止其他用户窥探私密文件。可以在/etc/login.defs中设置UMASK 077来使新创建的家目录默认拥有此权限。

用户管理是系统管理的日常,但日常不等于简单。每一个参数的选择,每一个命令的执行,都关系到系统的安全基线。从创建一个权限恰当的账户开始,是构建稳健服务器环境的第一步。把这些命令和原理内化为肌肉记忆,你就能在复杂的运维场景中从容应对。

← 返回列表