【Linux】用户管理

1.用户标识符

当我们登入Linux系统时,会要求我们输入用户名称和密码

实际上,Linux主机并不认识我们的账号名称,他是通过我们的ID(唯一标识符),和我们的学号是一个道理,学校可能存在同名的学生,但是每个学生的学号(ID)是唯一的,我们通过学号可以准确的找到某个学生。因此,账号是我们用户可以直观看到的,而对主机,他看到的是ID,那Linux主机是如何对应咱们的账号和ID的呢?

实际上,主机会在系统的配置文件中查找来确认,主要是passwd和shadow这两个文件(用户相关),还有group和gshadow这两个文件(群组相关)

当我们输入正确的密码之后,咱们就可以进入shell环境,也就是看到命令行了

这个过程主要发生了这些事情:

  1. 主机会进入**/etc/passwd里面查找是否有该账号,如果有就会从该配置文件读出该账号的UIDGID**(在**/etc/group**),同时并读出家目录和shell设定,可以发现我们每次登录后的当前路径都默认为工作目录下
  2. 进入**/etc/shadow**,根据UID核对密码
  3. 上面两步都成功,则进入shell环境,否则会显示拒绝登录,拒绝密码之类的话语

每一个文件都有拥有者和所属群组两个属性,因此,每个登录的用户也对应要取得两个ID,一个用户ID(user ID,UID),一个群组ID(group ID,GID)。

1.1UID

我们可以看一下用户的UID(在/etc/passwd中)

我们重点看圈出来的两行,一个是root用户,另一个是我用root给自己创建的另一个普通用户

不难发现,passwd文件中一行代表一个用户账号,且每行的字符串中间每栏用':'分割

下图是每栏所代表的含义

Linux中对UID的限制如下:

|-------------|------------------------------------------------------------------|
| UID范围 | 用户 |
| 0 | 系统管理员(root) |
| 201~999 | 保留给系统使用的ID 系统中的一些服务希望使用较小的权限去运作,所以需要提供一些用户账号去运行这些程序,这些账号通常是不可登入的 |
| 1000~60000 | 普通用户 |

在/etc/login.defs中,也可以查看UID及GID的范围

1.2GID

虽然在/etc/passwd中可以查看GID,但是关于GID更详细的信息存放在/etc/group中

group文件中一行代表一个群组

四栏分别代表以下含义:

  1. 群组名称
  2. 群组密码
  3. GID
  4. 此群组内的用户账号(可以有多个,用','分割)

在/etc/passwd和/etc/group中,主机可以查到用户账号和UID以及群组名称和GID的对应关系,并且很显然,两个文件中每行的第二栏都是密码字段,但是都显示x,早期Unix系统中,密码是显示在这一栏中的,观察这个配置文件的权限:rw-r--r--,即所有人都可以读取,所以后来就把密码放到**/etc/shadow中了,群组的密码对应放到了/etc/gshadow**中

查看下/etc/shadow文件的内容

同样,每行是一个用户账号

一行总共9栏,含义如下:

  1. 账号名称
  2. 密码:看起来是一堆奇怪字符,这是加密过后的密码
  3. 最近改动密码的日期:以1970年1月1日为起点的天数显示
  4. 密码锁定的天数(相对于第三栏):修改密码后的若干天不允许再修改
  5. 密码需要重新变更的天数(相对于第三栏):有的系统会强制要求用户定期变更密码以保证安全,更改密码后的若干天内需要变更,否则密码过期
  6. 强制变更期限前的警告倒计时(相对于第五栏)
  7. 密码过期后的宽限日期(相对于第五栏):密码过期后仍然可以登录系统,因为该密码仍有效
  8. 失效日期:过了该日期密码就会失效,此时就不能使用密码登录系统了
  9. 保留供以后使用

2.新增和删除用户

2.1useradd与passwd

在Linux系统中增加新用户

指令:useradd -选项 用户名称

不使用选项,直接创建一个新用户

在配置文件中使用账号名称筛选,可以发现配置文件已经有LiMing的相关信息了

使用指令useradd -D可以查看useradd指令的参考文件

事实上,我们不使用选项创建新用户,系统会帮助我们设定一些默认值,比如预设账号的初始群组(GROUP),家目录(HOME),密码过期后是否失效(INACTIVE),失效日期(EXPIRE),shell程序文件名(SHELL)等

当然,如果想要自己指定预设值,我们可以通过选项指定参数,常用选项如下

|--------|------------------------------------|
| option | 功能 |
| -u | 后面接UID,给新用户指定UID |
| -g | 后接想要预设的群组名称 |
| -G | 后接该用户还可以加入的群组 |
| -M | 不建立用户家目录(系统账号) |
| -m | 建立用户家目录(普通账号) |
| -c | /etc/passwd文件中第五栏的用户说明 |
| -d | 指定某个目录为家目录(绝对路径) |
| -r | 建立系统账号 |
| -s | 预设shell程序文件名 |
| -e | 后接日期(YYYY-MM-DD),账号失效日期 |
| -f | /etc/shadow第七个字段,密码是否会失效(0会-1永久有效) |

新增一个用户之后,该账号暂时被封锁,无法登入,在/etc/shadow的第二个字段(密码)可以发现 !! ,意思就是该账号没有设置密码

设置密码指令:passwd -选项 用户名称

不使用选项,直接给LiMing设置密码

实际上,和我们平时设置微信,QQ等账户的密码一样,系统会对我们的密码格式有一点要求,比如长度最少为12位,至少包含数字,英文字符,特殊字符中的几类等,但是我以root用户的身份设置时,虽然第一遍输入的密码被认定是一个坏密码,但是我第二次输入同样的密码后,系统也会接收改密码。

📖Note:

  • root用户下的操作要慎重
  • root用户为普通用户设置密码,passwd + 账号,千万不要忘记加账号,直接输入passwd就是更改当前用户的密码,即root用户更改root的密码

当然,普通用户也是可以更改自己的密码的

普通用户登录成功之后,直接输入passwd更改自己的密码。

与root更改不同,普通用户设定的密码有严格要求:

  1. 普通用户必须先输入原密码(current)
  2. 输入新密码,且新密码必须严格遵守格式,所有的bad password都不会通过验证
  3. 新密码不能与原密码有太高相似度
  4. 重试了最大次数(3)后仍然失败,三次密码验证都没通过,重新下达passwd指令就行,直到出现successfully提示,则密码设置成功

passwd指令选项

|--------|--------------------------------------|
| option | 功能 |
| -l | Lock,在/etc/shadow的第二栏(密码)前加上! ,使密码失效 |
| -u | Unlock |
| -S | 列出密码相关参数 |
| -n | 多久不可修改密码天数。shadow第四栏 |
| -x | 多久必须更改密码。shadow第五栏 |
| -w | 密码过期前的警告天数。shadow第六栏 |
| -i | 密码过期后到失效的宽限日期。shadow第七栏 |

我们举个例子,设置账号LiMing的密码在过期后10天就失效,/etc/shadow第七栏会变成10

当然,这里我们并没有设置多久更改密码的限制,因此这个参数此时是无效的,因为这个失效宽限日期是相对于过期的账号来说的

2.2usermod

usermod用于新增账号成功后,修改某个参数

指令:usermod -选项 用户名称

|--------|---------------------------------------|
| option | 功能 |
| -c | 账号说明信息,/etc/passwd第五栏 |
| -d | 家目录,/etc/passwd第六栏 |
| -e | 后接日期,格式YYYY-MM-D,/etc/shadow第八栏(失效日期) |
| -f | 后接天数,/etc/shadow第七栏(失效宽限时间) |
| -g | 后接初始群组,/etc/passwd第四栏(GID) |
| -G | 后接次要群组,修改/etc/group |
| -a | 与-G合用,增加次要群组 |
| -l | 修改账号名称,/etc/passwd第一栏 |
| -s | 修改shell的预设文件 |
| -u | 修改UID,/etc/passwd第三栏 |
| -L | 冻结用户密码 |
| -U | 解冻用户密码 |

其实usermod和useradd的选项非常类似,usermod是对useradd增加的用户信息进行微调的

📖📖Note:

所有指令参数都不需要强制记忆,如果用到了某条指令,他的选项是可以查阅文档的哦,使用我们之前讲解过的强大的man指令即可!参考https://blog.csdn.net/m0_64538862/article/details/157847066?spm=1001.2014.3001.5501

2.3userdel

删除用户:userdel -选项 账号名称

常用选项:-r 连同用户的家目录一起删除

📖📖Note:

  • 作为root用户,下达该指令要慎重。userdel会删除用户的所有数据
  • 一般移除一个账号,我们手动更改配置文件(/etc/passwd和/etc/shadow)即可
  • 若某个账号暂时不启用,将/etc/shadow的第八个字段(失效日期)设为0,则该账号无法使用但是账号相关的所有数据会保存下来

3.新增和移除群组

3.1有效群组和初始群组

上面我们多次提到了初始群组的概念,接下来我们详细讲解

在我们上边useradd的实例中,可以发现,新增一个用户账号时,他的GID(/etc/passwd第四栏,/etc/group第三栏)并不为空,且GID=UID,这是基于Linux distributions所采用的群组机制的,我们这里使用的centos采用私有群组机制,当创建一个新用户时,系统会建立一个与账号同名的群组作为初始群组,这样每一个新用户都拥有自己的群组,具有很好的保密性


采用私有群组机制:Fedora,centos....

采用公共群组机制:把GROUP=100这个设定值作为新用户的初始群组,即每个新用户都属于users这个群组,大家可以共享家目录内的数据,代表性的如SuSE

对于初始群组(一个),我们一登入系统,就获得这个群组的相关权限

一个用户可以加入多个群组,在usermod中,-G选项可以为用户添加群组

可以发现,已经把LiMing这个账号加入到lxj这群组中了。但是/etc/passwd第四栏,/etc/group第三栏中的GID仍然为1002(LiMing),这就是LiMing的初始群组;而lxj对LiMing来说是非初始群组,lxj是我们手动为LiMing添加的一个群组,LiMing也可以拥有lxj这个群组的相关权限,所以此时LiMing就拥有两个群组的相关权限了。


那么LiMing建立一个新的文件,这个文件输入那个群组呢,所以我们引入有效群组

上图中,切换到用户LiMing,使用groups指令查看LiMing的所属群组,没错儿,是两个,并且规定第一个是当前用户的有效群组,即LiMing,他创建的新文件是属于群组LiMing的


那LiMing想在lxj群组中创建文件该怎么办,那肯定就是把有效群组变成lxj了

指令:newgrp 有效群组

📖Note:

  • newgrp指令变更目前用户的有效群组,并且创建一个新的shell环境,所以如果想要返回到原本的环境中,使用exit退出哦!

3.2群组管理员与gpasswd

一个群组中可能会有若干的群组成员,我们可以使用root管理这些成员,但是root作为整个系统的管理员,他的任务太繁忙了,所以对于群组,我们可以设置一个群组管理员,给他权限去管理,使用gpasswd指令就可以实现

指令:gpasswd -选项 群组名

上图中,gpasswd不带任何选项,功能是为群组设置密码

上图中,gpasswd带-A(Adiminister)选项,功能是为群组设置管理员

同时我们在/etc/gshadow配置文件中可以发现设置成功

在/etc/gshadow中,四栏的含义分别如下:

  1. 群组名
  2. 密码,开头问!表示无合法密码,所以无群组管理员
  3. 群组管理员账号
  4. 群组内成员

3.3groupadd与groupdel

新增群组:groupadd -选项 群组名

选项:

  1. -g:指定GID
  2. -r:建立系统群组

删除群组:groupdel -选项 群组名

📖Note:

  • 初始化群组不可以被删除哦

参考:参考:《鸟哥的Linux私房菜》第十四章

相关推荐
安科士andxe8 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
小白同学_C11 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖11 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
2601_9491465311 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天11 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS12 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师12 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp12 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
不做无法实现的梦~13 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
Elastic 中国社区官方博客13 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索