Linux权限管理
@
文件的访问权限
当我们要打开一个文件时,分两种情况:
- 通过路径打开,如/usr/include/stdio.h,此时需要对路径上的目录 /、/usr、/include 都具有执行权限,同时需要对stdio.h具有相应权限,这取决于我们如何打开它(只读、读写)。
- 在当前目录打开,这需要对当前目录具有执行权限,对要打开的文件具有相应权限。
目录是文件的一种:
- 目录的读权限[r]用于读取目录结构列表
- 进入/打开目录需要执行权限[x] ,[x]表示可以对该目录进行搜索
- 在目录中创建、删除、重命名、移动文件或目录,需要对该目录有写和执行权限[wx]。删除目录中的文件,对文件本身不需要具有写和执行权限。
访问权限位
ls -al 或 ll
文件的三种身份:owner group others
-rwsr--r-- , 一共10个字符:
- 第1项代表文件类型,如文件是[-],目录是[d],linkfile是[l]
- 第2-4项3为owner权限,可读[r] ,可写[w],可执行[x]
- 第5-7项为group权限
- 最后三项为其他非本组用户others权限
- root具有全部权限。
对上述四项,可以用八进制数字进行表示,如 rwx = 111(二进制) = 7(八进制),-rwxrwxr-x = 1775
用户ID和组ID
与一个进程关联的ID有6个或更多
查看用户id /etc/passwd
切换用户 su id/name su操作是在当前的shell中重新启动了一个shell,并切换了用户权限
退出 exit
访问权限判断
进程打开、删除、创建文件时,内核对文件进行权限判断,根据文件的所有者(st_uid、gid),进程的有效用户ID、有效组ID、附属组ID
- 如果进程有效用户ID是0,即root,则允许访问
- 如果进程的有效用户ID=文件的所有者ID,即进程拥有此文件,则判断所有者是否被设置相应的访问权限位,即若进程对该文件的打开方式是读,则文件的访问权限位上,用户读位应为[r],否则拒绝访问
- 若进程的有效组ID或附属组ID=文件的组ID,则判断文件的组是否被设置相应的访问权限位,否则拒绝。
- 若文件的others设置了相应的访问权限位,则允许访问,否则拒绝。
用户权限改变
-
setuid(uid)
若当前用户是root,则setuid函数将real id、effective id和saved id改为uid;
若uid=real id或saved id则将effective id改为uid;
否则,返回-1 。 -
seteuid(uid), 设置effective id,非root用户可以将其effective id 改为real id 或 saved id
-
getuid(), 获取文件的real id;
-
geteuid(), 获取e id;
或
chown root:root backdoor //改owner,将backdoor的用户:用户组改为root:root
chmod 775 backdoor //改权限为 -rwsrwxr-x
例:以root权限打开一个新的shell,替换当前shell
#include <stdio.h>
#include <unistd.h>
int main(){
printf("real id is: %d; effective id is: %d.\n",getuid(),geteuid());
setuid(0);
execlp("/bin/bash","/bin/bash",NULL);
return 0;
}
参考:
《UNIX环境高级编程》
https://zhuanlan.zhihu.com/p/61870331