1 用户和用户组概述
1.1 用户介绍
Linux系统是一个多用户多任务的分时操作系统(服务器系统),允许多个用户同时登陆到系统上,并响应每个用户的请求。
任何需要使用操作系统的用户,都需要一个系统账号。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
用户在系统中是分角色的,在Linux系统中,由于角色的不同,权限和所完成的任务也不同。值得注意的是每个用户是通过UID(User ID)来唯一标识的。
用户账号类型:
1)超级用户:
- 默认是root用户。在每台unix/linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任何文件和命令,拥有最高的管理权限。在生产环境,一般禁止root账号远程登录SSH连接服务器,以加强系统安全。
- 其UID和GID均为0
2)普通用户:
- 这类用户一般是由具备系统管理员root的权限的运维人员添加的。
- 在 centos 7中 ,普通用户的UID范围为1000-60000。
3)程序用户:
- 与真实用户区分开来,这类用户的最大特点是安装系统后默认就会存在,且默认情况不能登录系统。它们是系统正常运行必不可少的,他们的存在主要是方便系统管理,满足相应的系统进程都文件属主的要求。例如系统默认的bin、adm、nodoby、mail用户等。
- 在centos 7中,系统用户的UID范围为1-999。
- 由于服务器角色的不同,有部分用不到的系统服务被禁止开机执行,因此,在做系统安全优化时,被禁止开机启动了的服务对应的虚拟用户也是可以处理掉的(删除或注释)。
1.2 用户组介绍
linux系统中的用户组(group)就是具有相同特性的用户(user)集合。
有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件,只需要把授权的用户都加入到同一个用户组里,然后通过修改该文件对应组的权限,让用户组具有符合需求的操作权限,这样组内所有用户对该文件就会具有相同的权限,这就是用户组的用途。
将用户分组是linux系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了运维管理工作。
组账号类型:
1)基本组(私有组)
- 创建用户账号时,如果没有指定用户所属的组,系统会建立一个和用户名相同的组,这个组就是基本组,默认只容纳一个用户。
- 在用户所属组中的第一个组称为基本组,基本组在/etc/passwd 文件中指定。
- 基本组有且唯一。
2)附加组(公共组)
- 在用户所属组中,除了第一个组(基本组)以外的其他组就是附加组,附加组在/etc/group文件中指定。
- 附加组可有可无,且可以有多个。
2 用户账号管理
用户账号的管理工作主要涉及到用户账号的添加、修改和删除。
2.1 用户信息存储文件
2.1.1 用户账号文件/etc/passwd
用途:保存用户名称、宿主目录、登录shell等基本信息。
文件位置:/etc/passwd。
每行说明:每一行对应一个用户的账号记录。
行内字段含义:
[root@localhost ~]# haed -2 /etc/passwd //查看passwd文件头2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
冒号(:)作为分隔符,将每行分为了7段。以第一行“root:x:0:0:root:/root:/bin/bash”为例,解释每段含义:
-
字段1:root,用户名。
-
字段2:x,密码占位符。为保障用户密码的安全性,密码实际存放在/etc/shadow文件中。
-
字段3:0,用户编号UID。
-
字段4:0,用户基本组编号GID。
-
字段5:root,用户描述说明。
-
字段6:/root,用户家目录。
-
字段7:/bin/bash,用户的登录shell。
注:可使用”man 5 passwd“命令,查看/etc/passwd文件说明及每个字段含义。
2.1.2 用户口令文件/etc/shadow
用途:存储用户的密码信息,又称为“影子文件” 。/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
文件位置:/etc/shadow。
每行说明:每一行对应一个用户的密码信息。
查看文件内容:
[root@localhost ~]# tail -3 /etc/shadow //查看shadow文件尾部3行
alice:$6$Cm32tytk$KT.XqgcgaZqZdB9USbAes2QBrh.ItCItnKqaj/wrXubrjqZpAZH.1pjsy3gjGdYzdsV0rTXy6FBY4dN.Qe4eM1:19026:0:99999:7:::
jack:!!:19017:0:99999:7:::
zhangsan:!!:19030:0:99999:7:::
/etc/shadow文件也是以冒号(:)作为分隔符,将每行分成了9段,每个字段的含义如下:
-
字段1:用户名。
-
字段2:密码加密值。当此字段为*或!!时,表示用户不能登录到此系统。当为空时,表示用户无需密码即可登录。
-
字段3:上次修改密码时间。从1970/1/1到上次修改密码的天数。 0 有特殊意思,表示用户应该在下次登录系统时更改密码。
-
字段4:最小修改密码间隔天数,即两次修改口令之间所需的最小天数。若不设置,默认为0,表示当天即可修改。 空字段或 0 都表示当天即可修改。
-
字段5:密码有效期。若为99999,表示永久有效。
-
字段6:警告时间。表示从系统开始警告用户到用户密码正式失效之间的天数。空字段或者 0 表示没有密码警告期。
-
字段7:密码过期后的宽限天数。
密码过期后,仍然接受使用此密码进行登录的天数(在此期间,用户应该在下次登录时修改密码)。
-
字段8:账户失效时间。从1970/1/1日起,到用户被禁用的天数。默认为空。
账户过期不同于密码过期。账户过期后,用户将不被允许登录。密码过期后,用户将不被允许使用此密码登录。
-
字段9:保留字段。此字段保留作将来使用。
2.2 添加用户账号 useradd
命令格式:
useradd [选项] 用户名
添加用户后,会在/etc/passwd文件和/etc/shadow文件中生成相应信息:
- 在/etc/passwd 文件和/etc/shadow 文件的末尾增加该用户账号的记录。
- 若未明确知道用户的宿主目录,则在/home 目录下自动创建与该用户账号同名的宿主目录,并在该目录中建立用户的各种初始配置文件。
- 若没有明确指定用户所属的组,则自动创建与该用户账号同名的基本组账号,组账号的记录信息将保存到/etc/group 和 /etc/shadow 文件中。
[root@localhost ~]# useradd nancy //创建nancy用户
[root@localhost ~]# cat /etc/passwd |grep nancy //查看passwd文件中和nancy有关的行
nancy:x:1006:1007::/home/nancy:/bin/bash
[root@localhost ~]# tail -1 /etc/passwd //查看passwd文件最后一行
nancy:x:1006:1007::/home/nancy:/bin/bash
[root@localhost ~]# tail -1 /etc/shadow //查看shadow文件最后一行
nancy:!!:19044:0:99999:7:::
常用选项:
| 选项 | 说明 |
|---|---|
| -u | 指定用户的UID,要求该UID未被其他用户使用 |
| -d | 指定用户的宿主目录位置(当与-M一起使用时,-d不生效)。必须使用绝对路径指定目录,且不需要事先创建目录。 |
| -e | 指定用户的账户失效时间,可使用YYYY-MM-DD的日期格式 |
| -g | 指定用户的基本组名(或使用GID号),对应的组名必须已存在 |
| -G | 指定用户的附加组名(或使用GID号),对应的组名必须已存在 |
| -M | 不建立宿主目录(一般用于系统用户账号) |
| -s | 指定用户的登录shell(比如/bin/bash为可登陆系统,Isbin/nologin和/bin/false禁止用户登陆系统) |
示例:
1)-u 指定用户的UID
[root@localhost ~]# useradd -u 2000 helen //添加helen用户,并指定UID为2000
[root@localhost ~]# tail -1 /etc/passwd //查看passwd中helen的信息
helen:x:2000:2000::/home/helen:/bin/bash
2)-d 指定用户的宿主目录
[root@localhost ~]# useradd -d /home/test/ user04 //创建用户,并指定家目录
[root@localhost ~]# tail -1 /etc/passwd
user04:x:2003:2003::/home/test/:/bin/bash
3)-e 指定用户的账户失效时间
[root@localhost ~]# useradd -e 2022-6-30 user05 //创建用户并指定账户失效时间为2022年6月30日
[root@localhost ~]# tail -1 /etc/shadow //查看shadow文件,19173表示距离1970年1月1日的19173天
user05:!!:19044:0:99999:7::19173:
4)-g 指定用户基本组
[root@localhost ~]# useradd -g hr user06 //创建用户并指定用户基本组为hr组
[root@localhost ~]# id user06 //查看用户信息,基本组为hr组
uid=2005(user06) gid=1002(hr) 组=1002(hr)
5)-G 指定用户附加组
[root@localhost ~]# useradd -G hr user07 //创建用户并指定用户附加组为hr组
[root@localhost ~]# id user07 //查看用户信息,附加组为hr组
uid=2006(user07) gid=2006(user07) 组=2006(user07),1002(hr)
6)-M 不建立家目录
[root@localhost ~]# useradd -M user08 //创建用户且不建立家目录
[root@localhost ~]# ls /home //查看/home下没有user08的目录
alice jack nancy user05 user07
Amy helen user01 user06 zhangsan
7)-s 指定用户的登录shell(一般用于程序用户)
[root@localhost ~]# useradd -s /sbin/nologin apache //创建用户并指定登录shell为/sbin/nologin,该用户无法登录系统
[root@localhost ~]# tail -1 /etc/passwd
apache:x:2008:2008::/home/apache:/sbin/nologin
2.3 设置/更改用户口令 passwd
root用户可以指定用户名作为参数,对指定账号的密码进行管理。不指定用户名时,修改当前账号的密码。
普通用户只能执行单独的passwd命令修改自己的密码。
命令格式:
passwd [用户名]
常用选项:
| 选项 | 作用 |
|---|---|
| -d | 清空指定用户的密码,仅使用用户名即可登录系统 |
| -l | 锁定用户密码,锁定的用户账号将无法再登录系统。(一定要事先设好密码) |
| -u | 解锁用户密码 |
| -S | 查看用户账户的状态(是否被锁定) |
示例:
1)设置或修改用户密码
[root@localhost ~]# passwd nancy //设置或修改nancy用户的密码
更改用户 nancy 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# echo "linux666" | passwd --stdin nancy //简便设置用户密码
更改用户 nancy 的密码 。
passwd:所有的身份验证令牌已经成功更新。
2)-d 清除用户密码,使用用户名可直接登录
[root@localhost ~]# passwd -d nancy //清除nancy用户的密码
清除用户的密码 nancy。
passwd: 操作成功
3)锁定和解锁用户
[root@localhost ~]# passwd -l nancy //锁定用户密码,锁定后用户无法登陆
锁定用户 nancy 的密码 。
passwd: 操作成功
[root@localhost ~]# passwd -u nancy //解锁用户,因nancy无密码,系统提示不安全,必须使用-f才能解锁
解锁用户 nancy 的密码。
passwd: 警告:未锁定的密码将是空的。
passwd: 不安全的操作(使用 -f 参数强制进行该操作)
[root@localhost ~]# passwd -S nancy //查看nancy用户状态,仍为锁定状态
nancy LK 2022-02-21 0 99999 7 -1 (密码已被锁定。)
2.4 修改用户账号的属性 usermod
命令格式:
usermod [选项]... 用户名
常用选项:
| 选项 | 作用 |
|---|---|
| -l | 更改用户账号的登录名称。格式:usermod -l 新名称 旧名称 |
| -L | 锁定用户账户 |
| -U | 解锁用户账户 |
| 以下选项与useradd命令中的含义相同 | |
| -u | 修改用户的UID号 |
| -d | 修改用户的宿主目录位置 |
| -e | 修改用户的账户失效时间,可使用YYYY–MM-DD的日期格式 |
| -g | 修改用户的基本组名(或使用GID号) |
| -G | 修改用户的附加组名(或使用GID号) |
| -s | 指定用户的登录Shell |
示例:
[root@localhost ~]# usermod -l sasha helen //将helen的用户名改成sasha
[root@localhost ~]# usermod -L sasha //锁定用户sasha
[root@localhost ~]# passwd -S sasha //查看sasha状态,已被锁定
sasha LK 2022-02-21 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# usermod -U sasha //解锁用户sasha
[root@localhost ~]# passwd -S sasha //查看sasha状态,正常状态
sasha PS 2022-02-21 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
2.5 删除用户 userdel
命令格式:
userdel [-r] 用户名 //结合-r可以删除宿主目录
示例:
[root@localhost ~]# userdel user05 //删除用户user05,不加-r会保留家目录
[root@localhost ~]# ls /home //查看/home下user05的家目录仍存在
alice jack nancy user05 user07 yuji
Amy helen user01 user06 zhangsan
[root@localhost ~]# userdel -r user06 //删除用户user06及其家目录
[root@localhost ~]# ls /home //查看/home下user06的家目录不存在
alice jack nancy user05 user07
yuji Amy helen user01 zhangsan
2.6 用户账号的初始配置文件
文件来源:
新建用户账号时,从 /etc/skel 目录中复制而来, 比如默认bin/bash,默认家目录。
用户宿主目录下的初始配置文件只对当前用户有效。
主要的用户初始配置文件:
- ~/.bash_profile : 这个文件是为系统全局变量配置文件,可以通过重启系统或者执行 ”source /etc/profile“ 命令使profile文件被读取。
- ~/.bashrc: 这个文件实际上是/etc/profile的子目录,存放的是一些应用程序所需的启动脚本。
- ~/.bash_logout: 每一个允许bash shell 的用户都会执行此文件。可通过执行bash命令打开一个新的bash,使bashrc文件被读取。
备注:
- 修改/etc/profile文件中相关配置,切换bash或者用户后都需要source /etc/profile才生效;
- 修改/etc/bashrc文件中相关配置,切换bash或者用户后直接生效。
3 组管理
3.1 组账号文件
(1)文件位置:
- /etc/group:保存组账号基本信息。
- /etc/gshadow:保存组账号的密码信息。
(2)/etc/group文件内容:
[root@localhost ~]# head -3 /etc/group //查看group文件前三行
root:x:0:
bin:x:1:
daemon:x:2:
group文件每行分成了4段,每个字段含义如下:
- 字段1:组账号名称。
- 字段2:密码占位符x;通常不需要设置组密码。由于安全原因,该密码被记录在/etc/gshadow中,因此显示为'x'。类似/etc/shadow文件。
- 字段3:组编号GID。
- 字段4:本组的成员用户列表 (一般不包括基本组对应的用户帐号),多个成员之间以逗号“,"分隔 。
3.2 添加组账号 groupadd
命令格式:
groudadd [-g GID] 组账号名
示例:
[root@localhost ~]# groupadd -g 1100 market //添加market用户组,指定GID为1100
[root@localhost ~]# tail -1 /etc/group //查看group文件,添加成功
market:x:1100:
3.3 添加删除组成员 gpasswd
gpasswd可以设置组账号密码,但该功能极少使用,一般用来添加或删除组成员。
命令格式:
gpasswd [选项]... 组账号名
常用选项:
| 选项 | 作用 |
|---|---|
| -a | 向组内添加一个用户 |
| -d | 从组内删除一个用户成员 |
| -M | 定义组成员列表 |
示例:
1)-a 向组内添加单个用户
[root@localhost ~]# gpasswd market -a jack //将jack用户添加进market组
正在将用户“jack”加入到“market”组中
[root@localhost ~]# tail -1 /etc/group //查看group文件,添加成功
market:x:1100:jack
2)-d 从组内删除一个用户成员
[root@localhost ~]# gpasswd market -d jack //将jack用户从market组中删除
正在将用户“jack”从“market”组中删除
[root@localhost ~]# tail -1 /etc/group //查看group文件,已删除
market:x:1100:
3)-M 定义组成员列表
[root@localhost ~]# gpasswd market -M sasha,user07,zhangsan //定义组成员为三个用户
[root@localhost ~]# tail -1 /etc/group //查看group文件,组成员添加成功
market:x:1100:sasha,user07,zhangsan
3.4 修改组账号的属性 groupmod
命令格式:
groupmod [选项]... 组名
常用选项:
| 选项 | 作用 |
|---|---|
| -g | 修改用户组的编号GID |
| -n | 修改用户组的名称 |
示例:
1) groupmod -g GID 组名,修改用户组的GID
[root@localhost ~]# cat /etc/group | grep sales //查看用户组sales的GID,为2009
sales:x:2009:
[root@localhost ~]# groupmod -g 1008 sales //将sales组的GID修改为1008
[root@localhost ~]# cat /etc/group | grep sales //查看组文件,GID修改成功
sales:x:1008:
2)groupmod -n 新名称 当前组名,修改用户组的名称
[root@localhost ~]# groupmod -n business sales //将用户组sales的名称改成business
[root@localhost ~]# cat /etc/group | grep 1008 //根据GID查看组名,修改成功
business:x:1008:
3.5 删除组账号 groupdel
命令格式:
groupdel 组账号名
示例:
[root@localhost ~]# tail -1 /etc/group //查看group文件,有market组
market:x:1100:sasha,user07,zhangsan
[root@localhost ~]# groupdel market //删除market组
[root@localhost ~]# tail -3 /etc/group //查看group文件,market组已不存在
user07:x:2006:
user08:x:2007:
apache:x:2008:
4 查询账号信息
4.1 查询用户所属的组 groups
命令格式:
groups [用户名]
示例:
[root@localhost ~]# groups jack //查询用户jack所属的组
jack : jack hr //jack的基本组为jack,附加组为hr
4.2 查询用户身份标识 id
命令格式:
id [用户名]
示例:
[root@localhost ~]# id jack //查询用户jack的UID、基本组和附加组信息
uid=1003(jack) gid=1004(jack) 组=1004(jack),1002(hr)
4.3 查询用户账号的详细信息 finger
注意:如果没有安装finger,需要安装后才能使用。
命令格式:
finger [用户名]
示例:
[root@localhost ~]# finger alice //未安装finger
bash: finger: 未找到命令...
[root@localhost ~]# yum install finger -y //使用yum安装finger
[root@localhost ~]# finger alice //查询用户alice的详细信息,包括家目录、登陆shell、上次登陆时间等
Login: alice Name:
Directory: /home/alice Shell: /bin/bash
Last login 日 2月 20 10:22 (CST) on pts/0
No mail.
No Plan.
4.4 查询已登录到主机的用户信息
1)w、who、users 命令
示例:
[root@localhost ~]# w //显示当前登录系统的用户信息以及他们的进程
23:27:59 up 8:12, 2 users, load average: 0.11, 0.08, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/2 192.168.72.1 22:09 7.00s 0.08s 0.08s -bash
root pts/3 192.168.72.1 22:09 1:18m 5.29s 5.27s top
[root@localhost ~]# who //显示当前登录系统的用户信息
root pts/2 2022-02-21 22:09 (192.168.72.1)
root pts/3 2022-02-21 22:09 (192.168.72.1)
[root@localhost ~]# users //查询最近三次登录的用户信息
root root
2) last 命令,用于显示用户最近登录信息
命令格式:
last [选项]
常用选项:
| 选项 | 作用 |
|---|---|
| -x | 显示系统开关机以及执行等级信息 |
| -a | 将登录IP显示在最后一列 |
| -f | 读取特定文件,可以选择 -f /var/log/btmp 文件 |
| -d | 将IP地址转换为主机名 |
| -n | 设置列出名单的显示行数(last -n 3 表示只显示前三行) |
| -t | 查看指定时间之前的用户登录历史(格式:-t YYYYMMDDHHMMSS) |
示例:
[root@localhost ~]# last -f /var/log/btmp //查看btmp文件,可看到系统开机的时间
btmp begins Mon Feb 21 15:11:13 2022
[root@localhost ~]# last -n 3 //查看最近三次登录信息
root pts/3 192.168.72.1 Mon Feb 21 22:09 still logged in
root pts/2 192.168.72.1 Mon Feb 21 22:09 still logged in
root pts/1 192.168.72.1 Mon Feb 21 15:25 - 22:24 (06:59)
[root@localhost ~]# last -t 20220218200000 |head -5 //查看2022年2月18日20点之前的登录信息
root pts/3 192.168.72.1 Fri Feb 18 19:44 gone - no logout
root pts/2 192.168.72.1 Fri Feb 18 19:44 gone - no logout
root pts/1 192.168.72.1 Fri Feb 18 18:32 - 19:57 (01:24)
root pts/0 192.168.72.1 Fri Feb 18 18:32 - 19:57 (01:24)
reboot system boot 3.10.0-693.el7.x Fri Feb 18 18:15 - 23:53 (3+05:37)
3)lastlog 命令, 用于显示系统中所有用户最近一次登录信息。
常用选项:
| 选项 | 作用 |
|---|---|
| -t <天数> | 显示指定天数内的登录信息 |
| -u <用户名> | 显示指定用户的最近登录信息 |
示例:
[root@localhost ~]# lastlog -t 3 //查看3天内的登录信息
用户名 端口 来自 最后登陆时间
root pts/3 192.168.72.1 一 2月 21 22:09:40 +0800 2022
gdm :0 一 2月 21 15:11:35 +0800 2022
alice pts/0 日 2月 20 10:22:13 +0800 2022
[root@localhost ~]# lastlog -u alice //查看用户alice最近一次登录信息
用户名 端口 来自 最后登陆时间
alice pts/0 日 2月 20 10:22:13 +0800 2022