UID是系统中用来表示用户的标识符,启动的进程的uid就是当前登陆用户的uid,查看用户uid可以使用id -u <username>
命令linux
须要注意的是,权限检查的时候是对euid检查,一般状况下进程的euid是和uid相同的。shell
euid即effective user id ,有效用户ID。编程
用于文件访问检查,euid和决定了进程是否有访问某个文件的能力。例如,编写下面代码:ui
/* testeuid.c */ #include <stdio.h> #include <unistd.h> #include <fcntl.h> int main(int argc, char * argv[]) { if (argc != 2) return 0; printf("uid: %d\teuid: %d\n", getuid(), geteuid()); printf("trying to open %s\n", argv[1]); int fd = open(argv[1], O_RDONLY); if (fd < 0) perror("open"); else printf("success\n"); return 0; }
编译并运行spa
上述执行过程当中,将a.file
拥有者改成root并修改访问权限为root只读后,我以eureka用户的身份没法访问该文件。unix
看APUE发现本身对suid不是特别了解,查资料以后明白了,记录以下。code
参考文章:blog
上面连接中的文章说的很准确,SUID即(Set Owner User ID up on execution)get
在执行时设置为全部者ID,一个例子就是/usr/bin/passwd
这个可执行文件。
$ ls /usr/bin/passwd -rwsr-xr-x 1 root root 54256 May 17 2017 /usr/bin/passwd
从上面passwd
的属性能够看到,权限位中有个s
,这就是suid。
passwd
这个命令是用来修改密码的,而密码文件是/etc/shadow
,且查看密码文件的属性能够看到它的拥有者是root,root可读写,用户组可读的。
/tmp $ ls -l /etc/shadow │ -rw-r----- 1 root shadow 1711 Mar 30 17:00 /etc/shadow
既然这个文件是root可读写,那非root用户修改密码要怎么办呢?
这时候就要说的suid了,当非root用户调用passwd
修改密码时,此时的euid将会变为passwd
的拥有者用户,即root用户,这样就能够修改密码了。
与其说suid是一个id,不如说它是文件的一个标志,它标志着这个可执行文件在执行时的euid将会被修改成它拥有者的uid。
下面编程实验:
/* testsuid.c */ #include <stdio.h> #include <unistd.h> #include <fcntl.h> int main(void) { printf("uid: %d euid:%d", getuid(), geteuid()); }
编译后执行
上面的chmod u+s
是给文件加上usid标志,而从上面的结果能够看出进程的uid和euid是能够不一样的。