Linux学习之五【用户身份与文件权限】

整理自刘遄老师的《Linux就该这么学》,网站链接

5、用户身份与文件权限

5.1 用户身份与能力

Linux 是一个多用户、多任务的操作系统,具有很好的稳定性与安全性。

安装系统时特别要求设置root 管理员密码,这个root 管理员就是存在于所有类UNIX 系统中的超级用户。它拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户、启动/关闭服务进程、开启/禁用硬件设备等

可通过用户的UID 值来判断用户身份,它具有唯一性。在RHEL 7 系统中,用户身份有下面这些:

  • 管理员 UID 为0:系统的管理员用户。
  • 系统用户UID 为1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
  • 普通用户 UID 从1000 开始:是由管理员创建的用于日常工作的用户。

为方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。假设有一个公司中有多个部门,每个部门中又有很多员工。如果只想让员工访问本部门内的资源,则可以针对部门而非具体的员工来设置权限。例如,可以通过对技术部门设置权限,使得只有技术部门的员工可以访问公司的数据库信息等。

另外,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,来满足日常的工作需要。

1、useradd命令

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

2、groupadd命令

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

3、usermod命令

usermod 命令用于修改用户的属性,格式为“usermod [选项] 用户名”。

用户的信息保存在/etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod 命令修改已经创建的用户信息,诸如用户的UID、基本/扩展用户组、默认终端等。
在这里插入图片描述
在这里插入图片描述
示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、passwd命令

passwd 命令用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]”。

普通用户只能使用passwd 命令修改自身的系统密码,而root 管理员则有权限修改其他所有人的密码。此外,root 管理员在Linux 系统中修改自己或他人的密码时不需要验证旧密码。
在这里插入图片描述
示例
在这里插入图片描述
假设有位同事正在度假且假期很长,那么可以使用passwd 命令禁止该用户登录系统,等假期结束回归工作岗位时,再使用该命令允许用户登录系统,而不是将其删除。这样既保证了这段时间内系统的安全,也避免了频繁添加、删除用户带来的麻烦:
在这里插入图片描述

5、userdel命令

userdel 命令用于删除用户,格式为“userdel [选项] 用户名”。
在这里插入图片描述

5.2 文件权限与归属

Linux 系统使用了不同的字符来区分文件类型,常见的字符如下所示:
􀂾 -:普通文件。
􀂾 d:目录文件。
􀂾 l:链接文件。
􀂾 b:块设备文件。
􀂾 c:字符设备文件。
􀂾 p:管道文件。

在 Linux 系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)可写(w)可执行(x)等权限。

  • 对于一般文件来说,“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。
  • 目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。

文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1 来表示,文件所有者,所属组及其他用户权限之间无关联
在这里插入图片描述
文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。例如,若某个文件的权限为7 则代表可读、可写、可执行(4+2+1);若权限为6 则代表可读、可写(4+2)。我们来看这样一个例子。现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r–,数字法表示即为764。

分析文件信息
在这里插入图片描述
上述命令执行结果中包含了文件的类型访问权限所有者(属主)所属组(属组)占用的磁盘大小修改时间文件名称等信息。通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文件的磁盘占用大小是34298 字节,最近一次的修改时间为4 月2 日的凌晨23 分,文件的名称为install.log。

5.3 文件的特殊权限

在复杂多变的生产环境中,单纯设置文件的rwx 权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID 与SBIT 的特殊权限位。

关于文件的特殊权限,另可查看Linux之特殊权限(SUID/SGID/SBIT)

1、SUID

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限二进制程序有效)。

例如,所有用户都可以执行passwd 命令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd 命令时如果加上SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow 文件中。

在使用passwd 命令时加上SUID 特殊权限位:“chmod u+s passwd” (SUID的参数是u+s

查看 passwd 命令属性时发现所有者的权限由rwx 变成了rws,其中x 改变成s 就意味着该文件被赋予了SUID 权限。另外有读者会好奇,那么如果原本的权限是rw-呢?如果原先权限位上没有x 执行权限,那么被赋予特殊权限后将变成大写的S。
在这里插入图片描述

2、SGID

SGID 主要实现如下两种功能:

  1. 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)
    该功能是参考SUID 设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的Linux 系统中,/dev/kmem 是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
    在这里插入图片描述
    除了root 管理员或属于system 组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps 命令文件上增加SGID 特殊权限位。查看ps 命令文件的属性信息:
    在这里插入图片描述
    这样,由于ps 命令被增加了SGID 特殊权限位,所以当用户执行该命令时,也就临时获取到了system 用户组的权限,从而可以顺利地读取设备文件了。
  2. 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
    每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组
    示例
    在这里插入图片描述
    在使用上述命令设置好目录的777 权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID 特殊权限位后(SGID的参数是g+s),就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:
    在这里插入图片描述
chmod命令

chmod能够用来设置文件或目录的权限,格式为“chmod [参数] 权限文件或目录名称”。

例如将文件test的权限设置成其所有者可读可写可执行、所属组可读可、其他人没有任何权限,命令为“chomd 760 test”。

chown命令

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

文件属性和权限是可以随意修改的嘛?这两个命令能成功执行的前提是什么?

3、SBIT

SBIT (Sticky Bit,称为特殊权限位之粘滞位,或保护位)特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了

其实,文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限(其原理会在下个章节讲到)。

与前面所讲的SUID 和SGID 权限显示方法不同,当目录被设置SBIT 特殊权限位后,文件的其他人权限部分的x 执行权限就会被替换成t 或者T,原本有x 执行权限则会写成t,原本没有x 执行权限则会被写成T。

示例
对linux/目录设置SBIT特殊权限位(参数o+t 代表设置SBIT 粘滞位权限):chmod -R o+t linux/

5.4 文件的隐藏属性

Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。例如仅能在日志文件中追加内容而不能修改或删除内容,这在一定程度上阻止了黑客篡改系统日志的图谋。

1、chattr命令

chattr 命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”
在这里插入图片描述
在这里插入图片描述
示例
新建一个普通文件,为其设置不允许删除与覆盖(+a 参数)权限,然后再尝试将这个文件删除
在这里插入图片描述

2、lsattr命令

lsattr 命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在Linux 系统中,文件的隐藏权限必须使用lsattr 命令来查看,平时使用的ls 之类的命令看不出。
在这里插入图片描述

5.5 文件访问控制列表

前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
在这里插入图片描述

1、setfacl命令

setfacl 命令用于管理文件的ACL 规则,格式为“setfacl [参数] 文件名称”。文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R 递归参数;针对普通文件则使用-m 参数;如果想要删除某个文件的ACL,则可以使用-b 参数。下面来设置用户在/root 目录上的权限:
在这里插入图片描述
通过ls命令查看/root,发现文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL 了。
在这里插入图片描述
示例
使用访问控制列表(ACL)来限制linuxprobe 用户组,使得该组中的所有成员不得在/tmp目录中写入内容。 setfacl -Rm g:linuxprobe:r-x /tmp。

2、getfacl命令

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

5.6 su命令和sudo服务

尽管Linux 系统为了安全性考虑,使得许多系统命令和服务只能被root 管理员来使用,但是这也让普通用户受到了更多的权限束缚,从而导致无法顺利完成特定的工作任务。

1、su命令

su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root 管理员切换至普通用户
在这里插入图片描述
su 命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息。强烈建议在切换用户身份时添加这个减号(-)

另外,当从root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成root管理员就需要进行密码验证了,这也是一个必要的安全检查。但这将暴露root管理员的密码,从而增大了系统密码被黑客获取的几率,并不是最安全的方案。
在这里插入图片描述

2、sudo命令

使用sudo 命令把特定命令的执行权限赋予给指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露root 管理员密码。我们要做的就是合理配置sudo 服务,以便兼顾系统的安全性和用户的便捷性。sudo 服务的配置原则也很简单—在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限

sudo 命令用于给普通用户提供额外的权限来完成原本root 管理员才能完成的任务,格式为“sudo [参数] 命令名称”。sudo 服务中可用的参数如下:
在这里插入图片描述
总结来说,sudo 命令具有如下功能
􀂾 限制用户执行指定的命令:
􀂾 记录用户执行的每一条命令;
􀂾 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
􀂾 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。

使用sudo 命令提供的visudo 命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers 配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。【注:只有 root 管理员才可以使用visudo 命令编辑sudo 服务的配置文件。

使用 visudo 命令配置sudo 命令的配置文件时,其操作方法与Vim 编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保存并退出。在sudo 命令的配置文件中,按照下面的格式将第99 行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
在这里插入图片描述
在这里插入图片描述
在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用sudo -l 命令查看到所有可执行的命令了。
在这里插入图片描述
测试:作为一名普通用户,是肯定不能看到root 管理员的家目录(/root)中的文件信息的,但是,只需要在想执行的命令前面加上sudo 命令就可以了
在这里插入图片描述
但是!!
生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此上面的ALL参数并不合适。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。

如果需要让某个用户只能使用root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用whereis 命令找出命令所对应的保存路径,再修改配置文件:
在这里插入图片描述
接着!!
每次执行sudo 命令都要输入一次当前登录用户的密码比较麻烦,这时可以添加NOPASSWD 参数,使得用户执行sudo 命令时不再需要密码验证:
在这里插入图片描述
这样,当切换到普通用户后再执行命令时,就不用再频繁地验证密码了。
linux如何配置普通用户(非root用户)的sudo权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值