Linux——账号管理

Linux 是如何辨别使用者的

每一个文件都会拥有两种属性:所有人所属群组。每个登录的使用者也会去的两个 ID,一个是使用者 ID(User ID,简称 UID)和 群组 ID(Group ID,简称 GID)。

在 Linux 中,系统是根据 UIDGID 来辨别使用者身份的。ID 与 账号的对应关系就在 /etc/passwd 文件中。

那么文件又如何来判断它的所有者和所属群组呢,就是利用 UID 和 GID。当有需要显示文件属性时(如使用 ls -l 命令),系统会根据文件的 UID 和 GID,再到 /etc/passwd/etc/group 文件中找到 UID 和 GID 对应的账号和群组名显示出来。


/etc/passwd 文件的内容结构

/etc/passwd 中存储的是系统中的所有账号信息。
在这里插入图片描述
如上图所示,/etc/passwd中的每一行都是一个账户的信息,并用 : 来分割不同的字段,共有 7 个字段,分别是:

  • ① 账号名称
  • ② 密码:早期的 Unix 系统的密码就是放在这个字段上的,但是由于这个文件的特性是所有程序都能够读取,这样一来容易造成密码数据被窃取,因此后来就将密码数据放到了 /etc/shadow 中,而在 /etc/passwd 中由于不存在了密码字段,因此会用 x 来取代这个字段,并不是代表密码是 x。
  • ③ UID:就是用来对应账号所对应的 UID的。但是 UID 的取值范围也是有一些限制的:
id 范围 该 ID 使用者特性
0(系统管理员) 当 UID 为 0 时,代表这个账号是 系统管理员。所以若想要让其他账号名称具有 root 的权限,将该账号的 UID 改为 0 即可
1 ~ 49 (系统账号) 由于系统上面启动的服务希望使用较小的权限去运作,因此不希望使用 root 的身份去执行这些服务。这些系统账号通常是不可登入的,所以才会有 /sbin/nologin 这个特殊的 shell 存在。 通常系统账号又被分为两种:① 1 ~ 99:由 Linux 自行建立的系统账号;② 100 ~ 499:若用户有系统账号需求时,可以使用的账号 UID
500 ~ 给一般使用者使用的 UID
  • ④ GID:这个与 /etc/group 有关,用来规范组名和 GID 的对应
  • ⑤ 用户信息说明栏:这个字段基本上没有重要用途,知识来解释这个账号的意义
  • ⑥ 家目录:用户的家目录,以上面的 root 账户的家目录为例,可以看到 root 用户的家目录在 /root,所以当 root 用户登入后,会自动进入 /root 目录中。其他用户默认的家目录一般在 /home/用户名
  • ⑦ Shell:用户使用的默认 Shell

/etc/shadow 文件的内容结构

/etc/shadow 文件中存储的是用户的密码,同时其中还加入了许多的密码限制参数。
在这里插入图片描述
如上图所示,/etc/shadow中的每一行都是一个账户密码信息以及其限制,并用 : 来分割不同的字段,共有 9 个字段,分别是:

  • ① 账号名称:这里的账号名称即在 /etc/passwd 中存储的账号名称
  • ② 密码:这个字段中的密码才是真正的密码,并且是经过了编码的密码。
  • ③ 最近修改密码的日期:这个字段记录了最近修改密码的日期和 1970 年 1 月 1 日相距的天数。
  • ④ 密码不可被修改的天数(与第 3 字段 最近修改密码的日期相比较):这个字段记录了这个账号的密码在最近一次呗修改后还需要经过多少天才可以再次被修改。
  • ⑤ 密码需要重新修改的天数(与第 3 字段 最近修改密码的日期相比较):这个字段可以指定在最近一次修改密码后,在多少天内需要再次修改密码。可以强制要求用户修改密码。
  • ⑥ 密码在需要重新修改的期限前的警告天数(与第 5 字段的密码需要重新修改的天数相比较):当账号的密码有效期快要到的时候,系统会根据这个字段的设定,发出警告言论给这个账号,提醒他:再过 n 天密码就要过期了。
  • ⑦ 密码过期后的账号宽限时间(与第 5 字段的密码需要重新修改的天数相比较):若过了强制要求修改密码的天数后用户还没有修改密码,那么该密码就是过期了。若在密码过期几天后用户还是没有修改密码,那么这个用户的密码将会失效,即该账号无法再使用该密码登入了。
  • ⑧ 密码失效日期:这个日期与第 3 字段一样,都是使用 1970 年 1 月 1 日以来的总日数来设定的。这个字段表示:这个账号在此字段规定的日期之后,将无法再使用,无论这个账号的密码是否过期。
  • ⑨ 保留:最后一个字段是用来保留,留给以后的新功能。

/etc/group 文件的内容结构

/etc/group 中记录了 GID 与 组名的对应在这里插入图片描述
如上图所示,/etc/group中的每一行都是一个群组的相关信息,并用 : 来分割不同的字段,共有 4 个字段,分别是:

  • ① 组名
  • ② 群组密码:通常是给群组管理员设定的,较少使用,同时与用户密码一样,群组密码已经移动到 /etc/gshadow 中去了,因此只会存在一个 x
  • ③ GID:群组的 ID
  • ④ 此群组支持的账号:一个账号可以加入多个群组,一个群组可以支持多个账号。当某个账号想要加入此群组时,将该账号填入这个字段即可

/etc/gshadow 文件的内容结构

/etc/gshadow 中存放的是群组密码的相关数据。也是用 : 来分割字段,总共有 4 个字段:

  • ① 组名
  • ② 群组密码:若开头为 ! 则表示无合法密码,所以无群组管理员
  • ③ 群组管理员的账号(相关信息在 /etc/gpasswd 中)
  • ④ 该群组支持的账号

有效群组(effective group) 与 初始群组(initial group)

初始群组

在 /etc/passwd 里面的第 4 个字段是 GID,那个 GID 就是初始群组。也就是当用户一登入系统,就立刻拥有这个群组的相关权限。
需要注意的是,一个用户的初始群组,不会在 /etc/group 中该群组的第 4 个字段(即群组支持的账号)中加入该用户账号。

若一个用户同时加入了两个群组 A 和 B,那么在读取/写入/执行 文件时,针对所属群组部分,就拥有了 A和B 这个两个群组的权限。

有效群组

但是若是想要建立一个新的文件或是新的目录,那么这个新文件的所属群组是 A 还是 B呢?这就需要看一下当时的有效群组(effective group)。

可以使用命令:groups 查看当前用户加入的所有群组,第一个输出的群组即为有效群组。若此时去建立一个新文件,那么这个文件的所属群组就是该有效群组。

扫描二维码关注公众号,回复: 5893404 查看本文章

可以使用命令:newgrp 群组名 来变更有效群组,但是想要切换的群组必须是当前用户已经加入了的群组。
需要注意的是,newgrp 这个指令是让使用者使用另一个 Shell 来登入,且新的 Shell 基于用户的有效 GID 就是新的群组的 GID,可以输入 exit 来回到原本的 Shell 中。
在这里插入图片描述


增加与删除用户

1. 新建用户:useradd

useradd [选项] 用户账号名

选项 意义
-u 后面接的是 UID,给新建的用户指定一个特定的 UID
-g 后面接的是群组名,是一个初始群组(initial group),该群组的 GID 会被放到 /etc/passwd 的第 4 个字段中
-G 后面接的是组名,该组名是这个新建用户还可以加入的群组,这个选项与参数会修改 /etc/group 内相应群组的第 4 个字段所支持的用户
-M 不建立家目录(系统账号默认)
-m 建立家目录(一般账号默认)
-c 就是 /etc/passwd 中第 5 个字段用户信息说明栏的内容,可以添加一些用户的相关信息
-d 指定某个目录成为家目录,要用绝对路径
-r 建立一个系统账号,这个账号的 UID 会有限制,可以参考 /etc/login.defs 文件
-s 后面接一个 Shell,若没有指定默认的是 /bin/bash
-e 后面接一个日期,格式为 YYYY-MM-DD,此项目是写入 /etc/shadow 中的第 8 个字段(即用户失效日期)
-f 指定密码是否会失效,0 为立刻失效,-1 为永远不失效

在建立一个新的用户时,Linux 会默认帮我们做一些更新:

  • ① 在 /etc/passwd 中建立一行与账号相关的数据
  • ② 在 /etc/shadow 中将此账号的密码等参数填入,若只是建立,还未设密码,则为空
  • ③ 在 /etc/group 中加入一个与账号名称一模一样的组名
  • ④ 在 /home 地下建立一个与账号同名的目录作为用户家目录,且权限为 700
useradd -D

useradd 这些默认的设置,如:为何使用的是 /bin/bash 这个 shell等,其实都是由 useradd 所使用的参考档案来设置的。

可以使用命令:useradd -D 来查看 useradd 所使用的默认值:
在这里插入图片描述

  • 1. GROUP=100:新建账号的初始群组使用的 GID 为100,即 users 这个群组。
    但是 Linux 有两种针对群组的不同机制:
    ① 私有群组机制:系统会建立一个与账号一样的群组给使用者作为初始群组。使用这种机制将不会参考 GROUP=100 这个设定值。代表的发行版本有:RHEL、Fedora、CentOS 等
    ② 公共群组机制:就是以 GROUP=100 这个设定值作为新建账号的初始群组,因此每个账号都属于 users 这个群组,且默认家目录的权限通常会是:drwxr-xr-x 。代表的发行版本有:SuSE 等。

  • 2. HOME=/home:用户家目录的基准目录

  • 3. INACTIVE=-1:密码过期后是否会失效的设定值。在 shadow 的第 7 个字段设置了在密码过期后还要过多久密码才会失效的时间,这个项目就可以指定该天数了。如果是 0 代表密码过期后立刻失效;如果是 -1 代表密码用于不会失效;如果是数字,如 30,则代表过期 30 天后密码失效

  • 4. EXPIRE=:账号失效的日期,通常不会设定此项目

  • 5. SHELL=/bin/bash:默认使用的 shell 程序文件名。如果你的系统为 mail server,且希望每个账号只能使用 email 的收发信件功能,而不允许用户登入趋同取得 shell,那么可以将这里设定为 /sbin/nologin,这样一来,新建的用户默认就无法登入

  • 6. SKEL=/etc/skel:用户家目录设置参考的基准目录。也就是说,我们的用户家目录中的各项数据都是由 /etc/skel 所复制过去的。所以我们可以建立 /etc/skel/www 这个目录,这样在以后新建用户后,在他的家目录下就会有 www 那个目录了

  • 7. CREATE_MAIL_SPOOL=yes:建立使用者的 mailbox

/etc/login.defs

除了这些基本的账号设定值外,UID/GID 还有密码参数是在 /etc/login.defs 这个文件中设置的。

使用命令:grep -v "^#" /etc/login.defs | grep -v "^$" 来过滤掉 /etc/login.defs 文件中的注释(#) 和 空行($)
在这里插入图片描述

  • MAIL_DIR:用户默认邮件信箱放置目录
  • PASS_MAX_DAYS:/etc/shadow 内的第 5 栏,即多久需要变成密码的天数
  • PASS_MIN_LEN:密码最短的字符长度,已经被 pam 模块取代了,失去了效用
  • PASS_WARN_AGE:/etc/shadow 内的第 6 栏,即过期前多少天会发出警告的天数
  • UID_MIN:用户最小的 UID
  • UID_MAX:用户能够用的最大 UID
  • SYS_UID_MIN:系统账户的最小 UID
  • SYS_UID_MSX:系统账户的最大 UID
  • GID_MIN:用户自定义组的最小 GID
  • GID_MAX:用户自定义组的最大 GID
  • CREATE_HOME:是否主动建立用户家目录
  • UMASK:用户家目录建立的 umask,即目录的默认权限(777),会减去的权限,此处为 077,因此用户家目录的权限会使 700
  • USERGROUPS_ENAB:使用 userdel 删除用户时,是否会删除初始群组
  • ENCRYPT_METHOD:用户密码加密的方法

2. passwd:给用户设置密码

默认情况下,使用 useradd 建立了账号后,该账号是暂时被封锁的,也就是说该账号目前还无法登入。若想登入,则还需要为用户设置一个密码。

passwd [选项] [用户]
若是后面没有加用户,则说明是修改当前登录用户自己的密码。

选项 意义
–stdin 可以透过来自前一个管线的数据,作为密码输入
-l 是 Lock 的意思,会将 /etc/shadow 的第 2 个字段(密码字段)前加上 !,使密码失效
-u 与 -l 相对,是 Unlock 的意思
-S 列出密码相关参数,即 /etc/shadow 文件内的大部分信息
-n 后面接天数,/etc/shadow 的第 4 个字段,即修改密码后多少天内不可再次修改密码的天数
-x 后面接天数,/etc/shadow 的第 5 个字段,即多久内必须要修改密码
-w 后面接天数,/etc/shadow 的第 6 个字段,即密码过期前的警告天数
-i 后面接日期,/etc/shadow 的第 7 个字段,即密码失效日期

3. chage:修改密码参数和查看更详细的密码参数

可以使用 chage 来查看比 passwd -S 更详细的密码参数

chage [选项] 账号名

选项 意义
-l 列出该账号的详细密码参数
-d 后面接日期,修改 /etc/shadow 中第 3 个字段,即最近一次更改密码的日期,格式为 YYYY-MM-DD
-m 后面接天数,修改 /etc/shadow 中第 4 个字段,即密码修改后多少天内不能再次修改的天数
-M 后面接天数,修改 /etc/shadow 中第 5 个字段,即密码多少天需要进行一次修改
-W 后面接天数,修改 /etc/shadow 中第 6 个字段,即密码过期前警告的天数
-I 后面接图案书,修改 /etc/shadow 中第 7 个字段,即密码过期时间后多少天密码会失效
-E 后面接日期,修改 /etc/shadow 中第 8 个字段,即密码失效日期,格式为 YYYY-MM-DD

可以使用命令:chage -d 0 账号名 来强制让用户在第一次登入后,必须更改密码才能使用系统资源。


4. usermod:修改用户账号的设置

usermod [选项] 用户名

选项 意义
-I 后面接账号名称,修改用户账号的名称,即 /etc/passwd 中的第 1 个字段
-u 后面接 UID,修改用户的 UID,即/etc/passwd 中的第 3 个字段
-g 后面接初始群组,修改用户的初始群组,即修改 /etc/passwd 中的第 4 个字段,GID 字段
-c 后面接账号的说明,即 /etc/passwd 中第 5 个字段
-d 后面接用户的家目录,即修改 /etc/passwd 中的第 6 个字段,用户家目录
-f 后面接天数,修改密码过期后多少天会失效的天数,即 /etc/shadow 中第 7 个字段
-e 后面接日期,修改 密码的失效日期,即/etc/shadow 中第 8 个字段,格式为 YYYY-MM-DD
-G 后面接次要群组,修改这个用户加入的群组,即 /etc/group 中第 4 个字段
-a 增加次要群组,而不是设定次要群组
-s 后面接 Shell 的实际文件,如:/bin/bash 或 /bin/csh
-L 暂时将用户的密码冻结,使其无法登入,实质是修改 /etc/shadow 的密码字段,在其前加上 !
-U 解冻,即将 /etc/shadow 的密码字段前的 !去掉

5. userdel:删除用户的相关数据

用户的数据有:

  • 用户账号相关参数:/etc/passwd
  • 用户密码相关参数:/etc/shadow
  • 用户群组相关参数:/etc/group
  • 用户群组密码相关参数:/etc/gshadow
  • 用户个人文件数据:/home/username、/var/spool/mail/username ……

userdel [-r] 用户名
若加上了 -r 选项,则连同用户的家目录也一起删除。

使用 userdel 这个命令时需要特别小心。
通常我们要删除一个账号的时候,可以手动的将 /etc/passwd/etc/shadow 中相关账号的数据删除即可;
若只是暂时不启用,那么可以将 /etc/shadow 中账号的失效日期(即第 8 个字段)设为 0;
若不想让该用户在主机上留下任何数据了,采用 userdel

若想将某个账号完全删除,在使用 userdel -r username 之前,可以使用 find / -user 用户名 来找出整个系统中属于该用户的文件,再加以删除。


新增和删除群组

1. groupadd:建立群组

groupadd [选项] 群组名

选项 意义
-g 后面接某个特定的 GID,用来直接给予某个 GID
-r 建立系统群组,与 /etc/login.defs 内的 GID_MIN 有关
2. groupmod:修改群组的某些参数

groupmod [选项] 群组名

选项 意义
-g 修改 GID
-n 修改群组名
3. groupdel:删除群组

groupdel 群组名

但是若存在某个账号的初始群组是该群组,那么该群组就无法删除。
若还是想要删除该群组,则需要先将该账号的删除,或修改该账号的 GID。

4. gpasswd:群组管理员设置
① 系统管理员 root 可使用的选项

gpasswd [选项] 群组名

选项 意义
-A 后面接用户,就是将群组的管理员设置为此用户
-M 将某些账号加入到该群组中
-r 删除群组的密码
-R 让群组的密码失效

使用 gpasswd 群组名 可以为该群组设置密码。

② 群组管理员可使用的选项

gpasswd [选项] 用户名 群组名

选项 意义
-a 将某位用户加入到群组中
-d 将某位用户移除出该群组

一般用户管理账号的命令

useradd / usermod / userdel 等命令都是系统管理员才能执行的命令,下面介绍一些一般身份的用户常用的账号数据变更和查询命令

1. finger:查阅用户相关信息

finger [选项] 用户名

选项 意义
-s 仅列出用户的账号、全名、终端机代号和登入时间
-m 列出后面接的账号完全相同的,而不是部分相同
2. chfn:修改 finger 信息
3. chsh:修改 Shell

chsh [选项]

选项 意义
-l 列出目前系统上可用的 shell,其实就是 /etc/shells 的内容
-s 后面接可用的 shell,设定修改自己的 shell

在这里插入图片描述
无论是 chfn 还是 chsh,都能让一般用户修改 /etc/passwd 这个系统文件,因此这两个命令文件的权限都具有 SUID 权限。

4. id:查询 UID / GID 的信息

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43915762/article/details/89291642