Linux 笔记分享十一:sudo 权限

注意:特殊权限尽量少修改,容易出现安全隐患

一、SetUID权限

  • 只有可以执行的二进制程序才能设定SUID权限
  • 命令执行者要对该程序拥有x(执行)权限
  • 命令执行者在执行改程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)(变成root)
  • SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

1、设定SUID权限

chmod 4755 文件名
chmod u+s 文件名

4就代表所属用户SUID

2、关于非执行权限的文件赋予SUID权限

  • 有执行权限的
chmod 4755 abc
ll

返回:

-rwsr-xr-x. 1 root root   0 7月 1 18:05 ==abc==
  • 无执行权限的
chmod 4644 bcd
ll

返回:

-rwSr--r--. 1 root root  0 7月 1 18:05 ==bcd==

注意赋予特殊权限是S的,无效;只有s是有效的

可以理解为s = S + x

关于有权限的,普通用户能够执行abc,则普通用户就能获取s权限,因为-rwsr-xr-x

3、passwd命令

  • 下面是passwd命令的权限
-rwsr-xr-x
  • 下面是/etc/shadow密码文件的权限
----------

root拥有无视权限集的能力,即就算文件所属者没有任何权限,而所属者恰好又是root,则root能够强制操作文件

  • 有关上面的解释

passwd是拥有SUID权限的命令,由权限可以看出,普通用户可以执行passwd命令,因此在执行过程中,普通用户会变身为root,所以就能改没有任何权限的密码文件了

4、设定 SetUID 的方法

  • 4 代表 SUID
chmod 4755 文件名

或者

chmod u+s 文件名

取消 SUID

chmod 0755 文件名
# 或者
chmod u-s 文件名

5、危险的 SetUID 命令

  • 关键目录应严格控制写权限。比如 //user
  • 用户的密码设置要严格遵守密码三原则
  • 对系统中默认应该具有 SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了 SetUID 权限

举个例子

chmod 4755 /bin/vi
/bin/vi /etc/shadow

这样操作之后,所有用户,都可以打开 shadow 并进行修改,当然也能改 root 的密码,这就相当于把服务器送给别人了

记得改回来:chmod 0755 /bin/vi

所以不要手动给文件赋予 SetUID 权限

6、检测系统中额外出现的 SetUID 权限的脚本

#!/bin/bash

# 搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
# 做循环,每次循环取出临时文件中的文件名
for i in $(cat /tmp/setuid.check)
do
    # 对比这个文件名是否在模板文件中
    grep $i /root/suid.log > /dev/null
        if ["$?" != "0"]
        # 检测上一个命令的返回值,如果不为 0,证明上一个命令报错
        then
            # 如果文件名不在模板文件中,则输出错误信息,并把报错输出到日志中
            echo "$i isn't in listfile!" >> /root/suid_log_$(date +%F)
         fi
done
# 清理缓存文件
rm -rf /tmp/setuid.check

二、SetGID 文件特殊权限

SetUID 仅能对执行的文件进行设置

SetGID 不仅能对执行的文件进行设置,也能对目录进行设置

1、SetGID 针对文件的作用

  • 只有可执行的二进制程序才能设置 SGID 权限
  • 命令执行者要对该程序拥有 x (执行)权限
  • 命令执行在执行程序的时候,组身份升级为该程序文件的数组
  • SetGID 权限同样只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

典型例子

ll /usr/bin/locate

返回

-rwx--s--x 1 root slocate 35612 8月 24 2010 /usr/bin/locate

locate 命令搜索的数据库

ll /var/lib/mlocate/mlocate.db

返回

-rw-r----- 1 root slocate 1838850 1月 20 04:29 /var/lib/mlocate/mlocate.db

我们看到 locate 所搜索的数据库,普通用户没有任何权限,则通过给 locate 添加 SetGID 权限,使得普通用户能够在执行时,加入 slocate 组,这时候就对数据库文件拥有的读的权限

2、SetGID 针对目录的作用

  • 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录
  • 普通用户在此目录中的有效组会变成此目录的属组
  • 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录的属组

举个例子

root 用户执行以下命令

cd /tmp
mkdir test
ll # 查看 test 权限发现为 755
chmod 777 test
chmod 2777 test # 给 test 目录赋予 SGID 权限

普通用户进入此目录执行以下命令

cd /tmp/test
touch blos # 这个 blos 所属组不是普通用户所在组,而是 test 目录所在组

3、SetGID 设置

chmod 2777 文件或目录
# 或者
chmod g+s 文件或目录

三、Sticky BIT 权限

1、SBIT 粘着位权限

  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限
  • 如果没有粘着位,普通用户拥有 w 权限,所有可以删除除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

2、设置与取消粘着位

  • 设置粘着位
chmod 1755 目录名
# 或者
chmod o+t 目录名
  • 取消粘着位
chmod 0777 目录名
# 或者
chmod o-t 目录名
  • 查看 SBIT 权限
drwxrwxrwt. 2 root root 4096 7月 1 22:57 test
  • 典型例子

根目录下的 tmp 目录默认拥有 SBIT 权限

四、不可改变位权限(chattr 属性)

SBIT 的扩展,限制目录中其他用户文件,防止当前用户进入文件瞎改

1、chattr 命令格式

chattr [+-=] [选项] 文件或目录

+:增加权限

-:删除权限

=:等于某权限

  • chattr 常用选项

i:insert 指插入,如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件,root 都不行

a:append 指追加,如果对文件设置 a 属性,那么 只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除,root 都不行

2、查看 chattr 属性

chattr +i abc
lsattr abc # 看目录用 lsattr -d 目录名

返回

----i--------e- abc

其中 i 代表 i 权限,e 呢是指文件系统(ext4)

  • 注意

关于 a 属性,说是对文件只有追加能力,但是不能用 vi 工具进行操作,因为系统,无法判断,你是修改了还是追加了。所有只能用 echo bbbbb >> dt

本作品采用《CC 协议》,转载必须注明作者和本文链接
时空扭曲, 到底长啥样.
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!