LINUX学习(5)

用户身份与文件权限

一、用户身份与能力

Linux 系统的管理员之所以是 root,并不是因为它的名字叫 root,而是因为该用户的身份号码即 UID(User IDentification)的数值为 0。在 Linux 系统中,UID 就相当于我们的身份 证号码一样具有唯一性,因此可通过用户的 UID 值来判断用户身份。在 RHEL 7 系统中,用 户身份有下面这些。
➢ 管理员 UID 为 0:系统的管理员用户。
➢ 系统用户 UID 为 1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏 范围。
➢ 普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户。
为了方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。通过使用用 户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方 便为组中的用户统一规划权限或指定任务。
另外,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且 这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户 组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满 足日常的工作需要。

1、useradd

useradd命令用于创建新的用户,格式为useradd [选项] 用户名
可以使用 useradd 命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会 被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名 的基本用户组
在这里插入图片描述
下面我们创建一个普通用户并指定家目录的路径、用户的 UID 以及 Shell 解释器。在下 面的命令中,请注意/sbin/nologin,它是终端解释器中的一员,与 Bash 解释器有着天壤之别。 一旦用户的解释器被设置为 nologin,则代表该用户不能登录到系统中

[root@RICARDOfs ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe
[root@RICARDOfs ~]# id linuxprobe
uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe)

2、groupadd

groupadd命令用于创建用户组,格式为groupadd [选项] 群组名

3、usermod

usermod命令用于修改用户的属性,格式为usermod [选项] 用户名
Linux 系统中的一切都是文件,因此在系统中创建用户也就是修改配置 文件的过程。用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用 户参数项目,也可以用 usermod 命令修改已经创建的用户信息,诸如用户的 UID、基本/扩展 用户组、默认终端
在这里插入图片描述
在这里插入图片描述

[root@RICARDOfs ~]# usermod -G root linuxprobe
[root@RICARDOfs ~]# id linuxprobe
uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe),0(root)
[root@RICARDOfs ~]# usermod -u 6666 linuxprobe
[root@RICARDOfs ~]# id linuxprobe
uid=6666(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe),0(root)

4、passwd

passwd命令用于修改用户密码、过期时间、认证信息等,格式为passwd [选项] [用户名]
普通用户只能使用 passwd 命令修改自身的系统密码,而 root 管理员则有权限修改其他 所有人的密码。root 管理员在 Linux 系统中修改自己或他人的密码时不需要验证旧密码,这一点特别方便。既然 root 管理员可以修改其他用户的密码,就表示完全拥有该用户 的管理权限
在这里插入图片描述
在这里插入图片描述

[root@RICARDOfs ~]# passwd -l linuxprobe
Locking password for user linuxprobe.
passwd: Success
[root@RICARDOfs ~]# passwd -S linuxprobe
linuxprobe LK 2020-03-25 0 99999 7 -1 (Password locked.)
[root@RICARDOfs ~]# passwd -u linuxprobe
Unlocking password for user linuxprobe.
passwd: Success
[root@RICARDOfs ~]# passwd -S linuxprobe
linuxprobe PS 2020-03-25 0 99999 7 -1 (Password set, SHA512 crypt.)

5、userdel

userdel命令用于删除用户,格式为userdel [选项] 用户名
在执行删除操作时,该用户的家目录默认会保留下来,此时可以使用-r 参数将其删 除。
在这里插入图片描述

[root@RICARDOfs ~]# id linuxprobe
uid=6666(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe),0(root)
[root@RICARDOfs ~]# userdel -r linuxprobe
[root@RICARDOfs ~]# id linuxprobe
id: linuxprobe: no such user

二、文件权限与归属

尽管在 Linux 系统中一切都是文件,但是每个文件的类型不尽相同,因此 Linux 系统使 用了不同的字符来加以区分,常见的字符如下所示。
➢ -:普通文件。
➢ d:目录文件。
➢ l:链接文件。
➢ b:块设备文件。
➢ c:字符设备文件。
➢ p:管道文件。
在 Linux 系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、 所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。对于一般文 件来说,权限比较容易理解:
可读表示能够读取文件的实际内容;
可写表示能够编辑、新增、修改、删除文件的实际内容
可执行则表示能够运行一个脚本程序。
但是, 对于目录文件来说,理解其权限设置来就不那么容易了
对目录文件来说,
可读表 示能够读取目录内的文件列表
可写表示能够在目录内新增、删除、重命名文件
可执行则表示能够进入该目录
在这里插入图片描述
现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文 件的权限就是 rwxrw-r–,数字法表示即为 764
在这里插入图片描述
在图中,包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息。
通过分析可知,该文件的类型为普通文件,所有者权限 为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文件的磁盘占用大小是 34298 字节(1字节8位),最近一次的修改时间为 4 月 2 日的凌晨 23 分,文件的名称 为 install.log。

三、文件的特殊权限

1、SUID

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有 属主的权限(仅对拥有执行权限的二进制程序有效)。
例如,所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。
但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得 程序所有者的身份,把变更的密码信息写入到 shadow 文件中。这很像我们在古装剧中见到的手持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法。
查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着 该文件被赋予了 SUID 权限。另外有读者会好奇,那么如果原本的权限是 rw-呢?如果原先权 限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S

[root@RICARDOfs ~]# ls -l /etc/shadow
---------- 1 root root 532 Mar 25 10:04 /etc/shadow
[root@RICARDOfs ~]# ls -l /bin/passwd
-rwsr-xr-x 1 root root 27856 Aug  9  2019 /bin/passwd

2、SGID

SGID 主要实现如下两种功能:
➢ 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
➢ 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
除了 root 管理员或属于 system 组成员外,所有用户都没有读取设备文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在 用于查看系统进程状态的 ps 命令文件上增加 SGID 特殊权限位。所以当用户执行该命令时,也就临时获取到了 system 用户组的权限,从而可以顺利地读取设备文件了。
如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共 享目录后,在该目录上设置 SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。
此时,我们用到的就是 SGID 的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
在这里插入图片描述
在使用上述命令设置好目录的 777 权限(确保普通用户可以向其中写入文件),并为该目 录设置了 SGID 特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件, 并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称
在这里插入图片描述
chmod命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为chmod [参数] 权限 文件或目录名称

[root@RICARDOfs ~]# ls -al tttest
-rw-r--r-- 1 root root 0 Mar 25 10:34 tttest
[root@RICARDOfs ~]# chmod 760 tttest
[root@RICARDOfs ~]# ls -al tttest
-rwxrw---- 1 root root 0 Mar 25 10:34 tttest

除了设置文件或目录的权限外,还可以设置文件或目录的所有者和所属组,这里使用的命令为chown,其格式为chown [参数] 所有者:所属组 文件或目录名称。 chmod 和 chown 命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件 进行整体操作

[root@RICARDOfs ~]# ls -l tttest
-rwxrw---- 1 root root 0 Mar 25 10:34 tttest
[root@RICARDOfs ~]# chown root:bin tttest
[root@RICARDOfs ~]# ls -l tttest
-rwxrw---- 1 root bin 0 Mar 25 10:34 tttest

3、SBIT

SBIT(Sticky Bit)特殊权限位(也可以称之为特殊权限位之粘滞位)。SBIT 特殊权限位可确保用户只能删除自己的文件,而 不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了
RHEL 7 系统中的/tmp 作为一个共 享文件的目录,默认已经设置了 SBIT 特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件
与前面所讲的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原 本没有 x 执行权限则会被写成 T
在这里插入图片描述
所以上面的命令还是赋予了这个 test文件最大的 777 权限(rwxrwxrwx)。我们切换到另外一个普通用户,然后尝试删除这个其他 人创建的文件就会发现,即便读、写、执行权限全开,但是由于 SBIT 特殊权限位的缘故,依然无法删除该文件:
在这里插入图片描述
要是也想对其他目录来设置 SBIT 特殊权限位,用 chmod命令就可以了。对应的 参数o+t代表设置 SBIT 粘滞位权限
在这里插入图片描述

四、文件的隐藏属性

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

1、chattr

chattr命令用于设置文件的隐藏权限,格式为chattr [参数] 文件。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加+参数,如果想要把某个隐藏功能移出文件, 则需要追加-参数
在这里插入图片描述
在这里插入图片描述

[root@RICARDOfs ~]# chattr +a tttest
[root@RICARDOfs ~]# rm tttest
rm: remove regular empty file ‘tttest’? y
rm: cannot remove ‘tttest’: Operation not permitted

2、lsattr

lsattr命令用于显示文件的隐藏权限,格式为lsattr [参数] 文件。在 Linux 系统中,文 件的隐藏权限必须使用 lsattr 命令来查看,平时使用的 ls 之类的命令则看不出端倪

[root@RICARDOfs ~]# ls -al tttest
-rwxrw---- 1 root bin 0 Mar 25 10:34 tttest
[root@RICARDOfs ~]# lsattr tttest
-----a-------e-- tttest

'e’属性表示文件正在使用区段来映射块
磁盘。

四、文件访问控制列表

一般权限、特殊权限、隐藏权限其实有一个共性—权限是 针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了 ACL,则目录中 的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。
为了更直观地看到 ACL 对文件权限控制的强大效果,我们先切换到普通用户,然后尝试进入 root 管理员的家目录中。在没有针对普通用户对 root 管理员的家目录设置 ACL 之前,其执行结果如下所示
在这里插入图片描述

1、setfacl

setfacl 命令用于管理文件的 ACL 规则,格式为setfacl [参数] 文件名称
文件的 ACL 提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 setfacl 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R 递归参数;针对普通文件则使用-m 参数;如果想要删除某个文件的 ACL, 则可以使用-b 参数。
chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。
常用的 ls命令是看不到 ACL 表信息的,但是却可以看到文件的权限最后一个点.变 成了加号+,这就意味着该文件已经设置了 ACL了。
在这里插入图片描述
在这里插入图片描述

2、getfacl

getfacl 命令用于显示文件上设置的 ACL 信息,格式为getfacl 文件名称
在这里插入图片描述

3、su 命令与 sudo 服务

在这里插入图片描述
上面的 su 命令与用户名之间有一个减号(-),这意味着完全切 换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强 烈建议在切换用户身份时添加这个减号(-)。 另外,当从 root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成 root 管理员就需要进行密码验证了;这也是一个必要的安全检查
在这里插入图片描述
sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式 为sudo [参数] 命令名称
在这里插入图片描述
总结来说,sudo 命令具有如下功能:
➢ 限制用户执行指定的命令:
➢ 记录用户执行的每一条命令;
➢ 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
➢ 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。
如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 visudo 命令 来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还 可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。
使用 visudo 命令配置 sudo 命令的配置文件时,其操作方法与 Vim 编辑器中用到的方法 一致,因此在编写完成后记得在末行模式下保存并退出。在 sudo 命令的配置文件中,按照下 面的格式将第 99 行(大约)填写上指定的信息:
在这里插入图片描述
在这里插入图片描述
在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用 sudo -l 命令查看到所有可执行的命令了(下面的命令中,验证的是该普通用户的密码,而不是 root 管理员的密码):
在这里插入图片描述
作为一名普通用户,是肯定不能看到 root 管理员的家目录 (/root)中的文件信息的,但是,只需要在想执行的命令前面加上 sudo 命令就可以了
在这里插入图片描述
考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的 最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此 ALL 参 数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的 权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给 出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis 命令找出命令所对应 的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可:
在这里插入图片描述
在编辑好后依然是先保存再退出。再次切换到指定的普通用户,然后尝试正常查看某个 文件的内容,此时系统提示没有权限。这时再使用 sudo 命令就可以顺利地查看文件内容了
每次执行 sudo 命令都要输入一次密码挺麻烦的,可以添加 NOPASSWD 参数, 使得用户执行 sudo 命令时不再需要密码验证:
在这里插入图片描述

复习题

1.在 RHEL 7 系统中,root 管理员是谁?
是 UID 为 0 的用户,默认是 root 管理员。

2.如何使用 Linux 系统的命令行来添加或删除用户?
添加和删除用户的命令分别是 useradd 与 userdel。

3.若某个文件的所有者具有文件的读/写/执行权限,其余人仅有读权限,那么用数字法表示 应该是什么?
所有者权限为 rwx,所属组和其他人的权限为 r–,因此数字法表示应该是 744。

4.某链接文件的权限用数字法表示为 755,那么相应的字符法表示是什么呢?
在 Linux 系统中,不同文件具有不同的类型,因此这里应写成 lrwxr-xr-x。

5.如果希望用户执行某命令时临时拥有该命令所有者的权限,应该设置什么特殊权限?
特殊权限中的 SUID。

6.若对文件设置了隐藏权限+i,则意味着什么?
无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能
新建或删除文件。

7.使用访问控制列表(ACL)来限制 linuxprobe 用户组,使得该组中的所有成员不得在/tmp 目录中写入内容。
想要设置用户组的 ACL,则需要把 u 改成 g,即 setfacl -Rm g:linuxprobe:r-x /tmp。

8.当普通用户使用 sudo 命令时是否需要验证密码?
系统在默认情况下需要验证当前登录用户的密码,若不想要验证,可添加 NOPASSWD
参数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值