# 4. 用户身份与文件权限

# 1.Linux 用户身份介绍

1.1 Linux 用户介绍
Linux 下的用户可以分为三类:超级用户、系统用户和普通用户。每个用户都有一个数值,称为 UID。

昵称权限功能UID
超级用户 root具有一切权限管理系统的各项功能,如添加 / 删除用户、启动 / 关闭服务进程、开启 / 禁用硬件设备0
系统用户为了满足相应的系统进程对文件属主的要求而建立的系统用户不能用来登录Linux 系统正常工作所必需的内建的用户,例如:bin、daemon、adm、lp 等1~999
普通用户由管理员赋予的一般权限由管理员创建的用于日常工作的用户从 1000 开始

1.2 Linux 用户相关文件
用户帐号信息保存在 passwd 文件中:/etc/passwd
用户的加密口令保存在 shadow 文件中:/etc/shadow
用户的宿主目录是 home 目录中与用户名称相同的目录:/home/teacher
用户的初始配置文件来在 skel 目录(配置模版):/etc/skel
1.3 passwd 文件介绍
/etc/passwd 文件每一行都表示的是一个用户的信息;一行有 7 个段位;每个段位用:号分割。
root:x:0:0:root:/root:/bin/bash

账号名称:密码:UID:GID:个人资料:主目录:Shell

第一字段:用户名(也被称为登录名)
第二字段:口令;在例子中我们看到的是一个 x,其实密码已被映射到 /etc/shadow 文件中
第三字段:UID;用户 ID
第四字段:GID;用户组的 ID
第五字段:用户名全称,这是可选的
第六字段:用户的家目录所在位置;root 这个用户的家目录是 /root
第七字段:用户所用 SHELL 的类型,root 用的是 bash;所以设置为 /bin/bash
1.4 shadow 文件介绍
Shadow 文件一共有 9 个字段来表示跟密码有关的部分,每个字段用 “:” 来分隔。
用户名:密码:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志字段说明
bin:*:17110:0:99999:7:::
用户名:和 /etc/passwd 文件中相对应的用户名。
密码:存放加密后的口令 (密码)。密码字段为 “*” 表示用户被禁止登录,为 “!!” 表示密码未设置,为 “!” 表示用户被锁定。
最后一次修改时间:用户最后一次修改口令的时间 (从 1970-1-1 起计的天数)。
最小时间间隔:两次修改口令允许的最小天数。
最大时间间隔:口令保持有效的最多天数,即多少天后必须修改口令。
警告时间:从系统提前警告到口令正式失效的天数。
不活动时间:口令过期多少天后,该账号被禁用。
失效时间:指示口令失效的绝对天数 (从 1970-1-1 开始计算)。
标志:未使用。

1.5 group 文件介绍
Linux 系统关于组的信息存放在文件 /etc/group 中.Linux 的组有私有组、系统组、标准组之分。私有组:建立账户时,若没有指定账户所属的组,系统会建立一个组名和用户名相同的组,这个组就是私有组,这个组只容纳了一个用户。标准组:可以容纳多个用户,组中的用户都具有组所拥有的权利。系统组:Linux 系统正常运行所必需的,安装 Linux 系统或添加新的软件包会自动建立系统组。
root:x:0:
组名:组的密码:GID:组成员
注:组的密码:设置加入组的密码,一般情况下不使用组密码,该字段通常没用

# 2. 创建 Linux 用户

2.1 添加 Linux 用户
adduser/useradd:
创建用户,使用该命令创建用户账户时,默认的用户家目录会被存放在 /home 目录中,默认的 Shell 解释器为 /bin/bash,而且默认会创建一个与该用户同名的基本用户组。
语法格式: useradd [选项] 用户名
常用选项:
-e 账户的到期时间,格式为 YYYY-MM-DD
-u 指定该用户的默认 UID
-d 指定用户的家目录(默认为 /home/username)
-g 指定一个初始的已存在用户基本组
- G 指定一个或多个扩展用户组
- N 不创建与用户同名的基本用户组
- s 指定该用户的默认 Shell 解释器

2.2 设置 Linux 用户密码
passwd 命令:
用于修改用户密码、过期时间、认证信息等
普通用户只能使用 passwd 命令修改自身的系统密码,而 root 管理员则有权限修改其他所有人的密码。更酷的是,root 管理员在 Linux 系统中修改自己或他人的密码时不需要验证旧密码,这一点特别方便。
语法格式: passwd [选项] [用户名]
常用选项:
-d 使该用户可用空密码登录系统
- l 锁定用户,禁止其登录
- u 解除锁定,允许用户登录
- S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称

# 3. 管理 Linux 用户

3.1 设置 Linux 用户账号
usermod 命令:
usermod 命令用于修改用户的属性
语法格式: usermod [选项] 用户名
用户的信息保存在 /etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用 usermod 命令修改已经创建的用户信息,诸如用户的 UID、基本 / 扩展用户组、默认终端等。
常用选项:
-g 变更所属用户组
- G 变更扩展用户组
- L 锁定用户禁止其登录系统
- U 解锁用户,允许其登录系统

选项功能
-c comment改变用户的注释,如:全名、地址、办公室电话、家庭电话等
-d dir改变用户的主目录
-e YYYY-MM-DD修改用户的有效日期
-L锁定用户密码,使密码无效
-U解除密码锁定
-f days在密码到期的 days 天后停止使用账户
-g GID 或组名修改用户的所属基本组
-l name更改账户的名称,必须在该用户未登录的情况下才能使用
-p 密码修改用户的密码
-s Shell修改用户的登录 Shell
-u UID改变用户的 UID 为新的值,改变用户的 UID 时主目录下所有该用户所拥有的文件或子目录将自动更改 UID,但对于主目录之外的文件和目录只能用 chown 命令手工进行设置

3.2 删除 Linux 用户账号
userdel 命令:
userdel 命令用于删除用户
语法格式: userdel [选项] 用户名
如果我们确认某位用户后续不再会登录到系统中,则可以通过 userdel 命令删除该用户的所有信息。在执行删除操作时,该用户的家目录默认会保留下来,此时可以使用 - r 参数将其删除。
常用选项:
-f 强制删除用户
- r 删除用户时将用户主目录下的所有内容一并删除,同时删除用户的邮箱,对于用户在别的目录下所拥有的文件只能手工删除

# 4. 创建与管理 Linux 用户组

4.1 创建 Linux 用户组
groupadd 命令:
groupadd 命令用来添加用户
语法格式: groupadd [选项] 群组名
为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。
常用选项:
-g GID 指定新组的 GID,默认值是已有的最大的 GID 加 1
-r 建立一个系统专用组,与 - g 不同时使用时,则分配一个 1~999 的 GID
例子:
[root @localhost /root]#groupadd -g 1000 group1 表示添加一个新组,组 ID 为 1000,组名为 group1

4.2 管理 Linux 用户组
groupmod 命令:
groupmod 命令用于修改组的属性
语法格式: groupmod [选项] 群组名
常用选项:
-g GID 指定组新的 GID
-n name 更改组的名字为 name

4.3 删除 Linux 用户组
groupdel 命令
删除指定名称的用户组帐号
语法格式: groupdel 群组名
需要从系统上删除群组时,可用 groupdel 指令来完成这项工作。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。

# 5. 文件的权限与归属

5.1 查看文件的权限与归属
尽管在 Linux 系统中一切都是文件,但是每个文件的类型不尽相同,因此 Linux 系统使用了不同的字符来加以区分,常见的字符如下所示。

代码文件类型
-普通文件
d目录文件
l链接文件
b块设备文件
c字符设备文件
p管道文件

-rw-r--r--

权限项执行执行执行
字符表示rwxrwxrwx
数字表示421421421
权限分配文件所有者文件所有者文件所有者文件所属组用户文件所属组用户文件所属组用户其他用户其他用户其他用户

5.2 修改文件的权限
chmod 命令
用于更改文件对于某类用户的操作权限
chmod [ugoa...][[+-=][rwx] FILE...
设置权限的对象,可以是用户、组、其他人或所有人 | 属性操作符 + 增加权限 - 减少权限 = 设置权限为 | 权限内容,可以是读、写、执行权限的组合 | 被设置属性的文件或目录
例子: -rw-rw-r-- 1 st01 class1 0 Apr 3 16:52 afile
增加文件属主 st01 的执行权限(x) # chmod u+x afile
去除文件属组 class1 的写权限(w) # chmod g-w afile
设置其他用户的文件权限为可执行 # chmod o=x afile
设置用户拥有执行权限,其他用户拥有写入权限 #Chmod u+x,o+w afile
设置用户和用户组拥有执行的权限 #Chmod ug+x afile

增加文件属主 st01 的执行权限(x) # chmod 764 afile
去除文件属组 class1 的写权限(w) # chmod 644 afile

5.3 修改文件的归属
要想改变一个文件对某些用户的权限,除了可以修改它的权限之外,还有一个方案就是修改文件属于哪个用户和用户组。
chown 命令
用于设置文件的属主和属组
命令格式: chown OWNER[:[GROUP]] FILE...
例子:
设置文件 afile 的属主为用户 st01 # chown st01 afile
设置文件 afile 的属主为 st03,并设置文件的属组为 class2 # chown st03:class2 afile
设置文件 afile 的属组为用户组 class1 # chown :class1 afile

# 6. 文件的特殊权限

特殊权限:在复杂多变的生产环境中,单纯设置文件的 rwx 权限无法满足我们对安全和灵活性的需求,因此便有了 SUID、SGID 与 SBIT 的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

6.1 SUID 特殊权限介绍
SUID
对应 user 的权限位置:当 s 这个标志出现在文件所有者的 x 权限上时,例如文件权限状态 -rwsr-xr-x ,此时就称为 Set UID,简称为 SUID 的特殊权限。
SUID 有这样的限制和功能:
SUID 权限仅对二进制程序有效;
执行者对于该程序需要具有 x 的可执行权限;
本权限仅在执行该程序的过程中有效;
执行者将具有该程序所有者的权限。

6.2 SGID 特殊权限介绍
SGID
对应 group 权限位置:当 s 标志出现在文件所有者的 x 权限时称为 SUID,那么 s 出现在用户组的 x 权限时称为 SGID。(U 表示 user,G 表示 group)。
SGID 有如下功能:
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
SGID 的第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。

6.3 SBIT 特殊权限介绍
SBIT
对应 other 用户权限位置
SBIT(Sticky Bit)特殊权限位(特殊权限位之粘滞位)。SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。SBIT 目前只对目录有效。
RHEL7 系统中的 /tmp 作为一个共享文件的目录,默认已经设置了 SBIT 特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。

# 7. 文件的隐藏属性

隐藏属性:Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。有用户曾经在生产环境中碰到过明明权限充足但却无法删除某个文件的情况,或者仅能在日志文件中追加内容而不能修改或删除内容,这在一定程度上阻止了黑客篡改系统日志的图谋,因此这种 “奇怪” 的文件也保障了 Linux 系统的安全性。

7.1 chattr 命令
chattr 命令
用于设置文件的隐藏权限
命令格式: chattr [选项] 文件
如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加 “+ 参数”,如果想要把某个隐藏功能移出文件,则需要追加 “- 参数”。
常用选项
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件.
a 仅允许补充(追加)内容,无法覆盖 / 删除内容(Append Only)

7.2 lsattr 命令
lsattr 命令用于显示文件的隐藏权限,在 Linux 系统中,文件的隐藏权限必须使用 lsattr 命令来查看,平时使用的 ls 之类的命令则看不出端倪。
命令格式: lsattr [选项] 文件
一旦使用 lsattr 命令后,文件上被赋予的隐藏权限马上就会原形毕露。此时可以按照显示的隐藏权限的类型(字母),使用 chattr 命令将其去掉。

# 8.su 命令与 sudo 服务

8.1 su 命令
su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从 root 管理员切换至普通用户。
su 命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
当从 root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成 root 管理员就需要进行密码验证了。

8.2 sudo 服务
使用 sudo 命令把特定命令的执行权限赋予给指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码。sudo 服务的配置原则也很简单:在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
这个服务是通过修改配置文件(/etc/sudoers)来提供集中的用户管理、权限与主机等设置,root 用户可以通过 visudo 来修改这个配置文件。

sudo 服务的工作过程
1,当用户执行 sudo 时,系统会主动寻找 /etc/sudoers 文件,判断该用户是否有执行 sudo 的权限
2,确认用户具有可执行 sudo 的权限后,让用户输入用户自己的密码确认
3,若密码输入成功,则开始执行 sudo 后续的命令
4,root 执行 sudo 时不需要输入密码 (sudoers 文件中有配置 root ALL=(ALL) ALL 这样一条规则)
5,若欲切换的身份与执行者的身份相同,也不需要输入密码

第一步:
利用 visudo 为指定用户添加权限
[root@localhost ~]# visudo
关于 root 用户权限完整格式:
root ALL=(ALL:ALL) ALL
root 表示能使用 sudo 命令的用户;
第一个 ALL 表示允许使用 sudo 的主机;
第二个 ALL 及第三个 ALL 表示用户组及用户;
第四个 ALL 表示 sudo 可执行的命令,即所有命令;
第二步:
利用 visudo 修改了配置以后,切换至指定的普通用户身份,此时就可以用 sudo -l 命令查看到所有可执行的命令了,此处注意输入的是普通用户的密码。

使用 sudo 命令来执行特殊的权限
sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务
命令格式 sudo [选项] 命令名称
常用选项:
-h 列出帮助信息
- l 列出当前用户可执行的命令
- u 用户名或 UID 值以指定的用户身份执行命令

第三步:使用 sudo 命令来执行特殊的权限对于普通用户无权查看的 shadow 文件,利用 sudu 命令就可以获得权限进行查看。

-->