序言
linux的文件权限是linux的安全管理机制中的一个环节,我们从使用了解下文件权限,然后再了解一下内核实现。
linux的文件权限
用ls命令查看/boot/grub2的文件权限
image.png
我们看到每个文件相关的信息,其中第一行的字段意义:
- -rw-r--r--.代表权限
- 1 对于文件,代表文件链接数,对于目录代表同一级的目录数字
- root 代表当前用户
- root 代表当前用户组
- 64文件大小
- Jul 10 22:55 是文件创建时间
- device.map代表文件名
紧接着,我们需要看权限的含义了,一共十个字符:
image.png
一共分为四部分:
- 第一个字符,代表类型,其中'-'代表普通文件, ‘d'代表目录文件,'b'代表块特殊文件,’c'代表字符特殊文件,‘l'代表符号链接,’f‘代表管道文件,’s‘代表套接字文件
- 第二部分的 rwx代表文件所属用户具有读写执行的权限
- r-x代表用户组权限,当一个用户,不是文件所属用户,但是和文件所属用户具有相同的用户组时,就可以有和用户组相同的权限,即使该用户不具备读写可执行权限。
- r-x,最后桑格字符代表其它用户具有的权限。
对于目录来说:
- x代表可进入目录
- rx代表可进入目录,显示目录下的文件名
-wx代表可进入目录,修改目录内的文件名
修改用户权限
chmod修改文件目录权限
chown修改文件的属主或者属组权限
image.png
通过帮助我们可以看到,有两种方式修改权限,一种MODE,一其中MODE的定义在最后一行
特殊权限
image.png
注意到属主的权限是rws,s表示任何一个用户都可以有可修改的权限,在这里每个用户可以自己修改自己的密码。
image.png
这个文件夹下的用户创建的文件仅仅用户和root可以创建和删除。这样,当用户在tmp下创建文件时,就可以避免被另外一个用户删除掉。
内核中的文件权限
文件创建的时候就会设置好权限,这些权限怎么工作的呢?
在进程描述符中相关的代码
struct task_struct {
.........
/* Tracer's credentials at attach: */
const struct cred __rcu *ptracer_cred;
/* Objective and real subjective task credentials (COW): */
const struct cred __rcu *real_cred;
/* Effective (overridable) subjective task credentials (COW): */
const struct cred __rcu *cred;
........
}
struct cred {
.........
kuid_t fsuid; /* UID for VFS ops */
kgid_t fsgid; /* GID for VFS ops */
unsigned securebits; /* SUID-less security management */
kernel_cap_t cap_inheritable; /* caps our children can inherit */
kernel_cap_t cap_permitted; /* caps we're permitted */
kernel_cap_t cap_effective; /* caps we can actually use */
kernel_cap_t cap_bset; /* capability bounding set */
kernel_cap_t cap_ambient; /* Ambient capability set */
......
} __randomize_layout;
一个进程,设置了fsuid和fsgid后,在执行碰到文件的时候,就看文件的uid和gid和进程之间比较,如果进程满足条件,就可以按照文件设置的权限对文件进行操作访问,否则就不行。
对于上述所讲的特殊权限s,怎么实现的呢,就是进程被创建的时候,虽然不是文件所属用户创建,但是此时进程的fsuid会被设置成为文件所属用户,这样就做到了可以对该文件进行修改。
小结
这篇小文章复习了一下用户权限,特别是特殊权限,同时,我们针对这块深入到源码中,看了一下源码是如何实现的,通过使用和源码比对,对于知识的掌握程度更加深入,感觉更加通透了。











网友评论