5.linux本地用户和组管理

Linux 本地用户和组管理

1. 概述

Linux 系统中的用户和组管理是权限控制的基础。它允许系统管理员定义谁可以访问哪些资源以及他们可以执行哪些操作。

2. 用户和组管理命令

2.1 用户管理命令

  • useradd: 添加用户
  • userdel: 删除用户
  • usermod: 修改用户属性

2.2 组管理命令

  • groupadd: 添加组
  • groupdel: 删除组

2.3 权限切换命令

  • su - username: 切换到指定用户(- 表示切换到该用户的环境)。
  • sudo command: 以超级用户权限执行命令。
  • visudo: 编辑 /etc/sudoers 文件,用于配置 sudo 权限。

3. 用户和组相关配置文件

  • /etc/passwd: 用户账户信息
  • /etc/group: 组信息
  • /etc/gshadow: 组密码和组管理员信息
  • /etc/sudoers: 配置哪些用户或组可以使用 sudo 以及他们可以执行哪些命令。

4. 实操演示

在Linux系统中,配置用户和组(例如使用 useradd, groupadd, userdel, groupdel, usermod 等命令)通常需要 root 用户的权限。这是因为用户和组的管理涉及到系统级别的安全和资源分配,只有 root 用户(或通过 sudo 获得 root 权限的用户)才能执行这些操作,以确保系统的稳定性和安全性。

4.1 切换到 Root 用户

首先我们使用su -来切换到root。

VirtualBoxVM_pxqixFiB5Q.png

4.2 添加用户

然后我们可以尝试使用useradd来添加一个账户。

VirtualBoxVM_FQLiI4LrjL.png

可以看到我们的账户已经创建完毕了,并且我们的/home目录下也多了一个目录。

4.3 创建组

接下来我们创建一个组试试。

VirtualBoxVM_B1mVSA6bGw.png

VirtualBoxVM_QNr99TvNze.png

/etc/group里面可以看到所有关于组和其id的信息。

4.4 删除用户

如果我们要删除用户的话,如果仅仅使用userdel noob,noob的home目录以及mailbox file仍然会存在,建议使用-r选项,在删除用户的同时,也移除该用户的家目录和邮箱文件。

VirtualBoxVM_ukurkiXySM.png

4.5 修改用户属性 (usermod)

然后我们尝试一下使用usermod。

VirtualBoxVM_xEu4SD6qtp.png

usermod -G用于修改一个用户所属的“附加组”,在 Linux 中,一个用户必须属于一个“主组” (primary group),并且可以同时属于多个“附加组”。

但是你有没有发现,我们执行完之后,/home目录下的noob目录仍然属于noob组。因为noob的主组还是noob。

如果你这时候使用usermod -g这个小写的g,它也只会改变用户在系统中的“默认主组”设置(即 /etc/passwd 文件中的 GID)。它不会自动去修改该用户已经拥有的所有文件(比如 /home/noob 目录)的属组。

4.6 修改文件属组 (chgrp)

如果你修改隶属于noob的所有文件变为fools所属的话,我们就需要使用change group命令chgrp

VirtualBoxVM_JQAyISr3ei.png

chgrp -R 中的 -R 选项代表 “Recursive”(递归)。它的意思是:不仅改变你指定目录的属组,还要进入这个目录,改变里面所有文件、所有子目录、以及子目录里的所有文件的属组,一直重复下去,直到覆盖所有内容。

4.7 深入理解配置文件

现在我们来看一看刚才提到的/etc/passwd有什么内容:

VirtualBoxVM_poiJUg52KB.png

可以看到每当你创建一个新用户的时候,最下方就会被添加新的信息。

/etc/passwd 是一个用冒号分隔的文本文件,其中每一行都代表一个系统用户账户。它定义了用户的核心信息,如用户名(第1字段)、用户ID (UID)(第3字段)、主组ID (GID)(第4字段)。它还指定了用户的家目录(第6字段)和登录时运行的 Shell 程序(第7字段),其中 /usr/sbin/nologin 表示该账户禁止登录。

我们继续看一看其他的文件都是什么内容,对于/etc/group

VirtualBoxVM_VHeuCP5Yu9.png

/etc/group 文件中的每一行都定义了一个用户组,它通过冒号分隔,依次显示了组名、占位符 (x)、组ID (GID)、以及该组的附加成员列表(用逗号分隔)。这个文件是 Linux 权限系统的核心,它通过 GID 来标识组,并通过附加成员列表来决定哪些用户可以“共享”这个组的权限。

/etc/group 文件的上下文中,那个 x 占位符的意思是:“这个组的加密密码存储在别处。”

这个“别处”就是 /etc/gshadow 文件。

  1. 历史原因: 在非常古老的 Unix/Linux 系统中,组的加密密码(如果设置了的话)会直接存放在 /etc/group 文件的第二个字段。
  2. 安全问题: /etc/group 文件需要被系统上所有用户读取(以便知道谁在哪个组里)。如果密码也存在这里,任何用户都可以拿到所有组的加密密码去尝试破解。
  3. 现代方案: 为了安全,系统把真正的组密码(如果有的话)转移到了一个只有 root 用户才能读取的 /etc/gshadow 文件中。原来的位置就用一个 x 来“占位”,表示“密码已启用并已转移”。

一句话总结: 那个 x 是一个安全改进的产物,它告诉你这个组的真实密码信息被安全地存放在 /etc/gshadow 文件里了。

(P.S. 实际上,“组密码”这个功能本身现在已经非常非常少用了。大多数组(如 x 所示)虽然启用了 shadow 密码,但并没有设置实际的密码。)

接下来我们来看看/etc/gshadow

VirtualBoxVM_gAqw7fhMRa.png

/etc/gshadow 文件是 /etc/group 文件的“影子文件”,它以安全的方式存储组密码组管理员信息,并且为了安全,它只能被 root 用户读取

它的每一行也由冒号 : 分隔,包含 4 个字段:

  1. 组名 (Group Name)

    • 对应于 /etc/group 中的组名。
  2. 加密的组密码 (Encrypted Password)

    • 这才是真正存储组密码的地方(而不是 /etc/group 里的 x)。
    • 如果这里是 !*,意味着这个组被锁定了,或者没有设置密码(这是最常见的情况)。
    • 如果这里是空的,表示该组没有密码。
  3. 组管理员 (Group Administrators)

    • 一个用逗号分隔的用户名列表,这些人可以管理这个组的成员(比如添加或删除成员)。
    • 这个字段通常是空的
  4. 组成员 (Group Members)

    • 一个用逗号分隔的用户名列表,这些人是这个组的成员。
    • 这和 /etc/group 文件的第 4 字段(附加成员列表)功能基本一样。

4.8 组合命令示例

接下来我们尝试一下组合命令:

VirtualBoxVM_D6DYVhjxvN.png

useradd -g fools -s /bin/bash -c "second noob" -m -d /home/noob2 noob2

  • useradd: “添加用户”的主命令。

  • -g fools:

    • -g (group) 指定用户的**“主组”**。
    • 强制将新用户 noob2 的主组设为 fools 组。
    • (后面的 id noob2 命令也确认了这一点,显示 gid=1002(fools))
  • -s /bin/bash:

    • -s (shell) 指定用户的**“登录 Shell”**。
    • noob2 的 Shell 设为 /bin/bash,这意味着该用户可以正常登录和使用命令行。
  • -c "second noob":

    • -c (comment) 添加**“备注”**信息,通常是用户的全名。
    • 备注内容是 “second noob”。
    • (后面的 tac /etc/passwd 命令确认了这一点)
  • -m:

    • -m (create home) 这是“创建家目录”的选项。
    • 它告诉 useradd 命令:“如果家目录不存在,就必须创建它。”
  • -d /home/noob2:

    • -d (directory) 指定**“家目录的路径”**。
    • noob2 的家目录路径设为 /home/noob2
  • noob2:

    • 放在命令最后的是你要创建的用户名

-m-d 是如何协同工作的?

这两个选项一起使用是标准操作:

  1. -d /home/noob2 告诉系统:“这个用户的家目录路径是 /home/noob2。”
  2. -m 告诉系统:“现在,请真的去创建 /home/noob2 这个目录。”

如果没有 -m 会怎样?
系统只会在 /etc/passwd 文件里记录家目录是 /home/noob2,但不会真的在磁盘上创建这个文件夹。当 noob2 登录时就会因为找不到家目录而出错。