[Linux服务器] Linux 用户 + 提权完整实操(CentOS7)

68 0
Honkers 3 小时前 来自手机 | 显示全部楼层 |阅读模式

引言

账号管理与权限管控是服务器安全的第一道防线,不少人日常运维习惯直接 su 切换 root,存在密码泄露、环境变量错乱等安全隐患。本篇基于 CentOS7 实操,覆盖用户 / 组增删改查、密码过期配置、sudo 精细化授权,附带登录报错排错案例,清晰区分 su 登录 shell 与 sudo 临时提权的差异,整理生产环境可用的权限操作规范。

Linux 用户和组管理

用户和组介绍

用户介绍

用户帐户是系统安全的基础。 系统上的每个进程(运行程序)都以特定用户身份运行。 每个文件都有一个特定用户作为其所有者。 文件所有权有助于系统对文件用户实施访问控制。正在运行的进程关联的用户确定该进程可访问的文件和目录。用户使用username标识并使其更易于使用。在内部,系统通过分配给它们的唯一标识号,用户ID或UID来区分用户帐户。 如果用户使用用户帐户,则通常会为其分配一个密码,用户在登录时将使用该密码来证明他们是实际的授权用户。

用户帐户主要有三种类型:

  • superuser:用于管理系统,用户名称为root,UID为0,对系统具有完全访问权限。
  • system users:系统具有系统用户帐户,由提供支持服务的进程使用。 这些进程或守护进程通常不需要以超级用户身份运行。 它们是非特权帐户,用户保护自己文件和其他资源。系统用户帐户不用于交互方式登录系统。
  • regular users:大多数用户拥有常规用户帐户,用于日常工作。

passwd 文件

/etc/passwd 文件保存操作系统登录用户信息。每行包含一个登录用户信息,以冒号分隔七个域。

格式:

  1. name:password:UID:GID:GECOS:directory:shell
复制代码

示例:

  1. [root@centos7 ~ 16:03:08]# grep yy /etc/passwd
  2. yy:x:1000:1000:yy:/home/yy:/bin/bash
复制代码

解释如下:

  • name:用户登录名
  • password:用户密码,以x表示
  • UID:用户ID
  • GID:用户主组ID
  • GECOS:用户描述信息,通常为用户的真实姓名
  • directory:用户主目录,启动shell时的工作目录,默认位于/home/username
  • shell:用户打开终端时运行的程序,默认是shell。

对于system user,它的shell是/sbin/nologin。

示例:

  1. [yy@centos7 ~ 16:48:32]$ grep postfix /etc/passwd
  2. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
复制代码

group 文件

**组是用户的集合,组中用户继承组权限。**与用户一样,组具有组名称以使其更易于使用。系统通过分配给它们的唯一标识号,组ID或GID来区分组。

/etc/group 文件保存操作系统组信息。每行包含一个组信息,以冒号分隔4个域。格式:

  1. group_name:password:GID:user_list
复制代码

示例:

  1. [yy@centos7 ~ 16:48:50]$ grep wheel /etc/group
  2. wheel:x:10:
复制代码

解释如下:

  • group_name:组名称
  • password:组密码,用x表示
  • GID:组ID,唯一表示组
  • user_list:作为补充的成员

组的类型

  • 主要组:每个用户只有一个主要组,/etc/passwd 文件中的GID编号定义。 默认情况下,**用户创建的新文件组所有者为用户的主要组。**通常,在创建新的常规用户时,会创建一个与该用户同名的新组。该组用作新用户的主要组,该用户是此用户专用组的唯一成员,有助于简化文件权限管理。
  • 补充组:用户还可以拥有补充组。 补充组的成员资格由/etc/group文件确定。 根据用户的任何组是否具有访问权限,授予用户访问权限的权限。例如,如果用户user01具有主要组user01和补充组wheel和webadmin,则该用户可以读取这三个组中任何一个组可读的文件。
  1. # 查看用户信息
  2. [yy@centos7 ~ 16:49:19]$ id
  3. uid=1000(yy) gid=1000(yy) groups=1000(yy) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  4. # 查看用户 uid
  5. [yy@centos7 ~ 16:49:42]$ id -u yy
  6. 1000
复制代码

练习

  1. 哪一项表示在最基本的层面上标识用户的编号? a. 主要用户 b. UID c. GID d. 用户名
  2. 哪一项表示提供用户命令行提示符的程序? a. 主 shell b. 主目录 c. 登录 shell d. 命令名称
  3. 哪一项目或文件表示本地组信息的位置? a. 主目录 b. /etc/passwd c. /etc/GID d. /etc/group
  4. 哪一项目或文件表示用户个人文件的位置? a. 主目录 b. 登录 shell c. /etc/passwd d. /etc/group
  5. 哪一项表示在最基本的层面上标识组的编号? a. 主要组 b. UID c. GID d. groupid
  6. 哪一项目或文件表示本地用户帐户信息的位置? a. 主目录 b. /etc/passwd c. /etc/UID d. /etc/group
  7. /etc/passwd 文件的第四个字段是什么? a. 主目录 b. UID c. 登录 shell d. 主要组

本地用户管理

whoami 命令

查看当前终端中登录的用户。

  1. [root@centos7 ~ 16:50:41]# whoami
  2. root
复制代码

who 和 w 命令

查看当前系统中所有终端上登录的用户,以及用户登录的时间。

  1. [yy@centos7 ~ 16:49:48]$ who
  2. yy :0 2026-07-17 13:31 (:0)
  3. yy pts/0 2026-07-17 16:48 (10.1.8.1)
  4. yy pts/1 2026-07-17 16:50 (10.1.8.1)
  5. [yy@centos7 ~ 16:50:59]$ w
  6. 16:51:02 up 5:09, 3 users, load average: 0.00, 0.01, 0.05
  7. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  8. yy :0 :0 13:31 ?xdm? 1:54 0.17s /usr/libexec/gnome-session-binary --session gnome-cla
  9. yy pts/0 10.1.8.1 16:48 6.00s 0.05s 0.00s w
  10. yy pts/1 10.1.8.1 16:50 22.00s 0.06s 0.18s sshd: yy [priv]
复制代码

users 命令

查看当前系统中所有终端上登录的用户名。

  1. [root@centos7 ~ 16:50:46]# users
  2. yy yy yy
复制代码

useradd 命令

作用:创建用户

  1. # 用户1
  2. [root@centos7 ~ 16:51:25]# useradd user01
  3. [root@centos7 ~ 16:52:11]# grep user01 /etc/passwd
  4. user01:x:1001:1001::/home/user01:/bin/bash
  5. # 用户2
  6. [root@centos7 ~ 16:52:24]# useradd -u 8888 -d /opt/user02 -c "user for software manage" -g wheel -s /sbin/nologin user02
  7. # -u uid
  8. # -d 用户的家目录
  9. # -c 描述信息
  10. # -g 用户的主组
  11. # -s 用户shell程序
  12. [root@centos7 ~ 16:53:11]# grep user02 /etc/passwd
  13. user02:x:8888:10:user for software manage:/opt/user02:/sbin/nologin
  14. [root@centos7 ~ 16:53:30]# ls -d /opt/user02
  15. /opt/user02
  16. # 创建一个没有密码的账户,该用户在图形化界面中可以直接登录
  17. [root@centos7 ~ 16:53:41]# useradd -p '' tom
复制代码

新用户家目录中的文件来源于 /etc/skel/ 目录。

  1. [root@centos7 ~ 16:54:21]# ls -a ~tom
  2. . .. .bash_logout .bash_profile .bashrc .mozilla
  3. [root@centos7 ~ 16:54:59]# ls -a /etc/skel/
  4. . .. .bash_logout .bash_profile .bashrc .mozilla
复制代码

创建用户的时候,用户属性默认参数配置在 /etc/login.defs 文件。

  1. [root@centos7 ~ 16:55:10]# vim /etc/login.defs
  2. #
  3. # Please note that the parameters in this configuration file control the
  4. # behavior of the tools from the shadow-utils component. None of these
  5. # tools uses the PAM mechanism, and the utilities that use PAM (such as the
  6. # passwd command) should therefore be configured elsewhere. Refer to
  7. # /etc/pam.d/system-auth for more information.
  8. #
  9. # *REQUIRED*
  10. # Directory where mailboxes reside, _or_ name of file, relative to the
  11. # home directory. If you _do_ define both, MAIL_DIR takes precedence.
  12. # QMAIL_DIR is for Qmail
  13. #
  14. #QMAIL_DIR Maildir
  15. MAIL_DIR /var/spool/mail
  16. #MAIL_FILE .mail
  17. # Password aging controls:
  18. #
  19. # PASS_MAX_DAYS Maximum number of days a password may be used.
  20. # PASS_MIN_DAYS Minimum number of days allowed between password changes.
  21. # PASS_MIN_LEN Minimum acceptable password length.
  22. # PASS_WARN_AGE Number of days warning given before a password expires.
  23. #
  24. PASS_MAX_DAYS 99999
  25. PASS_MIN_DAYS 0
  26. PASS_MIN_LEN 5
  27. PASS_WARN_AGE 7
  28. #
  29. # Min/max values for automatic uid selection in useradd
  30. #
  31. UID_MIN 1000
  32. UID_MAX 60000
  33. # System accounts
  34. SYS_UID_MIN 201
  35. SYS_UID_MAX 999
  36. #
  37. # Min/max values for automatic gid selection in groupadd
  38. #
  39. GID_MIN 1000
  40. GID_MAX 60000
  41. # System accounts
  42. SYS_GID_MIN 201
  43. SYS_GID_MAX 999
  44. #
  45. # If defined, this command is run when removing a user.
  46. # It should remove any at/cron/print jobs etc. owned by
  47. # the user to be removed (passed as the first argument).
  48. #
  49. #USERDEL_CMD /usr/sbin/userdel_local
  50. #
  51. # If useradd should create home directories for users by default
  52. # On RH systems, we do. This option is overridden with the -m flag on
  53. # useradd command line.
  54. #
  55. CREATE_HOME yes
  56. # The permission mask is initialized to this value. If not specified,
  57. # the permission mask will be initialized to 022.
  58. UMASK 077
  59. # This enables userdel to remove user groups if no members exist.
  60. #
  61. USERGROUPS_ENAB yes
  62. # Use SHA512 to encrypt password.
  63. ENCRYPT_METHOD SHA512
复制代码

usermod 命令

作用:修改用户属性。

  1. [root@centos7 ~ 16:57:05]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash
  2. # -m 移动家目录到新的位置
  3. [root@centos7 ~ 16:57:32]# grep user02 /etc/passwd
  4. user02:x:1008:10:user for software manage:/home/user02:/bin/bash
  5. [root@centos7 ~ 16:57:40]# ls -d /home/user02/
  6. /home/user02/
  7. [root@centos7 ~ 16:57:45]# su - user02
  8. [user02@centos7 ~ 16:57:51]$
  9. # 添加补充组,如果没有-a选项,则代表将补充组设置为user01,原先的补充组就被覆盖了。
  10. [root@centos7 ~ 16:59:02]# usermod -aG user01 user02
  11. [root@centos7 ~ 16:59:06]# id user02
  12. uid=1008(user02) gid=10(wheel) groups=10(wheel),1001(user01)
复制代码

userdel 命令

  1. # 正常删除
  2. [root@centos7 ~ 16:59:11]# useradd user03
  3. [root@centos7 ~ 16:59:36]# userdel user03
  4. # 强制删除
  5. [root@centos7 ~ 17:01:33]# userdel user02
  6. userdel: user user02 is currently used by process 9071
  7. [root@centos7 ~ 17:02:09]# id user02
  8. uid=1008(user02) gid=10(wheel) groups=10(wheel),1003(user01)
  9. # 尽量不要强制删除,要找到无法删除的原因
  10. [root@centos7 ~ 17:02:09]# userdel -f user02
  11. userdel: user user02 is currently used by process 9071
  12. [root@centos7 ~ 17:02:50]# id user02
  13. id: user02: no such user
复制代码

课后作业

  1. 创建 operator1 用户
  1. useradd -p '' zhangsan
  2. # 添加zhangsan用户并设置空密码
复制代码
  1. 使用 id 验证 operator1 用户信息
  2. 查看 /etc/passwd 中对应条目
  3. 密码设置为 redhat
  4. 修改 operator1 用户uid为1088
  5. 修改 operator1 用户描述信息为"Operator One"
  6. 将 wheel 组作为补充组添加给 operator1 用户
  7. 查看 /etc/group 中对应条目
  8. 删除 operator1 用户
  1. [root@centos7 ~ 09:14:30]# useradd operator1
  2. 正在创建信箱文件: 文件已存在
  3. [root@centos7 ~ 09:16:03]# id operator1
  4. uid=8890(operator1) gid=8890(operator1) 组=8890(operator1)
  5. [root@centos7 ~ 09:16:40]# grep operator1 /etc/passwd
  6. operator1:x:8890:8890::/home/operator1:/bin/bash
  7. [root@centos7 ~ 09:16:59]# passwd operator1
  8. 更改用户 operator1 的密码 。
  9. 新的 密码:
  10. 无效的密码: 密码少于 8 个字符
  11. 重新输入新的 密码:
  12. passwd:所有的身份验证令牌已经成功更新。
  13. [root@centos7 ~ 09:17:28]# usermod -u 1088 operator1
  14. usermod:警告:/var/spool/mail/operator1 不属于 operator1
  15. [root@centos7 ~ 09:17:59]# usermod -c "Operator One" operator1
  16. [root@centos7 ~ 09:18:20]# usermod -aG wheel operator1
  17. [root@centos7 ~ 09:19:38]# grep operator1 /etc/passwd
  18. operator1:x:1088:8890:Operator One:/home/operator1:/bin/bash
  19. [root@centos7 ~ 09:19:42]# grep wheel /etc/group
  20. wheel:x:10:operator1
  21. [root@centos7 ~ 09:20:29]# grep operttor1 /etc/group
  22. [root@centos7 ~ 09:20:49]# userdel operator1
  23. [root@centos7 ~ 09:21:11]# rm -fr /home/operator1
  24. [root@centos7 ~ 09:21:24]# ls /var/spool/mail
  25. operator1 root rpc tom user01 user02 user03 yy
  26. [root@centos7 ~ 09:21:37]# ls /var/spool/mail/
  27. operator1 root rpc tom user01 user02 user03 yy
  28. [root@centos7 ~ 09:21:40]# ls /var/spool/mail/operator1
  29. /var/spool/mail/operator1
  30. [root@centos7 ~ 09:21:52]# rm -fr /var/spool/mail/operator1
复制代码

综合案

手动创建一个用户
  1. # 1 添加账户
  2. [root@centos7 ~ 17:03:02]# vim /etc/passwd
  3. # 最后一行添加如下内容,注意uid要在原有的基础上增加1
  4. zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
  5. # 2 添加组
  6. [root@centos7 ~ 17:05:15]# vim /etc/group
  7. # 最后一行添加如下内容
  8. zhangsan:x:1002:
  9. # 3 添加密码
  10. [root@centos7 ~ 17:05:15]# vim /etc/shadow
  11. # 最后一行添加如下内容
  12. zhangsan:$6$FgUNKn74yoEDbcXD$pxDk9AEhsxkJGYi76Rv91zLy5LRns8olgAyGuNssQYG07ypaidhuX0gHAU4hrNi9Zp9A7vtMEvbyzCQ0e/gbk1::0:99999:7:::
  13. # 4 准备家目录
  14. [root@centos7 ~ 17:13:16]# cp -r /etc/skel/ /home/zhangsan
  15. # 修改zhangsan家目录所属有zhangsan用户和组
  16. [root@centos7 ~ 17:13:27]# chown zhangsan:zhangsan /home/zhangsan
  17. [root@centos7 ~ 17:13:33]# ll -d /home/zhangsan
  18. drwxr-xr-x. 3 zhangsan zhangsan 78 Jul 17 17:13 /home/zhangsan
  19. # 测试
  20. [root@centos7 ~ 17:13:37]# ssh zhangsan@localhost
复制代码
bash 提示符变为初始字符

提示符如下: bash-4.2$

模拟:

  1. [root@centos7 ~ 17:14:43]# mv /etc/bashrc{,.ori}
  2. [root@centos7 ~ 17:15:17]# bash
  3. bash-4.2#
复制代码

原因:nologin shell打开的时候执行 /etc/bashrc 配置。

恢复:

  1. bash-4.2# mv /etc/bashrc{.ori,}
  2. bash-4.2# bash
  3. [root@centos7 ~ 17:16:48]#
复制代码
误删用户家目录

故障:

  1. [root@centos7 ~ 17:21:29]# ssh zhangsan@localhost
  2. zhangsan@localhost's password:
  3. Activate the web console with: systemctl enable --now cockpit.socket
  4. Last login: Fri Jul 19 14:13:47 2024 from ::1
  5. Could not chdir to home directory /home/zhangsan: No such file or directory
  6. -bash-4.2$
复制代码

模拟:

  1. [root@centos7 ~ 17:21:40]$ rm -fr /home/zhangsan
复制代码

解决

  1. [root@centos7 ~ 17:22:20]$ cp -r /etc/skel/ /home/zhangsan
  2. [root@centos7 ~ 17:22:44]$ chown zhangsan:zhangsan /home/zhangsan
复制代码
没有权限切换家目录

故障

  1. Could not chdir to home directory /home/zhangsan: Permission denied
  2. -bash: /home/zhangsan/.bash_profile: 权限不够
复制代码

模拟

  1. [root@centos7 ~ 17:24:55]# chmod u=- /home/zhangsan
复制代码

解决

  1. [root@centos7 ~ 17:25:32]# chown -R zhangsan:zhangsan /home/zhangsan
  2. [root@centos7 ~ 17:26:07]# chmod u=rwx /home/zhangsan
  3. [root@centos7 ~ 17:26:30]# ll -d /home/zhangsan
  4. drwxr-xr-x. 4 zhangsan zhangsan 55 Jul 17 17:24 /home/zhangsan
复制代码

本地组管理

groupadd 命令

  1. # 创建名称为 admin 的组
  2. [root@centos7 ~ 10:24:38]# groupadd admin
  3. # 创建名称为sysadmin的组,组id为2000
  4. [root@centos7 ~ 10:24:57]# groupadd sysadmin -g 2000
  5. # 验证
  6. [root@centos7 ~ 10:25:13]# grep admin /etc/group
  7. printadmin:x:997:
  8. admin:x:1004:
  9. sysadmin:x:2000:
复制代码

groupmod 命令

  1. # 修改组名称
  2. [root@centos7 ~ 10:25:36]# groupmod --new-name admins admin
  3. # 修改组id
  4. [root@centos7 ~ 10:25:58]# groupmod -g 2002 admins
  5. # 验证
  6. [root@centos7 ~ 10:26:12]# grep 'admins' /etc/group
  7. admins:x:2002:
复制代码

groupdel 命令

  1. [root@centos7 ~ 10:26:27]# groupdel sysadmin
  2. [root@centos7 ~ 10:26:44]# grep sysadmin /etc/group
复制代码

groupmem 命令

  1. [root@centos7 ~ 10:30:09]# groupmems --help
  2. Usage: groupmems [options] [action]
  3. Options:
  4. -g, --group groupname change groupname instead of the user's group
  5. (root only)
  6. -R, --root CHROOT_DIR directory to chroot into
  7. Actions:
  8. -a, --add username add username to the members of the group
  9. -d, --delete username remove username from the members of the group
  10. -h, --help display this help message and exit
  11. -p, --purge purge all members from the group
  12. -l, --list list the members of the group
  13. # 添加成员
  14. [root@centos7 ~ 10:26:54]# groupmems -g admins -a yy
  15. [root@centos7 ~ 10:27:13]# groupmems -g admins -l
  16. yy
  17. [root@centos7 ~ 10:27:17]# id yy
  18. uid=1000(yy) gid=1000(yy) groups=1000(yy),2002(admins)
  19. # 删除成员
  20. [root@centos7 ~ 10:27:21]# groupmems -g admins -d yy
  21. [root@centos7 ~ 10:27:33]# groupmems -g admins -l
  22. # 清空组中所有成员
  23. [root@centos7 ~ 10:27:36]# groupmems -g admins -a yy
  24. [root@centos7 ~ 10:27:44]# groupmems -g admins -p
复制代码

练习

  1. 创建developer组,组id为2000
  2. 修改developer组名称为developers,组id为3000
  3. 创建developer1用户,并添加到组developers
  4. 将developer1用户从组developers中删除
  5. 删除组developers
  1. # 创建组并设置组id为2000
  2. [root@centos7 ~ 09:49:44]# groupadd developer -g 2000
  3. [root@centos7 ~ 10:17:16]# grep developer /etc/group
  4. developer:x:2000:
  5. # 修改组名称和组id
  6. [root@centos7 ~ 10:17:52]# groupmod --new-name developers developer
  7. [root@centos7 ~ 10:18:36]# groupmod -g 3000 developers
  8. [root@centos7 ~ 10:19:02]# grep 'developers' /etc/group
  9. developers:x:3000:
  10. # 创建developer1用户,并添加到组developers
  11. [root@centos7 ~ 10:20:39]# useradd developer1
  12. [root@centos7 ~ 10:20:51]# groupmems -g developers -a developer1
  13. [root@centos7 ~ 10:20:52]# grep 'developers' /etc/group
  14. developers:x:3000:developer1
  15. # 删除组developers中developer1用户
  16. [root@centos7 ~ 10:21:08]# groupmems -g developers -d developer1
  17. # 列出组内所有成员
  18. [root@centos7 ~ 10:21:36]# groupmems -g developers -l
  19. [root@centos7 ~ 10:21:45]# grep 'developers' /etc/group
  20. developers:x:3000:
  21. # 清空该组内所有附加用户
  22. [root@centos7 ~ 10:23:52]# groupmems -g developers -p
  23. # 删除组developers
  24. [root@centos7 ~ 10:23:58]# groupdel developers
  25. [root@centos7 ~ 10:24:14]# grep 'developers' /etc/group
复制代码

管理用户密码

shadow 文件

/etc/shadow 文件保存操作系统登录用户密码信息。

每行包含一个登录用户信息,以冒号分隔九个域。

示例:

  1. [root@centos7 ~ 10:41:39]# grep yy /etc/shadow
  2. yy:$6$FUDbUl5r4iDyUEgp$nvRxXlYweIKzDnbleUSpuz0yMNDEb/lH7VNoZo7rKu8AqQD6HncMngOlylcHzIltCycoq.x9Ld6cWZOwQnmQB/::0:99999:7:::
复制代码

解释如下:

  • login name:用户登录名。
  • encrypted password:加密的密码。
  • date of last password change:上一次密码更改日期,以距离1970-1-1过去的天数表示。设置为0,强制用户下次登录时更改密码。
  • minimum password age:最小密码生命周期。设置为0,密码可以随时更改。
  • maximum password age:最大密码生命周期。
  • password warning period:密码过期前,提前多少天告警。设置为0,不提示过期。
  • password inactivity period:密码过期后,非活跃天数,在期间密码仍可以使用。
  • account expiration date:账户过期时间,以距离1970-1-1过去的天数表示。
  • reserved field:保留域。

chage 命令

  1. # 查看用户密码信息
  2. [root@centos7 ~ 11:24:38]# chage -l yy
  3. 最近一次密码修改时间 :从不
  4. 密码过期时间 :从不
  5. 密码失效时间 :从不
  6. 帐户过期时间 :从不
  7. 两次改变密码之间相距的最小天数 :0
  8. 两次改变密码之间相距的最大天数 :99999
  9. 在密码过期之前警告的天数 :7
  10. # 修改用户密码要求
  11. # 修改两次更改密码间隔最大天数
  12. [root@centos7 ~ 11:24:51]# chage -M 100 yy
  13. [root@centos7 ~ 11:25:15]# chage -l yy
  14. 最近一次密码修改时间 :从不
  15. 密码过期时间 :从不
  16. 密码失效时间 :从不
  17. 帐户过期时间 :从不
  18. 两次改变密码之间相距的最小天数 :0
  19. 两次改变密码之间相距的最大天数 :100
  20. 在密码过期之前警告的天数 :7
  21. # 修改两次更改密码间隔最小天数
  22. [root@centos7 ~ 11:25:23]# chage -m 10 yy
  23. [root@centos7 ~ 11:25:45]# chage -l yy
  24. 最近一次密码修改时间 :从不
  25. 密码过期时间 :从不
  26. 密码失效时间 :从不
  27. 帐户过期时间 :从不
  28. 两次改变密码之间相距的最小天数 :10
  29. 两次改变密码之间相距的最大天数 :100
  30. 在密码过期之前警告的天数 :7
  31. #设置用户yy下次登录时必须修改密码
  32. [root@centos7 ~ 11:25:51]# chage -d 0 yy
  33. [root@centos7 ~ 11:27:54]# chage -l yy
  34. 最近一次密码修改时间 :密码必须更改
  35. 密码过期时间 :密码必须更改
  36. 密码失效时间 :密码必须更改
  37. 帐户过期时间 :从不
  38. 两次改变密码之间相距的最小天数 :10
  39. 两次改变密码之间相距的最大天数 :100
  40. 在密码过期之前警告的天数 :7
  41. # 验证 (登录时必须重新更改密码)
  42. [root@centos7 ~ 11:32:01]# ssh yy@localhost
  43. yy@localhost's password:
  44. You are required to change your password immediately (root enforced)
  45. Last login: Sat Jul 18 11:31:50 2026 from localhost
  46. WARNING: Your password has expired.
  47. You must change your password now and login again!
  48. 更改用户 yy 的密码 。
  49. 为 yy 更改 STRESS 密码。
  50. (当前)UNIX 密码:
  51. # 设置用户密码过期时间是过去的一个时间,以便确保用户密码过期,登录时强制用户更改密码
  52. # 将 yy 用户上次修改密码的日期设为纪元第 1 天,不会强制登录改密,仅改变密码计时起始点
  53. [root@centos7 ~ 11:33:06]# chage -d 1 yy
  54. [root@centos7 ~ 11:33:26]# chage -l yy
  55. 最近一次密码修改时间 :1月 02, 1970
  56. 密码过期时间 :4月 12, 1970
  57. 密码失效时间 :从不
  58. 帐户过期时间 :从不
  59. 两次改变密码之间相距的最小天数 :10
  60. 两次改变密码之间相距的最大天数 :100
  61. 在密码过期之前警告的天数 :7
  62. # 设置用户账户过期时间是过去的一个时间,以便锁定用户账户
  63. [root@centos7 ~ 11:33:40]# chage -E 1970-1-1 yy
  64. [root@centos7 ~ 11:34:41]# chage -l yy
  65. 最近一次密码修改时间 :1月 02, 1970
  66. 密码过期时间 :4月 12, 1970
  67. 密码失效时间 :从不
  68. 帐户过期时间 :1月 01, 1970
  69. 两次改变密码之间相距的最小天数 :10
  70. 两次改变密码之间相距的最大天数 :100
  71. 在密码过期之前警告的天数 :7
复制代码

usermod -p 更改用户密码

  1. # 更改yin的密码与yy一致
  2. [root@centos7 ~ 18:48:36]# grep yin /etc/shadow
  3. yin::20652:0:99999:7::19922:
  4. [root@centos7 ~ 17:00:02]# usermod -p '$6$61vYLp0B$/TeDdIhzMHrE6Z6LkBco8E0UzwdsdSr6d3dcJWS1Qn0F3yGFIgS/H.RadP59K7gKmigDaZqtVIxzvWzdIWps61' yy
  5. # 删除用户密码
  6. [root@centos7 ~ 17:01:58]# usermod -p '' yy
复制代码

usermod -s 限定用户shell

  1. # 默认情况下,root用户可以切换到任何用户而且不需要密码
  2. [root@centos7 ~ 17:07:47]# su - yin
  3. 上一次登录:六 7月 18 17:06:04 CST 2026pts/1 上
  4. [yin@centos7 ~ 17:07:55]$ 登出
  5. # 更改用户shell为 /sbin/nologin
  6. [root@centos7 ~ 17:08:18]# usermod -s /sbin/nologin yin
  7. [root@centos7 ~ 17:08:41]# su - yin
  8. 上一次登录:六 7月 18 17:07:55 CST 2026pts/1 上
  9. This account is currently not available.
  10. # 将用户shell改为/bin/bash
  11. [root@centos7 ~ 17:08:47]# usermod -s /bin/bash yin
复制代码

usermod -L 锁定用户密码

等效于passwd -l

  1. [root@centos7 ~ 17:09:01]# usermod -L yin
  2. # 输入正确的密码也无法登录
  3. [yy@centos7 ~ 17:10:34]$ su - yin
  4. 密码:
  5. su: 鉴定故障
  6. [yy@centos7 ~ 17:10:46]$
复制代码

usermod -U 解锁用户密码

等效于passwd -u

  1. [root@centos7 ~ 17:11:11]# usermod -U yin
  2. # 输入正确的密码登录
  3. [root@centos7 ~ 17:11:35]# 登出
  4. [yy@centos7 ~ 17:11:37]$ su - yin
  5. 密码:
  6. 上一次登录:六 7月 18 17:10:28 CST 2026pts/1 上
  7. 最后一次失败的登录:六 7月 18 17:10:45 CST 2026pts/1 上
  8. 最有一次成功登录后有 1 次失败的登录尝试。
  9. [yin@centos7 ~ 17:11:48]$
复制代码

passwd -d 删除密码

  1. # 删除用户密码即可
  2. [root@centos7 ~ 17:12:22]# passwd -d yin
  3. 清除用户的密码 yin。
  4. passwd: 操作成功
复制代码

用户登录的时候,输入用户名即可登录。

设置账户过期

等效于passwd -e

  1. # 设置账户过期时间为过去的某一个日期
  2. [root@centos7 ~ 17:12:34]# usermod -e 2024-7-18 yin
  3. # 或者
  4. [root@centos7 ~ 17:18:17]# chage -E 2024-7-18 yin
复制代码

增加一个 uid 为 0 的用户

方法一

  1. [root@centos7 ~ 17:18:30]# vim /etc/passwd
  2. # 将自己的用户id该为0,此时laoma用户可以行使root权限了
  3. yin:x:0:1001::/home/yin:/bin/bash
复制代码

方法二

  1. [root@centos7 ~ 17:20:40]# useradd -o -u 0 jeong
  2. [root@centos7 ~ 17:20:58]# id jeong
  3. uid=0(root) gid=0(root) 组=0(root)
复制代码

laoma 和 root 账户是两个不同的账户,但是laoma用户获得了root账户权限。

其他 shell

  1. # 查看系统中 shell 清单
  2. [root@centos7 ~ 17:21:01]# cat /etc/shells
  3. /bin/sh
  4. /bin/bash
  5. /usr/bin/sh
  6. /usr/bin/bash
  7. /bin/tcsh
  8. /bin/csh
  9. [root@centos7 ~ 17:21:48]# ll /bin/sh /usr/bin/sh
  10. lrwxrwxrwx. 1 root root 4 7月 14 10:27 /bin/sh -> bash
  11. lrwxrwxrwx. 1 root root 4 7月 14 10:27 /usr/bin/sh -> bash
  12. # 新增 tmux shell
  13. [root@centos7 ~ 17:22:05]# yum install -y tmux
  14. 已加载插件:fastestmirror, langpacks
  15. # 新增 c shell
  16. [root@centos7 ~ 17:22:16]# yum install -y tcsh
  17. [root@centos7 ~ 17:23:02]# ll /bin/csh /usr/bin/csh
  18. lrwxrwxrwx. 1 root root 4 7月 14 10:29 /bin/csh -> tcsh
  19. lrwxrwxrwx. 1 root root 4 7月 14 10:29 /usr/bin/csh -> tcsh
复制代码

tmux 控制键 ctrl+b:

  • c,新建一个会话
  • N,切换到N号会话,例如数字1,切换到1号会话。

Linux 提权管理

大多数时候Linux系统管理员以非特权用户身份登录系统,并使用工具暂时获得特权用户root管理系统。

su 命令

  • 示例1:su username 启动一个非登录shell,使用当前的环境设置(上一个用户)
  • 示例2:su -l username 启动一个登录shell,设置了shell环境

username 省略时,代表切换到root账户。

  1. # 不加用户名的 nologin shell
  2. [yy@centos7 ~ 17:25:26]$ su
  3. 密码:
  4. # 很多环境变量仍保留为laoma用户
  5. [root@centos7 yy 17:25:31]# env | grep yy
  6. HOSTNAME=centos7.yy
  7. USER=yy
  8. PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yy/.local/bin:/home/yy/bin
  9. MAIL=/var/spool/mail/yy
  10. PWD=/home/yy
  11. LOGNAME=yy
  12. XDG_DATA_DIRS=/home/yy/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
  13. # 不加用户名的 login shell
  14. [yy@centos7 ~ 17:26:07]$ su -l
  15. 密码:
  16. 上一次登录:六 7月 18 17:25:31 CST 2026pts/1 上
  17. # 所有环境变量都更改为了root用户
  18. [root@centos7 ~ 17:26:11]# set | grep yy
  19. HOSTNAME=centos7.yy
复制代码

提示: 尽可能使用 loging shell 登录。

准备一个用户

  1. # 添加一个用户
  2. [root@centos7 ~ 17:27:37]# useradd yue
  3. # 设置密码为redhat
  4. [root@centos7 ~ 17:28:12]# echo redhat | passwd --stdin yue
  5. 更改用户 yue 的密码 。
  6. passwd:所有的身份验证令牌已经成功更新。
  7. [root@centos7 ~ 17:28:32]# grep yue /etc/passwd
  8. yue:x:1002:1003::/home/yue:/bin/bash
  9. # 以特定用户身份执行特定命令
  10. [yy@centos7 ~ 19:00:37]$ su -l yue -c id
  11. 密码:
  12. uid=1001(yue) gid=1001(yue) 组=1001(yue) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  13. # 加单引号
  14. [yy@centos7 ~ 19:01:31]$ su -l yue -c 'cat /etc/hosts'
  15. 密码:
  16. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  17. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  18. # 不加单引号
  19. [yy@centos7 ~ 19:01:36]$ su -l yue -c cat /etc/hosts
  20. 密码:
  21. hello
  22. hello
  23. # 原因:没有把 "cat /etc/hosts" 当作整体
复制代码

其他使用方法

  1. # 创建的文件位置在 ~yy/haha
  2. [root@centos7 ~ 19:02:50]# su -l -c 'touch haha' yy
  3. # 无权创建
  4. [root@centos7 ~ 19:03:09]# su -c 'touch haha' yy
  5. touch: 无法创建"haha": 权限不够
  6. # 原因:nologin shell 执行,当前位置不变,导致yy用户无法在/root下创建
  7. # 切换 nologin shell 账户
  8. [root@centos7 ~ 19:03:41]# grep adm /etc/passwd
  9. adm:x:3:4:adm:/var/adm:/sbin/nologin
  10. [root@centos7 ~ 19:04:17]# su -l adm -c id
  11. This account is currently not available.
  12. [root@centos7 ~ 19:04:31]# su -l adm -s /bin/bash -c id
  13. uid=3(adm) gid=4(adm) 组=4(adm) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  14. # 只有 root 用户可以指定 shell
  15. [root@centos7 ~ 19:04:57]# su -l adm -s /bin/bash
  16. 上一次登录:日 7月 19 19:04:57 CST 2026pts/0 上
  17. -bash-4.2$
  18. # 提示符不正常,原因是家目录中缺少bash相关配置文件
  19. # 处理方法如下:
  20. [root@centos7 ~ 19:05:53]# grep adm /etc/passwd
  21. adm:x:3:4:adm:/var/adm:/sbin/nologin
  22. [root@centos7 ~ 19:06:06]# cp /etc/skel/{.bash_profile,.bashrc} /var/adm
  23. [root@centos7 ~ 19:06:40]# su adm -l -s /bin/bash
  24. 上一次登录:日 7月 19 19:05:38 CST 2026pts/0 上
  25. [adm@centos7 ~ 19:06:53]$
复制代码

sudo 命令

从根本上说,Linux实现了一个非常粗糙的获得权限模型:root 可以做任何事情,其他用户与系统相关什么也不能做。

  • su 缺点:
  • 用户必须知道 root 用户密码获取 root 用户所有权限。
  • 未记录用户执行命令。
  • 无法以 /sbin/nologin 的用户身份运行命令。
  • sudo 优点:
  • sudo 允许用户以其他用户身份执行特定命令。
  • sudo 需要用户输入用户自己的密码,而非他们想访问的用户密码。
  • sudo 执行的命令会记录在 /var/log/secure 文件中。

sudo 语法:sudo [-u username] command

  1. # 有sudo权限的用户,输入自己的密码,确认是否是本人在操作
  2. [yy@centos7 ~ 19:06:10]$ sudo id
  3. [sudo] password for yy:
  4. uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  5. # 没有sudo权限的用户
  6. [yy@centos7 ~ 19:07:28]$ sudo id
  7. 我们信任您已经从系统管理员那里了解了日常注意事项。
  8. 总结起来无外乎这三点:
  9. #1) 尊重别人的隐私。
  10. #2) 输入前要先考虑(后果和风险)。
  11. #3) 权力越大,责任越大。
  12. [sudo] yy 的密码:
  13. yy 不在 sudoers 文件中。此事将被报告。
复制代码

sudo 配置

  1. [root@centos7 ~ 19:15:06]# export EDITOR=vim
  2. [root@centos7 ~ 19:15:19]# visudo
  3. # 其中两条记录,wheel组中成员,可以以任何用户身份执行任何命令
  4. root ALL=(ALL) ALL
  5. # 组以%开头
  6. %wheel ALL=(ALL) ALL
复制代码

示例1:

  1. # yy 记录如下()
  2. yy ALL=(ALL) ALL
复制代码

验证:

  1. [yy@centos7 ~ 19:17:21]$ sudo id
  2. [sudo] yy 的密码:
  3. uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
复制代码

**示例2:**不需要输入密码情况下,直接执行命令。

  1. # yy 记录如下
  2. yy ALL=(ALL) NOPASSWD:ALL
复制代码

验证:

  1. [yy@centos7 ~ 19:19:38]$ sudo id
  2. uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
复制代码

**示例3:**只能够执行特定命令。

  1. # yy 记录如下
  2. yy ALL=(ALL) /sbin/useradd,/sbin/usermod,/sbin/userdel
复制代码

验证:

  1. [yy@centos7 ~ 19:20:54]$ sudo id
  2. 对不起,用户 yy 无权以 root 的身份在 centos7.yy 上执行 /bin/id。
  3. [yy@centos7 ~ 19:21:53]$ sudo useradd lao
  4. [yy@centos7 ~ 19:22:02]$ id lao
  5. uid=1003(lao) gid=1004(lao) 组=1004(lao)
复制代码

**总结:**在分配命令的时候,切记只给用户特定功能的命令(例如用户管理相关命令),而不是通用功能的工具(例如 vim)。

配置文件路径:

  • 主配置文件:/etc/sudoers,正常情况不要修改。
  • 从配置文件:/etc/sudoer.d/*,如果想添加配置,在此处添加。

示例:

  1. [root@centos7 ~ 19:22:43]# echo 'yue ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/yy
  2. [root@centos7 ~ 19:23:14]# cat /etc/sudoers.d/yy
  3. yue ALL=(ALL) NOPASSWD:ALL
复制代码

命令别名

  1. Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
  2. # sys组中成员执行以下命令别名中的所有命令
  3. %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
复制代码

案例

  1. 配置用户 xiaoniuma 可以以root身份运行vim命令
  2. 用户 xiaoniuma 将自己提权为 root 用户 - 方法一:使用vim将/etc/passwd中用户的uid改为0 - 方法二:将sudo规则中vim程序改为bash或者ALL

操作过程:

  1. # 创建用户
  2. [root@centos7 ~ 19:23:22]# useradd xiaoniuma
  3. [root@centos7 ~ 19:23:56]# echo 123 | passwd --stdin xiaoniuma
  4. # 配置sudo
  5. [root@centos7 ~ 19:24:15]# echo 'xiaoniuma ALL=(ALL) /bin/vim' > /etc/sudoers.d/xiaoniuma
  6. # 切换用户并修改用户id
  7. [root@centos7 ~ 19:24:57]# sudo vim /etc/passwd
  8. # 修改 xiaoniuma 的 UID 为0
  9. xiaoniuma:x:0:1001::/home/xiaoniuma:/bin/bash
  10. # 验证
  11. [xiaoniuma@centos7 ~ 19:27:18]$ su -l xiaoniuma
  12. 密码:
  13. [root@centos7 ~ 19:27:40]#
复制代码

还原环境

  1. # 修改用户id为原来的1001
  2. [xiaoniuma@centos7 ~ 19:28:08]$ sudo vim /etc/passwd
  3. xiaoniuma:x:1001:1001::/home/xiaoniuma:/bin/bash
  4. # 删除用户
  5. [root@centos7 ~ 19:30:12]# userdel -r xiaoniuma
  6. # 删除sudo规则
  7. [root@centos7 ~ 19:30:24]# rm -f /etc/sudoers.d/xiaoniuma
复制代码

提权总结

以下是关于 Linux 中 su 和 sudo 使用的几条建议:

  1. 优先选用 sudo,减少 su 的使用频次

sudo仅针对单条命令临时授予管理员权限,命令执行完毕会自动切回普通用户身份,严格遵循最小权限原则,大幅降低误删系统文件、误改配置的风险;而su会完整切换至 root 交互式终端,全程持有系统最高权限,长时间操作极易引发安全事故。

  1. 限定 su 的适用场景,用完及时退出

仅当需要连续执行多条系统运维指令时,才临时使用su -切换 root 环境;所有操作完成后务必执行exit退回普通账号,不要以 root 身份浏览文件、执行日常无关操作。另外su切换 root 需要共享 root 密码,多人服务器存在密码泄露隐患。

  1. 精细化管控 sudoers 权限,拒绝全量授权

修改 sudo 权限配置必须使用visudo命令,该工具自带语法校验,能避免配置错误导致管理员权限锁死。配置时遵循最小权限原则,不要直接授予用户全部 root 权限,可以限定用户仅能执行指定运维命令,CentOS 环境示例:laoma ALL=(ALL) /usr/bin/yum, /usr/bin/systemctl restart network。

  1. 执行特权命令尽量使用绝对路径

调用 sudo 执行命令时,建议填写程序完整绝对路径,例如sudo /usr/bin/yum list installed,可以规避恶意篡改 PATH 环境变量带来的命令劫持漏洞,提升操作安全性。

  1. 脚本不要明文携带 sudo 密码

切勿通过管道、文本硬编码等方式传递 sudo 密码,存在明文泄露风险;如果自动化脚本需要免密执行特权操作,可以在sudoers中配置NOPASSWD,仅放开脚本所需命令的免密权限。

  1. 定期核查权限操作审计日志

不同发行版日志路径存在区别:Ubuntu/Debian 记录在/var/log/auth.log,CentOS/RHEL 系列统一存放在/var/log/secure。定期检索日志能够完整追溯所有 su、sudo 提权行为,及时发现异常越权操作。

  1. 交互式 root 环境推荐 sudo -i 替代 su -

如果需要完整的 root 登录环境做批量操作,推荐使用sudo -i。它会完整加载 root 用户环境变量,同时所有操作都会生成 sudo 审计日志,且只需验证当前普通用户密码,无需共享 root 账号密码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行