给普通用户赋予sudo权限_linux 高级权限管理

这篇博客介绍了Linux高级权限管理,包括ACL概述、如何启用和使用ACL,详细讲解了sudo权限的赋予原则,以及SUID、SGID和Sticky BIT权限的作用和使用场景。通过理解这些权限,普通用户可以被适当地赋予管理员权限,同时保证系统的安全性。
摘要由CSDN通过智能技术生成

14b4ce07d5aa65f29824ebe14fa2df47.png

ACL 概述

ACL 用于解决用户对文件身份不足的问题。它的基本思路就是把用户拿出来,不再考虑它是文件的所有者还是所属组,直接赋予权限使用

2、ACL 使用

1)、开启 ACL

dumpe2fs -h /dev/sda2 dumpe2fs 命令是查询指定分区详细文件系统信息的命令
选项:
-h:仅显示超级快中信息,而不显示磁盘块组的详细信息
Default mount options:    user_xattr acl    # 看到这个表明 ACL 是开启的

==ACL 默认是开启的==

如果没有开启,手动开启分区的 ACL 权限

mount -o remount,acl /
重新挂载根分区,并挂载假如 ACL 权限

2)、ACL 基本命令

getfacl 文件名 查询文件的 acl 权限 setfacl 选项 文件名 设定 acl 权限
选项:
-m:设定 ACL 权限
-b:删除 ACL 权限
​ ``-x:用户` 删除单个用户的 ACL 权限 setfacl -m u:用户名:权限 文件名 setfacl -m g:组名:权限 文件名
setfacl -m u:Jimmy:4 /home/hepingfly/test/     # 这个就表示给 test 目录赋予 Jimmy 这个用户读的权限

setfacl -m u:Jimmy:5 -R /home/hepingfly/test/    # 赋予递归 ACL 权限,只能赋予目录

ACL 默认权限

setfacl -m d:u:Jimmy:5 -R /home/hepingfly/test/    # 在原有命令基础上加一个 d:    表示 default

注意:

如果给目录赋予 ACL 权限,下面两条命令都要输入

# 递归与默认的区别:
setfacl -m u:Jimmy:5 -R /home/hepingfly/test/     # 这条命令只对已经存在的文件生效
setfacl -m d:u:Jimmy:5 -R /home/hepingfly/test/   # 这条命令只对以后新建的文件生效

#第一个:比如说你 test 目录下原来有一些文件,然后你执行了上面第一个命令,那么这些文件就具备的 ACL 权限,但是此时你如果新建一个文件,这个新建文件时不具备 ACL 权限的
# 第二个:比如说你 test 目录下原来有一些文件,这些文件还没有 ACL 权限,这时候你执行第二条命令,那么以后新建的文件都会具备 ACL 权限,但是之前的文件还是没有 ACL 权限
# 因此需要两个命令一起使用

删除 ACL 权限:

setfacl -x u:Jimmy /home/hepingfly/test/        # 删除指定用户的 ACL 权限
setfacl -b /home/hepingfly/test/     # 删除文件的所有 ACL 权限

3、sudo 权限

sudo 授权

给普通用户赋予部分管理员权限

sudo 有个原则:

  • 赋予的权限越详细,普通用户得到的权限就越小
  • 赋予的权限越简单,普通用户得到的权限越大

使用 root 身份,执行 visudo

root    ALL=(ALL)       ALL
# 用户名   被管理主机的地址=(可使用的身份)   授权命令(要写绝对路径)

# %wheel        ALL=(ALL)       ALL
# %组名   被管理主机的地址=(可使用的身份)   授权命令(要写绝对路径)
  • 用户名/组名:代表 root 给哪个用户或用户组赋予命令,注意组名前加 "%"
  • 被管理主机的地址:用户可以用指定的命令管理指定 ip 地址的服务器。如果写 ALL 代表可以管理任何主机。如果写固定 IP ,代表用户可以管理指定的服务器
  • 可使用的身份:就是把来源用户切换成什么用户使用,(ALL)代表可以切换成任意身份。这个字段可以省略
  • 授权命令:代表 root 把什么命令授权给普通用户。默认是 ALL ,代表任何命令,这个当然不行(这样这个用户就变成 root 用户了)。如果需要给哪个命令授权,写入命令名即可,不过需要注意,一定要写成绝对路径
visudo
Jimmy ALL=/sbin/shutdown -r now    # 授权 Jimmy 用户可以使用 shutdown -r now 命令

sudo -l     # 查看可用的授权

授权 Jimmy 用户可以添加其他普通用户:

Jimmy ALL=/usr/sbin/useradd       # 赋予 Jimmy 添加用户权限。命令必须写入绝对路径
Jimmy ALL=/usr/bin/passwd        # 赋予修改密码权限,取消对 root 的密码修改
Jimmy ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root

4、SUID 权限

SetUID 是什么(简称 SUID)?

SetUID 的功能可以这么理解:
  • 只有可以执行的二进制程序才能设定 SUID 权限
  • 命令执行者要对该程序拥有 x(执行)权限
  • 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
  • SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
[root@hepingfly 桌面]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd

# 你会发现上面所属用户的最后一个权限是 s ,这就代表这个文件具有 suid 权限,假如这个 s 出现在所属组的位置,就代表这个文件具有 sgid 权限,假如 t 出现在其他用户的位置,就表示这个文件具有 sbit 权限
[root@hepingfly 桌面]# ll /etc/passwd
-rw-r--r--. 1 root root 1714 4月   8 23:14 /etc/passwd
[root@hepingfly 桌面]# ll /etc/shadow
----------. 1 root root 1181 4月   8 23:14 /etc/shadow
[root@hepingfly 桌面]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd

# 思考一个问题,我们说普通用户是可以修改自己的密码的,修改密码最终我们说是写到 /etc/shadow 这个文件中的,但是上面这个文件的权限是 000 ,它是怎么写进去的呢?

# 原因就在于修改密码的命令 /usr/bin/passwd 这个命令,你会发现它所有者上面有个 s 就表示它具有 suid 权限,那么为什么要给 /usr/bin/passwd 这个文件 suid 权限呢?目的就是为了可以让普通用户设置密码,普通用户在使用 /usr/bin/passwd 这个命令的时候可以去操作 /etc/shadow 文件

解释一下上面第一句话:

给文件赋 SUID 权限:

[root@hepingfly hepingfly]# touch abc
[root@hepingfly hepingfly]# ll abc 
-rw-r--r--. 1 root root 0 4月  14 22:52 abc
[root@hepingfly hepingfly]# chmod u+s abc             直接使用 u+s 就可以
[root@hepingfly hepingfly]# ll abc
-rwSr--r--. 1 root root 0 4月  14 22:52 abc

# 但是我们会发现上面的是 S ,这个 S 表示报错,说明你这个文件的权限有问题,因为我们说只有可以执行的程序才能设置 suid 权限,前提就是这个文件要有执行权限,这个 abc 文件时没有执行权限的,你给它设置 suid 权限,所以是 S 是有问题的(也可以这么理解:如果一个文件有 s 权限,那么它肯定有 x 权限。s = S + x)

# 正确应该这么操作:
[root@hepingfly hepingfly]# chmod 755 abc 
[root@hepingfly hepingfly]# ll abc
-rwxr-xr-x. 1 root root 0 4月  14 22:52 abc
[root@hepingfly hepingfly]# chmod u+s abc 
[root@hepingfly hepingfly]# ll abc 
-rwsr-xr-x. 1 root root 0 4月  14 22:52 abc

解释下上面第二句话:

[root@hepingfly hepingfly]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
[root@hepingfly hepingfly]# ll /etc/shadow
----------. 1 root root 1181 4月   8 23:14 /etc/shadow

# 你会发现 /usr/bin/passwd 这个命令的所属用户和所属组都是 root ,假如这时候我 Jimmy 用户想去改自己的密码,那么就会用到 /usr/bin/passwd 这条命令,相对于这条命令,我 Jimmy 用户就是其他人,会发现这条命令其他人也有执行权限
# 总之,你命令执行者要对这条命令有执行权限 suid 权限才会生效

解释下上面第三句话:

# 命令执行者在执行该程序时,获得该程序文件所有者身份,意思就是:
[root@hepingfly hepingfly]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
[root@hepingfly hepingfly]# ll /etc/shadow
----------. 1 root root 1181 4月   8 23:14 /etc/shadow

# 我 Jimmy 用户本来对 /etc/shadow 这个文件是没有权限操作的,但是因为 /usr/bin/passwd 这个命令是有 suid 权限的,所以当 Jimmy 用户执行 /usr/bin/passwd 这个命令的时候,它的身份会从 Jimmy 变成 /usr/bin/passwd 这个命令的所有者,也就是 root,root 用户时对 /etc/shadow 这个文件有操作权限的,因此 Jimmy 用户对这个文件也就有了操作权限

危险的 SetUID:

[root@hepingfly 桌面]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2283960 7月  24 2015 /usr/bin/vim
[root@hepingfly 桌面]# chmod u+s /usr/bin/vim
[root@hepingfly 桌面]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2283960 7月  24 2015 /usr/bin/vim

# 解释一下上面的,首先我 vim 命令是有执行权限的,这时候我给 vim 命令设置 suid 权限,那么就意味着我任何用户在执行 vim 命令的时候,身份都会变成 vim 命令的所属主用户,也就是 root 用户,那这权限就大了,比如说,/etc/shadow 文件普通用户时没有权限修改的,但是你一旦给 vim 设置 suid 权限,普通用户在执行 vim 命令的时候身份就变成了 root 用户,这时候就可以随意修改  /etc/shadow 文件了

注意:

==SUID 权限只能针对执行程序,也就是说一个文件只有有执行权限才能被赋予 SUID 权限==

5、SGID 权限

1)、针对文件的作用

SGID 既可以针对文件生效,也可以针对目录生效,这和 SUID 明显不同。如果针对文件,SGID 的含义如下:

  • 只有可执行的二进制程序才能设置 SGID 权限
  • 命令执行者要对该程序拥有 x (执行)权限
  • 命令在执行程序的时候,组身份升级为该程序文件的所属组
  • SGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@hepingfly hepingfly]# locate shp
/home/hepingfly/shp
[root@hepingfly hepingfly]# ll /var/lib/mlocate/mlocate.db 
-rw-r-----. 1 root slocate 2402222 4月  15 22:56 /var/lib/mlocate/mlocate.db

# 我们知道 locate 命令,是根据文件名去搜索文件,但是它搜索的实际上是一个数据库,根据数据库索引再去找文件,数据库文件位置是 /var/lib/mlocate/mlocate.db  但是我们发现这个文件对普通用户的权限是 0(该文件其他用户的权限是 0),但是我们发现普通用户也是可以使用 locate 命令去搜索的,那么既然可以使用 locate 命令,就必定会访问这个数据库文件去找索引,但是这个数据库文件对普通用户又没有权限,那是普通用户时怎么做到可以访问这个文件呢?

# 下面来解释下:
[root@hepingfly hepingfly]# ll /usr/bin/locate 
-rwx--s--x. 1 root slocate 35840 3月  12 2015 /usr/bin/locate

# 我们发现 /usr/bin/locate 这个命令是有 sgid 权限的,那么就意味着普通用户在执行 /usr/bin/locate 这条命令的时候,所属组就会变成 「slocate」,而 /var/lib/mlocate/mlocate.db 这个文件的所属组对这个文件是具有读权限的,因此普通用户在执行 /usr/bin/locate 这条命令的时候可以对这个数据库文件进行读取

2)、针对目录的作用

如果 SGID 针对目录设置,含义如下:

  • 普通用户必须对此目录拥有 r 和 x 的权限,才能进入此目录
  • 普通用户在此目录中的有效组会变成此目录的所属组
  • 若普通用户对此目录拥有 w 权限时,新建的文件的默认所属组是这个目录的所属组
[root@hepingfly hepingfly]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 4月  16 21:49 test      # 有个 test 文件夹,所有者和所属组都是 root

[root@hepingfly hepingfly]# chmod 777 test/   给 test 文件夹赋 777 权限,目的是为了让普通用户(其他人)拥有在这个文件夹下的 w 权限
[root@hepingfly hepingfly]# ll
总用量 4
drwxrwxrwx. 2 root root 4096 4月  16 21:49 test

[hepingfly@hepingfly test]$ touch aa       # 我用 hepingfly 这个用户创建了一个文件 aa 
[hepingfly@hepingfly test]$ ll
总用量 0
-rw-rw-r--. 1 hepingfly hepingfly 0 4月  16 22:01 aa   # 发现这个文件的所有者和所属组都是 hepingfly,这是正常的,本来就是 hepingfly 这个用户创建的


[root@hepingfly hepingfly]# chmod g+s test/    现在我用 root 用户给 test 文件夹设置 sgid 权限
[root@hepingfly hepingfly]# ll
总用量 4
drwxrwsrwx. 2 root root 4096 4月  16 22:01 test    # 发现所属组这里有了 sgid 权限

[hepingfly@hepingfly test]$ touch bb   # 现在再使用 hepingfly 这个用户去 test 目录下创建一个 bb 文件,发现它的所属组变成了 root,因为 test 文件夹具有 sgid 权限,那么如果普通用户对这个文件夹有 w 权限,在这个文件夹下新建的文件所属组就会变成这个文件夹的所属组(test 文件夹的所属组)
[hepingfly@hepingfly test]$ ll
总用量 0
-rw-rw-r--. 1 hepingfly hepingfly 0 4月  16 22:01 aa
-rw-rw-r--. 1 hepingfly root      0 4月  16 22:05 bb

6、Sticky BIT 权限

Sticky BIT 粘着位,也简称 SBIT。SBIT 目前仅针对目录有效,它的作用如下:

  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限
  • 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下的任何文件,包括其他用户建立的文件。一旦赋予粘着位,除了 root 用户可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
[root@hepingfly hepingfly]# ll -d /tmp/
drwxrwxrwt. 31 root root 4096 4月  16 22:01 /tmp/      # 我们发现 /tmp 目录就具有 sbit 权限

# 结合上面的权限,我们发现 /tmp 目录普通用户(其他人权限)具有 w 的权限,就意味着普通用户可以删除这个目录下的任何文件(按照以前的知识,删文件的前提是要对这个文件所在目录有 w 权限)

[root@hepingfly tmp]# touch abc       用 root 用户新建一个文件 abc
[root@hepingfly tmp]# ll /tmp/abc 
-rw-r--r--. 1 root root 0 4月  16 22:32 /tmp/abc 

[hepingfly@hepingfly tmp]$ touch bcd     # 用普通用户新建一个 bcd 文件
[hepingfly@hepingfly tmp]$ ll /tmp/bcd 
-rw-rw-r--. 1 hepingfly hepingfly 0 4月  16 22:37 /tmp/bcd

# 现在我想用普通用户删 abc 文件,既然我普通用户对 /tmp 目录有 w 权限,就意味着我可以删这个目录下任意文件
[hepingfly@hepingfly tmp]$ rm -rf abc
rm: 无法删除"abc": 不允许的操作

# 发现删不了,因为 /tmp 目录具有 sbit 权限,普通用户就算对这个文件夹有 w 权限,也只能删除自己建立的文件而不能删除别人建立的文件(但是 root 用户可以随意删)

设定文件特殊权限:

  • 4 代表 SUID
  • 2 代表 SGID
  • 1 代表 SBIT

或者你可以使用 u+s g+s o+t 来设定特殊权限

chmod 4755 test   # 赋予 SUID 权限
chmod 2755 test   # 赋予 SGID 权限
mkdir test
chmod 1755 test  # SBIT 只对目录有效,建立测试目录,并赋予 SBIT 权限

7、chattr 权限

chattr [+-=] [选项] 文件或目录名
选项:
+ : 增加权限
- : 删除权限
= : 等于某权限
i : 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件
a : 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除
e : linux 中绝对大多文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的。

查看文件系统属性:

lsattr 选项 文件名
选项:
-a : 显示所有文件和目录
-d : 若目标是目录,仅列出目录本身的属性,而不是子文件的
[root@hepingfly hepingfly]# touch abc
[root@hepingfly hepingfly]# chattr +i abc      给 abc 这个文件加上不可改变权限,相当于把 abc 的 insert 给锁了,那么这个文件就不给修改、删除
[root@hepingfly hepingfly]# lsattr abc           查看 abc 的权限
----i--------e- abc

[root@hepingfly hepingfly]# mkdir test
[root@hepingfly hepingfly]# chattr +i test/    给目录添加一个不可改变权限,相当于把目录的 insert 权限给锁了,那么这个目录就不能新建和删除文件,但是对目录下的文件不影响,文件还是可以修改的(我们锁的是目录,不是目录下的子文件)
[root@hepingfly hepingfly]# lsattr -d test/      查看目录权限
----i--------e- test/

注意:

如果你给文件设置了 a 属性,我们说只能在文件中增加数据,但是不能修改数据。增加数据的话,你不能使用 vim 去增加,因为 vim 是一个编辑器,它能增加能修改,系统无法判断你是增加了还是修改了。可以使用 echo 往文件里面追加。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux中,可以通过以下步骤为用户赋予sudo权限: 1. 打开终端,以root用户身份登录。 2. 执行以下命令创建一个新用户(例如,用户名为testuser): useradd testuser 3. 执行以下命令为testuser设置密码: passwd testuser 4. 执行以下命令将testuser添加到sudo组: usermod -aG sudo testuser 5. 现在,testuser就可以使用sudo命令执行需要root权限的操作了。例如,执行以下命令: sudo apt-get update 这将更新系统的软件包列表。 注意:在执行sudo命令时,需要输入testuser的密码。 ### 回答2: 在Linux中,sudo是一个非常强大的命令,可以让普通用户在不获得超级管理员(root)权限的情况下,执行某些特权命令。 如果要给用户赋予sudo权限,需要按照以下步骤进行操作: 1. 创建一个普通用户账户 首先,需要创建一个普通用户账户,即非管理员账户。可以在命令行中使用以下命令创建用户: ``` sudo adduser username ``` 其中,username为所创建的用户名。 2. 将该用户添加到sudo用户组中 接下来,需要将该用户添加到sudo用户组中,以便获得sudo权限。可以使用以下命令进行操作: ``` sudo usermod -aG sudo username ``` 其中,username为上一步中所创建的用户名。 3. 验证sudo权限 接下来,可以在新建的用户下使用sudo命令来执行需要特权的命令。例如,可以使用sudo命令来安装某些软件,或者修改系统配置等等。如下所示: ``` sudo apt-get install packageName ``` 其中,packageName为所要安装的软件包名。 需要注意的是,在使用sudo命令时,需要输入当前用户的密码,以确保安全性。同时,也应该合理规划用户权限,避免误操作或恶意行为。 通过上述步骤,可以为用户赋予sudo权限,在不使用root权限的情况下,顺利完成一些必要的操作。 ### 回答3: sudo是指"SuperUser Do",它是一个为用户赋予管理员权限的工具,用来执行超级用户(root)的命令,可以让没有管理员权限普通用户获得临时的超级用户权限,从而可以执行一些不被普通用户所允许的操作或命令。在Linux系统中,为了系统的安全性,一般情况下,超级用户账户root是被禁止登录的,而通过sudo命令,允许普通用户临时获得root权限,可以更好地管理操作系统。 如何给用户赋予sudo权限呢?下面是一些步骤: 1.首先,在root权限下,打开 /etc/sudoers 文件。 2.找到这个文件中的 "# User privilege specification"这段话,也就是用户特权规格说明的部分。 3.在用户特权规格说明的下方添加一行:username ALL=(ALL) ALL,其中username是你要赋予权限的用户名,如果需要给多个用户赋予sudo权限,则可以将他们的用户名都放在同一行上,用逗号分隔,如username1, username2 ALL=(ALL) ALL。 4.保存并关闭 /etc/sudoers 文件,这个用户就已经被赋予sudo权限了。 当用户执行sudo命令时,会提示输入当前用户的密码,然后会获得管理员权限执行相应的命令或操作,执行完成后就会自动回到普通用户状态。如果有多个用户需要管理,这种方式赋予sudo权限可能会比较麻烦,我们可以通过使用用户组来进行管理,把用户添加到具有sudo权限的组中,就可以使这些用户都拥有sudo权限,具体方法可以查阅Linux相关教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值