台州市环保局网站开发区,网站建设策划基本流程图,58同城网网站建设,昆山网站建设哪家便宜转载请注明来源chengyaogen.blog.chinaunix.net一、进程与权限A.进程时Linux/Unix操作系统中最重要的抽象之一B.进程是一个处于执行期的程序(目标代码存储在某种介质上)A process is a program(object code stored on some media) in the midst ofexecution.而进…转载请注明来源chengyaogen.blog.chinaunix.net一、进程与权限A.进程时Linux/Unix操作系统中最重要的抽象之一B.进程是一个处于执行期的程序(目标代码存储在某种介质上)A process is a program(object code stored on some media) in the midst ofexecution.而进程在执行过程中经常涉及到文件访问操作等1.一个运行中的进程究竟可以访问哪些资源而不能访问哪些资源2.一个进程运行过程中如何实现在某个执行阶段拥有一些权限而在另一个阶段又具备另外一种权限呢?上述状况对应于进程的访问权限以及进程执行中不同权限的切换。这一切都和进程实际用户ID,进程有效用户ID,进程保存设置用户ID有关联。二、进程的用户ID1.实际用户ID(real user id,RUID)为该进程的创建者的用户ID,也可以说是进程的执行者。该ID仅root用户可以修改2.有效用户ID(effective user id,EUID)该ID用户标识用户进程执行操作的权限。例如:如果EUID是0即(root),此时进程拥有root用户权限。普通用户可以将EUID设置为RUID或者SUID而超级用户可以将EUID设置为任意的合法UID。注意对于一个可执行的二进制文件如果其set-user-id bit被设置则运行改程序时对应进程的有效用户ID(EUID)为该文件的文件所有者用户ID。3.保存设置用户ID(saved set-user-id,SUID)对于没有设置set-uid-bit的可执行程序而言其对应进程的保存设置用户ID(SUID)为其实际用户ID;而对于设置了set-uid-bit的程序而言其对应的保存设置用户ID(SUID)为该可执行文件的文件拥有者用户ID。只能root用户权限才能更改(当一个程序文件运行的时候其值已经确定)。注意:linux不提供返回保存的设置-用户-ID的函数总结:RUID代表此进程是哪个用户创建的 EUID代表此进程所拥有的权限SUID保存了EUID当EUID改变后如果想回到以前的EUID此时SUID将发挥作用。三、相关API#include#includeint setuid(uid);可以用setuid函数设置实际用户ID和有效用户ID。注意我们并不能想怎么设就怎么设。有若干规则需要我们遵守:(1)若进程具有超级用户特权则setuid函数将实际用户ID、有效用户ID以及保存的设置-用户-D设置为uid。(2)若进程没有超级用户特权,但是uid等于实际用户ID或保存的设置-用户-ID则setuid只将有效用户ID设置为。不改变实际用户ID和保存的设置-用户-ID。(3)如果上面两个条件都不满足则errno设置为EPERM,并返回出错.。关于内核所维护的三个用户ID还要注意下列几点(1)只有超级用户进程可以更改实际用户ID。通常实际用户ID是在用户登录时由login(1)程序设置的而且决不会改变它。因为login是一个超级用户进程当它调用setuid时设置所有三个用户ID。(2)仅当对程序文件设置了 set-user-id bit时exec函数设置有效用户ID为文件所有者。如果set-user-id bit没有设置则exec函数不会改变有效用户ID而将其位置原先值。任何时候都可以调用setuid将有效用户ID设置为实际用户ID或保存的设置-用户-ID。自然不能讲有效用户ID设置为任意随机值。四、探究案例一:有个要在MacOS上实现一个关机程序,它熟悉linux其实老祖宗都是unix,所以MacOS对他并不陌生。如下他写了如下程序实现关机编译运行:从上面看这段代码可以实现关机但是有个不符合要求的地方运行程序不能是超级用户只能是普通用户。他很苦恼后来找到了我我做了如下事情呵呵可以了。我将这个可执行文件的owner和group都改为了root,然后有讲其set-user-id bit位加以了设置。这样以普通用户运行这个程序时此进程的EUID就是root了这样满足了shutdown命令执行的权限。案例二:#include #include #include #include #include #include void test_read_file(const char *name){int fd -1;fd open(name ,O_RDWR);if(fd 0){printf([ERROR]:read failed.\n);}else{printf([OK]:read successful\n);close(fd);}}//打印uid和euidvoid p_states(){int uid 0;int euid 0;printf(------Current states--------\n);printf(real uid\t %d\n,getuid());printf(effective uid\t %d\n,geteuid());printf(----------------------------\n);}//调用setuidvoid run_setuid_fun(int uid){if(setuid(uid) -1){printf([ERROR]:setuid(%d) error\n,uid);}p_states();}//调用setuidvoid run_seteuid_fun(int uid){if(setuid(uid) -1){printf([ERROR]:seteuid(%d) error\n,uid);}p_states();}int main(){int t_re 0;const char *file root_only.txt;printf(\nTEST 1:\n);p_states();//此时real uid login user id//effective uid root//saved uid roottest_read_file(file);getchar();printf(\nTEST 2:setuid(getuid())\n);run_seteuid_fun(getuid());//此时real uid login user id//effective uid login user id//saved uid roottest_read_file(file);getchar();printf(\nTEST 3:setuid(0)\n);run_setuid_fun(0);//此时real uid login user id//effective uid root//saved uid roottest_read_file(file);getchar();printf(\nTEST 4:setuid(0)\n);run_setuid_fun(0);//此时real uid root//effective uid root//saved uid roottest_read_file(file);getchar();printf(\nTEST 5:setuid(503)\n);run_setuid_fun(503);//此时real uid login user id//effective id login user id//saved uid login user idtest_read_file(file);getchar();printf(\nTEST 6:setuid(0)\n);//read uid login user id//effective uid login user id//saved uid login user idrun_setuid_fun(0);test_read_file(file);return 0;}编译运行:root_only.txt文件建立:第一次:RUID:实际用户EUID:文件所有者(root)SUID:文件所有者(root)此时进程拥有root用户权限能对root_only.txt进行读写操作第二次:此时普通用户调用setuid(getuid())只会将EUID改为getuid(),其他都不变RUID:实际用户EUID:实际用户SUID:root此时进程没有有root用户权限不能能对root_only.txt进行读写操作第三次:此时普通用户调用seteuid(0)只会将EUID改为0,其他都不变RUID:实际用户EUID:rootSUID:root此时进程拥有root用户权限能对root_only.txt进行读写操作第四次:此时进程拥有root用户权限调用setuid(0)会将三个ID都设置为0RUID:rootEUID:rootSUID:root此时进程拥有root用户权限能对root_only.txt进行读写操作第五次:此时进程拥有root用户权限调用setuid(503)会将三个ID都设置为503RUID:503EUID:503SUID:503此时进程拥有普通用户权限不能对root_only.txt进行读写操作第六次:此时进程拥有普通用户权限调用setuid(0)此时RUIDSUID都不为0这一次操作将失败RUID:503EUID:503SUID:503此时进程拥有普通用户权限不能能对root_only.txt进行读写操作