十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

CentOS 7 用户管理全解析:从基础命令到安全实践 1. 项目概述用户管理的基石与核心价值在任何一个多用户的操作系统环境中用户管理都是最基础、最核心的系统管理任务之一。对于使用 CentOS 7 的运维工程师、系统管理员甚至是个人开发者而言熟练地掌握用户和用户组的增、删、改、查就如同厨师要熟悉自己的刀具一样是开展一切后续工作的前提。这个项目标题——“Centos7 添加删除用户和用户操作命令”——看似简单背后却涵盖了从系统安全、权限隔离到资源分配、审计追踪等一系列关键概念。我见过不少新手管理员一上来就喜欢用root账号“为所欲为”这其实埋下了巨大的安全隐患。一次误操作rm -rf或者一个配置不当的服务以root权限运行被攻破都可能导致灾难性的后果。因此建立清晰、规范的用户管理体系为不同的任务、不同的使用者创建独立的、权限最小化的账户是构建稳定、安全系统的第一道防线。本文将带你深入 CentOS 7 的用户管理世界不仅告诉你useradd和userdel怎么用更会拆解每个命令背后的参数含义、配置文件的作用以及在实际生产环境中如何规划用户、设置权限、排查登录问题。无论你是刚接触 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/bashusername登录名。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:reservedencrypted_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,lisigroup_name组名。x组密码占位符极少使用。GID组ID。user_list属于该组的用户列表附加组用逗号分隔。注意这里列出的用户其主组不一定是该组。/etc/gshadow组密码信息文件类似/etc/shadow。2.3 用户生命周期与规划策略在实际运维中用户管理不是一次性的操作而是一个覆盖“创建 - 配置 - 维护 - 注销”全生命周期的过程。一个良好的规划策略至关重要命名规范制定统一的用户名命名规则如使用姓名全拼zhangsan、工号、或“部门-姓名缩写”dev-zs。避免使用易混淆的字符如l和1,O和0。UID/GID 规划为不同类别的用户预留 UID 范围。例如系统用户1-999本地普通用户1000-60000这符合系统默认配置。对于需要跨服务器同步用户的环境如 NIS、LDAP规划一致的 UID/GID 尤为重要。主目录规划默认家目录在/home/username。对于有特殊存储需求的用户如数据库管理员、FTP用户可以指定到其他位置如/var/www/username或/data/username。默认 Shell对于只需要运行特定服务、无需交互登录的“系统用户”或“服务账户”应将其 shell 设置为/sbin/nologin或/bin/false以增强安全性。权限模型优先使用用户组来管理权限。创建功能组如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.defs中CREATE_HOME设置为no也会创建。在 CentOS 7 中默认行为是创建家目录所以此参数常被省略但明确写出是好习惯。-M不创建家目录。适用于创建系统用户或不需要家目录的场景。-r创建系统用户。系统用户的 UID 会在一个特定范围内通常 1-999且默认不创建家目录 (-M)。用于运行系统服务如apache,mysql。实操示例与对比# 示例1创建一个最普通的用户 wangwu使用所有默认值。 sudo useradd wangwu # 查看结果 id wangwu # 输出uid1001(wangwu) gid1001(wangwu) groups1001(wangwu) # 系统创建了用户 wangwu主组也是 wangwu家目录 /home/wangwushell 是 /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 # 输出uid2001(ops01) gid10(wheel) groups10(wheel),981(docker),1002(sshuser) # 注意wheel, docker, sshuser 组必须已存在。 # 示例3创建一个系统用户 nginx用于运行 Nginx 服务不创建家目录。 sudo useradd -r -s /sbin/nologin nginx id nginx # 输出uid997(nginx) gid995(nginx) groups995(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 密码管理passwd与chage创建用户后必须设置密码。passwd命令不仅用于设置密码还能管理密码策略。passwd命令sudo passwd usernameroot 为用户设置新密码无需原密码。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 john4. 用户组管理命令精讲用户组是权限管理的枢纽。管理组通常使用groupadd,groupdel,groupmod命令逻辑与用户管理类似但更简单。groupadd创建组-g GID指定自定义 GID。-r创建系统组GID 在系统范围内。sudo groupadd -g 2000 developers sudo groupadd -r mysqldgroupdel删除组只能删除不是任何用户主组的组。如果组是某个用户的主组需要先修改该用户的主组或删除该用户。sudo groupdel developersgroupmod修改组-g 新GID修改组ID。-n 新组名修改组名。sudo groupmod -n devteam developers查看组信息getent group 组名查看特定组信息。groups 用户名查看用户属于哪些组。id -Gn 用户名以空格分隔列出用户所在的所有组名。5. 高级操作与组合技巧5.1 批量用户操作当需要创建或修改大量用户时手动操作效率低下且易错。我们可以利用 Shell 脚本或newusers、chpasswd命令进行批量处理。使用newusers命令批量创建newusers命令可以读取一个格式与/etc/passwd相同的文件来批量创建用户。创建一个文本文件user_list.txtuser1:x:1001:1001:User One:/home/user1:/bin/bash user2:x:1002:1002:User Two:/home/user2:/bin/bash注意密码字段是x创建后用户没有有效密码需要用chpasswd单独设置。执行批量创建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 检查用户登录与进程作为管理员经常需要知道谁登录了系统以及某个用户在运行什么进程。who或w查看当前登录系统的用户及其来源、登录时间、正在执行的命令。last或lastlog查看历史登录记录或所有用户最后一次登录时间。ps -u username或pgrep -u username查看属于特定用户的进程。pkill -u username终止属于特定用户的所有进程操作前务必确认。6. 常见问题排查与安全实践6.1 用户无法登录这是最常见的问题之一排查思路如下账户是否存在且未锁定id username # 检查用户是否存在 sudo passwd -S username # 检查密码状态是否锁定(L) sudo grep username /etc/shadow # 查看shadow文件密码字段开头是否有!或*Shell 是否正确检查/etc/passwd中用户的 shell 字段。如果是/sbin/nologin或/bin/false则禁止交互登录。家目录是否存在且权限正确家目录应存在且用户对其有读写权限。检查/home/username的权限应为drwx------或drwxr-xr-x属主对应用户。是否在允许登录的范围内检查/etc/security/access.conf或 PAM 配置如/etc/pam.d/login看是否有访问控制列表限制了该用户。磁盘空间是否已满使用df -h检查家目录所在分区的使用情况。如果磁盘满了用户登录后可能无法写入配置文件而失败。6.2 用户没有某个命令或文件的权限通常是因为用户不在拥有该权限的组里。检查文件/目录的权限ls -l /path/to/file检查文件的属组ls -l /path/to/file | awk ‘{print $4}’检查用户所在组id username如果文件属组是developers而用户不在该组则需要将其加入sudo usermod -aG developers username。用户需要重新登录才能使新的组生效因为组信息在登录时加载到会话中。6.3 安全最佳实践最小权限原则永远不要给用户超出其工作所需的权限。能用普通用户完成的任务绝不用root。使用sudo代替共享root为需要特权的用户配置sudo权限而不是告知他们root密码。通过/etc/sudoers文件使用visudo编辑精细控制每个用户可以执行的命令。强密码策略通过/etc/security/pwquality.conf或/etc/pam.d/system-auth配置密码复杂度要求最小长度、字符种类等。定期用chage强制更换密码。禁用无用账户对于离职员工或临时账户第一时间锁定或删除。对于系统服务账户确保其 shell 为/sbin/nologin。审计与监控定期检查/var/log/secure日志关注认证失败、sudo提权等安全事件。使用last、lastb记录失败登录查看登录历史。家目录权限确保用户家目录权限为700(drwx------)防止其他用户窥探私密文件。可以在/etc/login.defs中设置UMASK 077来使新创建的家目录默认拥有此权限。用户管理是系统管理的日常但日常不等于简单。每一个参数的选择每一个命令的执行都关系到系统的安全基线。从创建一个权限恰当的账户开始是构建稳健服务器环境的第一步。把这些命令和原理内化为肌肉记忆你就能在复杂的运维场景中从容应对。
返回列表