Featured image of post Linux 用户与用户组(ICT 相关)

Linux 用户与用户组(ICT 相关)

导论

Linux 是一个多用户操作系统,Linux 的用户权限管理相对简单,但是也可以通过 SELinux 等高级的机制来加强其的权限管理。
在 Linux 中,用户可以指真实用户的名称,可以像 root、storm 这样实在的用户,但 Linux 也为一些系统服务和程序设置了伪用户。这些用户在 /etc/passwd 占有一行但是不能登录,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。(参见 /etc/passwd)

用户组

这时候就能引伸出用户组的概念了:
使用 group 命令可以查看用户所属的组比如我的用户名是 storm,输出如下:

1
2
[storm@ArchLinuxLaptop ~]$ groups storm
storm : storm adm wheel kvm storage video plugdev libvirt docker

这是我使用了有四五个月的 Linux 所添加的用户组。用户组是具有相同特性的用户的集合。用户可以属于多个用户组。比如说这里有 wheel、video、docker 组等等。
用户组的用途是控制用户对文件和目录的访问权限。当用户创建一个文件和目录的时候可以指定该文件的所有用户和用户组以及 rwx 权限。而在 Unix 中有一项特别重要的哲学思想:一切皆文件(Everything is a file.)
Unix 下任何东西都被抽象成了文件,各种硬件设备都有其专属的文件,可以使用工具以文本的方式进行获取修改,这也是 Unix 可以屹立于操作系统之巅五十余年的很重要的缘故。而 Windows 就不是这样的。(可能也是唯一不是这样的流行操作系统)

回归正题,正是因为一切皆文件,当我想操作一些设置我需要是某一个组的成员才得以操作。比如我要调整亮度,我需要是 video 组的成员,然后可以通过 echo 或者抽象过的图形程序来写入某一个代表亮度的文件(一般在 /dev) 下,前提我是该组的成员

我在安装 ArchLinux 的时候一般会输入以下命令将我的用户添加到 3 个基本的组: adm wheel storage。

1
usermod -aG adm,wheel,storage storm

添加用户

在 ArchLinux 安装中,我会用如下的命令创建用户:

1
useradd --create-home storm

相较于华为学习空间给出的命令多了 --create-home 参数,不过没啥事,只要记住 useradd 是创建用户即可。而 –create-home 用于自动地在 /home 下创建同用户名文件夹作为家目录,也就是每个 Linux 用户的 ~ 目录。
不过如果仅仅在普通用户下创建用户会出现:

1
2
3
[storm@localhost ~]$ useradd zqf
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.

显然提示无权限,而第二行描述也表现了 Unix 一切皆文件的哲学思想。
只需要用 sudo 进行提权即可,sudo 可以理解为将后面的命令临时借用 root 用户的权限执行。

1
2
[storm@localhost ~]$ sudo useradd zqf
[sudo] password for storm:

这样就创建了 zqf 用户。
使用 passwd zqf 可以为 zqf 用户设置密码。

用户 ID 和组 ID

从底层来看,有非常多的用户,要如何实现一个非常快速的数据结构与算法来储存获取每个用户呢,Linux 使用了 ID,这是非常简单普遍的方式,通过键值对的方式对应每一个用户,相当于给每个用户、用户组一个编号
在 Linux 下使用 id 可以显示用户的用户 ID 和用户组 ID ,在 /etc/passwd 也可以得到 id。

1
2
[storm@localhost ~]$ id storm
uid=1000(storm) gid=1000(storm) groups=1000(storm),10(wheel)

该命令不仅提供了改用户的 id 还提供了其所属组的 id。wheel 是个特殊的组,和 sudo 提权有关系。
在 Linux 下,UID 是用户组标识,GID 是用户组表示。其都为整数。
除此之外,在 /etc/group 文件保存了用户组信息,包含了组名,口令字(不过被加密而只剩下了 x)、组 ID,用户组成员。
下面是一段 group 文件的内容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
root:x:0:root
sys:x:3:bin
mem:x:8:
ftp:x:11:
mail:x:12:
log:x:19:
smmsp:x:25:
proc:x:26:
games:x:50:
lock:x:54:
network:x:90:
floppy:x:94:
kvm:x:992:libvirt-qemu,qemu,storm

创建用户组

在 Linux 中,创建用户组使用 groupadd 命令。
比如以下命令创建 proj02 用户组,并且分配指定的 GID 10002。

1
useradd -m -u 10006 -g 10002 -G wheel,dev user0201

当我们创建用户时,可以添加 -g 参数指定用户的主组,用 -G 将用户添加到附属组。

  • 主组
    在用户创建文件时,文件默认属组就是主组。 每个用户都有且只有一个主组。其在 /etc/passwd 中的第四个字段显示。
  • 附属组
    用户除了主组外还能属于多个附属组。其使用 -G 参数指定且在 /etc/group 中记录。
    比如在这里将用户添加到 wheel,dev 中。

同时还有如下命令随时将用户添加到指定的组中:
将 zqf 添加到组 proj01。

1
useradd -aG proj01 zqf

这里的 -aG 用于将用户 zqf 添加到已存在的用户组 proj01 。

删除用户、用户组

删除用户使用 userdel 命令。

1
userdel -r user1

这个命令带有 -r 参数,表示删除用户时将其主目录(/home/user1) 和系统邮箱文件(/var/mail/user1) 也同时删除。这个选项很可能会删除一些重要的个人数据,在执行前要提前备份确认删除的文件是不需要的。


删除用户组使用 groupdel 命令。

1
groupdel ugroup1

usermod & groupmod

  1. usermod
    usermod 可以用来修改用户账号的各项设定。
    参数说明:

    • -c <备注> 修改用户描述
    • -d <登录目录> 修改用户登录时的目录
    • -e <时间> 修改用户的有效期限
      用户的有效期限至的是在该日期用户将无法登录系统。这种机制对维护系统安全、管理临时用户账号特别有用。可以通过 chage 命令来设置和修改用户账号的有效期。
    1
    
    sudo chage -E YYYY-MM-DD username
    
    • -f <缓冲天数> 修改在密码过期几天后关闭该账号
    • -g <用户组> 修改用户所属的用户主组
    • -G <用户组> 修改用户所属的附属用户组
    • -l <账户名> 修改用户的账户名
    • -L 锁定用户密码,使用户密码无效
    • -s 修改用户登录后使用的 shell。
      比如 bash、zsh……
    • -u 修改用户 uid
    • -U 解除密码锁定
  2. groupmod
    groupmod 用于修改用户组的各项设定。

    • -n 指定新的组名,比如将 abc 更名为 aqw:
    1
    
    groupmod -n abc aqw
    
    • -g 指定新的 GID
    1
    
    groupmod -g 1001 example_group
    
    • -o 允许使用一个已经存在的 GID,常与 -g 一起使用。

root 与 sudo

在 Unix 下有一个用户为 root 其的 uid 和 gid 都为 0。也可以成为超级用户。它拥有整个系统的权限,可以不受限制地执行任何操作。

Linux中,UID和GID的范围在1~99的用户,被系统保留或者分配给特殊用户使用,它们不是超级用户。使用root超级用户创建的新用户,其UID和GID的值从1000开始分配,这些用户是普通用户

需要注意的是,在一些博客上的 shell 命令可能会在前面加上 # 或者 $ 字符,它们不是命令的一部分,但是代表权限。$ 是指普通用户# 是指超级用户,当我们要运行带有 # 的命令最好是通过 sudo 提权或者直接在 root 用户下运行。

1
2
3
// 不同用户的 bash 不同
[storm@ArchLinuxLaptop ~]$
[root@ArchLinuxLaptop ~]#

sudo

那么 sudo 是什么呢?
ArchLinux Wiki 对 sudo 解释如下:

Sudo 使得系统管理员可以授权特定用户或用户组作为 root 或其他用户执行命令,同时还能够对命令及其参数提供审核跟踪。

只需要将用户添加到 wheel 组,然后通过 visudo 编辑 /etc/sudoers取消注释该行就可以:

1
 %wheel ALL=(ALL:ALL) ALL

要临时提权只需要通过 sudo 后面添上命令就可以。
sudo 的功能不只如此,还有很多功能本文暂不展开。

参考资料

  1. ArchLinux Wiki 用户和用户组
  2. Linux基础知识系列 第五十九篇 - 使用usermod命令管理用户属性
  3. Linux中/etc/passwd文件详细解析
  4. Linux usermod命令
  5. 深入理解 Linux groupmod 命令:管理用户组的得力工具
  6. ArchLinux Wiki sudo
萌ICP备20241614号