用户类型 | UID | 权限作用 |
---|---|---|
root超级管理员用户 | 0 | 最高权限 |
虚拟用户(傀儡用户) | 1-999 | 在运行程序的时候必须使用一个用户在执行,而且用户不需要登录操作系统 |
普通用户 | 1000-65535 | 登录操作系统使用的用户 |
1. 配置文件介绍
在Linux系统中创建、添加、删除用户和用户组,实际上都是修改系统上对应的文件。和用户用户组直接相关的文件主要有:/etc/passwd
,/etc/shadow
,/etc/group
,/etc/gshadow
这四个文件。
1.1 用户相关的配置文件
/etc/passwd #<==存储用户信息的文件。
/etc/shadow #<==存储用户密码信息的文件。
# 命令行执行命令
useradd newuser # 添加用户实际上就是修改上述两个文件,/etc/passwd、/etc/shadow
passwd newuser # 设置修改密码实际上就是修改密码所在的文件,/etc/shadow
存储用户信息文件
/etc/passwd
文件是Linux系统中的重要系统文件之一,主要作用是存储系统用户的信息。文件中的每一行表示一个用户信息,有多少行就表示有多少个用户信息。
仔细观察其中的一行,可以看出各行内容之间通过引号“:”
划分为多个字段,共7部分,分别定义了用户的不同属性,这里使用head
命令查看/etc/passwd
文件的前5行显示:
[root@localhost ~]# head -5 /etc/passwd # <==通过head命令查看/etc/passwd的前5行。
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
...省略其他...
提示:在passwd文件中有很多虚拟用户,比如bin、daemon等,一般来说,这些用户都是系统正常运行所需要的,在不确定的情况下,请不要随意删改此类用户。
在passwd文件中,第一行的内容就是超级用户root所在的行,我们可以看到它的UID和GID都为0,为了让读者能够清晰地了解passwd文件中内容的含义,列举了下表,以供参考。
- 以passwd文件中root一行为例介绍各个字段的作用
root | :x | :0 | :0 | :root | :/root | :/bin/bash |
---|---|---|---|---|---|---|
用户名 | :用户密码 | :用户UID | :用户组GID | :用户说明 | :用户家目录 | :shell解释器 |
- 对passwd文件中每一行各个字段的详细说明
字段名称 | 注释说明 |
---|---|
用户名 | 与用户UID相对应,这是用户登录时使用的用户名称,在系统中是唯一的,不能重名 |
用户密码 | 早期的Unix系统中,该字段是用于存放用户密码的,基于安全原因,后来将这个密码字段的内容移到/etc/shadow文件中了。从这个位置可以看到一个字母x,表示该用户的密码是保护在/etc/shadow文件中的 |
用户UID | 用户UID一般是由一个整数来表示的,默认范围是0~60000,最大可以到65535。 |
用户组GID | 用户GID一般也是由一个整数来表示的,范围、最大值与用户UID相同,添加用户时,默认情况下会同时建立一个与用户同名且ID相同的组 |
用户说明 | 对用户的描述说明,可以为空 |
用户家目录 | 用户登录后默认进入的目录,一般为“/home/用户名”这样的目录 |
shell解释器 | 当前用户登录后所使用的解释器。在 CentOS/Red Hat等主流Linux系统中,默认的解释器为bash。 如果不希望用户登录系统,那么可以通过 usermod 或者手工修改passwd配置,将解释器类型改为/sbin/nologin 即可。如果你仔细查看passwd文件,会发现大部分内置系统的虚拟用户的这个字段都是/sbin/nologin ,表示禁止登录系统,这是出于安全考虑进行的设置 |
- /etc/passwd文件的权限
[root@localhost ~]# ls -l /etc/passwd
-rw-r--r--. 1 root root 1214 Apr 30 20:41 /etc/passwd # 所有用户都有读的权限。
因为每个用户登录时都需要取得
UID
与GID
来判断权限,所以/etc/passwd
文件的权限为644
,但这样一来就会带来安全问题,即所有的用户都可以读/etc/passwd
文件。即使文件内的密码是加密的,也还是存在一定的被攻击破解的安全隐患。因此,后来就将密码的信息移动到/etc/shadow
文件了。
存储用户密码信息的文件
由于passwd文件必须要被所有的用户读取,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。下面我们来看一下/etc/shadow
文件的权限:
[root@localhost ~]# ls -l /etc/shadow
---------- 1 root root 681 Mar 30 08:59 /etc/shadow # 理论上所有用户都没有权限。
查看/etc/shadow
文件权限,发现所有用户均不可读(root用户除外),其文件具体内容是:
[root@localhost ~]# head -5 /etc/shadow # 通过head命令查看/etc/shadow的前5行。
root:$6$xTyEY0ruiSVt6yVU$DDkAYnnhWdX3Ks0zH4ENQHmN35/2SB7Hrt9MdDYi7W9zoyvFLxgRT73tdRptiKvZedoVdRD9CBzCKWYYnhdxQ/:17598:0:99999:7::: # 一长串特殊字符是设置了密码以后加密的数据信息。
bin:*:17246:0:99999:7:::
daemon:*:17246:0:99999:7:::
adm:*:17246:0:99999:7:::
lp:*:17246:0:99999:7:::
和/etc/passwd
文件类似,/etc/shadow
文件中的每一行内容也是以冒号(:)作为分隔符的,共九个字段,内容如下:
字段名称 | 注释说明 |
---|---|
用户名 | 用户名称 |
用户密码 | 密码加密后的字符串 |
最近修改密码的时间 | 从1970年1月1日起,到用户最近一次更改密码的天数 |
禁止修改密码的天数 | 从1970年1月1日起,到用户可以更改密码的天数 |
用户必须修改密码的天数 | 从1970年1月1日起,到用户必须更改密码的天数 |
警告修改密码的期限 | 在用户密码过期之前多少天提醒用户更改密码 |
不活动时间 | 在用户密码过期之后到禁用账户的天数 |
失效时间 | 从1970年1月1日起,到用户被禁用的天数 |
标志 | 保留 |
- 提示:
使用
useradd
命令添加用户会相应更改/etc/passwd
、/etc/shadow、/etc/group
、/etc/gshadow
。使用 passwd 命令为用户设置密码会更改
/etc/shadow
。
1.2 用户组相关配置文件
/etc/group #<==用户组信息文件。
/etc/gshadow #<==用户组密码信息文件。
useradd newuser # 添加用户实际上也会修改上述两个文件(因为会创建同名用户组)
groupadd newuser # 添加用户实际上就是修改上述两个文件
用户组信息文件
/etc/group
文件是存储用户组相关信息的文件,内容包含用户组名称、用户组GID等属性。/etc/group
文件同/etc/passwd
文件的权限相同,也是644
,示例如下:
[root@localhost ~]# ls -l /etc/group
-rw-r--r--. 1 root root 652 Apr 30 20:42 /etc/group
/etc/group
文件的实际内容格式为:
[root@localhost ~]# head -5 /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
...省略部分...
group文件各个字段的说明
字段名称 | 注释说明 |
---|---|
用户组名 | 用户组的名称 |
用户组密码 | 通常不需要设置该密码,基于安全原因,该密码被记录在/etc/gshadow 中,因此,显示为“x”。这有点类似于/etc/shadow |
GID | 用户组的ID |
用户组成员 | 加入这个组的所有用户(附加组成员,即用“-G”加入的成员) |
提示:
使用
groupadd
命令添加用户组会更改/etc/group
、/etc/gshadow
。
存储用户组密码的文件
/etc/gshadow
是存储用户组密码信息的文件。比如,用户组管理密码就存放在这个文件中。/etc/gshadow
和/etc/group
是两个互补的文件;早期对于大型服务器,针对很多用户和用户组,定制一些关系结构比较复杂的权限模型,可以选择设置用户组密码。比如,如果不想让一些非用户组成员永久拥有用户组的权限和特性,那么可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码了。
在实际运维工作中,一般是用不到这个功能的。
/etc/gshadow
文件权限及内容格式如下,每个用户组独占一行:
[root@localhost ~]# ls -l /etc/gshadow
----------. 1 root root 530 Apr 30 20:42 /etc/gshadow
[root@localhost ~]# head -5 /etc/gshadow
root:::
bin:::bin,daemon
daemon:::bin,daemon
sys:::bin,adm
adm:::adm,daemon
...省略部分...
gshadow文件中每一行各个字段的详细说明:
字段名称 | 注释说明 |
---|---|
用户组名 | 用户组的名称 |
用户组密码 | 这个段可以是空的或“!”,如果是空的或有“! ”,则表示没有密码 |
用户组管理员用户 | 用户组管理者,这个字段也可以为空,如果存在多个用户组管理者,则用“,”号进行分割 |
用户组成员 | 加入这个组的所有用户,列表中多个用户之间可通过“,”进行分隔 |
2. 命令介绍
2.1 用户管理的常见命令
命令 | 注释说明 |
---|---|
用户直接相关的命令 | |
useradd | 添加用户 |
usermod | 修改用户信息 |
userdel | 删除用户及与用户相关联的配置或文件 |
用户密码直接相关的命令 | |
passwd | 为用户设置或修改密码 |
chpasswd | 批量更新用户密码 |
chage | 修改用户密码属性信息 |
与其他用户相关的命令 | |
id | 查看用户的UID、GID及所归属的用户组信息 |
su | 切换用户角色工具 |
sudo | 以一个其他用户身份(主要是root 用户))执行命令的工具,普通用户用来提权的重要工具 |
visudo | 用于编辑suders配置文件( sudo授权文件)的工具 |
有关用户组管理的常见命令汇总
命令 | 注释说明 |
---|---|
groupadd | 添加用户组 |
groupdel | 删除用户组 |
groupmod | 修改用户组信息 |
gpasswd | 为用户组设置密码 |
groups | 显示用户所属的用户组 |
newgrp | 更改用户所属的有效用户组 |
2.2 添加用户命令useradd
useradd命令的工作原理
当不带任何参数使用useradd
命令添加用户时,首先会读取配置文件/etc/login.defs
和/etc/default/useradd
中预先定义的规则,并且根据设置的规则添加用户,同时向 /etc/passwd
和 /etc/group
文件内添加新建的用户和用户组记录。系统还会根据 /etc/login.defs
和 /etc/default/useradd
文件中的配置信息创建用户的家目录,并且复制/etc/skel
中的隐藏环境配置文件到新用户的家目录中,以完成对用户环境的初始化设置。
1)与创建用户相关的文件/etc/login.defs
/etc/login.defs
文件的作用是预先定义创建用户时需要的一些用户默认配置信息。如创建用户时,是否需要家目录,以及UID
和GID
的取值起始值及取值范围,用户及密码的有效期限等,完整功能参考/etc/logins.defs
文件的内容及注释说明:
[root@localhost ~]# cat /etc/login.defs
...忽略若干注释行...
# *REQUIRED*
# Directory where mailboxes reside, _or_ name of file, relative to the
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
# QMAIL_DIR is for Qmail
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail #<==设定用户对应的mail文件所在的路径。
#MAIL_FILE .mail
# Password aging controls:
...忽略若干注释行...
PASS_MAX_DAYS 99999 #<==密码最长可以使用的天数。
PASS_MIN_DAYS 0 #<==更换密码的最小天数。
PASS_MIN_LEN 5 #<==密码的最小长度。
PASS_WARN_AGE 7 #<==密码失效之前提前多少天开始警告。
# Min/max values for automatic uid selection in useradd
UID_MIN 1000 #<==默认最小UID为1000,也就是说添加用户时,UID是从1000开始的。
UID_MAX 60000 #<==默认最大UID为60000。
# System accounts
SYS_UID_MIN 201
SYS_UID_MAX 999
# Min/max values for automatic gid selection in groupadd
GID_MIN 1000 #<==默认最小GID为1000,也就是说添加用户时,GID是从1000开始的。
GID_MAX 60000 #<==默认最大GID为60000。
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#USERDEL_CMD /usr/sbin/userdel_local #<==删除用户时,删除与用户相关的所有工作,默认关闭。
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
CREATE_HOME yes #<==是否创建用户家目录,默认要求创建;可以用-m参数进行控制。
# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077 #<==家目录对应umask默认值。
# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes #<==删除用户同时删除用户组(如果用户组没有其他成员,则删除)。
# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512 #<==密码加密算法SHA512。
2)与创建用户相关的文件/etc/default/useradd
/etc/default/useradd
文件是在使用useradd添加用户时预先加载的默认用户信息配置文件,可以使用“useradd-D
参数”修改此文件的配置,当然,也可以直接使用vim编辑器来修改文件里面的内容,下面就来看看它的内容,具体如下:
[root@localhost ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100 #<==依赖于/etc/login.defs的USERGROUPS_ENAB参数,如果为no,则此处控制。
HOME=/home #<==在/home目录下创建用户的家目录。
INACTIVE=-1 #<==是否启用用户过期停权,-1表示不启用。
EXPIRE= #<==用户终止日期,不设置表示不启用。
SHELL=/bin/bash #<==新用户默认使用的Shell解释器类型。
SKEL=/etc/skel #<==配置新用户家目录的默认环境变量文件的存放路径。当我们使用useradd添加用户时,用户家目录下的隐藏环境变量文件,都是从这里配置的/etc/skel目录中复制过去的。
CREATE_MAIL_SPOOL=yes #<==创建mail文件。
3)与创建用户相关的目录/etc/skel
/etc/skel
目录是用来存放新用户需要的所有基础环境变量文件的目录,当添加新用户时,这个目录下的所有文件都会被自动复制到新添加的用户的家目录下;默认情况下,/etc/skel
目录下的所有文件都是隐藏文件(以点号开头的文件),通过修改、添加、删除/etc/skel目录下的环境变量文件,我们可为新创建的用户提供统一的、标准的、定制化的初始化用户环境。
[root@localhost ~]# ls -la /etc/skel/
-rw-r--r--. 1 root root 18 Mar 23 2017 .bash_logout #<==用户环境变量文件,退出时加载。
-rw-r--r--. 1 root root 176 Mar 23 2017 .bash_profile #<==用户环境变量文件,登录时加载。
-rw-r--r--. 1 root root 124 Mar 23 2017 .bashrc #<==用户环境变量文件,登录时加载。
问题:用户登录到Linux系统后,发现提示符为如下所示的异常情况,请问如何恢复到正常的Linux命令行提示符情况?
-bash-4.1$ -bash-4.1$ # 故障原因就是,用户家目录下的环境变量不存在了。
故障恢复方案及步骤:
-bash-4.1$ cp /etc/skel/.bash* ~/ #<==从/etc/skel中将所有环境变量文件复制回来,注意当前用户。 -bash-4.1$ logout #<==可以按快捷键(Ctrl+D),退出当前环境。 [root@localhost ~]# su - test #<==重新切换到test用户下。 [test@localhost ~]$ #<==故障排除了。
useradd命令的常用参数介绍
参数选项 | 注释说明 |
---|---|
-c | 设置新用户在passwd文件中的说明字段的信息 |
-d | 新用户每次登录时使用的家目录 |
-e | 用户终止日期,日期指定格式为MM/DD/YY |
-f | 用户过期几日后永久停权。当值为0时用户立刻被停权。而当值为-1时表示关闭此功能,预设值为-1 |
-g | 指定新用户所属的用户组ID,即GID。用户组名需为系统现存的名称 |
-G | 将新用户指定为多个不同用户组的成员。每个用户组均使用“,”(逗号)进行分隔。用户组名同“-g”选项的限制。默认值为用户的起始用户组 |
-m | 如果家目录不存在,则创建并指定用户家目录 |
-M | 不建立用户家目录,其优先于/etc/login.defs文件的设定。一般创建虚拟用户时不建立家目录,部署网络服务时需要创建虚拟用户 |
-n | 默认情况下,用户的用户组与用户的名称是相同的。如果添加了-n参数,就不会生成与用户同名的用户组了 |
-s | 用户登入后使用的解释器名称,默认为bash |
-u | 指定用户ID值,即所谓的UID |
useradd命令使用
# 语法结构:
useradd 参数选项 用户名称
# 一次只能创建一个用户
# 案例1.创建test用户,不加任何参数
1.默认UID GID按照passwd中的编号顺延
2.默认创建家目录
3.默认允许登录,默认创建的就是普通用户
[root@localocal ~]# useradd test
# 过滤passwd中是否存在test用户
[root@localhost ~]# grep test /etc/passwd
test:x:1003:1003::/home/test:/bin/bash
# 案例2.创建虚拟用户test01 不创建家目录 不允许登录操作系统
[root@localhost ~]# useradd -M -s /sbin/nologin test01
[root@localhost ~]# grep test01 /etc/passwd
test01:x:1004:1004::/home/test01:/sbin/nologin
# 案例3.创建虚拟用户test02 指定UID666 GID666 不创建家目录 不允许登录,如果指定GID,必须先创建组,然后再创建用户指定小组的id号
[root@localhost ~]# useradd -u666 -g666 -M -s /sbin/nologin test02
useradd: group '666' does not exist
# 因为GID666不存在,指定GID的话需要GID已存在
# 所以需要先创建组
[root@localhost ~]# groupadd -g666 test02
# 再创建用户
[root@localhost ~]# useradd -u666 -g666 -M -s /sbin/nologin test02
[root@localhost ~]# grep test02 /etc/passwd
test02:x:666:666::/home/test02:/sbin/nologin
# 如果指定UID不指定gid,小组会自动创建gid会顺延
[root@localhost ~]# useradd -u666 -M -s /sbin/nologin test03
[root@localhost ~]# grep test03 /etc/passwd
test03:x:666:1005::/home/test03:/sbin/nologin
2.3 用户信息修改命令usermod
usermod命令的功能非常强大,但在生产场景中其的使用频率不是很多,它不仅能更改用户的解释器类型、UID、家目录等,还能更改用户的有效期、登录名等很多与用户有关的信息。
usermod的作用是修改用户,而useradd的作用是添加用户,本质上都是对用户进行操作,因此,这两个命令大部分的参数作用都是一样的,只不过命令不同而已,功能上的区别就是一个是添加,一个是修改。
- 语法结构
usermod [options] [login]
usermod [选项] [用户名]
- usermod常用参数说明
参数选项 | 注释说明 |
---|---|
-c | 修改用户 passwd文件中用户的说明栏,同useradd 的 -c 功能 |
-d | 修改用户每次登入时所使用的家目录,同useradd 的-d功能 |
-e | 修改用户终止日期,同useradd的-e功能 |
-f | 修改用户过期几日后永久停权,同useradd 的-f功能 |
-g | 修改与用户对应的用户组,同useradd 的 -g功能 |
-G | 修改此用户为多个不同组的成员,同useradd 的-G功能 |
-m | 移动内容到用户的新目录,如果不存在就不会创建,与useradd 的 -m不同 |
-M | 不建立用户家目录,优先于/etc/login.defs文件设定。一般创建虚拟用户时不建立家目录,部署应用服务时需要创建虚拟用户 |
-n | 默认情况下,用户的用户组与用户的名称是相同的。如果命令添加了-n参数,则不会再生成与用户同名的用户组了 |
-s | 修改用户登入后使用的Shell名称,同useradd的-s功能 |
-u | 修改用户的ID值,同useradd 的-u功能 |
-a | 追加用户到用户组,仅与-G参数连用 |
-l | 修改用户账号名称 |
-L | 锁定用户密码 |
-U | 解除密码锁定 |
# 修改用户信息
[root@localhost ~]# usermod -u777 test02
[root@localhost ~]# id test02
uid=777(test02) gid=666(test02) groups=666(test02)
2.4 删除用户命令userdel
- 语法格式
userdel [options] [login]
userdel [选项] [用户名]
- userdel命令的参数选项及说明
参数选项 | 解释说明 |
---|---|
-f | 强制删除用户,即使用户当前已登录 |
-r | 删除用户的同时,删除与用户相关的所有文件(常用) |
-
userdel命令实践
-
在生产场景中,如果不能确认用户相关的目录有没有重要数据,就不能使用
-r
。 -
删除用户时,先进入
vi /etc/passwd
,然后注释掉用户,观察一段时间(建议1个月以上),这样若出问题还可以还原。 相当于进行操作前备份,将登录Shell修改为/sbin/nologin
。
-
提示:处于登录状态中的用户无法被删除。
2.5 添加用户组命令groupadd
groupadd命令的用途不大,因为useradd命令在创建用户的同时会创建与用户同名的用户组,正常情况下都可以满足创建用户组的需求。
- 命令语法
groupadd [options ] [group]
groupadd [选项] [用户组]
- groupadd命令的常见参数及说明
参数选项 | 注释说明 |
---|---|
-g | 指定用户组的GID,除非接-o参数,否则ID值唯一且不为负,如果不指定-g参数,则GID 从1000开始 |
-f | 新增一个账户,强制覆盖一个已存在的组账号 |
2.6 删除用户组命令groupdel
groupdel命令用于删除指定的用户组,此命令的使用频率极低,了解一下即可。
- 命令语法
groupdel [group]
groupdel [用户组]
groupdel不能删除还有用户归属的主用户组。
2.7 修改用户密码命令passwd
passwd命令可以修改用户密码及密码过期时间等内容,是工作中很常用的命令。 普通用户和超级用户都可以运行passwd命令,但普通用户只能更改自身的用户密码,超级用户root则可以设置或修改所有用户的密码。
- 命令语法
passwd [option] [username]
passwd [选项] [用户名]
- passwd命令常见参数及说明
参数选项 | 解释说明 |
---|---|
-k | 为密码已经过期的用户更新有效期 |
-l | 锁定用户,被锁定用户将不能登录。仅root用户有权使用该选项 |
–stdin | 从标准输入读取密码字符串 |
-u | 解除对用户的锁定。仅root用户有权使用该选项 |
-d | 删除用户的密码,使密码为空。仅root用户有权使用该选项 |
-e | 使用户密码立即过期,将在用户下次登录时强制用户修改密码。仅root用户有权使用该选项 |
-n | 设置修改密码的最短天数。仅root用户有权使用该选项 |
-x | 设置修改密码的最长天数。仅root用户有权使用该选项 |
-w | 设置用户在密码过期前多少天收到警告的信息。仅 root用户有权使用该选项 |
-i | 设置密码过期多少天之后禁用账户。仅root用户有权使用该选项 |
-S | 显示与用户密码相关的简单描述。仅root用户有权使用该选项 |
root用户可以修改任何用户的密码,普通用户只能修改自身的密码。
root用户修改密码时,如果不符合系统密码规则,则会给出警告信息,但密码设置仍然有效。 而普通用户修改密码时,如果使用的是弱密码,则会给出告警信息,且修改无效。
# 交互式:
# 1. passwd 直接回车修改当前登录用户的密码
# 2. passwd test # 指定修改test用户的密码
[root@localhost ~]# passwd # 修改root的密码
Changing password for user root.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
# 非交互式:
echo 密码|passwd --stdin 用户名
# 案例.修改test01的密码为123456
[root@localhost ~]# echo 123456|passwd --stdin test01
Changing password for user test01.
passwd: all authentication tokens updated successfully.
# 密码复杂度要求:
[root@localhost ~]# echo "L898#23iz%henya'I{am-18"
L898#23iz%henya'I{am-18
【密码软件工具】
win端密码管理工具:keepass、lastpass;
Linux端生成随机密码:
# 需要安装expect # 使用mkpasswd自动生成密码 [root@localhost ~]# mkpasswd (9lm8uPGb [root@localhost ~]# mkpasswd BJqcla05{ [root@localhost ~]# mkpasswd kt[47lxYA # mkpasswd -l len -d 最小数字个数 -C 大写字母个数 [root@localhost ~]# mkpasswd -l 15 -d 3 -C 5 tqHR9sqU)T9bM0c [root@localhost ~]# mkpasswd -l 15 -d 3 -C 5 I6VOlC2cdi&wuB3 [root@localhost ~]# mkpasswd -l 15 -d 3 -C 5
【MD5校验】
- MD5作用: 校验文件是否被篡改。
# 1.创建一个文件 [root@localhost ~]# echo aaaa > 1.txt [root@localhost ~]# cat 1.txt aaaa # 2.生成MD5校验值 [root@localhost ~]# md5sum 1.txt e5828c564f71fea3a12dde8bd5d27063 1.txt # 修改文件后,哈希值变化了 [root@localhost ~]# echo bbbb >> 1.txt [root@localhost ~]# md5sum 1.txt 7c438cbff62ba78d44b5b31ed043549b 1.txt
- 给单个或者多个文件做校验值
[root@localhost ~]# echo cccc > 2.txt [root@localhost ~]# ll total 8 -rw-r--r-- 1 root root 10 Nov 17 15:13 1.txt -rw-r--r-- 1 root root 5 Nov 17 15:16 2.txt [root@localhost ~]# md5sum 1.txt 2.txt 7c438cbff62ba78d44b5b31ed043549b 1.txt b26795c69684a7c9cc4a94ff70a95b71 2.txt [root@localhost~]# find ./ -type f -name "*.txt" ./1.txt ./2.txt ./ceshi/test/test.txt [root@localhost ~]# find ./ -type f -name "*.txt"|xargs md5sum 7c438cbff62ba78d44b5b31ed043549b ./1.txt b26795c69684a7c9cc4a94ff70a95b71 ./2.txt e5828c564f71fea3a12dde8bd5d27063 ./ceshi/test/test.txt
md5sum *.txt
不能找出目录下的文件;需要实现这种操作的时候,往往使用这种方式:find ./ -type f -name "*.txt"|xargs md5sum
- 保留最原始的未被修改过的MD5校验值写入文件中,然后进行校验
# 写入文件 [root@localhost ~]# md5sum 1.txt 2.txt > md5.log [root@localhost ~]# cat md5.log 7c438cbff62ba78d44b5b31ed043549b 1.txt b26795c69684a7c9cc4a94ff70a95b71 2.txt # 检测校验 [root@localhost ~]# md5sum -c md5.log 1.txt: OK 2.txt: OK [root@localhost ~]# ll total 12 -rw-r--r-- 1 root root 10 Nov 17 15:13 1.txt -rw-r--r-- 1 root root 5 Nov 17 15:16 2.txt [root@localhost ~]# cat md5.log 7c438cbff62ba78d44b5b31ed043549b 1.txt b26795c69684a7c9cc4a94ff70a95b71 2.txt # 修改文件1.txt [root@localhost ~]# echo yyyy >> 1.txt [root@localhost ~]# md5sum -c md5.log 1.txt: FAILED 2.txt: OK md5sum: WARNING: 1 computed checksum did NOT match
- 路径问题:为了防止在校验的时候出现找不到路径或找不到文件的问题,要求在使用md5sum进行生成哈希码的时候,文件都要使用绝对路径。
[root@localhost ~]# find /root/ -type f -name "*.txt" /root/1.txt /root/2.txt /root/ceshi/test/test.txt [root@localhost ~]# md5sum /root/*.txt 68a07a8bf1b376046f63285a80426ec7 /root/1.txt 3c88ec828e5489c32a25514871fa8a8f /root/2.txt [root@localhost ~]# md5sum /root/*.txt > md5.log [root@localhost ~]# cat md5.log 68a07a8bf1b376046f63285a80426ec7 /root/1.txt 3c88ec828e5489c32a25514871fa8a8f /root/2.txt [root@localhost ~]# cat md5.log 68a07a8bf1b376046f63285a80426ec7 /root/1.txt 3c88ec828e5489c32a25514871fa8a8f /root/2.txt [root@localhost ~]# cd /opt/ [root@localhost opt]# md5sum -c /root/md5.log /root/1.txt: OK /root/2.txt: OK
因为此时都是绝对路径,所以在其他位置也可以进行文件校验。
2.8 批量更新用户的密码命令chpasswd
chpasswd命令可从标准输入中读取一定格式的用户名、密码来批量更新用户的密码。 这个格式为用户名:密码
,注意,用户名必须事先真实存在,否则,该命令无法为一个不存在的用户设置密码。
- 批量修改密码的实践
第一步:要确保修改密码的用户存在
第二步:执行命令
- 方法1:命令行直接输入并执行
[root@localhost ~]# chpasswd #<==在命令行输入chpasswd,回车。
root:123456 #<==格式为“用户名:密码”,用户必须事先真实存在才行。
test:123456 #<==一行一个。
test01:123456
[root@localhost ~]# #<==在新的空行输入Ctrl+D结束输入。
- 方法2:将用户和密码字符串放到文件里执行
[root@localhost ~]# cat user.txt #<==用户及密码字符串文件,注意格式。
root:123456 #<==格式为“用户名:密码”,用户必须事先真实存在才行,且一行一个。
test:123456
test01:123456
[root@localhost ~]# chpasswd <user.txt #<==利用输入重定向一次性为所有用户设置预先指定的密码。
2.9 修改用户密码有效期命令chage
chage命令用于查看或修改用户密码的有效期,有些参数的功能与passwd相同。
- 命令语法格式:
chage [option] [login]
chage [选项] [用户名]
- chage命令的参数选项及说明
参数选项 | 解释说明 |
---|---|
-d | 设置上一次密码更改的日期 |
-E | 账号过期的日期。日期格式为YYYY-MM-DD |
-I(大写i) | 设置密码过期多少天后禁用账户 |
-l(小写L) | 显示账号有效期信息 |
-m | 密码可更改的最小天数。默认为0,表示任何时候都可以更改密码 |
-M | 密码保持有效的最大天数 |
-W | 密码到期之前,提前收到警告信息的天数 |
- 范例:创建新用户range,要求该用户在7天之内不能更改密码,60天以后必须修改密码,过期前10天通知用户,过期30天之后禁止用户登录。
[root@localhost ~]# useradd range #<==添加新用户range。
[root@localhost ~]# chage -m7 -M60 -W10 -I30 range #<==使用chage按题意要求进行授权。
[root@localhost ~]# chage -l range #<==-l参数用于查看账户的信息。
Last password change : May 01, 2018
#<==最后一次密码变化时间为2018-05-01,-d选项可控制该行。
Password expires : Jun 30, 2018
#<==密码过期时间为60天,即从2018-05-01到2018-06-30,该行受-M参数影响。
Password inactive : Jul 30, 2018
#<==密码停权时间,即密码过期30天后停权,-I选项可控制该行。
Account expires : never #<==账号过期时间,-E选项可控制该行。
Minimum number of days between password change : 7 #<==-m选项可控制该行。
Maximum number of days between password change : 60 #<==-M选项可控制该行。
Number of days of warning before password expires : 10 #<==-W选项可控制该行。
2.10 用户查询相关命令
查询用户的几种常见工具id
、finger
、users
、w
、who
、last
、lastlog
、groups
的用法。
id
命令通常用来查询用户和组信息以及对应的UID、GID等信息,它的用法非常简单
[root@localhost ~]# id test #<==查看test的用户及组相关的信息。
uid=1002(test)gid=1002(test)groups=1002(test) #<==用户和组信息以及对应的UID、GID。
[root@localhost ~]# id -u test #<==只查看用户UID。
1002
[root@localhost ~]# id -g test #<==只查看用户组GID。
1002
[root@localhost ~]# id -un test #<==只查看用户名。
test
[root@localhost ~]# id -gn test #<==只查看用户组名。
test
whoami
、who
、w
、last
、lastlog
命令
whoami
命令可用于查看当前登录的用户,who
和w
命令的作用是显示已经登录的用户,并且展示他都做了什么的信息。 而last
、lastlog
命令可以查看用户更详细的登录信息,不同命令的侧重点略有差别,大家可以仔细对比下。 示例代码具体如下:
[root@localhost ~]# whoami #<==查看当前登录的用户,比较常用。
root
[root@localhost ~]# w
#<==显示已经登录的用户,并且展示他都做了什么的信息。查看的信息与/var/run/utmp文件有关,比较常用。
21:34:56 up 5 days, 21:31, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 09:21 0.00s 0.30s 0.07s w
root pts/1 10.0.0.1 21:34 8.00s 0.04s 0.00s -bash
root pts/2 10.0.0.1 21:34 14.00s 0.04s 0.00s -bash
- 以下是上述w命令输出结果的格式说明。
上面第1行的输出依次显示了
当前的系统时间
、系统从启动到现在已经运行的时间
、登录到系统中的用户数
和系统平均负载
。 平均负载是指在1分钟、5分钟、15分钟之内系统的负载状况。
USER
:表示登录系统的用户。
TTY
:表示用户使用的TTY名称。
FROM
:表示用户从哪里登录进来,一般是显示远程登录主机的IP地址或者主机名。
LOGIN@
:用户登录的日期和时间。
IDLE
:显示终端空闲时间。
JCPU
:表示该终端上的所有进程及子进程使用系统的总时间。
PCPU
:当前活动进程使用的系统时间。
WHAT
:当前用户执行的进程名称和选项。
[root@localhost ~]# who #<==显示哪些用户正在登录,登录的终端及登录时间,来源主机,显示的信息比w少,不常用。
root pts/0 May 1 09:21 (10.0.0.1)
root pts/1 May 1 21:34 (10.0.0.1)
root pts/2 May 1 21:34 (10.0.0.1)
- 以下是who命令的输出格式及说明:
名称 [状态] 线路 时间 [活动] [进程标识] (主机名)
其中各项参数的说明具体如下。
名称:用户的登录名。
状态:表明线路对用户是否都是可写的。
线路:类似于pts/1、pts/2等,此线路标识在/dev目录中可以找到。
时间:用户登录系统的时间。
活动:某个用户在自己的线路上最后一次活动发生以来到现在的时间。 如果此项是个“.”,就表示一分钟内的线路活动; 如果线路保持静止已经超过24小时,或者自从系统启动以来还没有被使用过,那么此项标记为“old”。
进程标识:用户登录Shell的进程id。
主机名:登录到Linux系统上的客户端机器标识。
[root@localhost ~]# last
#<==显示已登录的用户列表及登录时间等,查看的信息与/var/log/wtmp及/var/log/btmp两个文件有关。
root pts/2 10.0.0.1 Tue May 1 21:34 still logged in
root pts/1 10.0.0.1 Tue May 1 21:34 still logged in
...省略部分信息...
root pts/0 10.0.0.1 Sat Mar 31 14:33 - 18:01 (03:28)
root tty1 Sat Mar 31 13:17 - 13:17 (00:00)
root pts/0 10.0.0.1 Sat Mar 31 13:02 - 14:33 (01:30)
reboot system boot 2.6.32-696.el6.x Sat Mar 31 12:36 - 21:36 (31+09:00)
root pts/0 10.0.0.1 Wed Mar 14 18:40 - crash (16+17:55)
...省略部分信息...
root pts/0 10.0.0.1 Sat Mar 10 12:26 - 12:28 (00:02)
reboot system boot 2.6.32-696.el6.x Sat Mar 10 12:26 - 21:36 (52+09:10)
root tty1 Thu Mar 8 10:10 - 10:10 (00:00)
reboot system boot 2.6.32-696.el6.x Thu Mar 8 10:07 - 21:36 (54+11:29)
wtmp begins Thu Mar 8 10:07:21 2018
[root@localhost ~]# lastlog
#<==报告最近的所有系统用户的登录信息,查看的信息与/var/log/lastlog日志有关。
Username Port From Latest
root pts/2 10.0.0.1 Tue May 1 21:34:29 +0800 2018
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
...省略部分信息...nobody
dbus **Never logged in**
vcsa **Never logged in**
abrt **Never logged in**
haldaemon **Never logged in**
...省略部分信息...
test **Never logged in**
range **Never logged in**
2.11 Linux用户身份切换命令su
简单地说,su命令就是切换用户身份的命令。su命令可以在用户之间进行切换,超级权限用户root向普通用户切换不需要密码验证(这就是超级权限所在),其他普通用户之间或者从普通用户切换到root,都需要切换用户的密码验证。
- 语法格式
su [option] [user]
su [选项] [用户名]
1)若命令后面的用户名省略了,则默认切换为root用户。
2)从root用户切换到普通用户时,不需要任何密码,从普通用户切换到root用户时,则需要输入root密码。
- su命令的参数选项
参数选项 | 注释说明 |
---|---|
- | 切换用户的时候,连带着用户的环境变量一起进行切换 |
-c | 后面跟随使用的shell命令,执行完成后,切换回原来的用户 |
在生产场景中,su命令比较常用的参数为“-”和“-c”,其他的参数很少用到。
- 总结
“
su 用户名
”虽然能够切换到对应用户,但是登录后的环境变量信息有些还是切换前用户的环境变量信息。“
su - 用户名
”不但能切换到相应的用户,还能将登录后的环境变量一并切换,这是标准规范的操作方法。
2.12 visudo:编辑sudoers文件的工具
visudo命令是专门用来编辑/etc/sudoers
这个文件的,同时它还提供了语法检查等功能。 /etc/sudoers
文件是sudo命令的配置文件。
- 语法格式
visudo [option]
visudo [选项]
# visudo命令的参数选项及说明
-c # 手动执行语法检查
- 范例:执行visudo对普通用户test、test01授权的例子。
执行如下visudo命令,即可打开sudo的配置文件进行编辑:
[root@localhost ~]# visudo # 相当于直接执行vim /etc/sudoers编辑,但使用命令方式更安全,推荐此种方式。
在/etc/sudoers文件的大约第100行下面添加需要提升为root权限的普通用户名及对应权限,格式如下:
test ALL=(ALL) ALL #<==此行是第98行,将test提权为root身份。
test01 ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel
#<==授权test使其可以以root身份添加和删除用户权限。
#<==分别对test和test01两个用户做不同的授权,如上。
待授权的用户或组 | 机器=(授权角色) | 可以执行的命令 |
---|---|---|
user | MACHINE= | COMMANDS |
test01 | ALL=(ALL) | /usr/sbin/useradd,/usr/sbin/userdel |
如果是针对用户组,则对应的授权命令如下:
%用户组 机器=(授权使用哪个角色的权限)/usr/sbin/useradd
通过sudo命令进行系统的授权管理的目的是,既能让运维人员正常工作,又不会威胁到系统的安全,还可以审计用户使用sudo的提权操作命令,默认的用户是无法获得root权限的。
为了管理方便,工作中可以为test授权ALL权限,test既可管理整个系统,平时也可以使用test用户处理工作,而不使用root用户。
- 范例:检查sudoer文件语法的例子
有的时候,用户并不是使用visudo(保存时会自动检查语法)编辑的sudoer文件,而是使用vim或者echo等命令编辑的sudoer文件,此时就需要执行如下命令检查编辑文件的语法是否正确,如果语法不正确,则可能会导致授权无法生效的问题。
例如,工作中若有批量管理用户的需求,那么使用快速操作命令增加sudo授权,就需要单独执行语法检查,快速操作命令如下:
\cp /etc/sudoers /etc/sudoers.ori
echo "test ALL=(ALL)NOPASSWD: ALL " >>/etc/sudoers
tail -1 /etc/sudoers
# 上述操作是直接追加内容到sudoers文件,并没有进行语法检查,因此需要单独执行语法检查命令:
[root@localhost ~]# visudo -c #<==使用-c选项进行语法检查。
/etc/sudoers: parsed OK
2.13 sudo:用户提权
sudo命令可以让普通用户在执行指定的命令或程序时,拥有超级用户(也可以是其他用户)的权限,并且可以有针对性地(精细)将不同命令或程序授予指定的普通用户,同时普通用户不需要知道root密码就可以得到授权,这个授权可以使用visudo配置管理。
- 语法格式
sudo [option]
sudo [选项]
- sudo命令使用
- 普通用户提权,开发测试人员想要以root的权限执行命令
- 软件的权限提权,针对启动软件的用户进行提权
# 案例1.普通用户提权
# 第一步: 切换用户
[root@localhost ~]# su - test
# 第二步: 普通用户下执行命令
[test@localhost ~]$ tailf /var/log/messages
tailf: cannot open /var/log/messages: Permission denied
[test@localhost ~]$ cat /var/log/messages
cat: /var/log/messages: Permission denied
# 第三步:查看当前普通用户拥有的sudo命令
[test@localhost ~]$ sudo -l # 然后要输入自己的密码查看拥有的权限 默认为空
# 第四步: sudo提权 在root中配置
visudo
100 root ALL=(ALL) ALL # 在100行下面
101 test ALL=(ALL) /usr/bin/cat # 找到命令的绝对路径粘贴进来
# 保存退出然后再普通用户查看sudo命令
[test@localhost ~]$ sudo -l # 可以看到有一个命令可以执行
User test may run the following commands on localhost:
(ALL) /usr/bin/cat
# 第五步: 执行sudo命令
[test@localhost ~]$ sudo cat /var/log/messages
# sudo授权单个命令:
test ALL=(ALL) /usr/bin/cat
# sudo授权多个命令: 使用逗号分隔命令
test ALL=(ALL) /usr/bin/cat,/usr/bin/tailf
# sudo授权所有的命令: 授权给运维人员
test ALL=(ALL) NOPASSWORD: ALL
# 对命令进行取反:
test ALL=(ALL) ALL,!/usr/bin/rm,!/usr/bin/vim
# 执行su是使用root的身份执行所以不需要密码
[test@localhost ~]$ sudo su - root
Last login: Mon Nov 20 11:26:42 CST 2023 from 10.0.0.1 on pts/2
[root@localhost ~]# exit
编辑sudo提权的区别:
visudo ===> 实际编辑的是
/etc/sudoers
- 使用sudo提权可以直接使用visudo,有语法检测功能
- 使用
vim /etc/sudoers
使用:wq!
没有语法检测功能