但行好事
莫论前程❤

Linux命令—-文件权限setuid(sudo命令)

背景:Ubuntu16.4

今天在配置jdk的时候,遇到了权限问题,由于偷懒直接执行了

sudo chmod -R 755 /usr/

之后在使用sudo命令时报错

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set

经过研究发现是chmod的锅.

Ubuntu中的sudo,passwd等命令拥有特殊的S权限

-rwsr-xr-x  1 root root      40240 May 11  2016 newgrp
-rwsr-xr-x  1 root root      30768 Nov 24  2015 passwd
-rwsr-xr-x  1 root root      22544 Mar 17  2015 pkexec
-rwxr-sr-x  1 root nobody   141384 Mar 22  2017 ssh-agent
---s--x---  1 root stapusr  183072 Mar 22  2017 staprun
---s--x--x  1 root root     123832 Mar 22  2017 sudo
-r-xr-sr-x  1 root tty       15224 Jul 24  2015 wall
-rwxr-sr-x  1 root tty       12016 Mar 22  2017 write

当执行第一条命令的时候,这些命令文件的权限发生了改变.导致命令不可用.

拓展:文件权限除了r、w、x外还有s、t、i、a权限:

s,t与系统账号和系统进程相关。

s可以出现在文件拥有者的x权限位置上,也可以出现在文件所属组的x权限位上。前者被称为set UID,简称SUID,后者被称为Set GID,简称SGID。

执行命令ls -l /bin/su,能够看到这个命令权限是 -rwsr-xr-x,这就是SUID。SUID权限拥有这样的功能:

  • SUID仅对二进制程序有效;
  • 执行者对于该程序具有x的可执行权限;
  • 执行权限仅在该程序执行过程中有效;
  • 执行者将具有改程序拥有者的权限;

su这个命令,无论任何人执行了它都具有root权限,因为它的拥有者是root,只是这个权限仅在su命令中有效。这也是su命令能够切换用户的实现原理。
设置SUID权限可以使用u+s来进行。
SUID在Linux中是非常常见的。那些需要提供给普通用户,但是又需要root权限的程序基本都有SUID,如passwd,mount等。

相对于SUID,SGID比较少见。典型的是/usr/bin/locate,他的权限是-rws–s–x,设置SGID,用g+s来进行。SGID权限的功能是这样的。

  • SGID仅对二进制程序有效。
  • 执行者对该程序有x的可执行权限。
  • 执行者在执信过程中将会获得该程序所属用户组的支持。

SGID用在locate命令上,是期望任何用户在执行命令时候能够读取mlocate.db文件内容。这个文件位于/var/lib/mlocate/mlocate.db。与locate命令有相同的用户组,而且用户组具有读权限,其他用户没有任何权限。
SGID除了用在二进制程序上,还能够用在目录上,当一个目录设置了SGID后,具有如下功能:

  • 用户若对此目录拥有r与x权限时,该用户能够进入次目录。
  • 该用户在此目录下的有效用户组将变成该目录的用户组。
  • 若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同。

s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效(chmod命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)。Linux修改密码的passwd便是个设置了SUID的程序,普通用户无读写/etc/shadow文件的权限确可以修改自己的密码。

ll -a /usr/bin/passwd
-rwsr-xr-x 1 root root 32988 2008-12-08 17:17 /usr/bin/passwd

我们可以通过字符模式设置s权限:chmod a+s filename,也可以使用绝对模式进行设置:

设置suid:将相应的权限位之前的那一位设置为4;
设置guid:将相应的权限位之前的那一位设置为2;
两者都置位:将相应的权限位之前的那一位设置为4+2=6。

SUID,SGID,SBIT和普通的x,w,r权限一样能用数字法设置。只需将原来的3位数字扩展到4位即可。SUID代表4,SGID代表2,SBIT代表1.他们放在数字权限的最开头。如设置SUID,写成4755

例如:

chmod 4764 filename   # 设置SUID

t :设置粘着位,一个文件可读写的用户并一定想让他有删除此文件的权限,如果文件设置了t权限则只有属主和root有删除文件的权限,通过chmod +t filename 来设置t权限。

i:不可修改权限 例:chattr u+i filename 则filename文件就不可修改,无论任何人,如果需要修改需要先删除i权限,用chattr -i filename就可以了。查看文件是否设置了i权限用lsattr filename。

a:只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。可以使用chattr +a设置追加权限。

赞(0) 打赏
未经允许不得转载:刘鹏博客 » Linux命令—-文件权限setuid(sudo命令)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏