侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 743 篇文章
  • 累计创建 64 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(11)之用户及用户组介绍

zze
zze
2019-09-30 / 0 评论 / 0 点赞 / 555 阅读 / 7496 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
每个用户账号都拥有一个唯一的用户名和各自的口令。
用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
实现用户账号的管理,要完成的工作主要有如下几个方面:

  1. 用户账号的添加、删除与修改。
  2. 用户口令的管理。
  3. 用户组的管理。

用户的分类

Linux 用户可分为 2 类,一类是管理员用户,即 root,另一类则是普通用户,也可以说除了 root 用户以外的用户都是普通用户。
用户和 Linux 系统的交互是通过用户名,而在 Linux 系统中每一个用户都还有一个一个 UID 与每一个用户对应。

  • root 用户对应的 UID 为 0;
  • 普通用户对应的 UID 范围为 1-65535;

而普通用户又可以分为 2 类,分别是系统用户和登录用户。
对于 CentOS 6 而言:

  • 系统用户对应的 UID 范围为 1-499;
  • 登录用户对应的 UID 范围为 500+;

对于 CentOS 7 而言:

  • 系统用户对应的 UID 范围为 1-999;
  • 登录用户对应的 UID 范围为 1000+;

系统用户的主要作用是为守护(服务)类进程获取资源进行权限分配,而登录用户主要用来完成交互式登录使用。

用户组

Linux 用户管理中有一个组的概念,相当于一个容器,它的作用是将多个用户与某一类权限建立关联关系,是实现权限指派的一种机制,在其它场景下偶尔也成为角色(role)。
Linux 用户组按角色的划分可以分为 2 种,每一个组同样有它对应的 GID:

  • 管理员组,包含 root 用户,GID 固定为 0;
  • 普通组,在普通组内部又可分为系统组与普通组,系统组对应 GID 范围为 1-499;普通组对应 GID 范围为 500+;

安全上下文

我们对计算机的操作是通过运行程序完成的,运行起来的程序称为进程(process)。而进程则一定是以发起者的身份来运行的,进程所拥有的权限就是发起者身份拥有的权限,这就是 Linux 中的安全上下文。

进程能拥有访问哪些资源的权限取决于进程发起者的身份。

用户组的类别

Linux 组有 2 类:

  • 用户的基本组(主组):用户必须以某个组身份去运行程序,基本组可看作为用户初始所属组。
  • 用户的附加组(额外组):一个用户做任何命令执行时必须拥有某个组的身份,这个组通常是主组,而当用户操作进程访问某些资源判定该用户是否有某个权限时,不一定非要依赖主组判断,还可以通过附加组判断。

一个用户创建文件,该文件的属主通常是该用户本身,而属组一般是该用户的主组。

用户的基本组可能与用户本身的用户名同名,且该基本组就仅有一个同名用户,该组就可称为用户自己的私有组。
创建一个用户时,如果没有明确给该用户指定一个组,那么就会自动创建一个该用户的私有组。

Linux用户和组相关的配置文件

对 Linux 主机来讲,用户的账号、组的相关信息都是保存在 /etc 下的某些配置文件中。

  • /etc/passwd:该文件并不是保存密码,而是保存用户及其属性信息(用户名、UID、基本组 ID...)。
  • /etc/group:组及其属性信息。
  • /etc/shadow:用户密码及其相关属性(包含用户密码的有效期限等等)。
  • /etc/gshadow:组密码及其相关属性(组的密码在用户完成基本组切换时使用)。

/etc/passwd

内容:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

内容格式:

name:password:UID:GID:GECOS:directory:shell

含义:

  • name:用户名。
  • passwd:密码,出于安全考虑,passwd 实际上只是密码占位符,内容都为 x
  • UID:用户 ID。
  • GID:用户所属基本组 ID。
  • GECOS:用户的详细信息,多个时使用 , 分隔。
  • directory:用户的家目录。
  • shell:用户默认使用的 shell 程序。

/etc/group

内容:

root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
input:x:999:
systemd-journal:x:190:
systemd-network:x:192:
dbus:x:81:
polkitd:x:998:
ssh_keys:x:997:
sshd:x:74:
postdrop:x:90:
postfix:x:89:
chrony:x:996:
cgred:x:995:
dockerroot:x:994:

内容格式:

group_name:password:GID:user_list

含义:

  • group_name:组名。
  • password:组密码占位符。
  • GID:组 ID 号。
  • user_list:以当前组为附加组的用户列表,有多个时用 , 分隔。

/etc/shadow

内容:

root:$6$yqKQaf9v5HQRgsrH$keg8lpeKUSEF9jMST0X04ntAVMxZFYU4Jy.fbuUrakPcB6xjFGMHTkCsreHn7HjTMwQjF3vRBRI5HvhnMr4MS0::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
shutdown:*:17834:0:99999:7:::
halt:*:17834:0:99999:7:::
mail:*:17834:0:99999:7:::
operator:*:17834:0:99999:7:::
games:*:17834:0:99999:7:::
ftp:*:17834:0:99999:7:::
nobody:*:17834:0:99999:7:::
systemd-network:!!:18145::::::
dbus:!!:18145::::::
polkitd:!!:18145::::::
sshd:!!:18145::::::
postfix:!!:18145::::::
chrony:!!:18145::::::

描述:
/etc/shadow 名为影子化了的密码文件,它包含系统账户的密码信息和可选的年龄信息。如果没有维护好密码安全,此文件绝对不能让普通用户可读。此文件的每行包括 9 个字段,使用半角冒号 (“:”) 分隔,顺序如下:

  1. 登录名:必须是有效的账户名,且已经存在于系统中。
  2. 加密了的密码:请参考 crypt(3) 来了解关于解析此字符串的细节信息。如果密码字段包含一些不是 crypt(3) 合法结果的字符,比如 ! 或 *,用户将无法使用 unix 密码登录(但是可以通过其它方法登录系统)。此字段可以为空,此时认证为特定的登录名时,不要求密码。然而,一些读取 /etc/shadow 文件的应用程序,在密码字段为空时,可能决定禁止任何访问。以叹号开始的密码字段意味着密码被锁定。该行的剩余字符表示锁定之前的密码。
  3. 最后一次更改密码的日期:最近一次更改密码的时间,表示从1970年1月1日开始的天数。0 有特殊意思,表示用户应该在下次登录系统时更改密码。空字段表示密码年龄功能被禁用。
  4. 密码的最小年龄:最小密码年龄是指,用户一次更改密码之后,要等多长时间才再次被允许更改密码。空字段或 0 表示没有最小密码年龄。
  5. 最大密码年龄:最大密码年龄是指,这写天之后,用户必须更改密码。这写天之后,密码仍然可用。用户将会在下次登录的时候被要求更改密码。空字段表示没有最大密码年龄,没有密码警告时间段,没有密码禁用时间段(请看下边)。如果最大密码年龄小于最小密码年龄,用户将会不能更改密码。
  6. 密码警告时间段:密码过期之前,提前警告用户的的天数(请参考上边的密码的最大年龄)。空字段或者 0 表示没有密码警告期。
  7. 密码禁用期:密码过期(查看上边的密码最大年龄)后,仍然接受此密码的天数(在此期间,用户应该在下次登录时修改密码)。密码到期并且过了这个宽限期之后,使用用户的当前的密码将会不能登录。用户需要联系系统管理员。空字段表示没有强制密码过期。
  8. 账户过期日期:账户过期的日期,表示从1970年1月1日开始的天数。注意,账户过期不同于密码过期。账户过期时,用户将不被允许登录;密码过期时,用户将不被允许使用其密码登录。空字段表示账户永不过期。应该避免使用 0,因为它既能理解成永不过期也能理解成在1970年1月1日过期。
  9. 保留字段:此字段保留作将来使用。

CentOS 7 中可通过 man 5 shadow 查看上述信息。

/etc/gshadow

内容:

root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
games:::
tape:::
video:::
ftp:::
lock:::
audio:::
nobody:::
users:::
utmp:!::
utempter:!::
input:!::
systemd-journal:!::
systemd-network:!::
dbus:!::
polkitd:!::
ssh_keys:!::
sshd:!::
postdrop:!::
postfix:!::
chrony:!::

/etc/gshadow/etc/group 的加密资讯文件,比如用户组(Group)管理密码就是存放在这个文件。/etc/gshadow/etc/group 是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。比如我们不想让一些非用户组成员永久拥有用户组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码;
/etc/gshadow 格式如下,每个用户组独占一行;

groupname:password:admin,admin,...:member,member,...

第一字段:用户组名。
第二字段:用户组密码,这个段可以是空的或!,如果是空的或有!,表示没有密码;
第三字段:用户组管理者,这个字段也可为空,如果有多个用户组管理者,用,号分割;
第四字段:组成员,如果有多个成员,用 , 号分割;

补充

加密的几种方式

bash 默认提供了几种加密方式,分别是 md5、sha1、sha224、sha256、sha384、sha512。
使用方式也很简单,在对应加密名称后加上 sum 就是命令名称,比如要使用 md5 加密,只需使用 md5sum 命令即可,例:

[root@localhost ~]# md5sum /etc/passwd
4022cc06f1f2fa60d0eecb807417c1c4  /etc/passwd
0

评论区