一、前言
悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。舟遥遥以轻飏,风飘飘而吹衣。问征夫以前路,恨晨光之熹微。
第一版我已经全部放到我的精选里了,大家可以点开我的头像主页,选择精选观看,本系列依照《Linux就该这么学》第二版随书学习练习操作,将一些课本上不顺畅的地方,全部以最简方式免费开源展示给大家,资源大家可以自行百度,学习起来我们既要多巴胺也要内啡肽。
还有两天又过周末了,本想这周一天一更的,结果没想到实操那么多坑,不过我把坑趟平了,希望大家少入坑,能顺顺利利的学完,也希望明年三四月份大家都能找到好工作或者顺利升职加薪,不能谋万世者不能谋一时,不能谋全局者不能谋一隅,请挨下今天学习痛苦的小皮鞭,一鞭加一鞭,砥砺前行,到时站在塔尖俯瞰众生,唯我独尊,送上一首天王的<周杰伦-琴伤>,今天要学的也是用户身份和权限,你的能力越大责任就越大,权限也就越高,身份一朝改变,从此一骑绝尘。
5.1 用户身份与能力
在RHEL 8系统中,用户身份有下面这些,相当于皇宫的一些身份,皇帝、锦衣卫、大臣,皇帝是0独一无二,也就是root,锦衣卫是1-999保护系统免于崩溃,大臣是1000+由皇帝任命,拼命干活,出生的时候都以为自己是0,长大之后发现拿错本了,都是1000+。UID是不能冲突的,而且管理员创建的普通用户的UID默认是从1000开始的(即使前面有闲置的号码),就是有的萝卜坑不是你想占就占的。
管理员UID为0:系统的管理员用户。
系统用户UID为1~999:Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会由独立的系统用户负责运行,进而有效控制被破坏范围。
普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。
用户组的概念。通过使用用户组号码(GID,Group IDentification),可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。这个简单来讲就是小团体,党争。
在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳到其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要,你被任命了先各自为战,然后如果有人拉拢你,其他用户就是扩展用户组,但是基本用户组还是你,你中有我,我中有你,天下事坏就坏在这里,但是我们都是有基本立场的。
1. id命令
id命令用于显示用户的详细信息,语法格式为“id用户名”
使用id命令查看一个名称为linuxprobe的用户信息:
[root@localhost ~]# id centos8
uid=1000(centos8) gid=1000(centos8) groups=1000(centos8)
2. useradd命令
useradd命令用于创建新的用户账户,语法格式为“useradd [参数] 用户名”
可以使用useradd命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。
useradd命令中参数及作用
参数 | 作用 |
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD. |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
使用useradd命令创建一个名称为linuxcool的用户,并使用id命令确认信息:
[root@localhost ~]# useradd weihongbin04
[root@localhost ~]# id weihongbin04
uid=1004(weihongbin04) gid=1004(weihongbin04) groups=1004(weihongbin04)
创建一个普通用户并指定家目录的路径、用户的UID以及Shell解释器,/sbin/nologin,它是终端解释器中的一员,与Bash解释器有着天壤之别。一旦用户的解释器被设置为nologin,则代表该用户不能登录到系统中:
[root@localhost ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin jinyiwei01
[root@localhost ~]# id jinyiwei01
uid=8888(jinyiwei01) gid=8888(jinyiwei01) groups=8888(jinyiwei01)
3. groupadd命令
groupadd命令用于创建新的用户组,语法格式为“groupadd [参数] 群组名”
创建一个用户组cabinet(内阁):
[root@localhost ~]# groupadd cabinet
4. usermod命令
usermod命令用于修改用户的属性,语法格式为“usermod [参数] 用户名”
用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,比如用户的UID、基本/扩展用户组、默认终端等
usermod命令参数及作用
参数 | 作用 |
-c | 填写用户账户的备注信息 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
将用户weihongbin01加入到root用户组中,这样扩展组列表中则会出现root用户组的字样,而基本组不会受到影响:
[root@localhost ~]# usermod -G root weihongbin01
[root@localhost ~]# id weihongbin01
uid=1001(weihongbin01) gid=1001(weihongbin01) groups=1001(weihongbin01),0(root)
用-u参数修改weihongbin01用户的UID号码值:
[root@localhost ~]# usermod -u 9999 weihongbin01
[root@localhost ~]# id weihongbin01
uid=9999(weihongbin01) gid=1001(weihongbin01) groups=1001(weihongbin01),0(root)
把用户的解释器终端由默认的/bin/bash修改为/sbin/nolog:
[root@localhost ~]# usermod -s /sbin/nologin weihongbin01
[root@localhost ~]# su - weihongbin01
This account is currently not available.
将用户的终端设置成/sbin/nologin后用户马上就不能登录了,但这个用户依然可以被某个服务所调用,管理某个具体的服务。当黑客通过这个服务入侵成功后,破坏的范围也仅仅局限于这个特定的服务,而不能使用这个用户身份登录到整台服务器上,从而尽可能地把损失降至最小化。
5. passwd命令
passwd命令用于修改用户的密码、过期时间等信息,语法格式为“passwd [参数] 用户名”
普通用户只能使用passwd命令修改自己的系统密码,而root管理员则有权限修改其他所有人的密码。
passwd命令参数及作用
参数 | 作用 |
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
--stdin | 允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
修改自己的密码,只需要输入命令后敲击回车键即可:
[root@localhost ~]# passwd
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
要修改其他人的密码,则需要先检查当前是否为root管理员权限,然后在命令后指定要修改密码的那位用户的名称:
[root@localhost ~]# passwd weihongbin01
Changing password for user weihongbin01.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
使用passwd命令禁止该用户登录系统,等假期结束回归工作岗位时,再使用该命令允许用户登录系统,而不是将其删除。
[root@localhost ~]# passwd -l weihongbin01
Locking password for user weihongbin01.
passwd: Success
[root@localhost ~]# passwd -S weihongbin01
weihongbin01 LK 2023-11-17 0 99999 7 -1 (Password locked.)
在解锁时,记得也要使用管理员的身份;
[root@localhost ~]# passwd -u weihongbin01
Unlocking password for user weihongbin01.
passwd: Success
[root@localhost ~]# passwd -S weihongbin01
weihongbin01 PS 2023-11-17 0 99999 7 -1 (Password set, SHA512 crypt.)
6. userdel命令
userdel命令用于删除已有的用户账户,语法格式为“userdel [参数] 用户名”
userdel命令中参数及作用
参数 | 作用 |
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录 |
在删除一个用户时,一般会建议保留他的家目录数据,以免有重要的数据被误删除。所以在使用userdel命令时可以不加参数,写清要删除的用户名称就行,用户删除但是家目录数据会继续存放在/home目录中,等确认未来不再使用时将其手动删除即可::
[root@localhost ~]# userdel weihongbin01
[root@localhost ~]# id weihongbin01
id: ‘weihongbin01’: no such user
[root@localhost ~]# cd /home
[root@localhost home]# ll
drwx------. 15 centos8 centos8 4096 Nov 15 10:38 centos8
drwx------. 3 jinyiwei01 jinyiwei01 78 Nov 16 16:43 linux
drwx------. 3 9999 1001 78 Nov 15 15:31 weihongbin01
[root@localhost home]# rm -rf weihongbin01
5.2 文件权限与归属
文件权限解析可读(r)、可写(w)、可执行(x):可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。
读写执行权限对于文件与目录可执行命令的区别
文件的可读、可写、可执行权限的英文全称分别是read、write、execute,可以简写为r、w、x,亦可分别用数字4、2、1来表示,文件所有者、文件所属组及其他用户权限之间无关联
减号是占位符,代表这里没有权限,在数字表示法中用0表示
文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名称等信息。通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r--),除此以外的其他人也只有可读权限(r--),文件的磁盘占用大小是34298字节,最近一次的修改时间为4月2日的0:23,文件的名称为install.log
普通文件(-)和目录文件(d)的身影。块设备文件(b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等,在/dev/目录中最为常见
5.3 文件的特殊权限
1. SUID
SUID是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)在使用命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份。
[root@localhost home]# ll /etc/shadow
----------. 1 root root 1686 Nov 17 16:39 /etc/shadow
[root@localhost home]# ll /bin/passwd
-rw
s
r-xr-x. 1 root root 33600 Apr 7 2020 /bin/passwd
加粗显示的字体用来告诫用户一定要小心这个权限,因为一旦某个命令文件被设置了SUID权限,就意味着凡是执行该文件的人都可以临时获取到文件所有者所对应的更高权限。因此,千万不要将SUID权限设置到vim、cat、rm等命令上
2. SGID
SGID特殊权限有两种应用场景:当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
[root@localhost home]# mkdir test
[root@localhost home]# ll test/
[root@localhost home]# ls -ald test/
drwxr-xr-x. 2 root root 6 Nov 17 16:54 test/
[root@localhost home]# chmod -R 777 test/
[root@localhost home]# ls -ald test/
drwxrwxrwx. 2 root root 6 Nov 17 16:54 test/
[root@localhost home]# chmod -R g+s test/
[root@localhost home]# ls -ald test/
drwxrwsrwx. 2 root root 6 Nov 17 16:54 test/
[root@localhost home]# mkdir -p test/123
[root@localhost home]# ls -ald test/123/
drwxr-sr-x. 2 root root 6 Nov 17 16:55 test/123/
chmod命令用于设置文件的一般权限及特殊权限,语法格式为“chmod [参数] 文件名”
文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760。
[root@localhost ~]# ll anaconda-ks.cfg
-rw-------. 1 root root 2788 Nov 9 15:44 anaconda-ks.cfg
[root@localhost ~]# chmod 760 anaconda-ks.cfg
[root@localhost ~]# ll anaconda-ks.cfg
-rwxrw----. 1 root root 2788 Nov 9 15:44 anaconda-ks.cfg
chown命令用于设置文件的所有者和所有组,语法格式为“chown所有者:所有组 文件名”
“所有者:所有组”的格式把前面那个文件的所属信息修改,变更后的效果如下:
[root@localhost ~]# chown weihongbin02:weihongbin02 anaconda-ks.cfg
[root@localhost ~]# ll anaconda-ks.cfg
-rwxrw----. 1 weihongbin02 weihongbin02 2788 Nov 9 15:44 anaconda-ks.cfg
3. SBIT
SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。文件的其他用户权限部分的x执行权限就会被替换成t或者T—原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
/tmp目录上的SBIT权限默认已经存在,这体现为“其他用户”权限字段的权限变为rwt:
[root@localhost ~]# ls -ald /tmp
drwxrwxrwt. 32 root root 4096 Nov 17 17:01 /tmp
赋予test文件最大的777权限(rwxrwxrwx)切换到一个普通用户身份下,尝试删除这个由其他人创建的文件,这时就会发现,即便读、写、执行权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除该文件:
[root@localhost ~]# echo "123" > /tmp/test
[root@localhost ~]# chmod 777 /tmp/test
[root@localhost ~]# ls -al /tmp/test
-rwxrwxrwx. 1 root root 4 Nov 17 17:03 /tmp/test
[root@localhost ~]# su - weihongbin02
[weihongbin02@localhost ~]$ rm -rf /tmp/test
rm: cannot remove '/tmp/test': Operation not permitted
使用特殊权限,就能实现很多巧妙的功能。使用chmod命令设置特殊权限
SUID、SGID、SBIT特殊权限设置参数
参数 | 作用 |
u+s | 设置SUID权限 |
u-s | 取消SUID权限 |
g+s | 设置SGID权限 |
g-s | 取消SGID权限 |
o+t | 设置SBIT权限 |
o-t | 取消SBIT权限 |
在家目录中创建一个名为linux的新目录,随后为其设置SBIT权限:
[root@localhost ~]# mkdir linux
[root@localhost ~]# chmod -R o+t linux/
[root@localhost ~]# ls -ld linux/
drwxr-xr-t. 2 root root 6 Nov 17 17:05 linux/
SUID、SGID与SBIT也有对应的数字表示法,分别为4、2、1。也就是说777还不是最大权限,最大权限应该是7777,其中第1个数字代表的是特殊权限位。既然知道了数字表示法是由“特殊权限+一般权限”构成的,现在就以上面linux目录的权限为例,为大家梳理一下计算方法
在rwxr-xr-t权限中,最后一位是t,这说明该文件的一般权限为rwxr-xr-x,并带有SBIT特殊权限。对于可读(r)、可写(w)、可执行(x)权限的数字计算方法大家应该很熟悉了—rwxr-xr-x即755,而SBIT特殊权限位是1,则合并后的结果为1755。
权限是“rwsrwSr--”大写S表示原先没有执行权限,因此一般权限为rwxrw-r--,将其转换为数字表示法后结果是764。带有的SUID和SGID特殊权限的数字法表示是4和2,心算得出结果是6,合并后的结果为6764。
特殊权限的5是由4+1组成的,意味着有SUID和SBIT。SUID和SGID的写法是,原先有执行权限则是小写s,如果没有执行权限则是大写S;而SBIT的写法则是,原先有执行权限是小写t,没有执行权限是大写T。一般权限的537进行字符转换后应为r-x-wxrwx,然后在此基础上增加SUID和SBIT特殊权限,合并后的结果是r-s-wxrwt。
UID占位是4,GID占位是2,BID占位是1,先占为小写,后占为大写,U和G的为s,B的为t
5.4 文件的隐藏属性
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。
1. chattr命令
chattr命令用于设置文件的隐藏权限,语法格式为“chattr [参数] 文件名称”如果想要把某个隐藏功能添加到文件上,需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”
chattr命令中参数及作用
参数 | 作用 |
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
设置“不允许删除与覆盖”(+a参数)权限,然后再尝试将这个文件删除:
[root@localhost ~]# echo "for Test" > linux
[root@localhost ~]# chattr +a linux
[root@localhost ~]# rm -rf linux
rm: cannot remove 'linux': Operation not permitted
2. lsattr命令
lsattr命令用于查看文件的隐藏权限,语法格式为“lsattr [参数] 文件名称”
文件的隐藏权限必须使用lsattr命令来查看
[root@localhost ~]# ls -al linux
-rw-r--r--. 1 root root 9 Nov 17 17:22 linux
[root@localhost ~]# lsattr linux
-----a-------------- linux
按照显示的隐藏权限的类型(字母),使用chattr命令将其去掉:
[root@localhost ~]# chattr -a linux
[root@localhost ~]# rm -rf linux
彻底地保护某个文件,不允许任何人修改和删除它的话,加上-i参数,彻底删除某个文件,可以使用+s参数来保证其被删除后不可恢复—硬盘上的文件数据会被用零块重新填充
5.5 文件访问控制列表
基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准地派发权限。针对某个目录设置了ACL,则目录中的文件会继承其ACL权限;若针对文件设置了ACL,则文件不再继承其所在目录的ACL权限。
[root@localhost ~]# su - weihongbin02
Last login: Fri Nov 17 17:03:51 CST 2023 on pts/0
[weihongbin02@localhost ~]$ cd /root
-bash: cd: /root: Permission denied
1. setfacl命令
setfacl命令用于管理文件的ACL权限规则,语法格式为“setfacl [参数] 文件名称”ACL权限提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制。使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。
setfacl命令中参数及作用
参数 | 作用 |
-m | 修改权限 |
-M | 从文件中读取权限 |
-x | 删除某个权限 |
-b | 删除全部权限 |
-R | 递归子目录 |
为普通用户单独设置一下权限:
[root@localhost ~]# setfacl -Rm u:weihongbin02:rwx /root
再切换到这位普通用户的身份下,现在能正常进入了:
[root@localhost ~]# su - weihongbin02
Last login: Mon Nov 20 09:13:26 CST 2023 on pts/0
[weihongbin02@localhost ~]$ cd /root
[weihongbin02@localhost root]$ ll
-rw-rwxr--+ 1 root root 587202560 Nov 8 15:53 560
查看文件是否设置了ACL,文件权限的最后一个点(.)变成了加号(+),代表该文件已经设置了ACL。
[weihongbin02@localhost root]$ ls -ld /root
dr-xrwx---+ 17 root root 4096 Nov 17 17:25 /root
2. getfacl命令
getfacl命令用于查看文件的ACL权限规则,语法格式为“getfacl [参数] 文件名称”查看ACL,用getfacl命令
[root@localhost ~]# getfacl /root/
getfacl: Removing leading '/' from absolute path names
# file: root/
# owner: root
# group: root
user::r-x
user:weihongbin02:rwx
group::r-x
mask::rwx
other::---
ACL权限还可以针对某个用户组进行设置
[root@localhost ~]# setfacl -m g:weihongbin02:rw /etc/fstab
[root@localhost ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
group:weihongbin02:rw-
mask::rw-
other::r--
要清空所有ACL权限,请用-b参数;要删除某一条指定的权限,就用-x参数:
[root@localhost ~]# setfacl -x g:weihongbin02 /etc/fstab
[root@localhost ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
ACL权限的设置都是立即且永久生效的,不需要再编辑什么配置文件,在备份/home目录上的ACL权限时,可使用-R递归参数,这样不仅能够把目录本身的权限进行备份,还能将里面的文件权限也自动备份。
[root@localhost ~]# cd /
[root@localhost /]# getfacl -R home > backup.acl
[root@localhost /]# ll backup.acl
-rw-r--r--. 1 root root 59442 Nov 20 09:27 backup.acl
ACL权限的恢复也很简单,使用的是--restore参数。
[root@localhost /]# setfacl --restore backup.acl
5.6 su命令与sudo服务
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户
[root@localhost /]# su - weihongbin02
Last login: Mon Nov 20 09:18:30 CST 2023 on pts/0
从普通用户切换成root管理员就需要进行密码验证
[weihongbin02@localhost ~]$ su -
Password:
Last login: Mon Nov 20 09:13:06 CST 2023 from 192.168.227.1 on pts/0
su命令与用户名之间有一个减号(-)把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)
sudo命令用于给普通用户提供额外的权限,语法格式为“sudo [参数] 用户名”
sudo命令中可用参数及作用
参数 | 作用 |
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
使用sudo命令提供的visudo命令来配置用户权限,visudo命令用于编辑、配置用户sudo的权限文件,语法格式为“visudo [参数]”这是一条会自动调用vi编辑器来配置/etc/sudoers权限文件的命令,能够解决多个用户同时修改权限而导致的冲突问题
使用visudo命令配置权限文件时,其操作方法与Vim编辑器中用到的方法完全一致,因此在编写完成后记得在末行模式下保存并退出。在配置权限文件时,按照下面的格式在第101行(大约)填写上指定的信息。
谁可以使用 允许使用的主机 = (以谁的身份) 可执行命令的列表
谁可以使用:稍后要为哪位用户进行命令授权。
允许使用的主机:可以填写ALL表示不限制来源的主机,亦可填写如192.168.10.0/24这样的网段限制来源地址,使得只有从允许网段登录时才能使用sudo命令。
以谁的身份:可以填写ALL表示系统最高权限,也可以是另外一位用户的名字。
可执行命令的列表:可以填写ALL表示不限制命令,亦可填写如/usr/bin/cat这样的文件名称来限制命令列表,多个命令文件之间用逗号(,)间隔。
红色为新添加的用户及权限
[root@localhost /]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 weihongbin02 ALL=(ALL) ALL
在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用sudo -l命令查看所有可执行的命令了,验证的是普通用户的密码,而不是root管理员的密码
[root@localhost ~]# su - weihongbin02
Last login: Mon Nov 20 09:29:46 CST 2023 on pts/0
[weihongbin02@localhost ~]$ sudo -l
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for weihongbin02:
此处输入当前用户的密码
Matching Defaults entries for weihongbin02 on localhost:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME
HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User weihongbin02 may run the following commands on localhost:
(ALL) ALL
作为一名普通用户,是肯定不能看到root管理员的家目录(/root)中的文件信息的,但是,只需要在想执行的命令前面加上sudo命令就行了,加之前先去掉之前加的root规则:
[root@localhost ~]# setfacl -x u:weihongbin02 /root
[weihongbin02@localhost ~]$ ll /root
ls: cannot open directory '/root': Permission denied
[weihongbin02@localhost ~]$ sudo ls /root
560 bash.txt Checkkeys.sh
需要让某个用户只能使用root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。这时,可以先使用whereis命令找出命令所对应的保存路径:
[root@localhost ~]# whereis cat
cat:
/usr/bin/cat
/usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@localhost ~]# whereis reboot
reboot:
/usr/sbin/reboot
/usr/share/man/man8/reboot.8.gz /usr/share/man/man2/reboot.2.gz
使用visudo命令继续编辑权限文件,将原先第101行所新增的参数作如下修改,且多个命令之间用逗号(,)间隔:
[root@localhost ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 weihongbin02 ALL=(ALL)
/usr/bin/cat,/usr/sbin/reboot
在编辑好后依然是先保存再退出。再次切换到指定的普通用户,然后尝试正常查看某个系统文件的内容,此时系统提示没有权限(Permission denied)。这时再使用sudo命令就能顺利地查看文件内容了:
[root@localhost ~]# su - weihongbin02
Last login: Mon Nov 20 09:42:20 CST 2023 on pts/0
[weihongbin02@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[weihongbin02@localhost ~]$ sudo cat /etc/shadow
[sudo] password for weihongbin02:
此处输入当前用户的密码
bin:*:18397:0:99999:7:::
daemon:*:18397:0:99999:7:::
添加NOPASSWD参数,使得用户下次再执行sudo命令时就不用密码验证:
[root@localhost ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 weihongbin02 ALL=(ALL)
NOPASSWD:
/usr/bin/cat,/usr/sbin/reboot
visudo命令只有root管理员才可以执行,普通用户在使用时会提示权限不足。
[root@localhost ~]# su - weihongbin02
Last login: Mon Nov 20 09:56:43 CST 2023 on pts/0
[weihongbin02@localhost ~]$ sudo cat /root
cat: /root: Is a directory
[weihongbin02@localhost ~]$ sudo cat /etc/shadow
bin:*:18397:0:99999:7:::
daemon:*:18397:0:99999:7:::
二、巩固练习
1.在RHEL 8系统中,root管理员是谁?
答:是UID为0的用户,是权限最大、限制最小的管理员。
2.如何使用Linux系统的命令行来添加和删除用户?
答:添加和删除用户的命令分别是useradd与userdel。
3.若某个文件的所有者具有文件的读/写/执行权限,其余人仅有读权限,那么用数字法表示应该是什么?
答:所有者权限为rwx,所属组和其他人的权限为r--,因此数字法表示应该是744。
4.某文件的字符权限为rwxrw-r--,那么对应的数字法权限应该是多少?
答:数字法权限应该是764。
5.某链接文件的权限用数字法表示为755,那么相应的字符法表示是什么呢?
答:在Linux系统中,不同文件具有不同的类型,因此这里应写成lrwxr-xr-x。
6.如果希望用户执行某命令时临时拥有该命令所有者的权限,应该设置什么特殊权限?
答:特殊权限中的SUID。
7.若对文件设置了隐藏权限(+i参数),则意味着什么?
答:无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件。
8.使用访问控制列表(ACL)来限制linuxprobe用户组,使得该组中的所有成员不得在/tmp目录中写入内容。
答:想要设置用户组的ACL,则需要把u改成g,即setfacl -Rm g:linuxprobe:r-x /tmp。
9.当普通用户使用sudo命令时是否需要验证密码?
答:系统在默认情况下需要验证当前登录用户的密码,若不想验证,可添加NOPASSWD参数。
三、跋文
如果想上手操作的同学们可以通过阿里云ecs服务器免费试用参与或低价购买专属于自己的服务器入口如下↓↓↓↓↓