Linux是一个多用户多任务的操作系统,身为一个优秀安全的多用户操作系统,linux对用户之间资源的访问权限管理得十分严谨。
linux每个文件和目录都有一组访问权限标志位,用9个二进制位表示:
如用ls -l显示/etc/passwd文件:
-rw-r--r-- 1 root root 1687 passwd
代表passwd文件的访问权限是:所属用户(拥有者)可读可写;组用户可读;其他用户可读;(其中passwd所属用户为root,所属为root组)
1、按这权限标记意味着只有passwd的所属者root对其有可写权限,那么真得用其它用户登录的情况下就不能对其进行写操作吗?
首先我们得明白linux系统是怎么判定访问者是谁。其实我们无论图形操作和终端命令操作都是调用一段程序对某个文件资源的访问。而进程(执行中的程序)中有个euid(有效用户)这个才是系统用来判定访问者的根据。意味着即使是非root用户只要执行的程序进程中的euid==root,那么系统就认为访问者是root,就能对/etc/passwd进行可写操作!
2、那么什么时候非root用户执行进程的euid才会是root呢?
这就关系到今天的主题SUID位的作用。在程序没设置SUID的情况下,哪个用户执行该程序,该程序进程中的euid就为该用户uid。
比如用户JaxonXu执行了权限描述为-rwxr-xr-x root root foo的foo程序,那么该进程的euid就为JaxonXu,就不能对/etc/passwd进行写操作。
但在某程序文件设置了SUID位以后,比如bar程序,其权限描述为:-rwsr-xr-x root root bar(注意在所属用户可执行位里标的是s,表明文件设置了SUID并且所属用户可执行,具体请翻看APUE)当JaxonXu执行bar程序,该进程的euid为程序的所属用户root(这就是SUID的作用),因此该进程就可以对/etc/passwd进行可写操作(即使是非root用户运行的)!
这就是passwd命令可以让非root用户修改/etc/passwd文件的原因。
我们用which passwd定位到passwd命令的位置/usr/bin/passwd,用ls -l查看:
-rwsr-xr-x 1 root root 37100 passwd
可知/usr/bin/passwd命令文件设置了SUID的标记位。