Linux 用户与权限
1. 实验介绍
1.1 实验内容
通过前面小节的学习, 你应该知道 Linux 是一个多用户登录的操作系统,比如 "tom" 和 "jerry" 都可以同时登录同一台主机,他们共享一些主机的资源,但他们分别拥有自己的用户空间,用于存放各自的文件。但实际上他们的文件都放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于 Linux 的用户管理和权限机制,不同用户不可以轻易地查看、修改彼此的文件。接下来就让我们一起来学习 Linux 下的用户管理的相关知识。
1.2 实验知识点
- 用户概念
- 用户的增删改查
- 用户批量的创建
- 组的增删改查
- 禁止用户登录
2. 用户概念
- 用户
因为 Linux 是个 多用户多任务得分时操作系统,所有想要调用系统资源的用户都必须先向系统管理员申请一个账号,然后通过这个用户身份进入系统。用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也能帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个唯一的用户名和用户密码。用户在登录时键入正确的用户名和密码后,才能进入系统和自己的主目录。
- 用户组
用户组是具有相同特征用户的逻辑集合,有时需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是逐一对多个用户进行文件访问授权;另一种方法是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中,那么所有用户就具有了和组一样的权限。这就是用户组,将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了管理工作。
- 用户与用户组间的联系
一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。
一对多:即一个用户可以存在多个用户组中。那么此用户具有多个组的共同权限。
多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限。
多对多:多个用户可以存在多个组中。其实就是上面三个对应关系的扩展。
2.2 相关配置文件
2.2.1 用户信息文件(/etc/passwd)
用户信息是被保存在 /etc/passwd 文件中,可以通过 cat /etc/passwd 来查看文件的内容:
$ cat /etc/passwd
文件中每行记录是以冒号( :)来分割为 7 个字段,从左到右具体含义是:
用户名:密码占位符( x 表示用户需要密码登录):用户标识号(UID):组标识号(GID):注释性描述:主目录:登陆的 Shell
2.2.2 密码文件(/etc/shadow)
在用户信息文件中的密码信息是被单独保存在 /etc/shadow 文件中,文件格式和用户信息类似,通过 cat /etc/shadow 命令来查看
$ sudo cat /etc/shadow
用户名:加密口令:最后一次修改时间:密码最短有效天数:密码最长有效天数:密码过期前的警告时间:不活动时间:用户失效时间:暂时保留未使用
在上面的命令中,我们使用了 sudo,因为对于 /etc/shadow 文件来说,当前的用户 shiyanlou 是没有权限去读该文件的,所以我们需要使用 sudo 工具。上面的命令使用 sudo 后,就是让当前的 shiyanlou 用户使用 root 的角色去执行后面的命令。
2.2.3 用户组文件(/etc/group)
Linux 系统对用户组的所有信息被保留在 /etc/group 文件中,同样通过 cat /etc/group 命令来查看。
$ cat /etc/group
组名:口令:组标识号(GID):组内用户列表(多用户可用逗号分隔开)
3. 用户管理
3.1 创建用户
添加新的用户账号是通过 useradd 命令。除此之外还有 adduser 命令也可以用于添加用户,但是掌握前者就已经足够。
语法
useradd [选项][用户名]
选项说明
表3-1
选项 | 说明 |
---|---|
-c | comment 置顶一段注释性描述 |
-d | 目录,指定用户主目录或者说家目录;如果此目录不存在,则同时使用 -m 选项来创建主目录 |
-g | 用户组,指定用户所属的用户组 |
-G | 用户组,指定用户所属的附加组 |
-s | Shell文件,指定用户的登录 shell |
-u | 用户号,指定用户的用户号,若有 -o 选项,则可以重复使用其他用户的标识号 |
注意
- shell 指的是用户进入系统命令行界面中默认执行的一个程序,比如打开桌面上的 xfce 终端,默认会进入 zsh shell,绝大多是的 Linux 系统都会使用 bash。创建用户的时候 -s 参数指定的是使用的 shell 的完整的路径,比如 /bin/bash 或者 /bin/zsh。
- -g 指定用户加入的主用户组,-G 表示创建的用户加入的其他附加用户组,参数可以是组的列表(使用逗号隔开),某个用户属于的主用户组合附加用户组可以使用 id username 查询。一个用户只能属于一个主组,但是很多附加组。主组就是用户登录系统后的默认组,当用户创建一个文件的时候文件的组是当前用户的主组。用户可以在系统中使用 newgrp 命令切换默认组到其他的附加组。
举例
eg 1:新建一个用户 loulou ,并设置某些属性值,然后查看 /etc/passwd 中相应的内容。
# 添加用户,指定 shell
$ sudo useradd -s /bin/bash loulou
# 设置密码
$ sudo passwd loulou
# 查看 /etc/passwd 文件最后 10 行
$ sudo tail /etc/passwd
# 查看文件的最后一行
$ sudo tail -l /etc/passwd
此时对用户 loulou 来说,我们就可以使用 su 命令从当前 shiyanlou 用户切换到 loulou 用户:
$ su loulou
使用 su 命令切回到 shiyanlou 用户中,也可以使用 exit 命令直接退出当前 shell。(查看当前的 shiyanlou 用户的密码可以通过网页上的 SSH 直接查看密码)
在上面的内容中我们使用了一个 passwd 的命令,该命令还可用于设置修改用户的密码,设置用户密码过期等操作,非管理员用户即一般用户只能变更自己的密码。
我们先用 -h 选项来查看下 passwd 的使用手册。
$ passwd -h
举例
eg1:锁定用户密码和解除密码锁定
$ sudo passwd -l loulou
$ su loulou
$ sudo passwd -u loulou
$ su loulou
exit
从输出可以看到当锁定了用户密码时,用户就不能成功认证登录,只有解除锁定才可以登录成功。
eg2:清除用户密码
$ sudo passwd -S loulou
$ sudo passwd -d loulou
$ sudo passwd -S loulou
从输出可以看到用户密码的状态从 P 变成了 NP。
3.2 修改用户
通常情况下,通过 usermod 来修改已经存在用户信息。
语法
usermod [选项][用户名]
常用选项包括 -c,-d,-m,-g,-G,-s,-u,-o 等,主要选项用法与 useradd 相同。这里额外介绍一个 -a 参数,该参数可以给用户添加一个新的附加组。
举例
eg1:使用选项 c ,修改用户 loulou 的备注信息。
$ sudo usermod -c "shiyanlou" loulou
$ tail /etc/passwd
3.3 删除用户
从系统中删除一个不用的用户,我们可以通过使用 userdel 命令。如果一个用户的账号不再使用,删除用户账号就要把 /etc/passwd 等系统文件中的该用户记录都删除,必要时还要删除用户的主目录。
语法
userdel [选项][用户名]
选项通常是 -r ,用于把用户的主目录一起删除。
举例
eg1:先用 useradd 新建一个用户 louplus,然后删除。
因为不会有输出信息,可以通过查看 /etc/passwd 文件来确认。
$ sudo useradd louplus
$ tail -3 /etc/passwd
$ sudo userdel louplus
$ tail -3 /etc/passwd
3.4 查看用户
在 Linux 终端里,我们先来查看一下 /etc/passwd 文件。在第三个参数:500 以上的就是我们后来建立的用户,其他的就是系统用户。
$ cat /etc/passwd
也可以通过下面这些命令来查看用户的了信息。
3.4.1 查看当前用户
$ w
查看登录记录
$ lastlog
3.4.3 查看用户 ID 和组信息
$ id
3.5 用户批量创建
在这里我们使用 newusers + chpasswd 来批量添加用户。
3.5.1 首先创建用户文件和密码文件
创建包含新用户的文件 userfile.txt ,然后为新添加的用户设置密码的 userpwdfile.txt。
$ touch userfile.txt
$ touch userpwdfile.txt
然后用文本编辑器的 vim/vi 命令打开文件 userfile.txt,添加如下内容(不熟悉 vim 的用户,可以尝试使用桌面上的 gedit 文本编辑器,记得保存到正确的路径):
user1:x:5002:5002::/home/user1:/usr/sbin/nologin
user2:x:5003:5003::/home/user2:/usr/sbin/nologin
userfile.txt 文件内容格式和 /etc/passwd 的格式是一样的,必须严格按照 /etc/passwd 的格式来书写;上面所添加的用户都不能登录系统,但完全能用于 ftp 登录,不过得在相应的 ftp 服务器的配置文件上打开,并让本地用户有读写权限;如果想让上面的部分用户可以登录系统,可以把 SHELL 改一改,比如改成:/bin/bash 。
接着新增用户的密码文件 userpwdfile.txt 内容(同样用 vim编辑器 打开)。这个文件的内容中的用户名要与 userfile.txt 用户名相同且严格按照"用户名:密码"的格式来写,一个用户一行。
user1:654321
user2:123qwe
3.5.2 newusers 批量添加用户
使用 newusers 命令批量添加用户:
# 添加用户
$ sudo newusers < userfile.txt
# 可以从文件中查看到新添加的用户
$ tail -5 /etc/passwd
3.5.3 关闭影子文件
这里的影子文件指的是 /etc/shadow 文件。执行命令 /usr/sbin/pwunconv,将 /etc/shadow 产生的 shadow 密码解码,然后写回到 /etc/passwd 中,并将 /etc/shadow 文件中的 shadow 密码栏删掉。这是为了方便下一步的密码装换工作,即先取消 shadow password 功能,关闭影子文件。
$ sudo pwunconv
3.5.4 用 chpasswd 批量修改密码
$ sudo chpasswd < userpwdfile.txt
3.5.5 恢复影子文件
为了保证安全,通过下面的命令来映射到 /etc/shadow 文件名
$ sudo pwconv
$ sudo tail -5 /etc/shadow
4. 管理用户组
用户组的管理和用户的管理相类似,主要也包括:用户组的添加、删除和修改以及用户组间切换的权限。其中用户组的增删改实际上就是对 /etc/group 文件的更新。
4.1 增加新用户组
增加一个新的用户组调用 groupadd 命令。
语法
groupadd [选项][用户组]
选项说明
表4-1
选项 | 说明 |
---|---|
-g | 指定新用户组的组标识号(GID),该参数指定的值必须唯一 |
-o | 与 -g 同时使用,允许用户组的新 GID 和系统已有用户组的相同 |
举例
eg:创建爱你一个用户组 test ,并且组表示号为 1024,然后查看组信息。
$ sudo groupadd -g 1024 test
$ sudo grep test /etc/group
test:x:1024:
grep 是一个检索命令,检索指定的字符串是否在文件中出现,有则打印出来,后续章节会详细讲解
4.2 修改用户组
通常修改用户组的属性我们调用 groupmod 命令。
语法
groupmod [选项][用户组]
选项说明
表4-2
选项 | 说明 |
---|---|
-g | 为用户组指定一个新的组标识号 |
-o | 与 -g 同时使用时,允许将组 GID 更改为非唯一值 |
-n | 将用户组的名字修改为新的名字 |
举例
eg1:修改用户组 test 的用户组名为 test1.
$ sudo groupmod -n test1 test
eg2:修改用户组 test1 的 GID ,并查看用户组信息。
$ sudo groupmod -g 1023 test1
$ sudo grep test1 /etc/group
test1:x:1023:
4.3 删除用户组
调用 groupdel 命令来把一个已有用户组从系统中删除。
语法
groupdel 用户组
举例
eg:删除用户组 test1。
$ sudo groupdel test1
5. 查看用户所属的所有组
查看一个用户属于哪些组,可以使用 groups 命令,不指定用户时,查看的是当前用户属于哪些组。
6. 用户的禁用和恢复登录
若一个用户在操作过程中存在违法或长时间未曾登录,可以对其进行用户的锁定。
语法说明
禁用
# usermod -L username
# passwd -l username
恢复
# usermod -U username
# passwd -u username
举例
eg1:禁止用户 loulou 登录,然后再恢复。
$ sudo passwd -l loulou
$ sudo passwd -u loulou
禁用原理
$ sudo grep loulou /etc/shadow
$ sudo passwd -l loulou
$ sudo grep loulou /etc/shadow
在禁用密码之后,在文件 /etc/shadow 中密码仍旧存在,只是在前面多了感叹号( !),这样是肯定登录不了,英文验证端改变了密码。当然,在解锁之后,密码前面的两个叹号会被去掉。
7. 总结
通过本节实验主要给大家讲解了关于 Linux 中用户的概念,用户的增删改查,用户批量的创建,组的增删改查,以及禁止用户登录等基本命令操作。要想熟练运用还需要大家不断去练习。