摘要:
最近遇到一个问题,在测试环境上发现使用su无法切换账户,但是这两个账户都是可以登录的,于是就开始百度,找到了解决问题的办法。
解决方案如下:
第一步:
使用root用户登录系统,或者有root权限的用户登录
第二步:
查看文件权限,例如
ll -a /bin/su
ll -a /usr/bin/passwd
观察显示结果,正确的结果为:
-rwsr-xr-x 1 root root 36936 Feb 17 2014 /bin/su*
-rwsr-xr-x 1 root root 47032 Feb 17 2014 /usr/bin/passwd*
错误的结果为:
-rwxr-xr-x 1 root root 36936 Feb 17 2014 /bin/su
-rwxr-xr-x 1 root root 47032 Feb 17 2014 /usr/bin/passwd
请注意rw sr-xr-x 与rw xr-xr-x是不同的
前者与后者的区别如下:
- s:当普通用户使用su的时候,采用的是owner的权限,几使用root去执行su内部需要执行的文件或命令
- x:当用普通用户执行su的时候,只能代表该用户,虽然执行了,但访问其他资源,比如密码文件等,可能就没有权限了。
关于密码文件可能也访问了别的命令或文件,道理同上。
第三步:
既然知道原因,那么修改文件权限即可
chmod 4755 /bin/su
chmod 4755 /usr/bin/passwd
第四步:
查看结果是否正确,可以正常切换用户。
虽然遇到的问题解决了,可是还有需对疑问:
- 有s权限吗,没见过啊?
- 还有别的特殊权限吗?
- 授权的时候755我理解啊,4775是什么意思啊,为什么是前边加4呢?
这几个问题还是困扰我的,于是我继续百度,去找到问题的答案。
第一、二个问题答案:
文件权限除了r、w、x外还有s、t、i、a权限:
s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。
例如:Linux修改密码的passwd便是个设置了SUID的程序,普通用户无读写/etc/shadow文件的权限确可以修改自己的密码。
ls -al /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。
如:chmod 4755 filename //设置SUID
注:在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效(chmod命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效。
例如:
有执行权限:
无执行权限:
t :设置粘着位,一个文件可读写的用户并一定相让他有删除此文件的权限,如果文件设置了t权限则只用属主和root有删除文件的权限,通过chmod +t filename 来设置t权限。
注:经过测试发现,这个权限用于文件夹,如果文件夹没有这个权限,文件也无法添加这个权限
i:不可修改权限 例:chattr u+i filename 则filename文件就不可修改,无论任何人,如果需要修改需要先删除i权限,用chattr -i filename就可以了。查看文件是否设置了i权限用lsattr filename。
a:只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。可以使用chattr +a设置追加权限。
第三个问题答案:
如何设置以上特殊权限:
- setuid:chmod u+s xxx
- setgid: chmod g+s xxx
- stick : chmod o+t xxx
或者使用八进制方式,在原先的数字前加一个数字,三个权限所代表的进制数与一般权限的方式类似,如下:
suid guid stick
1 1 1
所以:
- suid的二进制串为:100,换算十进制为:4
- guid的二进制串为:010,换算十进制:2
- stick的 二进制串:001,换算十进制:1
于是也可以这样设:
- setuid: chmod 4755 xxx
- setgid: chmod 2755 xxx
- stick : chmod 1755 xxx
参考: