Linux 是一个多用户、多任务的操作系统,具有很好的稳定性与安全性。
这一部分主要学习了关于文件的所有者、所属者以及其他人对文件进行读(r)、写(w)、执行(x)等操作,以及如何在Linux系统中添加、删除、修改用户账户信息。除此之外,还可以使用SUID、SGID、SBIT特殊权限更加灵活地设置系统权限功能。最后讲解了如何使用su命令与sudo服务让普通用户具备管理员的权限。
5.1 用户身份与能力
1、root用户的权限
- root管理员拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户,启动/关闭服务进程,开启/禁用硬件设备等。
- root用户的身份号码即UID(User IDentificatiaon)的数值为0。
2、用户身份
在RHEL 7 系统中,用户身份有
- 管理员UID为0:系统的管理员用户
- 系统用户UID为1~999:Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
- 普通用户UID从1000开始(即是前面有闲置的号码):是由管理员创建的用于日常工作的用户。
3、用户组
- 通过使用用户组号码(GID,Group IDentification),可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。
- 在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。
- 一个用户只有一个基本用户组,但是可以有多个扩展用户组。
4、useradd命令
- 作用:用于创建新用户
- 格式:useradd [选项] 用户名
- 使用该命令创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且会默认创建一个与该用户同名的基本用户组。
- 参数
- 例子:
[root@hanna ~]# useradd -d /home/linux -u 6666 -s /sbin/nologin hanna2 [root@hanna ~]# id hanna2 uid=6666(hanna2) gid=6666(hanna2) groups=6666(hanna2)
5、groupadd命令
- 作用:用户创建用户组
- 格式:groupadd [选项] 群组名
- 例子:
[root@hanna ~]# groupadd ronny
6、usermod命令
-
作用:该命令用于修改用户的属性
-
格式:usermod [选项] 用户名
-
Linux系统中创建用户也就是修改配置文件的过程。
-
用户的信息保存在/etc/passwd文件中
-
参数:
-
例子
变更扩展用户组[root@hanna ~]# id hanna2 uid=6666(hanna2) gid=6666(hanna2) groups=6666(hanna2) [root@hanna ~]# usermod -G root hanna2 [root@hanna ~]# id hanna2 uid=6666(hanna2) gid=6666(hanna2) groups=6666(hanna2),0(root)
[root@hanna ~]# id hanna2 uid=6666(hanna2) gid=6666(hanna2) groups=6666(hanna2) [root@hanna ~]# usermod -u 8866 hanna2 [root@hanna ~]# id hanna2 uid=8866(hanna2) gid=6666(hanna2) groups=6666(hanna2),0(root) [root@hanna ~]# usermod -g 8888 hanna2 [root@hanna ~]# id hanna2 uid=8866(hanna2) gid=8888(hanna3) groups=6666(hanna2),0(root) [root@hanna ~]# usermod -G 8888 hanna2 [root@hanna ~]# id hanna2 uid=8866(hanna2) gid=8888(hanna3) groups=8888(hanna3)
7、passwd命令
-
作用:该命令用于修改用户命令、过期时间、认证信息等。
-
格式:passwd [选项] [用户名]
-
普通用户只能使用passwd 命令修改自身的系统密码,
-
root 管理员则有权限修改其他所有人的密码。
-
root 管理员在Linux 系统中修改自己或他人的密码时不需要验证旧密码,即root 管理员完全拥有其他用户的管理权限。
-
参数:
-
例子:
重置密码[root@hanna ~]# passwd Changing password for user root. New password: 此处输入密码值 Retype new password: 再次输入进行确认 passwd: all authentication tokens updated successfully. [root@hanna ~]# passwd hanna2 Changing password for user hanna2. New password: 此处输入密码值 Retype new password: 再次输入进行确认 passwd: all authentication tokens updated successfully.
锁定用户
[root@hanna ~]# passwd -l hanna2 Locking password for user hanna2. passwd: Success [root@hanna ~]# passwd -S hanna2 hanna2 LK 2020-04-14 0 99999 7 -1 (Password locked.) [root@hanna ~]# passwd -u hanna2 Unlocking password for user hanna2. passwd: Success [root@hanna ~]# passwd -S hanna2 linuxprobe PS 2020-04-14 0 99999 7 -1 (Password set, SHA512 crypt.)
8、userdel命令
-
作用:该命令用于删除用户。
-
格式:userdel [选项] 用户名
-
普通用户只能使用passwd 命令修改自身的系统密码,
-
在执行删除操作时,对应用户的家目录默认会保留下来,此时可以使用-r 参数将其
删除。 -
参数
-
例子:
[root@hanna ~]# id hanna2 uid=6688(hanna2) gid=6666(hanna3) groups=6666(hanna3) [root@hanna ~]# userdel -r hanna2 [root@hanna ~]# id hanna2 id: hanna2: no such user
5.2 文件权限与归属
1、文件类型
在 Linux 系统中一切都是文件,但是每个文件的类型不一定相同,因此Linux 系统使
用了不同的字符来加以区分,常见的字符有
- -:普通文件。
- d:目录文件。
- l:链接文件。
- b:块设备文件。
- c:字符设备文件。
- p:管道文件。
2、文件权限
- 在 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 文件的特殊权限
SUID、SGID 与SBIT 为特殊权限位,这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。
5.3.1 SUID
- SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
- 这是一种有条件的、临时的特殊权限授权方法。
5.3.2 SGID
1、SGID功能
SGID 主要实现如下两种功能:
- 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
- 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
2、功能1
- SGID 的第一种功能是参考SUID 而设计的,不同点在于执行程序的用户获取的不再是文
件所有者的临时权限,而是获取到文件所属组的权限。 - 例子1:
在早期的Linux 系统中,/dev/kmem 是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
cr–r----- 1 root system 2, 1 Feb 11 2017 kmem
上述可以看出除了root 管理员或属于system 组成员外,所有用户都没有读取该文件的权限。 - 例子2:
由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用
于查看系统进程状态的ps 命令文件上增加SGID 特殊权限位。:查看ps 命令文件的属性信息:
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps
这样一来,由于ps 命令被增加了SGID 特殊权限位,所以当用户执行该命令时,也就临时获取到了system 用户组的权限,从而可以顺利地读取设备文件了。
3、功能2
- 每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。
- 简易理解功能2 的作用:假设现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
- 例子:
首先创建一个目录testdir/
然后为其设置设置好目录的777 权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID 特殊权限位
切换至一个普通用户,尝试在该目录中创建文件test,
查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称为了与之对比,我们在tmp/ 目录下也创建了一个文件,可以看到所属组名称是不一样的。
4、chmod命令
- 作用: chmod 命令是一个非常实用的命令,能够用来设置文件或目录的权限。
- 格式:chmod [参数] 权限文件或目录名称
- 例子:
如果要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760
5、chown命令
- 作用:除了设置文件或目录的权限外,还可以设置文件或目录的所有者和所属组,这里使用的命令为chown。
- 格式:chown [参数] 所有者:所属组文件或目录名称
- 例子:
chmod 和chown 命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R 来表示递归操作,即对目录内所有的文件进行整体操作。
5.3.3 SBIT
- SBIT(Sticky Bit)为特殊权限位了,也可以称之为特殊权限位之粘滞位(“保护位”)。
- SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
- 与前面所讲的SUID 和SGID 权限显示方法不同,当目录被设置SBIT 特殊权限位后,文
件的其他人权限部分的x 执行权限就会被替换成t 或者T,原本有x 执行权限则会写成t,原本没有x 执行权限则会被写成T。 - 例子:
系统中的/tmp 作为一个共享文件的目录,默认已经设置了SBIT 特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。
其实,文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。
切换到另外一个普通用户,然后尝试删除这个其他人创建的文件就会发现,即便读、写、执行权限全开,但是由于SBIT 特殊权限位的缘故,依然无法删除该文件:
5.4 文件的隐藏属性
隐藏属性,即被隐藏起来的权限,默认情况下不能直接被用户发觉。
5.4.1 chattr命令
- 作用:该命令用于设置文件的隐藏权限
- 格式: chattr [参数] 文件
若想把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”
若想把某个隐藏功能移出文件,则需要追加“-参数” - 参数
- 例子
[root@hanna ~]# echo "for Test" > test [root@hanna ~]# rm test rm: remove regular file ‘ltest’? y [root@hanna ~]# echo "for Test" > test [root@hanna ~]# chattr +a test [root@hanna ~]# rm test rm: remove regular file ‘test’? y rm: cannot remove ‘linuxprobe’: Operation not permitted
5.4.2 lsattr命令
-
作用:该命令用于显示文件的隐藏权限
-
格式: lsattr [参数] 文件
-
例子:
[root@hanna ~]# ls -al hannana -rw-r--r--. 1 root root 9 Apr 17 14:48 hannana [root@lhanna ~]# lsattr hannana -----a----------hannana [root@hanna ~]# chattr -a hannana [root@hanna ~]# lsattr hannana ---------------- hannana
5.5 文件访问控制列表
- 一般权限、特殊权限、隐藏权限都是针对某一类用户设置的。
- 针对某个指定的用户进行单独的权限控制,需要用到文件的访问控制列表ACL。
- 基于普通文件或目录设置ACL就是针对指定的用户或用户组设置文件或目录的操作权限。
- 针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
5.5.1 setfacl命令
-
作用:该命令用于管理文件的ACL规则。
-
格式:setfacl [参数] 文件名称
-
文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。
-
针对目录文件需要使用-R递归参数
针对普通文件需要使用-m参数
删除某个文件的ACL使用-b参数 -
设置用户在/root目录上的权限
[root@hanna ~]# setfacl -Rm u:linuxprobe:rwx /root [root@hanna ~]# su - hanna7 [hanna7@hanna ~]$ cd /root [hanna7@hanna root]$ ls anaconda-ks.cfg Downloads Pictures Public [hanna7@hanna root]$ exit
-
查看文件的ACL表信息
文件权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL。[root@hanna ~]# ls -ld /root dr-xrwx---+ 21 root root 4096 Apr 17 15:12 /root
5.5.2 getfacl 命令
-
作用:该命令用于显示文件上设置的ACL信息
-
格式: getfacl 文件名称
-
例子:
显示在root管理员家目录上设置的所有ACL信息[root@hanna ~]# getfacl /root getfacl: Removing leading '/' from absolute path names # file: root # owner: root # group: root user::r-x user:hanna7:rwx group::r-x mask::rwx other::---
5.6 su命令与sudo服务
5.6.1 su命令
- su命令可以在当前用户不退出登录的情况下,切换用户身份。
[root@hanna ~]# su - hanna7 [hanna7@hanna ~]# su - hanna7
- 上面的su 命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。
- 当从root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成root管理员就需要进行密码验证了;这也是一个必要的安全检查
[hanna7@hanna ~]# su root Password:
5.6.2 sudo服务
- sudo命令可以把特定命令的执行权限赋予给指定用户。
- 合理配置sudo服务可以兼顾系统的安全性和用户的便捷性。
- sudo服务的配置原理是在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
- sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务。
- 格式: sudo [参数] 命令名称
- 参数:
- 功能:
总结来说,sudo 命令具有如下功能:
限制用户执行指定的命令:
记录用户执行的每一条命令;
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。 - 如果担心直接修改配置文件会出现问题,则可以使用sudo 命令提供的visudo 命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers 配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
- 只有 root 管理员才可以使用visudo 命令编辑sudo 服务的配置文件。
- 例子
普通用户使用visudo命令
root管理员使用visudo命令[hanna7@hanna ~]$ visudo visudo: /etc/sudoers: Permission denied
[root@hanna ~]$ visudo
配置用户权限
利用命令 :set nu 显示行号
在上述sudo 命令的配置文件中,按照下面的格式将第99 行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
此时就用sudo-l 命令查看到所有可执行的命令了
作为一名普通用户,是肯定不能看到root 管理员的家目录(/root)中的文件信息的,但是,只需要在想执行的命令前面加上sudo 命令就可以了:
考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此ALL 参数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。可以先使用whereis 命令找出命令所对应的保存路径,然后把配置文件第99 行的用户权限参数修改成对应的路径即可:
上述在每次执行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参数。