Linux 用户系统

用户系统

概述

为什么 Linux 需要提供用户管理机制?

  • 核心:[用户管理机制是用于 文件的安全防护措施]{.red}
  • 描述:普通用户只有具备权限才可以进行操作;系统管理员拥有最大的权限从而可以进行 [任何操作]{.green}

Linux 用户管理机制分为几个级别?

  • 定义:① 用户 ② 用户组 ② 其他用户组
8da1f87ae15b28af0420e033acaf4aed.png

用户管理

概述

  • 定义:文件的拥有者

  • 分类:

    • 普通账号:可以被正常登陆使用的账号
    • 系统账号:[系统正常运行所必须的用户:不可以被登陆使用的账号]{.red}
  • 用户标识符( UID ):

    • 定义:每个用户都具有的唯一标识符
    • 系统管理员( UID=0 ):[可以拥有多个系统管理员:多个用户标识符为 0 的用户]{.red}
    • 系统账号( 1<UID<999 ):1<UID<200:系统自行建立的账号,201<UID<999:用户自行建立的系统账号
    • 普通账号( 1000<UID<60000 ):最新版本的内核已经支持普通账号数量达到 2^32 - 1 个
    • 细节:[采用普通的方式建立用户时标识符必须不同,但是可以修改文件使得两个账号标识符相同]{.red}
  • 用户家目录:

    • 定义:每个 [普通用户]{.red} 登陆后默认进入的目录 / 每个 [普通用户]{.red} 被创建后默认拥有的目录
    • 细节:
      • [系统账号默认不具有家目录]{.red} (/etc/passwd 会记录系统账号的家目录但是并不会生成)
      • [用户家目录默认只有自己可以访问,用户家目录名默认和用户账号名相同]{.red}
      • 用户家目录默认创建在 /home 目录下并且内容为空(参考 /etc/default/useradd 文件就知道为什么了)
  • 配置文件

    • /etc/passwd:[记录用户各种信息的配置文件:任何用户都具有权限操作]{.red}

      用户名 : 密码 : 用户标识符 : 组标识符 : 描述性内容 : 家目录 : 使用的 Shell

      注:[任何用户都具有权限操作所以密码不可以记录在该配置文件中]{.red}

      # 普通用户账号的记录
      # 原本的密码确实记录在 passwd 文件中,但是由于不安全所以后续就放入了 shadow 文件中,这里的密码字段就采用 x 代替
      fuyusakaiori:x:1000:1000::/home/fuyusakaiori:/bin/bash
      # 系统用户账号的记录:注意这里系统账号虽然被记录具有家目录,但是这个家目录是没有被创建的
      system:x:991:986::/home/system:/bin/bash
    • /etc/shadow:[记录用户密码的配置文件:仅有系统管理员具有权限操作]{.red}

      用户名 : 加密密码 : 最近修改时间 : 下次修改密码最少间隔时间 : 下次修改密码最大间隔时间 : 密码即将过期时提前警告的时间 : 密码过期后经过多少天失效 : 账号失效时间 : 保留

      (1) CentOS 加密方式采用 SHA512

      (2) [加密密码前添加 !或者 * 会导致密码失效]{.red}(锁定密码的原理也是这个)

      (3) 密码失效 后该账号就无法登陆了,密码过期 后仍然可以登陆账号,只是系统会提示修改密码

      # 用户的密码记录
      fuyusakaiori:$6$gio2YePg$/yShZXZO9OhGGivMslwpSNBkwsUXoCmaq/N/qhmQY168uqcQ5ifDLTktvidGXy6SDhAqP/bhErzaJrB2Mf9aw.:18838:0:99999:7:::
      # 查询加密方式
      authconfig --test | grep hashing
  • 登陆流程

    • 系统查找 /etc/passwd 文件看是否存在输入的账号:如果存在就将记录读取出来并且进行下一步;如果不存在显然无法登陆
    • 系统查找 /etc/shadow 文件看账号密码是否正确:如果正确就能够正常登陆;如果不正确显然也无法登陆

管理

  • 前提:[新增、删除、修改用户仅有系统管理员可以使用;用户功能则是普通用户都可以使用的]{.red}

  • 新增用户

    • 命令:[useradd [-u uid] [-g 初始用户组] [-G 次要用户组] [-d 家目录绝对路径] 新增用户名]{.green}

      [useradd 新增用户名]{.green}:创建用户时使用默认设置(只要没有指定的内容都默认参考配置文件 /etc/default/useradd 进行设置)

      [root@localhost ~]:useradd username

      [useradd -u uid 新增用户名]{.green}:创建用户时指定用户标识符

      # 普通用户指定用户标识符:(1) 不能够指定已经存在的用户标识符 (2) 可以使用系统账号范围中的标识符,但是不会被视为系统账号,最好不要这样做
      [root@localhost ~]:useradd -u 2200 username
      # 系统用户指定用户标识符:必须添加 -r 选项才可以真正创建系统账户
      [root@localhost ~]:useradd -r -u 450 username

      [useradd -g 初始用户组 -G 次要用户组]{.green}

      (1) [每个用户可以加入多个不同的用户组]{.green}:设置的时候仅可以设置一个,如果需要更多则需要使用其他命令进行追加

      (2) 每个用户默认的初始用户组是自身:不指定初始用户组时会自行创建一个和用户名称相同的用户组,并将用户添加进该用户组

      # 指定的用户组必须是存在的
      [root@localhost ~]:useradd -g initgroup -G othergroup username

      [useradd -d 家目录绝对路径]{.green}

      (1) [可以自定义家目录的名称,即可以不和账户名相同]{.red}

      (2) 每个用户默认家目录名称和用户名称相同,并且默认创建家目录,系统账号除外

      # 家目录路径建议使用绝对路径
      [root@localhost ~]:useradd -d pathname username

      [passwd [-u] [-l] [-S]用户名]{.green}:

      (1) 账号完成创建之后通常没有密码,需要设置密码才可以登录该账号

      (2) 如果不填写用户名,那么修改的就是系统管理员的账号密码

      (3) [系统管理员无论设置何种样式的密码都是可以被接受的,普通用户必须严格按照规范设置密码,否则不予通过]{.red}( PAM 模块检验 )

      # 密码的形式是严格限制的
      # 1. 密码不能够和账号相同 # 5. 密码不要使用简单的关系式
      # 2. 密码尽量不要选择用字典里面会出现的字符串 # 6. 密码尽量使用大小写字符、数字、特殊字符的组合
      # 3. 密码需要超过 8 个字符
      # 4. 密码不要使用个人信息
      [root@localhost ~]:passwd username
      # 锁定密码:即使密码失效,账号无法登陆
      [root@localhost ~]:passwd -l username
      # 解锁密码:让密码重新生效
      [root@localhost ~]:passwd -u username
      # 列出密码相关的详细信息:即 /etc/shadow 中的记录
      [root@localhost ~]:passwd -S username
    • 配置文件:/etc/default/useradd:创建用户时默认值的配置文件

      GROUP:配置用户默认进入的用户组(CentOS、RHEL、Fedora 发行版没有采用该默认值、SUSE 采用该默认值(用户组机制))

      # 默认每个用户都添加进入标识符为 100 的用户组(user 组)
      GROUP=100

      HOME:配置用户家目录默认位置([系统管理员的家目录并不在该目录下]{.red)

      # 默认每个用户的家目录都存放在 /home 目录下
      HOME=/home

      INACTIVE:配置密码过期是否失效(-1 :密码即使过期也永不失效;0 :密码过期后立刻失效;其他数字:经过多少天后失效)

      # 默认密码永不过期:
      INACTIVE=-1

      EXPIRE:配置账号是否失效(可以在会员付费的系统中使用该属性)

      # 默认永不失效
      EXPIRE=

      SHELL:配置用户登陆使用的命令行程序

      # 默认使用 bash
      SHELL=/bin/bash

      SKEL:配置家目录创建参考的基准目录(该目录下有什么,家目录创建时也会具有相应的内容)

      # 该目录下默认为空
      SKEL=/etc/skel
      CREATE_MAIL_SPOOL=yes
  • 删除用户

    • 命令:[userdel [-r] 用户名]{.green}

      [userdel 用户名]{.green}:[删除用户但是保留用户的家目录下的所有文件]{.red}

      # 该用户被删除后尽管保留了家目录但是依然不可以登陆了
      [root@localhost ~]:userdel username

      [userdel -r 用户名]{.green}:[删除用户并且不保留家目录]{.red}

      [root@localhost ~]:userdel -r username
  • 修改用户

    • 命令:[usermod [-g 初始用户组] [-G 次要用户组] [-d 家目录路径] [-a 增加的用户组] [-l 新的用户名] [-u 新的uid] 用户名]{.green}

      [usermod [-g 初始用户组] [-G 次要用户组] [-d 家目录路径]]{.green}:更新用户所属的初始用户组,次要用户组,家目录路径

      		

      [usermod -aG 增加的用户组 用户名]{.green}:

      (1) [每次仅可以追加一个次要用户组,不可以追加多个]{.red}

      (2) 必须配合 -G 选项使用

      # 可以使用用户功能中提供的 groups 命令查看当前用户到底属于哪些组
      [root@localhost ~]:usermod -aG firstgroup username
      [root@localhost ~]:usermod -aG secondgroup username

      [usermod -l 新的用户名 -u 新的uid 用户名]{.green}

      # uid 尽量在创建之后不要乱改,容易出问题
      [root@localhost ~]:usermod -l newusername -u uid username
  • 用户功能

    • 命令:

      [id 用户名]{.green}:查看用户的相关信息

      [root@localhost ~]:id username

用户组管理

概述

  • 定义:多个相互协作的用户组成的集合

  • 用户组标识符( GID ):每个用户组都具有的唯一的标识符

    注:[用户组也分为系统用户组和普通用户组,用户组标识符遵循的规范和用户标识符是一致的]{.red}

  • 用户组机制

    • 私有用户组机制:[每个用户建立时,系统会建立一个相应的用户组,并将该新用户放入新用户组中]{.red}

      注:CentOS、RHEL、Fedora 采用私有用户组机制

    • 公有用户组机制:每个用户建立时,系统直接将其放入用户组默认值中( users 组)

      注:SUSE 采用公有用户组机制

  • 分类:

    • 有效用户组:[每个文件所属的用户组都是该用户的有效用户组]{.red}
    • 次要用户组:用户存在于组内,但是对于文件来说是其他用户组
  • 配置文件

    • /etc/group:记录用户组相关的所有信息的配置文件

      用户组名 : 用户组密码 : 用户组标识符 : 用户组支持的账号名称

      (1) 用户组密码:每个组都可以设置 用户组管理员,用户组密码提供给用户组管理员使用,用户组管理员可以自行进行用户相关操作(用户组管理员现在实际已经被 sudo 命令代替)

      (2) [系统默认建立的用户组是不会将该组中的用户添加进去的]{.red},所以看到的可能是空白

      # 用户自行建立组:密码依然为 x 保存在 gshadow 文件中
      anime:x:1001:shinobu
      # 新增用户时系统默认建立的用户组
      fuyusakaiori:x:1000:
    • /etc/gshadow:记录用户组密码相关的所有信息配置文件([用户组通常禁止使用密码]{.red})

      anime:!::shinobu

管理

  • 前提:[新增、删除、切换用户组的命令只能够由系统管理员使用]{.red}(包括用户组管理员)

  • 新增用户组:[groupadd [-g gid] [-r] 用户组名称]{.green}

    [groupadd -g gid 用户组名称]{.green}

    # 建立普通的用户组
    [root@localhost ~]:groupadd -g 1145 groupname
    # 建立系统用户组
    [root@localhost ~]:groupadd -r -g 450 groupname
  • 删除用户组:[groupdel 用户组名称]{.green}

    • [删除的用户组必须是没有用户作为初始用户组]{.red}:如果有用户在创建时就制定了该用户组,那么只要这个用户存在,那么这个用户组就不能够删除

    • [非空的用户组都是可以删除的,除了初始用户组]{.red}

      [root@localhost ~]:groupdel groupname
  • 查看用户所属用户组:[groups 用户名]{.green}:查看当前用户所属的用户组([命令输出的第一个用户组为有效用户组]{.red})

    # 如果不添加用户名的话就是查看当前用户所属的用户组
    [root@localhost ~]:groups username
  • 切换有效用户组:[newgrp 用户组名]{.green}

    # 切换的有效用户组必须是该用户支持的用户组
    [root@localhost ~]:newgrps groupname

运行级别

  • 级别 0:关机
  • 级别 1:单用户(++找回密码++)
  • 级别 2:多用户状态没有网络
  • 级别 3:++多用户状态有网络服务++
  • 级别 4:系统未使用保留给用户
  • 级别 5:图形用户界面
  • 级别 6:系统重启
# 切换运行级别
init status
# 获取当前系统的运行级别
systemctl get-default
# 设置默认运行级别为图形化界面:需要 root 权限
systemctl set-default graphical.target
Author: Fuyusakaiori
Link: http://example.com/2021/09/11/linux/Linux 用户系统/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.