Linux加强篇005-用户身份与文件权限

简介: 山重水复疑无路,柳暗花明又一村

一、前言

悟已往之不谏知来者之可追实迷途其未远觉今而昨非。舟遥遥以轻飏风飘飘而吹衣。问征夫以前路恨晨光之熹微

第一版我已经全部放到我的精选里了,大家可以点开我的头像主页,选择精选观看,本系列依照《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  

-rwsr-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服务器免费试用参与或低价购买专属于自己的服务器入口如下

入口一:新老同学免费试用

入口二:新人服务器特惠礼包

入口三:大学生版低价特惠服务器

入口四:云服务器首购特惠&免费试用

入口五:云服务器特惠1.5折起

入口六:低价特惠建站



目录
相关文章
|
5月前
|
Linux
linux查看修改文件权限
linux查看修改文件权限
47 4
|
2月前
|
安全 Linux 数据安全/隐私保护
探索Linux操作系统的文件权限管理
【9月更文挑战第29天】在数字世界中,文件权限管理如同保护我们隐私的锁。本文将带你了解如何在Linux系统中设置和管理文件权限,确保你的数据安全。我们将一起学习如何通过命令行工具来控制文件访问,就像学习一门新语言一样有趣。准备好了吗?让我们一起开启这场技术之旅!
|
17天前
|
Linux
linux/mac 下查看、修改文件权限的命令
这篇文章介绍了在Linux和Mac操作系统下如何查看和修改文件及文件夹的权限。
20 0
|
3月前
|
Linux 开发工具
在Linux中,文件权限有哪些?有什么作用?
在Linux中,文件权限有哪些?有什么作用?
|
3月前
|
Linux 数据安全/隐私保护
在Linux中,什么是文件权限?什么是rwx权限模型?
在Linux中,什么是文件权限?什么是rwx权限模型?
|
3月前
|
Linux 数据安全/隐私保护
Linux文件权限
Linux文件权限
|
3月前
|
安全 Linux
在Linux中,文件权限有哪些?
在Linux中,文件权限有哪些?
|
3月前
|
安全 Linux 数据安全/隐私保护
在Linux中,什么是文件权限?它们是如何工作的?
在Linux中,什么是文件权限?它们是如何工作的?
|
5月前
|
Linux 数据处理 数据库
深入解析Linux命令id:理解用户身份与权限
`id`命令在Linux中用于显示用户身份(UID, GID和附加组)。它查看系统用户数据库获取信息。参数如`-u`显示UID,`-g`显示GID,`-G`显示附加组,结合`-n`显示名称而非ID。用于确认命令执行者身份,确保权限正确。在脚本中使用时注意权限管理,遵循最小权限原则。
|
5月前
|
Ubuntu Linux Shell
Linux logname命令:揭秘当前登录用户的身份
`logname`命令在Linux中显示当前登录用户的用户名。它读取`/var/run/utmp`或`/etc/utmp`文件获取信息,简单直接,数据可靠。适用于多种Linux发行版。在终端输入`logname`即可查看用户名,也可在脚本中使用以动态调整内容。注意,`logname`不考虑`LOGNAME`或`USER`变量,适用于本地登录,无权限问题。在脚本中应处理无对应条目的情况。