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 主要实现如下两种功能:
-
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)
。
该功能是参考SUID 设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的Linux 系统中,/dev/kmem 是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
除了root 管理员或属于system 组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps 命令文件上增加SGID 特殊权限位。查看ps 命令文件的属性信息:
这样,由于ps 命令被增加了SGID 特殊权限位,所以当用户执行该命令时,也就临时获取到了system 用户组的权限,从而可以顺利地读取设备文件了。 -
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
。
每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置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 命令时不再需要密码验证:
这样,当切换到普通用户后再执行命令时,就不用再频繁地验证密码了。