当前位置: 首页 > news >正文

汽车零件销售网站开发公司网站维护分工

汽车零件销售网站开发,公司网站维护分工,三水容桂网站制作,有什么好看的网站资源文章目录 一、安全简介二、DAC2.1 UNIX 的自主访问控制2.2 Linux 的自主访问控制 三、进程凭证3.1 简介3.2 uid/gid3.3 系统调用 四、客体标记4.1 简介4.2 系统调用 五、UGO规则源码分析参考资料 一、安全简介 计算机系统应对安全挑战的办法大致有四种#xff1a;隔离、控制、… 文章目录 一、安全简介二、DAC2.1 UNIX 的自主访问控制2.2 Linux 的自主访问控制 三、进程凭证3.1 简介3.2 uid/gid3.3 系统调用 四、客体标记4.1 简介4.2 系统调用 五、UGO规则源码分析参考资料 一、安全简介 计算机系统应对安全挑战的办法大致有四种隔离、控制、混淆、监视。 1隔离计算机系统安全的设计者在系统的各个层级都发明了不同的技术来实现隔离隔离的结果常常被称作“沙箱”。隔离是对外的阻断内部和外部的交互。 2控制则是对内的在计算机世界是通过系统代码内在的逻辑和安全策略来维护信息流动和信息改变。如用户 A 可不可以读取文件 a用户 B 能不能改变文件 b 的内容等等。 3混淆加密。可以接触到数据却无法还原信息。加密的本质是通过计算来混淆数据让攻击者在不知道密钥的情况下很难将加密后的数据还原为原始数据。 4监视计算机系统中的日志和审计就是在做监视工作。 为了更有效地利用计算机计算机操作系统步入分时多用户时代。比如UNIX UNIX 是诞生于 20 世纪 70 年代的分时多任务多用户操作系统。当时的场景是许多用户同时登录到一台主机运行多个各自的进程。许多人登录到一台主机张三是个程序员李四是个文档管理员王五是系统管理员。随之出现了基于角色的访问控制Role-based Acess ControlRBAC让用户分属于不同的角色再基于角色赋予访问权限。 当 PC 时代来临计算机设备专属于某个人系统中的所谓用户也背离了原有的含义。随便打开 Linux 系统上的/etc/passwd 文件看看里面还有几个是真正的用户因此在PC 中使用基于角色的访问控制就有些力不从心了。接下来诞生了另一个访问控制模型——类型增强Type EnforcementTE。模型中控制的对象不再是人或角色而是进程。进程属于不同的类型不同类型有不同的访问权限。 二、DAC 访问的三要素是主体、操作和客体。主体是代表用户执行任务的进程。客体有很多种包 括文件、目录、管道、设备、IPC进程间通信、socket套接字、key密钥等。操作其实就是系统调用。 对照访问的三个要素有了主体标记请参考第三节和客体标记请参考第四节只要有一种方法规定哪个主体可以对哪个客体进行何种操作就可以做到访问控制了。 访问控制Access Control是对访问进行控制。比如允许进程 A 读文件 a不允许进程 B 读文件 b。要实现访问控制需要两个东西一个是标记标记主体和客体这样才有控制的对象另一个是策略允许某主体对某客体做什么。 自主访问控制Discretionary Access Control: 1UGO 2ACL 3Capabilities 2.1 UNIX 的自主访问控制 UNIX 的自主访问控制的设计是简单而有效的。它分为两个部分第一部分可以概括为进程操作文件。操作分三种读、写、执行。在进程操作文件时内核会检查进程有没有对文件的相应操作许可。第二部分可以概括为拥有特权的进程可以做任何事情内核不限制。特权机制实际上包含了两类行为一类是超越第一部分的操作许可控制比如 root 用户可以读或写任何文件。另一类是无法纳入上述“进程操作文件”模型之内的行为比如重启动系统。 Unix系统的UGOUser、Group、Other权限管理方式在文件和目录上设置权限位用来控制用户或用户组对文件或目录的访问。Linux继承了Unix的UGO权限管理方式。 对于这种DAC模型 主体一般指进程。 客体一般指文件。 行为操作读取权限r、写入权限w和执行权限x。 主体 操作 客体时查询的规则UGO规则把主体分为User、Group、Other三种类型每种类型拥有自己的RWX mask。 每个文件和目录都有一个所有者和所属组以及一组权限位。权限位包括读取权限r、写入权限w和执行权限x。权限位可以分为三个类别所有者权限User、所属组权限Group和其他用户权限Others。这些权限位决定了哪些用户或用户组可以对文件执行特定的操作。 例如如果一个文件的权限位设置为-rw-r–r–表示文件的所有者具有读写权限所属组用户具有读权限其他用户也具有读权限但没有写权限。 DAC是一种简单而直观的访问控制机制但它具有一定的局限性。例如DAC不能提供细粒度的访问控制无法限制特定用户对特定文件的访问。此外它无法提供强制性的安全策略因此需要其他访问控制机制来提供更高级别的安全性。 为了解决这些限制Linux还引入了其他访问控制机制如访问控制列表ACLs、Capabilities、Linux 安全模块LSM等。 2.2 Linux 的自主访问控制 Linux继承了Unix的UGO权限管理方式。 在自主访问控制上Linux 对 UNIX 的扩展主要有两处一是提供了访问控制列表Access Control List使得能够规定某一个用户或某一个组的操作许可二是对特权操作细化Capabilities将原有属于根用户的特权细化为互不相关的三十几个能力。 三、进程凭证 没有标记就谈不上区分没有区分就无从实施控制接下来介绍进程的标记。 UNIX 是诞生于 20 世纪 70 年代的分时多任务多用户操作系统。当时的场景是许多用户同时登录到一台主机运行多个各自的进程。因此很自然的UNIX 系统中进程的标记是基于用户的。在人类的世界中人的标记是名字。相比字符串而言计算机更擅长处理数字UNIX使用一个整数来标记运行进程的用户这个整数被称作 user id简写为 uid。人通常被分组比如这几个人做研发工作被分到研发组那几个人做销售工作被分到销售组。UNIX 用另一个整数来标记用户组这个整数被称作 group id简写为 gid。uid 和 gid 是包括 Linux 在内的所有类 UNIX 操作系统的自主访问控制的基础。 3.1 简介 下面看一下 uid 和 gid 是如何记录在内核的进程控制结构之中的 struct task_struct {/* Process credentials: *//* Tracers 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; }Linux 内核没有用户这个数据结构。内核中只会识别UID至于用户名是通过在/etc/passwd文件中查找对应关系得到的。 这里我们只关系 real_cred 和 cred 这两个进程凭证。进程的凭证中存储有和访问控制相关的成员。 在内核代码注释中将 real_cred 称为客体objective凭证将 cred 称为主体subjective 凭证。进程是主体在某些场景下又是客体。典型的场景是进程间发信号进程 A 向进程 B 发 送信号进程 A 是主体进程 B 就是客体。在大多数情况下主体凭证和客体凭证的值是相同 的但在某些情况下内核代码会修改当前进程的主体凭证以获得某种访问权限待执行完任 务后再将主体凭证改回原值比如SUID机制请参考Linux 安全 - SUID机制。 权限管理时真正代表用户的是进程操作文件的也是进程也就是说用户所拥有的文件访问权限是通过进程来体现的。 凭证的数据结构 /** The security context of a task** The parts of the context break down into two categories:** (1) The objective context of a task. These parts are used when some other* task is attempting to affect this one.** (2) The subjective context. These details are used when the task is acting* upon another object, be that a file, a task, a key or whatever.** Note that some members of this structure belong to both categories - the* LSM security pointer for instance.** A task has two security pointers. task-real_cred points to the objective* context that defines that tasks actual details. The objective part of this* context is used whenever that task is acted upon.** task-cred points to the subjective context that defines the details of how* that task is going to act upon another object. This may be overridden* temporarily to point to another security context, but normally points to the* same context as task-real_cred.*/ struct cred {......kuid_t uid; /* real UID of the task */kgid_t gid; /* real GID of the task */kuid_t suid; /* saved UID of the task */kgid_t sgid; /* saved GID of the task */kuid_t euid; /* effective UID of the task */kgid_t egid; /* effective GID of the task */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 were 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 */ #ifdef CONFIG_KEYSunsigned char jit_keyring; /* default keyring to attach requested* keys to */struct key *session_keyring; /* keyring inherited over fork */struct key *process_keyring; /* keyring private to this process */struct key *thread_keyring; /* keyring private to this thread */struct key *request_key_auth; /* assumed request_key authority */ #endif #ifdef CONFIG_SECURITYvoid *security; /* subjective LSM security */ #endif...... } __randomize_layout;进程凭证中不止有 id 相关的成员还有能力集相关的成员、密钥串相关的成员和强制访问 控制相关的成员。 3.2 uid/gid struct cred {......kuid_t uid; /* real UID of the task */kgid_t gid; /* real GID of the task */kuid_t suid; /* saved UID of the task */kgid_t sgid; /* saved GID of the task */kuid_t euid; /* effective UID of the task */kgid_t egid; /* effective GID of the task */kuid_t fsuid; /* UID for VFS ops */kgid_t fsgid; /* GID for VFS ops */...... }可以看到进程凭证结构体struct cred包含了多个 uid/gid。 1uid 这是最早出现的 user id。有时也被称为 real uid实际的 uid简写为®uid代表启动进程的原始用户身份。这个 uid 在资源统计和资源分配中使用比如限制某用户拥有的进程数量。 2euid euideffective uid即有效 uid。操作系统用于确定进程权限和访问权限的用户 ID。它表示进程在访问系统资源时所扮演的用户身份。 在内核做特权判断时使用它。它的引入和提升权限有关。此外内核在做 ipc进程间通信和 key密钥的访问控制时也使用 euid。 权限判断时看的就是euid。初始状态时uid和euid相同做一些权限切换时euid可能改变不等于uid了。 3suid suid 是“saved set user id”。suid 存储了有效用户 ID以便稍后恢复。euid 和特权有关当 euid 为 0 时进程就具有了超级用户的权限拥有了全部特权在系统中没有做不了的事情。这有些危险。我们需要锋利的刀但不用的时候希望把刀放入刀鞘。为了让进程不要总是具有全部特权总能为所欲为系统的设计者引入了suid用于暂存 euid 的值。euid 为 0 时做需要特权的操作执行完操作将 0 赋予suideuid 恢复为非 0 值做普通的不需要特权的操作需要特权时再将 suid 的值传给 euid。 4fsuid fsuid 是“file system user id”。这个 uid 是 Linux 系统独有的。它用于在文件系统相关的访问控制中判断操作许可。 3.3 系统调用 进程的控制结构和进程凭证都是内核中的数据结构相应的数据对象都是被内核掌控的。用户态进程只能通过内核提供的接口来查看和修改进程凭证。Linux 内核提供了数个系统调用来查看和修改进程的凭证中的uid和gid。这部分系统调用都要求进程只能修改自己的uid和gid不可以修改别的进程的。 1 NAMEsetuid - set user identitySYNOPSIS#include sys/types.h#include unistd.hint setuid(uid_t uid);DESCRIPTIONsetuid() sets the effective user ID of the calling process. If the effective UID of the caller is root, the real UID and saved set-user-ID are also set.setuid() 函数用于设置调用进程的有效用户 IDeuid。如果调用者的有效用户 ID 是 root那么实际用户 IDuid 和保存的设置用户 IDsuid 也会被设置。 2 NAMEseteuid, setegid - set effective user or group IDSYNOPSIS#include sys/types.h#include unistd.hint seteuid(uid_t euid);int setegid(gid_t egid);DESCRIPTIONseteuid() sets the effective user ID of the calling process. Unprivileged user processes may only set the effective user ID to the real user ID, the effective user IDor the saved set-user-ID.Precisely the same holds for setegid() with group instead of user.seteuid() 函数用于设置调用进程的有效用户 ID。非特权用户进程只能将有效用户 ID 设置为实际用户 ID、有效用户 ID 或保存的设置用户 ID。 在 Linux 系统中非特权用户进程的有效用户 ID 受到限制只能设置为它自身的实际用户 ID、有效用户 ID 或保存的设置用户 ID。这是为了确保进程无法将有效用户 ID 设置为其他特权用户的用户 ID从而防止滥用权限。 这种限制是为了维护系统的安全性防止非特权用户进程滥用特权。只有特权用户例如 root 用户才能更改为任意有效用户 ID。 3 NAMEsetreuid, setregid - set real and/or effective user or group IDSYNOPSIS#include sys/types.h#include unistd.hint setreuid(uid_t ruid, uid_t euid);int setregid(gid_t rgid, gid_t egid);DESCRIPTIONsetreuid() sets real and effective user IDs of the calling processsetreuid() 函数用于设置调用进程的实际用户 IDreal user ID和有效用户 IDeffective user ID。 当给定的实际用户 ID 或有效用户 ID 的值为 -1 时系统将保持该 ID 不变。 非特权进程只能将有效用户 ID 设置为实际用户 ID、有效用户 ID 或保存的设置用户 ID。 非特权用户只能将实际用户 ID 设置为实际用户 ID 或有效用户 ID。 如果设置了实际用户 ID或者将有效用户 ID 设置为与先前的实际用户 ID 不相等的值保存的设置用户 ID 将被设置为新的有效用户 ID。 通过调用setreuid()函数进程可以更改其实际用户 ID 和有效用户 ID。这对于需要在进程中切换用户身份的场景非常有用。 4 NAMEsetresuid, setresgid - set real, effective and saved user or group IDSYNOPSIS#define _GNU_SOURCE /* See feature_test_macros(7) */#include unistd.hint setresuid(uid_t ruid, uid_t euid, uid_t suid);int setresgid(gid_t rgid, gid_t egid, gid_t sgid);DESCRIPTIONsetresuid() sets the real user ID, the effective user ID, and the saved set-user-ID of the calling process.setresuid() 函数用于设置调用进程的实际用户 IDreal user ID、有效用户 IDeffective user ID和保存的设置用户 IDsaved set-user-ID。 非特权用户进程可以将实际用户 ID、有效用户 ID 和保存的设置用户 ID 分别设置为以下值之一当前实际用户 ID、当前有效用户 ID 或当前保存的设置用户 ID。 特权进程在 Linux 上拥有 CAP_SETUID 能力的进程可以将实际用户 ID、有效用户 ID 和保存的设置用户 ID 设置为任意值。 如果其中一个参数等于 -1则对应的值不会改变。 无论对实际用户 ID、有效用户 ID 和保存的设置用户 ID 进行了何种更改文件系统的用户 ID 总是设置为与可能是新的有效用户 ID 相同的值。 通过调用 setresuid() 函数进程可以同时更改实际用户 ID、有效用户 ID 和保存的设置用户 ID。这对于需要在进程中切换用户身份的场景非常有用。 5 NAMEsetfsuid - set user identity used for file system checksSYNOPSIS#include unistd.h /* glibc uses sys/fsuid.h */int setfsuid(uid_t fsuid);DESCRIPTIONThe system call setfsuid() sets the user ID that the Linux kernel uses to check for all accesses to the file system. Normally, the value of fsuid will shadow the valueof the effective user ID. In fact, whenever the effective user ID is changed, fsuid will also be changed to the new value of the effective user ID.setfsuid() 系统调用用于设置 Linux 内核用于检查对文件系统的所有访问的用户 ID。通常情况下fsuid 的值会跟随有效用户 ID 的值。事实上每当有效用户 ID 发生变化时fsuid 也会被更改为新的有效用户 ID 的值。 通过调用 setfsuid() 函数可以显式地设置文件系统用户 IDfsuid。这个值将影响进程对文件系统的访问权限检查。如果 fsuid 不同于有效用户 ID那么内核将使用 fsuid 来进行访问权限检查。 设置 fsuid 的主要目的是允许进程在文件系统访问权限方面切换用户身份。这对于需要使用不同用户身份访问文件系统的场景非常有用例如在特定用户权限下处理文件或资源。通过显式设置 fsuid进程可以模拟以其他用户身份执行操作而不必更改有效用户 ID。 6 在设置 user id 的系统调用中内核代码遵守了以下原则 1具备 setuid 特权的进程可以把®uid、euid、suid、fsuid 设置为任意值。即如果进程有root权限那么uid/suid/euid/fsuid可以设置任意值。 2不具备 setuid 特权的进程只能将®uid、euid、suid 的值设置为现有的®uid、euid、或 suid 的值。以 euid 为例euid 的新值只能是现在的®uid 的值、现在的 euid 的值或现在的 suid 的值。即如果进程没有root权限那么设置新的uid只能是原uid/suid/euid/fsuid中的一个值不能是任意值。 3不具备 setuid 特权的进程只能将 fsuid 的值置为现有的®uid、euid、suid、fsuid 的值 之一。 setreuid()/setuid()/setresuid()系统调用可以降级权限它没有升级的能力。 在用户权限切换的过程中一般通过SUID机制来无密码的把权限升级到root然后在root状态下验证用户密码再根据配置通过setreuid()/setuid()/setresuid()系统调用到权限降级到合适用户。 四、客体标记 4.1 简介 UNIX 中进程有多个 uid 和多个 gid但是文件只有一个 uid 和一个 gid分别称为属主和属组。它们的含义是标记文件属于哪一个用户属于哪一个用户组。 在文件系统中一个文件不仅要包含文件的内容数据还要包含所谓的元数据meta data。 元数据包括文件的存取访问方式、文件的创建日期、文件所在的设备、属主和属组以及允许位等。 在 UNIX 中元数据存储在文件系统的 inode 中。有些文件系统比如 ext4在物理存储介质上存储 inode。有些非 UNIX/Linux 原生的文件系统没有 inode概念。Linux 内核会在内存中临时创建 inode。对于那些内存文件系统比如 tmpfsLinux 内核也是在内存中创建临时的 inode。 下面看一下内核中 inode 的定义这里我们只看成员文件所在的属主和属组 struct inode {......kuid_t i_uid;kgid_t i_gid;...... }4.2 系统调用 文件属性是内核控制的数据只能由内核来修改。内核开放了几个系统调用供用户态进程使用用户态进程可以请求内核修改文件属性。涉及属主和属组的系统调用是 NAMEchown, fchown, lchown - change ownership of a fileSYNOPSIS#include unistd.hint chown(const char *path, uid_t owner, gid_t group);int fchown(int fd, uid_t owner, gid_t group);int lchown(const char *path, uid_t owner, gid_t group);这些系统调用用于更改文件的所有者和组。它们的区别仅在于文件的指定方式 chown() 函数更改路径指定的文件的所有者如果该文件是符号链接则对其进行解引用。 fchown() 函数更改由打开的文件描述符 fd 引用的文件的所有者。 lchown() 函数类似于 chown()但不对符号链接进行解引用。 只有特权进程Linux 上具有 CAP_CHOWN 能力的进程才能更改文件的所有者。文件的所有者可以将文件的组更改为该所有者所属的任何组。特权进程Linux 上具有 CAP_CHOWN 能力的进程可以任意更改组。 如果将所有者或组指定为 -1则该 ID 不会更改。 当非特权用户更改可执行文件的所有者或组时S_ISUID 和 S_ISGID 模式位将被清除。POSIX 并未指定在 root 用户执行 chown() 时是否也应该清除这些模式位Linux 的行为取决于内核版本。对于非组可执行文件即 S_IXGRP 位未设置的文件S_ISGID 位指示强制锁定并且不会被 chown() 清除。 五、UGO规则源码分析 UGO规则请参考2.1 UNIX 的自主访问控制 客体文件inode-i_mode中存储了UGO 3组mask每组mask由rwx三个行为组成。 struct inode {umode_t i_mode;...... }有了UGO规则主体进程在RWX客体文件时会做对应的权限规则检查。 以open系统调用为例 SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) {if (force_o_largefile())flags | O_LARGEFILE;return do_sys_open(AT_FDCWD, filename, flags, mode); }SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,umode_t, mode) {if (force_o_largefile())flags | O_LARGEFILE;return do_sys_open(dfd, filename, flags, mode); }open系统调用会调用inode_permission函数进行权限检查 /*** inode_permission - Check for access rights to a given inode* inode: Inode to check permission on* mask: Right to check for (%MAY_READ, %MAY_WRITE, %MAY_EXEC)** Check for read/write/execute permissions on an inode. We use fs[ug]id for* this, letting us set arbitrary permissions for filesystem access without* changing the normal UIDs which are used for other things.** When checking for MAY_APPEND, MAY_WRITE must also be set in mask.*/ int inode_permission(struct inode *inode, int mask) {int retval;retval sb_permission(inode-i_sb, inode, mask);if (retval)return retval;if (unlikely(mask MAY_WRITE)) {/** Nobody gets write access to an immutable file.*/if (IS_IMMUTABLE(inode))return -EPERM;/** Updating mtime will likely cause i_uid and i_gid to be* written back improperly if their true value is unknown* to the vfs.*/if (HAS_UNMAPPED_ID(inode))return -EACCES;}retval do_inode_permission(inode, mask);if (retval)return retval;retval devcgroup_inode_permission(inode, mask);if (retval)return retval;return security_inode_permission(inode, mask); } EXPORT_SYMBOL(inode_permission);从函数注释可以看到 Check for read/write/execute permissions on an inode.UGO权限检查 inode_permission()--do_inode_permission()--generic_permission()/*** generic_permission - check for access rights on a Posix-like filesystem* inode: inode to check access rights for* mask: right to check for (%MAY_READ, %MAY_WRITE, %MAY_EXEC, ...)** Used to check for read/write/execute permissions on a file.* We use fsuid for this, letting us set arbitrary permissions* for filesystem access without changing the normal uids which* are used for other things.** generic_permission is rcu-walk aware. It returns -ECHILD in case an rcu-walk* request cannot be satisfied (eg. requires blocking or too much complexity).* It would then be called again in ref-walk mode.*/ int generic_permission(struct inode *inode, int mask) {int ret;/** Do the basic permission checks.*/ret acl_permission_check(inode, mask);if (ret ! -EACCES)return ret;if (S_ISDIR(inode-i_mode)) {/* DACs are overridable for directories */if (!(mask MAY_WRITE))if (capable_wrt_inode_uidgid(inode,CAP_DAC_READ_SEARCH))return 0;if (capable_wrt_inode_uidgid(inode, CAP_DAC_OVERRIDE))return 0;return -EACCES;}/** Searching includes executable on directories, else just read.*/mask MAY_READ | MAY_WRITE | MAY_EXEC;if (mask MAY_READ)if (capable_wrt_inode_uidgid(inode, CAP_DAC_READ_SEARCH))return 0;/** Read/write DACs are always overridable.* Executable DACs are overridable when there is* at least one exec bit set.*/if (!(mask MAY_EXEC) || (inode-i_mode S_IXUGO))if (capable_wrt_inode_uidgid(inode, CAP_DAC_OVERRIDE))return 0;return -EACCES; } EXPORT_SYMBOL(generic_permission);在acl_permission_check函数中做UGO权限检查 /** This does the basic permission checking*/ static int acl_permission_check(struct inode *inode, int mask) {//获取文件的inode-i_modeunsigned int mode inode-i_mode;//查当前文件系统用户 IDcurrent_fsuid()是否等于 inode 的用户 IDi_uid。如果它们相等表示用户与文件的所有者匹配它将 mode 按位向右移动 6 位获取所有者的权限if (likely(uid_eq(current_fsuid(), inode-i_uid)))mode 6;else {//如果当前用户不是所有者函数会检查 inode 是否启用了 POSIX ACL并且组权限是否已设置。if (IS_POSIXACL(inode) (mode S_IRWXG)) {//如果两个条件都满足它会使用 check_acl() 函数执行额外的基于 ACL 的权限检查。int error check_acl(inode, mask);if (error ! -EAGAIN)return error;}//如果当前用户不是所有者并且未执行 ACL 检查或 ACL 检查结果为 -EAGAIN函数会检查当前用户是否属于文件所属组。如果是这样它会考虑组对请求访问的权限。它检查当前用户是否是 inode 所属组的成员in_group_p(inode-i_gid)。如果是这样它将 mode 按位向右移动 3 位获取组的权限。if (in_group_p(inode-i_gid))mode 3;}//如果以上条件都未匹配成功则为Other用户取最低3bit规则获取其他用户权限/** If the DACs are ok we dont need any capability check.*///将请求的访问掩码与相关权限mode进行比较基于用户与文件的关系所有者、组成员或其他用户。如果允许请求的访问它返回 0 表示成功。否则返回 -EACCES 表示权限被拒绝。 if ((mask ~mode (MAY_READ | MAY_WRITE | MAY_EXEC)) 0)return 0;return -EACCES; }1该函数通常在需要进行权限检查的文件系统操作中调用比如打开文件、读写文件或执行文件等操作。 inode 参数表示文件或目录的元数据包括权限、所有权、时间戳和文件大小等属性。 mask 参数是一个访问掩码用于指定请求的权限比如读取、写入或执行权限。 函数根据 inode 的 mode 位执行权限检查。这些位表示所有者、组和其他用户的权限。 2函数首先检查当前用户是否与文件的所有者匹配。如果匹配它会考虑所有者对请求访问的权限。它检查当前文件系统用户 IDcurrent_fsuid()是否等于 inode 的用户 IDi_uid。如果它们相等表示用户与文件的所有者匹配它将 mode 按位向右移动 6 位获取所有者的权限 3如果当前用户不是所有者函数会检查 inode 是否启用了 POSIX ACL并且组权限是否已设置。如果两个条件都满足它会使用 check_acl() 函数执行额外的基于 ACL 的权限检查。 如果 ACL 检查返回除了 -EAGAIN 之外的错误码表示明确拒绝权限函数会立即返回该错误不再进行进一步处理。 4如果当前用户不是所有者并且未执行 ACL 检查或 ACL 检查结果为 -EAGAIN函数会检查当前用户是否属于文件所属组。如果是这样它会考虑组对请求访问的权限。它检查当前用户是否是 inode 所属组的成员in_group_p(inode-i_gid)。如果是这样它将 mode 按位向右移动 3 位获取组的权限。 5如果以上条件都未匹配成功则为Other用户取最低3bit规则获取其他用户权限。 6最后函数将请求的访问掩码与相关权限mode进行比较基于用户与文件的关系所有者、组成员或其他用户。如果允许请求的访问它返回 0 表示成功。否则返回 -EACCES 表示权限被拒绝。 参考资料 Linux 5.4.18 Linux DAC 权限管理详解 Linux 内核安全模块深入剖析
文章转载自:
http://www.morning.kabaifu.com.gov.cn.kabaifu.com
http://www.morning.qjghx.cn.gov.cn.qjghx.cn
http://www.morning.kwfnt.cn.gov.cn.kwfnt.cn
http://www.morning.kjksn.cn.gov.cn.kjksn.cn
http://www.morning.wbysj.cn.gov.cn.wbysj.cn
http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn
http://www.morning.bzfwn.cn.gov.cn.bzfwn.cn
http://www.morning.zqzzn.cn.gov.cn.zqzzn.cn
http://www.morning.yrjfb.cn.gov.cn.yrjfb.cn
http://www.morning.qbwyd.cn.gov.cn.qbwyd.cn
http://www.morning.lfbsd.cn.gov.cn.lfbsd.cn
http://www.morning.bhpsz.cn.gov.cn.bhpsz.cn
http://www.morning.rjrnx.cn.gov.cn.rjrnx.cn
http://www.morning.rgrz.cn.gov.cn.rgrz.cn
http://www.morning.dbhnx.cn.gov.cn.dbhnx.cn
http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn
http://www.morning.ldnrf.cn.gov.cn.ldnrf.cn
http://www.morning.bnpcq.cn.gov.cn.bnpcq.cn
http://www.morning.nfgbf.cn.gov.cn.nfgbf.cn
http://www.morning.zrfwz.cn.gov.cn.zrfwz.cn
http://www.morning.ydxwj.cn.gov.cn.ydxwj.cn
http://www.morning.zxqxx.cn.gov.cn.zxqxx.cn
http://www.morning.qsy39.cn.gov.cn.qsy39.cn
http://www.morning.gswfs.cn.gov.cn.gswfs.cn
http://www.morning.langlaitech.cn.gov.cn.langlaitech.cn
http://www.morning.znqfc.cn.gov.cn.znqfc.cn
http://www.morning.elsemon.com.gov.cn.elsemon.com
http://www.morning.xknsn.cn.gov.cn.xknsn.cn
http://www.morning.cwwts.cn.gov.cn.cwwts.cn
http://www.morning.nkrmh.cn.gov.cn.nkrmh.cn
http://www.morning.mfltz.cn.gov.cn.mfltz.cn
http://www.morning.rzysq.cn.gov.cn.rzysq.cn
http://www.morning.knpmj.cn.gov.cn.knpmj.cn
http://www.morning.cyyhy.cn.gov.cn.cyyhy.cn
http://www.morning.kyhnl.cn.gov.cn.kyhnl.cn
http://www.morning.mgskc.cn.gov.cn.mgskc.cn
http://www.morning.xqnzn.cn.gov.cn.xqnzn.cn
http://www.morning.ypcbm.cn.gov.cn.ypcbm.cn
http://www.morning.rttxx.cn.gov.cn.rttxx.cn
http://www.morning.ksjnl.cn.gov.cn.ksjnl.cn
http://www.morning.lctrz.cn.gov.cn.lctrz.cn
http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn
http://www.morning.mcfjq.cn.gov.cn.mcfjq.cn
http://www.morning.tdwjj.cn.gov.cn.tdwjj.cn
http://www.morning.zmnyj.cn.gov.cn.zmnyj.cn
http://www.morning.chxsn.cn.gov.cn.chxsn.cn
http://www.morning.ngpdk.cn.gov.cn.ngpdk.cn
http://www.morning.crfyr.cn.gov.cn.crfyr.cn
http://www.morning.c7629.cn.gov.cn.c7629.cn
http://www.morning.ppghc.cn.gov.cn.ppghc.cn
http://www.morning.c7512.cn.gov.cn.c7512.cn
http://www.morning.tbhf.cn.gov.cn.tbhf.cn
http://www.morning.divocn.com.gov.cn.divocn.com
http://www.morning.wzwyz.cn.gov.cn.wzwyz.cn
http://www.morning.zmwzg.cn.gov.cn.zmwzg.cn
http://www.morning.xzkgp.cn.gov.cn.xzkgp.cn
http://www.morning.nicetj.com.gov.cn.nicetj.com
http://www.morning.ywndg.cn.gov.cn.ywndg.cn
http://www.morning.gynlc.cn.gov.cn.gynlc.cn
http://www.morning.crrmg.cn.gov.cn.crrmg.cn
http://www.morning.ccyjt.cn.gov.cn.ccyjt.cn
http://www.morning.yqrfn.cn.gov.cn.yqrfn.cn
http://www.morning.pplxd.cn.gov.cn.pplxd.cn
http://www.morning.fxygn.cn.gov.cn.fxygn.cn
http://www.morning.nylbb.cn.gov.cn.nylbb.cn
http://www.morning.rshkh.cn.gov.cn.rshkh.cn
http://www.morning.tsycr.cn.gov.cn.tsycr.cn
http://www.morning.rwzc.cn.gov.cn.rwzc.cn
http://www.morning.xshkh.cn.gov.cn.xshkh.cn
http://www.morning.hflrz.cn.gov.cn.hflrz.cn
http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn
http://www.morning.ntqjh.cn.gov.cn.ntqjh.cn
http://www.morning.ldgqh.cn.gov.cn.ldgqh.cn
http://www.morning.xtxp.cn.gov.cn.xtxp.cn
http://www.morning.nnqrb.cn.gov.cn.nnqrb.cn
http://www.morning.gynkr.cn.gov.cn.gynkr.cn
http://www.morning.hwnqg.cn.gov.cn.hwnqg.cn
http://www.morning.qlwfz.cn.gov.cn.qlwfz.cn
http://www.morning.qgtfl.cn.gov.cn.qgtfl.cn
http://www.morning.zwdrz.cn.gov.cn.zwdrz.cn
http://www.tj-hxxt.cn/news/250029.html

相关文章:

  • wordpress网站 800cdn怎样做视频电影网站
  • 手机网站建设规划书沐众科技网站建设
  • 有好看图片的软件网站模板东莞专业网络营销公司
  • 深圳市网站备案需求那家公司装修比较好
  • 网站开发的技术支持wordpress链接尾缀
  • 南昌网站seo技术厂家源码下载网站有哪些
  • 网站开发需求分析报告站长百度
  • 中煤建设集团网站兴宁市网站建设
  • 山东专业网站建设公司企业网站排名运营
  • 通过音乐做网站外链网页设计代码写入文字
  • 备案时网站名称怎么写全景网站开发
  • 个人网站优秀案例大庆网站建设公司哪家好
  • 网站开发公司团队优势厦门seo推广优化
  • 古装摄影网站建设方案专业企业展馆展厅设计
  • 好吊顶网站企业端app下载
  • 在线网站建设者wordpress文章形式
  • 洛阳seo网站网站描述标签怎么写
  • 怎样网站建设简答题网站建设步骤
  • 建设库平台seo竞价推广
  • 网站建设兼职劳务协议做一个wordpress模板
  • 西宁哪里做网站wordpress 文章底部
  • 网站推广方式方法网站名申请
  • 许昌市做网站公司网站建设对于企业的必要性
  • 郑州网站建设维护做推广的网站需要注意什么
  • 青少年思想道德建设网站广东省做网站推广公司
  • 免费最好网站建设网站开发公司合作协议书
  • 网站系统开发方式wordpress调用标题
  • 做网站需要机吗360建设网站免费
  • 无锡 学校网站建设uc浏览器网页版入口
  • 小型网站设计网站cms系统 开源