Linux账号和群组

Linux系统登录需要用户名和密码,但是不同的用户拥有不同的权限。有一位特殊的存在:root—— 系统管理员,它在系统中拥有全部权限,可以管理用户的文件权限、目录权限等等。接下来就围绕账号与群组进行具体讨论。

Linux账号与群组

UID和GID

对于用户,记住Linux系统的用户名和密码足矣,然而对于Linux主机,则需要记住用户的UID(User ID)和密码。首先我们要有一个概念:Linux系统由文件组成包括目录也是文件组成。 Linux规定所有的配置文件都保存在/etc目录下,而每个用户名和UID的对应则保存在/etc/passwd文件中。以前用户的密码也保存在/etc/passwd文件中,但是目前用户的密码在/etc/shadow文件中密文保存。

每个用户都必须属于一个组,在未指定所属组的情况下,用户的组为自己本身。同样,组由于GID(Group ID)被Linux主机记住,组名和GID的对应保存在/etc/group文件中。

每个Linux文件都属于用户和组,Linux系统依据/etc/passwd和/etc/group中的内容,找到UID/GID对应的用户名和组名显示出来。因此,若随意更改/etc/passwd中用户的UID,会导致此用户的文件无法显示名字,并且/home/用户 无法登入(因为UID更改,而家目录所属UID未变)。

用户账号与群组

用户登录Linux系统,需要利用tty1~tty6终端机的login接口,并且输入用户名和密码。或者使用ssh进行远程登录。而输入用户名和密码后,Linux系统的验证流程如下:

  1. 进入/etc/passwd,查找是否存在这个用户名,如果有再读出UID和GID,shell和家目录。
  2. 进入/etc/shadow,核验用户名和密码是否对应,如果对应则用户进入到Shell界面。

/etc/passwd的每一行代表了一个用户,而其中的某些为系统用户,例如bin,deamon等等。

而每一行的固定格式为:

用户名:密码(x):UID:GID:用户信息说明栏:家目录:Shell

需注意,UID为0代表用户为系统管理员,因此root的UID为0,除此之外设置其余用户的UID为0也可以做到让其变为系统管理员。

/etc/shadow的每一行存储了密码相关的字段,固定格式为:

用户名:密码:最近更改密码的日期:密码不可更动的天数:密码需要重新更动的天数:密码需要变更期限前的提醒天数:密码过期后的宽限天数:用户失效日期:保留字段

举个例子:

root:xxx:16659:5:60:7:5:16679:

密码可更改的日期:16664

密码提醒更改的日期:16722-16729

密码更改宽限的日期:16734

用户失效日期:16679

其中,/etc/shadow中查看加密方式,$1$表示MD5加密,$5$表示SHA-256,$6$表示SHA-512。

/etc/group的每一行代表一个群组,格式为:

组名:密码:GID:支持的用户名

账号相关文件之间的UID/GID与密码相关性示意图

img12-20241017163842-kxs91dn

群组

有效群组(effective group):每个用户可以同属多个群组,用户的有效群组决定了新建文件的所属组。

1
2
3
groups [user]

std输出>> dmtsai wheel users #其中,第一个群组为有效群组
1
newgrp [group] #在所属群组的范围中,临时切换有效群组,退出当前shell即还原有效群组

初始群组(initial group):用户一登录系统便拥有初始群组的所有权限。

/etc/gshadow格式

组名:密码:群组管理员账号:群组成员

总结

Linux账户与群组是Linux系统权限划分的有效工具,不同角色,不同群组可以有不同的权限。

账号和群组管理

新增账号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#普通建立账号
useradd [user]

#指定账号UID
useradd -u 10250 [user]

#指定初始群组
useradd -g [group]

#指定附加群组
useradd -G [group]

#不指定家目录
useradd -M [user]

#指定家目录
useradd -d [绝对路径]

#指定shell
useradd -s [shell]

#普通建立账号的默认值
useradd -D

std输出>>GROUP=100
std输出>>HOME=/home
std输出>>INACTIVE=-1
std输出>>EXPIRE=
std输出>>SHELL=/bin/bash
std输出>>SKEL=/etc/skel
std输出>>CREATE_MAIL_SPOOL=yes

/etc/default/useradd

普通建立账号的默认值可从本文件编辑,其中:

  1. GROUP=100,为公共群组的GID,而RHEL、CENTOS中为私有群组,因此GID会由系统自动分配
  2. HOME=/home,为用户家目录的基础目录(basedir)
  3. INACTIVE=-1,密码过期后是否会失效,过多久失效的设置
  4. EXPIRE=,账号的失效日期
  5. SHELL=/bin/bash,默认SHELL名称
  6. SKEL=/etc/skel,用户家目录参考目录,新建账号时会从/etc/skel/*复制到用户家目录
  7. CREATE_MAIL_SPOOL=yes,是否建立用户的mailbox

除了以上账号的基本设定值以外,UID/GID和密码等其他默认参数由/etc/login.defs决定,此处省略对login.defs的介绍。

用户建立以后,需要马上设定密码,否则无法登录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#普通设置密码
passwd [user]

#锁定用户
passwd -l [user]

#解锁用户
passwd -u [user]

#查看用户的shadow信息
passwd -S [user]

#管道命令明文设置密码
echo "password" | passwd --stdin [user]

更详细地显示密码参数

1
2
3
4
5
6
7
8
9
10
11
#显示详细参数
chage -l [user]

#最近一次修改密码日期设置
chage -d [YYYY-MM-DD] [user] # 若YYYY-MM-DD=0则表示用户下一次登录必须重新设置过密码

#用户失效日期设置
chage -E [YYYY-MM-DD] [user] # shadow第8个字段,无法登录

#密码过期设置
chage -I [YYYY-MM-DD] [user] # shadow第7个字段,无法使用此密码登录

修改账号信息

方式1:通过/etc/passwd和/etc/group修改

方式2:通过usermod命令修改

1
2
3
4
5
usermod -L/-U [user] # 同passwd -l/-u
usermod [选项] [user] # 同useradd选项

#使账号失效
usermod -e 0 [user]

删除账号

用户的相关数据都会在账号被删除的时候清除,相关数据有:

  1. 用户账号、密码数据:/etc/passwd,/etc/shadow
  2. 群组数据:/etc/group,/etc/gshadow
  3. 个人文件数据:/home/username,/var/spool/mail/username…
1
2
3
4
5
#普通删除账号
userdel [user]

#删除账号,连同家目录-r
userdel -r username

用户功能

  1. 查看id(UID/GID)
1
id [user]

增删改群组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#普通增加群组
groupadd [group]

#增加的同时指定GID
groupadd -g [GID] [group]

#修改GID
groupmod -g [GID] [group] # 此命令少用,容易造成系统资源错乱

#修改群组名字
groupmod -n [newName] [oldName]

#删除附件群组
groupdel [group] # 删除初始群组通常需要先删除用户,或者更改其GID再删除

成员管理

  1. gpasswd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#给群组设置密码(root)
gpasswd [group]

#给群组设置管理员(root)
gpasswd -A [user] [group]

#新增成员(root)
gpasswd -M [user] [group]

#删除密码/使密码失效(root)
gpasswd -r/-R [group]

#新增/移除成员(Group Admin、root)
gpasswd -a/-d [user] [group]

改变文件所属组

  1. chgrp
1
2
3
4
5
#普通更改
chgrp [group] [file] #group需要在/etc/group中存在

#递归更改子目录但不包括符号链接
chgrp -hR [group] [file]
  1. chown
1
2
3
4
5
#更改属主和属组
chown [user]:[group] [file]

#递归更改属主和属组但不包括符号链接
chown -hR [user]:[group] [file]

总结

给出了关于账号和群组的增删查改相关的命令。