sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/security/credentialsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/zh_TW/security/credentialsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/it_IT/security/credentialsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ja_JP/security/credentialsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ko_KR/security/credentialsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/pt_BR/security/credentialsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/sp_SP/security/credentialsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhU/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/security/credentials.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h'Documentation/security/credentials.rst h]h)}(h&Documentation/security/credentials.rsth]h&Documentation/security/credentials.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubj)}(h.赵硕 Shuo Zhao h]h)}(h-赵硕 Shuo Zhao h](h赵硕 Shuo Zhao <}(hj4hhhNhNubh reference)}(hzhaoshuo@cqsoftware.com.cnh]hzhaoshuo@cqsoftware.com.cn}(hj>hhhNhNubah}(h]h ]h"]h$]h&]refuri!mailto:zhaoshuo@cqsoftware.com.cnuh1j<hj4ubh>}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj0ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(hLinux中的凭据h]hLinux中的凭据}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1johjlhhhhhK ubh)}(h+作者: David Howells h](h作者: David Howells <}(hjhhhNhNubj=)}(hdhowells@redhat.comh]hdhowells@redhat.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:dhowells@redhat.comuh1j<hjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjlhhubhtopic)}(hhh]h bullet_list)}(hhh](h list_item)}(hhh]h)}(hhh]j=)}(hhh]h概述}(hjhhhNhNubah}(h]id11ah ]h"]h$]h&]refidid1uh1j<hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j=)}(hhh]h 凭据类型}(hjhhhNhNubah}(h]id12ah ]h"]h$]h&]refidid2uh1j<hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j=)}(hhh]h 文件标记}(hjhhhNhNubah}(h]id13ah ]h"]h$]h&]refidid3uh1j<hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](h)}(hhh]j=)}(hhh]h 任务凭据}(hjhhhNhNubah}(h]id14ah ]h"]h$]h&]refidid4uh1j<hjubah}(h]h ]h"]h$]h&]uh1hhjubj)}(hhh](j)}(hhh]h)}(hhh]j=)}(hhh]h不可变凭据}(hj8hhhNhNubah}(h]id15ah ]h"]h$]h&]refidid5uh1j<hj5ubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(hhh]j=)}(hhh]h访问任务凭据}(hjZhhhNhNubah}(h]id16ah ]h"]h$]h&]refidid6uh1j<hjWubah}(h]h ]h"]h$]h&]uh1hhjTubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(hhh]j=)}(hhh]h访问其他任务的凭据}(hj|hhhNhNubah}(h]id17ah ]h"]h$]h&]refidid7uh1j<hjyubah}(h]h ]h"]h$]h&]uh1hhjvubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(hhh]j=)}(hhh]h 修改凭据}(hjhhhNhNubah}(h]id18ah ]h"]h$]h&]refidid8uh1j<hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(hhh]j=)}(hhh]h 管理凭据}(hjhhhNhNubah}(h]id19ah ]h"]h$]h&]refidid9uh1j<hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j=)}(hhh]h打开文件凭据}(hjhhhNhNubah}(h]id20ah ]h"]h$]h&]refidid10uh1j<hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j=)}(hhh]h覆盖VFS对凭据的使用}(hjhhhNhNubah}(h]id21ah ]h"]h$]h&]refidvfsuh1j<hj ubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhhhNhNubah}(h]contentsah ](contentslocaleh"]contentsah$]h&]uh1jhhhKhjlhhubjk)}(hhh](jp)}(h概述h]h概述}(hj?hhhNhNubah}(h]h ]h"]h$]h&]refidjuh1johj<hhhhhKubh)}(hb当一个对象对另一个对象进行操作时,Linux执行的安全检查包含几个部分:h]hb当一个对象对另一个对象进行操作时,Linux执行的安全检查包含几个部分:}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj<hhubh block_quote)}(hX!1. 对象 对象是可以直接由用户空间程序操作的系统中的实体。Linux具有多种可操作 的对象,包括: - 任务 - 文件/索引节点 - 套接字 - 消息队列 - 共享内存段 - 信号量 - 密钥 所有这些对象的描述的一部分是一组凭据。集合中的内容取决于对象的类型。 2. 对象所有权 大多数对象的凭据中会有一个子集用来表示该对象的所有权。 这用于资源核算和限制(如磁盘配额和任务资源限制)。 例如,在标准的UNIX文件系统中,这将由标记在索引节点上的UID定义。 3. 对象上下文 此外在这些对象的凭据中,将有一个子集表示对象的“对象上下文”。 这可能与(2)中相同,也可能不同 —— 例如,在标准的UNIX文件中, 这是由标记在索引节点上的UID和GID定义的。 对象上下文是进行安全计算的一部分,当对象被操作时会用到。 4. 主体 主体是正在对其他对象执行操作的对象。 系统中的大多数对象是不活动的:他们不会对系统中的其他对象起作用。 进程/任务是明显的例外:它们可以访问和操纵其他对象。 任务之外的其他对象在某些情况下也可以是主体。例如,打开的文件可以使用 名为 ``fcntl(F_SETOWN)`` 的任务给它的UID和EUID向一个任务发送SIGIO 信号。在这种情况下,文件结构也会有一个主体上下文。 5. 主体上下文 主体对其凭据有一个额外的解释。其凭据的一个子集形成了“主体上下文”。主体 上下文在主体执行操作时作为安全计算的一部分使用。 例如,Linux任务在操作文件时会有FSUID、FSGID和附加组列表 —— 这些凭据 与通常构成任务的对象上下文的真实UID和GID是相互独立的。 6. 操作 Linux提供许多操作,主体可以对对象执行这些操作。可用的操作集取决于主体 和对象的性质。 操作包括读取、写入、创建和删除文件,以及派生(forking)或发送 信号(signalling)和跟踪(tracing)任务等。 7. 规则,访问控制列表和安全计算 当主体对对象进行操作时,会进行安全计算。这涉及到使用主体上下文、对象 上下文和操作,并搜索一个或多个规则集,以确定在给定这些上下文的情况下, 主体是否被授予或拒绝以所需方式对对象进行操作的权限。 主要有两个规则来源: a. 自主访问控制(DAC): 有时,对象的描述中会包含一组规则。这就是所谓的“访问控制列表”或‘ACL’。 一个Linux文件可以提供多个ACL。 例如,传统的UNIX文件包括一个权限掩码,它是一个简化的ACL,具有三个固定的 主体类别(“用户”、“组”和“其他”),每一个都可以被授予一定的特权(如“读取”、 “写入”和“执行” —— 无论这些映射对于对象意味着什么)。然而,UNIX文件权限不 允许任意指定主体,因此用途有限。 Linux文件还可以支持POSIX ACL。这是一个规则列表,为任意主体授予各种权限。 b. 强制访问控制(MAC): 整个系统可能有一个或多个规则集,适用于所有主体和对象,不考虑它们的来源。 SELinux和Smack就是这种情况的例子。 在SELinux和Smack的情况下,每个对象在其凭据中都被赋予一个标签。当请求执 行操作时,它们使用主体标签、对象标签和操作,寻找一个规则,该规则表示此操 作是授予还是拒绝的。 h]henumerated_list)}(hhh](j)}(hXj对象 对象是可以直接由用户空间程序操作的系统中的实体。Linux具有多种可操作 的对象,包括: - 任务 - 文件/索引节点 - 套接字 - 消息队列 - 共享内存段 - 信号量 - 密钥 所有这些对象的描述的一部分是一组凭据。集合中的内容取决于对象的类型。 h](h)}(h对象h]h对象}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjgubj])}(hXX对象是可以直接由用户空间程序操作的系统中的实体。Linux具有多种可操作 的对象,包括: - 任务 - 文件/索引节点 - 套接字 - 消息队列 - 共享内存段 - 信号量 - 密钥 所有这些对象的描述的一部分是一组凭据。集合中的内容取决于对象的类型。 h](h)}(hx对象是可以直接由用户空间程序操作的系统中的实体。Linux具有多种可操作 的对象,包括:h]hx对象是可以直接由用户空间程序操作的系统中的实体。Linux具有多种可操作 的对象,包括:}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjyubj])}(ha- 任务 - 文件/索引节点 - 套接字 - 消息队列 - 共享内存段 - 信号量 - 密钥 h]j)}(hhh](j)}(h任务h]h)}(hjh]h任务}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h文件/索引节点h]h)}(hjh]h文件/索引节点}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h 套接字h]h)}(hjh]h 套接字}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h 消息队列h]h)}(hjh]h 消息队列}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h共享内存段h]h)}(hjh]h共享内存段}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h 信号量h]h)}(hjh]h 信号量}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h密钥 h]h)}(h密钥h]h密钥}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1j\hhhKhjyubh)}(hf所有这些对象的描述的一部分是一组凭据。集合中的内容取决于对象的类型。h]hf所有这些对象的描述的一部分是一组凭据。集合中的内容取决于对象的类型。}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjyubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjgubeh}(h]h ]h"]h$]h&]uh1jhjdubj)}(hX对象所有权 大多数对象的凭据中会有一个子集用来表示该对象的所有权。 这用于资源核算和限制(如磁盘配额和任务资源限制)。 例如,在标准的UNIX文件系统中,这将由标记在索引节点上的UID定义。 h](h)}(h对象所有权h]h对象所有权}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hj\ubj])}(h大多数对象的凭据中会有一个子集用来表示该对象的所有权。 这用于资源核算和限制(如磁盘配额和任务资源限制)。 例如,在标准的UNIX文件系统中,这将由标记在索引节点上的UID定义。 h](h)}(h大多数对象的凭据中会有一个子集用来表示该对象的所有权。 这用于资源核算和限制(如磁盘配额和任务资源限制)。h]h大多数对象的凭据中会有一个子集用来表示该对象的所有权。 这用于资源核算和限制(如磁盘配额和任务资源限制)。}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjnubh)}(h[例如,在标准的UNIX文件系统中,这将由标记在索引节点上的UID定义。h]h[例如,在标准的UNIX文件系统中,这将由标记在索引节点上的UID定义。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjnubeh}(h]h ]h"]h$]h&]uh1j\hhhK'hj\ubeh}(h]h ]h"]h$]h&]uh1jhjdubj)}(hX_对象上下文 此外在这些对象的凭据中,将有一个子集表示对象的“对象上下文”。 这可能与(2)中相同,也可能不同 —— 例如,在标准的UNIX文件中, 这是由标记在索引节点上的UID和GID定义的。 对象上下文是进行安全计算的一部分,当对象被操作时会用到。 h](h)}(h对象上下文h]h对象上下文}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubj])}(hXJ此外在这些对象的凭据中,将有一个子集表示对象的“对象上下文”。 这可能与(2)中相同,也可能不同 —— 例如,在标准的UNIX文件中, 这是由标记在索引节点上的UID和GID定义的。 对象上下文是进行安全计算的一部分,当对象被操作时会用到。 h](h)}(h此外在这些对象的凭据中,将有一个子集表示对象的“对象上下文”。 这可能与(2)中相同,也可能不同 —— 例如,在标准的UNIX文件中, 这是由标记在索引节点上的UID和GID定义的。h]h此外在这些对象的凭据中,将有一个子集表示对象的“对象上下文”。 这可能与(2)中相同,也可能不同 —— 例如,在标准的UNIX文件中, 这是由标记在索引节点上的UID和GID定义的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubh)}(hT对象上下文是进行安全计算的一部分,当对象被操作时会用到。h]hT对象上下文是进行安全计算的一部分,当对象被操作时会用到。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubeh}(h]h ]h"]h$]h&]uh1j\hhhK.hjubeh}(h]h ]h"]h$]h&]uh1jhjdubj)}(hX主体 主体是正在对其他对象执行操作的对象。 系统中的大多数对象是不活动的:他们不会对系统中的其他对象起作用。 进程/任务是明显的例外:它们可以访问和操纵其他对象。 任务之外的其他对象在某些情况下也可以是主体。例如,打开的文件可以使用 名为 ``fcntl(F_SETOWN)`` 的任务给它的UID和EUID向一个任务发送SIGIO 信号。在这种情况下,文件结构也会有一个主体上下文。 h](h)}(h主体h]h主体}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubj])}(hX主体是正在对其他对象执行操作的对象。 系统中的大多数对象是不活动的:他们不会对系统中的其他对象起作用。 进程/任务是明显的例外:它们可以访问和操纵其他对象。 任务之外的其他对象在某些情况下也可以是主体。例如,打开的文件可以使用 名为 ``fcntl(F_SETOWN)`` 的任务给它的UID和EUID向一个任务发送SIGIO 信号。在这种情况下,文件结构也会有一个主体上下文。 h](h)}(h6主体是正在对其他对象执行操作的对象。h]h6主体是正在对其他对象执行操作的对象。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjubh)}(h系统中的大多数对象是不活动的:他们不会对系统中的其他对象起作用。 进程/任务是明显的例外:它们可以访问和操纵其他对象。h]h系统中的大多数对象是不活动的:他们不会对系统中的其他对象起作用。 进程/任务是明显的例外:它们可以访问和操纵其他对象。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjubh)}(hX任务之外的其他对象在某些情况下也可以是主体。例如,打开的文件可以使用 名为 ``fcntl(F_SETOWN)`` 的任务给它的UID和EUID向一个任务发送SIGIO 信号。在这种情况下,文件结构也会有一个主体上下文。h](hn任务之外的其他对象在某些情况下也可以是主体。例如,打开的文件可以使用 名为 }(hj hhhNhNubhliteral)}(h``fcntl(F_SETOWN)``h]hfcntl(F_SETOWN)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 的任务给它的UID和EUID向一个任务发送SIGIO 信号。在这种情况下,文件结构也会有一个主体上下文。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK;hjubeh}(h]h ]h"]h$]h&]uh1j\hhhK6hjubeh}(h]h ]h"]h$]h&]uh1jhjdubj)}(hX{主体上下文 主体对其凭据有一个额外的解释。其凭据的一个子集形成了“主体上下文”。主体 上下文在主体执行操作时作为安全计算的一部分使用。 例如,Linux任务在操作文件时会有FSUID、FSGID和附加组列表 —— 这些凭据 与通常构成任务的对象上下文的真实UID和GID是相互独立的。 h](h)}(h主体上下文h]h主体上下文}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK?hj8ubj])}(hXf主体对其凭据有一个额外的解释。其凭据的一个子集形成了“主体上下文”。主体 上下文在主体执行操作时作为安全计算的一部分使用。 例如,Linux任务在操作文件时会有FSUID、FSGID和附加组列表 —— 这些凭据 与通常构成任务的对象上下文的真实UID和GID是相互独立的。 h](h)}(h主体对其凭据有一个额外的解释。其凭据的一个子集形成了“主体上下文”。主体 上下文在主体执行操作时作为安全计算的一部分使用。h]h主体对其凭据有一个额外的解释。其凭据的一个子集形成了“主体上下文”。主体 上下文在主体执行操作时作为安全计算的一部分使用。}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhjJubh)}(h例如,Linux任务在操作文件时会有FSUID、FSGID和附加组列表 —— 这些凭据 与通常构成任务的对象上下文的真实UID和GID是相互独立的。h]h例如,Linux任务在操作文件时会有FSUID、FSGID和附加组列表 —— 这些凭据 与通常构成任务的对象上下文的真实UID和GID是相互独立的。}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjJubeh}(h]h ]h"]h$]h&]uh1j\hhhKAhj8ubeh}(h]h ]h"]h$]h&]uh1jhjdubj)}(hX操作 Linux提供许多操作,主体可以对对象执行这些操作。可用的操作集取决于主体 和对象的性质。 操作包括读取、写入、创建和删除文件,以及派生(forking)或发送 信号(signalling)和跟踪(tracing)任务等。 h](h)}(h操作h]h操作}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjvubj])}(hXLinux提供许多操作,主体可以对对象执行这些操作。可用的操作集取决于主体 和对象的性质。 操作包括读取、写入、创建和删除文件,以及派生(forking)或发送 信号(signalling)和跟踪(tracing)任务等。 h](h)}(h{Linux提供许多操作,主体可以对对象执行这些操作。可用的操作集取决于主体 和对象的性质。h]h{Linux提供许多操作,主体可以对对象执行这些操作。可用的操作集取决于主体 和对象的性质。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjubh)}(h操作包括读取、写入、创建和删除文件,以及派生(forking)或发送 信号(signalling)和跟踪(tracing)任务等。h]h操作包括读取、写入、创建和删除文件,以及派生(forking)或发送 信号(signalling)和跟踪(tracing)任务等。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjubeh}(h]h ]h"]h$]h&]uh1j\hhhKIhjvubeh}(h]h ]h"]h$]h&]uh1jhjdubj)}(hX 规则,访问控制列表和安全计算 当主体对对象进行操作时,会进行安全计算。这涉及到使用主体上下文、对象 上下文和操作,并搜索一个或多个规则集,以确定在给定这些上下文的情况下, 主体是否被授予或拒绝以所需方式对对象进行操作的权限。 主要有两个规则来源: a. 自主访问控制(DAC): 有时,对象的描述中会包含一组规则。这就是所谓的“访问控制列表”或‘ACL’。 一个Linux文件可以提供多个ACL。 例如,传统的UNIX文件包括一个权限掩码,它是一个简化的ACL,具有三个固定的 主体类别(“用户”、“组”和“其他”),每一个都可以被授予一定的特权(如“读取”、 “写入”和“执行” —— 无论这些映射对于对象意味着什么)。然而,UNIX文件权限不 允许任意指定主体,因此用途有限。 Linux文件还可以支持POSIX ACL。这是一个规则列表,为任意主体授予各种权限。 b. 强制访问控制(MAC): 整个系统可能有一个或多个规则集,适用于所有主体和对象,不考虑它们的来源。 SELinux和Smack就是这种情况的例子。 在SELinux和Smack的情况下,每个对象在其凭据中都被赋予一个标签。当请求执 行操作时,它们使用主体标签、对象标签和操作,寻找一个规则,该规则表示此操 作是授予还是拒绝的。 h](h)}(h*规则,访问控制列表和安全计算h]h*规则,访问控制列表和安全计算}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjubj])}(hX当主体对对象进行操作时,会进行安全计算。这涉及到使用主体上下文、对象 上下文和操作,并搜索一个或多个规则集,以确定在给定这些上下文的情况下, 主体是否被授予或拒绝以所需方式对对象进行操作的权限。 主要有两个规则来源: a. 自主访问控制(DAC): 有时,对象的描述中会包含一组规则。这就是所谓的“访问控制列表”或‘ACL’。 一个Linux文件可以提供多个ACL。 例如,传统的UNIX文件包括一个权限掩码,它是一个简化的ACL,具有三个固定的 主体类别(“用户”、“组”和“其他”),每一个都可以被授予一定的特权(如“读取”、 “写入”和“执行” —— 无论这些映射对于对象意味着什么)。然而,UNIX文件权限不 允许任意指定主体,因此用途有限。 Linux文件还可以支持POSIX ACL。这是一个规则列表,为任意主体授予各种权限。 b. 强制访问控制(MAC): 整个系统可能有一个或多个规则集,适用于所有主体和对象,不考虑它们的来源。 SELinux和Smack就是这种情况的例子。 在SELinux和Smack的情况下,每个对象在其凭据中都被赋予一个标签。当请求执 行操作时,它们使用主体标签、对象标签和操作,寻找一个规则,该规则表示此操 作是授予还是拒绝的。 h](h)}(hX当主体对对象进行操作时,会进行安全计算。这涉及到使用主体上下文、对象 上下文和操作,并搜索一个或多个规则集,以确定在给定这些上下文的情况下, 主体是否被授予或拒绝以所需方式对对象进行操作的权限。h]hX当主体对对象进行操作时,会进行安全计算。这涉及到使用主体上下文、对象 上下文和操作,并搜索一个或多个规则集,以确定在给定这些上下文的情况下, 主体是否被授予或拒绝以所需方式对对象进行操作的权限。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjubh)}(h主要有两个规则来源:h]h主要有两个规则来源:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKVhjubjc)}(hhh](j)}(hX自主访问控制(DAC): 有时,对象的描述中会包含一组规则。这就是所谓的“访问控制列表”或‘ACL’。 一个Linux文件可以提供多个ACL。 例如,传统的UNIX文件包括一个权限掩码,它是一个简化的ACL,具有三个固定的 主体类别(“用户”、“组”和“其他”),每一个都可以被授予一定的特权(如“读取”、 “写入”和“执行” —— 无论这些映射对于对象意味着什么)。然而,UNIX文件权限不 允许任意指定主体,因此用途有限。 Linux文件还可以支持POSIX ACL。这是一个规则列表,为任意主体授予各种权限。 h](h)}(h自主访问控制(DAC):h]h自主访问控制(DAC):}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjubj])}(hX有时,对象的描述中会包含一组规则。这就是所谓的“访问控制列表”或‘ACL’。 一个Linux文件可以提供多个ACL。 例如,传统的UNIX文件包括一个权限掩码,它是一个简化的ACL,具有三个固定的 主体类别(“用户”、“组”和“其他”),每一个都可以被授予一定的特权(如“读取”、 “写入”和“执行” —— 无论这些映射对于对象意味着什么)。然而,UNIX文件权限不 允许任意指定主体,因此用途有限。 Linux文件还可以支持POSIX ACL。这是一个规则列表,为任意主体授予各种权限。 h](h)}(h有时,对象的描述中会包含一组规则。这就是所谓的“访问控制列表”或‘ACL’。 一个Linux文件可以提供多个ACL。h]h有时,对象的描述中会包含一组规则。这就是所谓的“访问控制列表”或‘ACL’。 一个Linux文件可以提供多个ACL。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKZhjubh)}(hX例如,传统的UNIX文件包括一个权限掩码,它是一个简化的ACL,具有三个固定的 主体类别(“用户”、“组”和“其他”),每一个都可以被授予一定的特权(如“读取”、 “写入”和“执行” —— 无论这些映射对于对象意味着什么)。然而,UNIX文件权限不 允许任意指定主体,因此用途有限。h]hX例如,传统的UNIX文件包括一个权限掩码,它是一个简化的ACL,具有三个固定的 主体类别(“用户”、“组”和“其他”),每一个都可以被授予一定的特权(如“读取”、 “写入”和“执行” —— 无论这些映射对于对象意味着什么)。然而,UNIX文件权限不 允许任意指定主体,因此用途有限。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjubh)}(heLinux文件还可以支持POSIX ACL。这是一个规则列表,为任意主体授予各种权限。h]heLinux文件还可以支持POSIX ACL。这是一个规则列表,为任意主体授予各种权限。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjubeh}(h]h ]h"]h$]h&]uh1j\hhhKZhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hX强制访问控制(MAC): 整个系统可能有一个或多个规则集,适用于所有主体和对象,不考虑它们的来源。 SELinux和Smack就是这种情况的例子。 在SELinux和Smack的情况下,每个对象在其凭据中都被赋予一个标签。当请求执 行操作时,它们使用主体标签、对象标签和操作,寻找一个规则,该规则表示此操 作是授予还是拒绝的。 h](h)}(h强制访问控制(MAC):h]h强制访问控制(MAC):}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhj5ubj])}(hX整个系统可能有一个或多个规则集,适用于所有主体和对象,不考虑它们的来源。 SELinux和Smack就是这种情况的例子。 在SELinux和Smack的情况下,每个对象在其凭据中都被赋予一个标签。当请求执 行操作时,它们使用主体标签、对象标签和操作,寻找一个规则,该规则表示此操 作是授予还是拒绝的。 h](h)}(h整个系统可能有一个或多个规则集,适用于所有主体和对象,不考虑它们的来源。 SELinux和Smack就是这种情况的例子。h]h整个系统可能有一个或多个规则集,适用于所有主体和对象,不考虑它们的来源。 SELinux和Smack就是这种情况的例子。}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhjGubh)}(h在SELinux和Smack的情况下,每个对象在其凭据中都被赋予一个标签。当请求执 行操作时,它们使用主体标签、对象标签和操作,寻找一个规则,该规则表示此操 作是授予还是拒绝的。h]h在SELinux和Smack的情况下,每个对象在其凭据中都被赋予一个标签。当请求执 行操作时,它们使用主体标签、对象标签和操作,寻找一个规则,该规则表示此操 作是授予还是拒绝的。}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjGubeh}(h]h ]h"]h$]h&]uh1j\hhhKfhj5ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]enumtype loweralphaprefixhsuffix.uh1jbhjubeh}(h]h ]h"]h$]h&]uh1j\hhhKRhjubeh}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]jyarabicj{hj|j}uh1jbhj^ubah}(h]h ]h"]h$]h&]uh1j\hhhKhj<hhubeh}(h]jah ]h"]概述ah$]h&]uh1jjhjlhhhhhKubjk)}(hhh](jp)}(h 凭据类型h]h 凭据类型}(hjhhhNhNubah}(h]h ]h"]h$]h&]jMjuh1johjhhhhhKoubh)}(h)Linux内核支持以下类型的凭据:h]h)Linux内核支持以下类型的凭据:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhjhhubj])}(hXy 1. 传统的UNIX凭据。 - 真实用户ID - 真实组ID UID和GID由大多数(如果不是全部)Linux对象携带,即使有时它们需要被虚构出 来(例如FAT或CIFS文件,这些文件来源于Windows)。这些(通常)定义了该对象 的对象上下文,但任务在某些情况下略有不同。 - 有效用户ID,保存用户ID和FS用户ID - 有效组ID,保存组ID和FS组ID - 补充组 这些是仅由任务使用的额外凭据。通常,一个EUID/EGID/GROUPS 被用作主体上下文, 而真实UID/GID 被用作对象上下文。对于任务,这并不总是正确的。 2. 能力 - 允许的能力集合 - 可继承的能力集合 - 有效的能力集合 - 能力边界集合 这些仅由任务携带,表示授予任务的超出普通任务权限的能力。这些可以通过传统 UNIX凭据的更改进行隐式操作,但也可以通过 ``capset()`` 系统调用直接操作。 允许的能力是指进程可以通过 ``capset()`` 将其添加到其有效或允许集合中的 那些能力。这个可继承的集合也可能受到这样的限制。 有效能力是任务本身实际可以使用的能力。 可继承能力是那些可以通过 ``execve()`` 传递的能力。 边界集限制了通过 ``execve()`` 继承的能力,特别是在以UID 0执行二进制文件时。 3. 安全管理标记(securebits) 它们用于控制上述凭据在特定操作如execve()中的操作和继承方式。它们并不直接 用作对象或主体凭据使用。 4. 密钥和密钥环 这些仅由任务携带。它们用于携带和缓存不适合放入其他标准UNIX凭据中的安全令牌。 它们用诸如使网络文件系统密钥在进程执行的文件访问时可用,而无需让普通程序了解 涉及的安全细节。 密钥环是一种特殊类型的密钥。它们携带一组其他密钥,并可以搜索来查找所需的密钥。 每个进程可以订阅多个密钥环: 每线程密钥 每进程密钥环 每会话密钥环 当进程访问一个密钥时,若尚不存在,则通常会将其缓存在一个密钥环中,以便将来的 访问时找到该密钥。 有关密钥的更多信息,请参见 ``Documentation/translations/zh_CN/security/keys/*`` 。 5. LSM Linux安全模块允许在任务执行操作时施加额外的控制。目前,Linux支持几种LSM选项。 一些工作通过标记系统中的对象,并应用一组规则(策略)说明某个标签的任务可以对 另一标签的对象执行哪些操作。 6. AF_KEY 这是一种基于套接字网络协议栈中的凭据管理[RFC 2367]。本文档中没有讨论它,因为不 直接与任务和文件凭据进行交互,而是保留了系统级的凭据。 h]jc)}(hhh](j)}(hX传统的UNIX凭据。 - 真实用户ID - 真实组ID UID和GID由大多数(如果不是全部)Linux对象携带,即使有时它们需要被虚构出 来(例如FAT或CIFS文件,这些文件来源于Windows)。这些(通常)定义了该对象 的对象上下文,但任务在某些情况下略有不同。 - 有效用户ID,保存用户ID和FS用户ID - 有效组ID,保存组ID和FS组ID - 补充组 这些是仅由任务使用的额外凭据。通常,一个EUID/EGID/GROUPS 被用作主体上下文, 而真实UID/GID 被用作对象上下文。对于任务,这并不总是正确的。 h](h)}(h传统的UNIX凭据。h]h传统的UNIX凭据。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshjubj])}(hX^ - 真实用户ID - 真实组ID UID和GID由大多数(如果不是全部)Linux对象携带,即使有时它们需要被虚构出 来(例如FAT或CIFS文件,这些文件来源于Windows)。这些(通常)定义了该对象 的对象上下文,但任务在某些情况下略有不同。 - 有效用户ID,保存用户ID和FS用户ID - 有效组ID,保存组ID和FS组ID - 补充组 这些是仅由任务使用的额外凭据。通常,一个EUID/EGID/GROUPS 被用作主体上下文, 而真实UID/GID 被用作对象上下文。对于任务,这并不总是正确的。 h](j])}(h- 真实用户ID - 真实组ID h]j)}(hhh](j)}(h真实用户IDh]h)}(hjh]h真实用户ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h 真实组ID h]h)}(h 真实组IDh]h 真实组ID}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j:j;uh1jhhhKuhjubah}(h]h ]h"]h$]h&]uh1j\hhhKuhjubh)}(hX UID和GID由大多数(如果不是全部)Linux对象携带,即使有时它们需要被虚构出 来(例如FAT或CIFS文件,这些文件来源于Windows)。这些(通常)定义了该对象 的对象上下文,但任务在某些情况下略有不同。h]hX UID和GID由大多数(如果不是全部)Linux对象携带,即使有时它们需要被虚构出 来(例如FAT或CIFS文件,这些文件来源于Windows)。这些(通常)定义了该对象 的对象上下文,但任务在某些情况下略有不同。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhjubj])}(ha- 有效用户ID,保存用户ID和FS用户ID - 有效组ID,保存组ID和FS组ID - 补充组 h]j)}(hhh](j)}(h,有效用户ID,保存用户ID和FS用户IDh]h)}(hj3h]h,有效用户ID,保存用户ID和FS用户ID}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hj1ubah}(h]h ]h"]h$]h&]uh1jhj.ubj)}(h#有效组ID,保存组ID和FS组IDh]h)}(hjJh]h#有效组ID,保存组ID和FS组ID}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hjHubah}(h]h ]h"]h$]h&]uh1jhj.ubj)}(h 补充组 h]h)}(h 补充组h]h 补充组}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hj_ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]j:j;uh1jhhhK|hj*ubah}(h]h ]h"]h$]h&]uh1j\hhhK|hjubh)}(h这些是仅由任务使用的额外凭据。通常,一个EUID/EGID/GROUPS 被用作主体上下文, 而真实UID/GID 被用作对象上下文。对于任务,这并不总是正确的。h]h这些是仅由任务使用的额外凭据。通常,一个EUID/EGID/GROUPS 被用作主体上下文, 而真实UID/GID 被用作对象上下文。对于任务,这并不总是正确的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1j\hhhKuhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hX能力 - 允许的能力集合 - 可继承的能力集合 - 有效的能力集合 - 能力边界集合 这些仅由任务携带,表示授予任务的超出普通任务权限的能力。这些可以通过传统 UNIX凭据的更改进行隐式操作,但也可以通过 ``capset()`` 系统调用直接操作。 允许的能力是指进程可以通过 ``capset()`` 将其添加到其有效或允许集合中的 那些能力。这个可继承的集合也可能受到这样的限制。 有效能力是任务本身实际可以使用的能力。 可继承能力是那些可以通过 ``execve()`` 传递的能力。 边界集限制了通过 ``execve()`` 继承的能力,特别是在以UID 0执行二进制文件时。 h](h)}(h能力h]h能力}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj])}(hX - 允许的能力集合 - 可继承的能力集合 - 有效的能力集合 - 能力边界集合 这些仅由任务携带,表示授予任务的超出普通任务权限的能力。这些可以通过传统 UNIX凭据的更改进行隐式操作,但也可以通过 ``capset()`` 系统调用直接操作。 允许的能力是指进程可以通过 ``capset()`` 将其添加到其有效或允许集合中的 那些能力。这个可继承的集合也可能受到这样的限制。 有效能力是任务本身实际可以使用的能力。 可继承能力是那些可以通过 ``execve()`` 传递的能力。 边界集限制了通过 ``execve()`` 继承的能力,特别是在以UID 0执行二进制文件时。 h](j])}(h`- 允许的能力集合 - 可继承的能力集合 - 有效的能力集合 - 能力边界集合 h]j)}(hhh](j)}(h允许的能力集合h]h)}(hjh]h允许的能力集合}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h可继承的能力集合h]h)}(hjh]h可继承的能力集合}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h有效的能力集合h]h)}(hjh]h有效的能力集合}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h能力边界集合 h]h)}(h能力边界集合h]h能力边界集合}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j:j;uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubh)}(h这些仅由任务携带,表示授予任务的超出普通任务权限的能力。这些可以通过传统 UNIX凭据的更改进行隐式操作,但也可以通过 ``capset()`` 系统调用直接操作。h](h这些仅由任务携带,表示授予任务的超出普通任务权限的能力。这些可以通过传统 UNIX凭据的更改进行隐式操作,但也可以通过 }(hj#hhhNhNubj)}(h ``capset()``h]hcapset()}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh 系统调用直接操作。}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h允许的能力是指进程可以通过 ``capset()`` 将其添加到其有效或允许集合中的 那些能力。这个可继承的集合也可能受到这样的限制。h](h(允许的能力是指进程可以通过 }(hjChhhNhNubj)}(h ``capset()``h]hcapset()}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubhw 将其添加到其有效或允许集合中的 那些能力。这个可继承的集合也可能受到这样的限制。}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h9有效能力是任务本身实际可以使用的能力。h]h9有效能力是任务本身实际可以使用的能力。}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hD可继承能力是那些可以通过 ``execve()`` 传递的能力。h](h%可继承能力是那些可以通过 }(hjqhhhNhNubj)}(h ``execve()``h]hexecve()}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh 传递的能力。}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hg边界集限制了通过 ``execve()`` 继承的能力,特别是在以UID 0执行二进制文件时。h](h边界集限制了通过 }(hjhhhNhNubj)}(h ``execve()``h]hexecve()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhB 继承的能力,特别是在以UID 0执行二进制文件时。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(h安全管理标记(securebits) 它们用于控制上述凭据在特定操作如execve()中的操作和继承方式。它们并不直接 用作对象或主体凭据使用。 h](h)}(h"安全管理标记(securebits)h]h"安全管理标记(securebits)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj])}(h它们用于控制上述凭据在特定操作如execve()中的操作和继承方式。它们并不直接 用作对象或主体凭据使用。 h]h)}(h它们用于控制上述凭据在特定操作如execve()中的操作和继承方式。它们并不直接 用作对象或主体凭据使用。h]h它们用于控制上述凭据在特定操作如execve()中的操作和继承方式。它们并不直接 用作对象或主体凭据使用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hX密钥和密钥环 这些仅由任务携带。它们用于携带和缓存不适合放入其他标准UNIX凭据中的安全令牌。 它们用诸如使网络文件系统密钥在进程执行的文件访问时可用,而无需让普通程序了解 涉及的安全细节。 密钥环是一种特殊类型的密钥。它们携带一组其他密钥,并可以搜索来查找所需的密钥。 每个进程可以订阅多个密钥环: 每线程密钥 每进程密钥环 每会话密钥环 当进程访问一个密钥时,若尚不存在,则通常会将其缓存在一个密钥环中,以便将来的 访问时找到该密钥。 有关密钥的更多信息,请参见 ``Documentation/translations/zh_CN/security/keys/*`` 。 h](h)}(h密钥和密钥环h]h密钥和密钥环}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj])}(hX这些仅由任务携带。它们用于携带和缓存不适合放入其他标准UNIX凭据中的安全令牌。 它们用诸如使网络文件系统密钥在进程执行的文件访问时可用,而无需让普通程序了解 涉及的安全细节。 密钥环是一种特殊类型的密钥。它们携带一组其他密钥,并可以搜索来查找所需的密钥。 每个进程可以订阅多个密钥环: 每线程密钥 每进程密钥环 每会话密钥环 当进程访问一个密钥时,若尚不存在,则通常会将其缓存在一个密钥环中,以便将来的 访问时找到该密钥。 有关密钥的更多信息,请参见 ``Documentation/translations/zh_CN/security/keys/*`` 。 h](h)}(h这些仅由任务携带。它们用于携带和缓存不适合放入其他标准UNIX凭据中的安全令牌。 它们用诸如使网络文件系统密钥在进程执行的文件访问时可用,而无需让普通程序了解 涉及的安全细节。h]h这些仅由任务携带。它们用于携带和缓存不适合放入其他标准UNIX凭据中的安全令牌。 它们用诸如使网络文件系统密钥在进程执行的文件访问时可用,而无需让普通程序了解 涉及的安全细节。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h密钥环是一种特殊类型的密钥。它们携带一组其他密钥,并可以搜索来查找所需的密钥。 每个进程可以订阅多个密钥环:h]h密钥环是一种特殊类型的密钥。它们携带一组其他密钥,并可以搜索来查找所需的密钥。 每个进程可以订阅多个密钥环:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj])}(h6每线程密钥 每进程密钥环 每会话密钥环 h]h)}(h5每线程密钥 每进程密钥环 每会话密钥环h]h5每线程密钥 每进程密钥环 每会话密钥环}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubh)}(h当进程访问一个密钥时,若尚不存在,则通常会将其缓存在一个密钥环中,以便将来的 访问时找到该密钥。h]h当进程访问一个密钥时,若尚不存在,则通常会将其缓存在一个密钥环中,以便将来的 访问时找到该密钥。}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h`有关密钥的更多信息,请参见 ``Documentation/translations/zh_CN/security/keys/*`` 。h](h(有关密钥的更多信息,请参见 }(hjE hhhNhNubj)}(h4``Documentation/translations/zh_CN/security/keys/*``h]h0Documentation/translations/zh_CN/security/keys/*}(hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE ubh 。}(hjE hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hXLSM Linux安全模块允许在任务执行操作时施加额外的控制。目前,Linux支持几种LSM选项。 一些工作通过标记系统中的对象,并应用一组规则(策略)说明某个标签的任务可以对 另一标签的对象执行哪些操作。 h](h)}(hLSMh]hLSM}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjq ubj])}(hX Linux安全模块允许在任务执行操作时施加额外的控制。目前,Linux支持几种LSM选项。 一些工作通过标记系统中的对象,并应用一组规则(策略)说明某个标签的任务可以对 另一标签的对象执行哪些操作。 h](h)}(hmLinux安全模块允许在任务执行操作时施加额外的控制。目前,Linux支持几种LSM选项。h]hmLinux安全模块允许在任务执行操作时施加额外的控制。目前,Linux支持几种LSM选项。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubh)}(h一些工作通过标记系统中的对象,并应用一组规则(策略)说明某个标签的任务可以对 另一标签的对象执行哪些操作。h]h一些工作通过标记系统中的对象,并应用一组规则(策略)说明某个标签的任务可以对 另一标签的对象执行哪些操作。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjq ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hAF_KEY 这是一种基于套接字网络协议栈中的凭据管理[RFC 2367]。本文档中没有讨论它,因为不 直接与任务和文件凭据进行交互,而是保留了系统级的凭据。 h](h)}(hAF_KEYh]hAF_KEY}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubj])}(h这是一种基于套接字网络协议栈中的凭据管理[RFC 2367]。本文档中没有讨论它,因为不 直接与任务和文件凭据进行交互,而是保留了系统级的凭据。 h]h)}(h这是一种基于套接字网络协议栈中的凭据管理[RFC 2367]。本文档中没有讨论它,因为不 直接与任务和文件凭据进行交互,而是保留了系统级的凭据。h]h这是一种基于套接字网络协议栈中的凭据管理[RFC 2367]。本文档中没有讨论它,因为不 直接与任务和文件凭据进行交互,而是保留了系统级的凭据。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j\hhhKhj ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jyjj{hj|j}uh1jbhjubah}(h]h ]h"]h$]h&]uh1j\hhhKshjhhubh)}(hX当打开一个文件时,打开任务的主体上下文的一部分会记录在创建的文件结构中。 这使得使用该文件结构的操作可以使用这些凭据,而不是发出操作的任务的主体上下文。 一个例子是在网络文件系统上打开的文件,打开文件的凭据应该被呈现给服务器,而不管 实际进行读取或写入操作的是谁。h]hX当打开一个文件时,打开任务的主体上下文的一部分会记录在创建的文件结构中。 这使得使用该文件结构的操作可以使用这些凭据,而不是发出操作的任务的主体上下文。 一个例子是在网络文件系统上打开的文件,打开文件的凭据应该被呈现给服务器,而不管 实际进行读取或写入操作的是谁。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]jah ]h"] 凭据类型ah$]h&]uh1jjhjlhhhhhKoubjk)}(hhh](jp)}(h 文件标记h]h 文件标记}(hj hhhNhNubah}(h]h ]h"]h$]h&]jMjuh1johj hhhhhKubh)}(h存储在磁盘上或通过网络获取的文件可能具有注释,构成该文件的对象安全上下文。 根据文件系统的类型,这些注释可能包括以下一项或多项:h]h存储在磁盘上或通过网络获取的文件可能具有注释,构成该文件的对象安全上下文。 根据文件系统的类型,这些注释可能包括以下一项或多项:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj])}(h* UNIX UID, GID, mode; * Windows user ID; * Access control list; * LSM security label; * UNIX exec privilege escalation bits (SUID/SGID); * File capabilities exec privilege escalation bits. h]j)}(hhh](j)}(hUNIX UID, GID, mode;h]h)}(hj( h]hUNIX UID, GID, mode;}(hj* hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj& ubah}(h]h ]h"]h$]h&]uh1jhj# ubj)}(hWindows user ID;h]h)}(hj? h]hWindows user ID;}(hjA hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj= ubah}(h]h ]h"]h$]h&]uh1jhj# ubj)}(hAccess control list;h]h)}(hjV h]hAccess control list;}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjT ubah}(h]h ]h"]h$]h&]uh1jhj# ubj)}(hLSM security label;h]h)}(hjm h]hLSM security label;}(hjo hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjk ubah}(h]h ]h"]h$]h&]uh1jhj# ubj)}(h0UNIX exec privilege escalation bits (SUID/SGID);h]h)}(hj h]h0UNIX exec privilege escalation bits (SUID/SGID);}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj# ubj)}(h2File capabilities exec privilege escalation bits. h]h)}(h1File capabilities exec privilege escalation bits.h]h1File capabilities exec privilege escalation bits.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj# ubeh}(h]h ]h"]h$]h&]j:*uh1jhhhKhj ubah}(h]h ]h"]h$]h&]uh1j\hhhKhj hhubh)}(h将这些与任务的主体安全上下文进行比较,并根据比较结果允许或禁止执行某些操作。 在execve()的情况下,特权提升位起作用,并且可能允许由可执行文件的注释决定的 进程获得额外的特权。h]h将这些与任务的主体安全上下文进行比较,并根据比较结果允许或禁止执行某些操作。 在execve()的情况下,特权提升位起作用,并且可能允许由可执行文件的注释决定的 进程获得额外的特权。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]jah ]h"] 文件标记ah$]h&]uh1jjhjlhhhhhKubjk)}(hhh](jp)}(h 任务凭据h]h 任务凭据}(hj hhhNhNubah}(h]h ]h"]h$]h&]jMj"uh1johj hhhhhKubh)}(h在Linux中,一个任务的所有凭据都保存在一个引用计数结构体‘struct cred’中, 通过(uid, gid)或(groups, keys, LSM security)进行访问。每个任务在其 task_struct中通过一个名为‘cred’的指针指向其凭据。h]h在Linux中,一个任务的所有凭据都保存在一个引用计数结构体‘struct cred’中, 通过(uid, gid)或(groups, keys, LSM security)进行访问。每个任务在其 task_struct中通过一个名为‘cred’的指针指向其凭据。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h]一旦一组凭据已经准备好并提交,除非以下几种情况,否则不能更改:h]h]一旦一组凭据已经准备好并提交,除非以下几种情况,否则不能更改:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj])}(hX1. 其引用计数可以更改; 2. 它所指向的 group_info 结构体的引用计数可以更改; 3. 它所指向的安全数据的引用计数可以更改; 4. 它所指向的任何密钥环的引用计数可以更改; 5. 它所指向的任何密钥环可以被撤销、过期或其安全属性可以更改; 6. 它所指向的任何密钥环的内容可以更改(密钥环的整个目的就是作为一组共享凭据, 可由具有适当访问权限的任何人修改)。 h]jc)}(hhh](j)}(h其引用计数可以更改; h]h)}(h其引用计数可以更改;h]h其引用计数可以更改;}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hC它所指向的 group_info 结构体的引用计数可以更改; h]h)}(hB它所指向的 group_info 结构体的引用计数可以更改;h]hB它所指向的 group_info 结构体的引用计数可以更改;}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h:它所指向的安全数据的引用计数可以更改; h]h)}(h9它所指向的安全数据的引用计数可以更改;h]h9它所指向的安全数据的引用计数可以更改;}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj7 ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h=它所指向的任何密钥环的引用计数可以更改; h]h)}(h<它所指向的任何密钥环的引用计数可以更改;h]h<它所指向的任何密钥环的引用计数可以更改;}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjO ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hX它所指向的任何密钥环可以被撤销、过期或其安全属性可以更改; h]h)}(hW它所指向的任何密钥环可以被撤销、过期或其安全属性可以更改;h]hW它所指向的任何密钥环可以被撤销、过期或其安全属性可以更改;}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjg ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h它所指向的任何密钥环的内容可以更改(密钥环的整个目的就是作为一组共享凭据, 可由具有适当访问权限的任何人修改)。 h]h)}(h它所指向的任何密钥环的内容可以更改(密钥环的整个目的就是作为一组共享凭据, 可由具有适当访问权限的任何人修改)。h]h它所指向的任何密钥环的内容可以更改(密钥环的整个目的就是作为一组共享凭据, 可由具有适当访问权限的任何人修改)。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]jyjj{hj|j}uh1jbhj ubah}(h]h ]h"]h$]h&]uh1j\hhhKhj hhubh)}(hX要更改cred结构体中的任何内容,必须遵循复制和替换的原则。首先进行复制,然后修 改副本,最后使用RCU(读-复制-更新)将任务指针更改为指向新的副本。有一些封装可 用于帮助执行这个过程(见下文)。h]hX要更改cred结构体中的任何内容,必须遵循复制和替换的原则。首先进行复制,然后修 改副本,最后使用RCU(读-复制-更新)将任务指针更改为指向新的副本。有一些封装可 用于帮助执行这个过程(见下文)。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(hX{一个任务只能修改自己的凭据;不再允许一个任务修改另一个任务的凭据。 这意味着 ``capset()`` 系统调用不再允许使用除当前进程之外的任何PID。 此外, ``keyctl_instantiate()`` 和 ``keyctl_negate()`` 函数也不再 允许在请求进程中附加到特定于进程的密钥环,因为实例化进程可能需要创建它们。h](hq一个任务只能修改自己的凭据;不再允许一个任务修改另一个任务的凭据。 这意味着 }(hj hhhNhNubj)}(h ``capset()``h]hcapset()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhN 系统调用不再允许使用除当前进程之外的任何PID。 此外, }(hj hhhNhNubj)}(h``keyctl_instantiate()``h]hkeyctl_instantiate()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 和 }(hj hhhNhNubj)}(h``keyctl_negate()``h]hkeyctl_negate()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 函数也不再 允许在请求进程中附加到特定于进程的密钥环,因为实例化进程可能需要创建它们。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubjk)}(hhh](jp)}(h不可变凭据h]h不可变凭据}(hj hhhNhNubah}(h]h ]h"]h$]h&]jMjAuh1johj hhhhhKubh)}(h一旦一组凭据已经被公开(例如通过调用 ``commit_creds()`` ),必须将其视为 不可变的,除了两个例外情况:h](h7一旦一组凭据已经被公开(例如通过调用 }(hj hhhNhNubj)}(h``commit_creds()``h]hcommit_creds()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhB ),必须将其视为 不可变的,除了两个例外情况:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj])}(h1. 引用计数可以被修改。 2. 虽然无法更改一组凭据的密钥环订阅,但订阅的密钥环的内容可以被更改。 h]jc)}(hhh](j)}(h引用计数可以被修改。 h]h)}(h引用计数可以被修改。h]h引用计数可以被修改。}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj- ubah}(h]h ]h"]h$]h&]uh1jhj* ubj)}(hd虽然无法更改一组凭据的密钥环订阅,但订阅的密钥环的内容可以被更改。 h]h)}(hc虽然无法更改一组凭据的密钥环订阅,但订阅的密钥环的内容可以被更改。h]hc虽然无法更改一组凭据的密钥环订阅,但订阅的密钥环的内容可以被更改。}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE ubah}(h]h ]h"]h$]h&]uh1jhj* ubeh}(h]h ]h"]h$]h&]jyjj{hj|j}uh1jbhj& ubah}(h]h ]h"]h$]h&]uh1j\hhhKhj hhubh)}(hXD为了在编译时捕获意外的凭据修改,struct task_struct具有_const_指针指向其凭据集, struct file也是如此。此外,某些函数如 ``get_cred()`` 和 ``put_cred()`` 在 const指针上操作,因此不需要进行类型转换,但需要临时放弃const限定,以便能够修改 引用计数。h](h为了在编译时捕获意外的凭据修改,struct task_struct具有_const_指针指向其凭据集, struct file也是如此。此外,某些函数如 }(hji hhhNhNubj)}(h``get_cred()``h]h get_cred()}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji ubh 和 }(hji hhhNhNubj)}(h``put_cred()``h]h put_cred()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji ubh 在 const指针上操作,因此不需要进行类型转换,但需要临时放弃const限定,以便能够修改 引用计数。}(hji hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]jGah ]h"]不可变凭据ah$]h&]uh1jjhj hhhhhKubjk)}(hhh](jp)}(h访问任务凭据h]h访问任务凭据}(hj hhhNhNubah}(h]h ]h"]h$]h&]jMjcuh1johj hhhhhMubh)}(h任务只能修改自己的凭据,允许当前进程可以读取或替换自己的凭据,无需任何形式锁定的 情况下 —— 这极大简化了事情。它可以调用::h]h任务只能修改自己的凭据,允许当前进程可以读取或替换自己的凭据,无需任何形式锁定的 情况下 —— 这极大简化了事情。它可以调用:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh literal_block)}(h!const struct cred *current_cred()h]h!const struct cred *current_cred()}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhMhj hhubh)}(hE获取指向其凭据结构的指针,并且之后不必释放它。h]hE获取指向其凭据结构的指针,并且之后不必释放它。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj hhubh)}(hh有一些方便的封装用于检索任务凭据的特定方面(在每种情况下都只返回值)::h]hg有一些方便的封装用于检索任务凭据的特定方面(在每种情况下都只返回值):}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj hhubj )}(hXuid_t current_uid(void) Current's real UID gid_t current_gid(void) Current's real GID uid_t current_euid(void) Current's effective UID gid_t current_egid(void) Current's effective GID uid_t current_fsuid(void) Current's file access UID gid_t current_fsgid(void) Current's file access GID kernel_cap_t current_cap(void) Current's effective capabilities struct user_struct *current_user(void) Current's user accounth]hXuid_t current_uid(void) Current's real UID gid_t current_gid(void) Current's real GID uid_t current_euid(void) Current's effective UID gid_t current_egid(void) Current's effective GID uid_t current_fsuid(void) Current's file access UID gid_t current_fsgid(void) Current's file access GID kernel_cap_t current_cap(void) Current's effective capabilities struct user_struct *current_user(void) Current's user account}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhMhj hhubh)}(hJ还有一些方便的封装,用于检索任务凭据的特定关联对::h]hI还有一些方便的封装,用于检索任务凭据的特定关联对:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubj )}(h}void current_uid_gid(uid_t *, gid_t *); void current_euid_egid(uid_t *, gid_t *); void current_fsuid_fsgid(uid_t *, gid_t *);h]h}void current_uid_gid(uid_t *, gid_t *); void current_euid_egid(uid_t *, gid_t *); void current_fsuid_fsgid(uid_t *, gid_t *);}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhMhj hhubh)}(hN在从当前任务的凭据中检索后,通过其参数返回这些值对。h]hN在从当前任务的凭据中检索后,通过其参数返回这些值对。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hP此外,还有一个函数用于获取当前进程的当前凭据集的引用::h]hO此外,还有一个函数用于获取当前进程的当前凭据集的引用:}(hj% hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj hhubj )}(h*const struct cred *get_current_cred(void);h]h*const struct cred *get_current_cred(void);}hj3 sbah}(h]h ]h"]h$]h&]hhuh1j hhhM"hj hhubh)}(h[以及用于获取对一个实际上不存在于struct cred中的凭据的引用的函数::h]hZ以及用于获取对一个实际上不存在于struct cred中的凭据的引用的函数:}(hjA hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM$hj hhubj )}(hXstruct user_struct *get_current_user(void); struct group_info *get_current_groups(void);h]hXstruct user_struct *get_current_user(void); struct group_info *get_current_groups(void);}hjO sbah}(h]h ]h"]h$]h&]hhuh1j hhhM&hj hhubh)}(hW分别获得对当前进程的 user accounting structure 和补充组列表的引用。h]hW分别获得对当前进程的 user accounting structure 和补充组列表的引用。}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hj hhubh)}(h~一旦获得引用,就必须使用 ``put_cred()``, ``free_uid()`` 或 ``put_group_info()`` 来适当释放它。h](h%一旦获得引用,就必须使用 }(hjk hhhNhNubj)}(h``put_cred()``h]hput_cred()}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk ubh, }(hjk hhhNhNubj)}(h``free_uid()``h]hfree_uid()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk ubh 或 }(hjk hhhNhNubj)}(h``put_group_info()``h]hput_group_info()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk ubh 来适当释放它。}(hjk hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM+hj hhubeh}(h]jiah ]h"]访问任务凭据ah$]h&]uh1jjhj hhhhhMubjk)}(hhh](jp)}(h访问其他任务的凭据h]h访问其他任务的凭据}(hj hhhNhNubah}(h]h ]h"]h$]h&]jMjuh1johj hhhhhM0ubh)}(h虽然一个任务可以在不需要锁定的情况下访问自己的凭据,但想要访问另一个任务 的凭据的任务并非如此。它必须使用RCU读锁和 ``rcu_dereference()``。h](h虽然一个任务可以在不需要锁定的情况下访问自己的凭据,但想要访问另一个任务 的凭据的任务并非如此。它必须使用RCU读锁和 }(hj hhhNhNubj)}(h``rcu_dereference()``h]hrcu_dereference()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM2hj hhubh)}(h``rcu_dereference()`` 是由::h](j)}(h``rcu_dereference()``h]hrcu_dereference()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 是由:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM5hj hhubj )}(h9const struct cred *__task_cred(struct task_struct *task);h]h9const struct cred *__task_cred(struct task_struct *task);}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhM7hj hhubh)}(h2这应该在RCU读锁中使用,如下例所示::h]h1这应该在RCU读锁中使用,如下例所示:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM9hj hhubj )}(hX2void foo(struct task_struct *t, struct foo_data *f) { const struct cred *tcred; ... rcu_read_lock(); tcred = __task_cred(t); f->uid = tcred->uid; f->gid = tcred->gid; f->groups = get_group_info(tcred->groups); rcu_read_unlock(); ... }h]hX2void foo(struct task_struct *t, struct foo_data *f) { const struct cred *tcred; ... rcu_read_lock(); tcred = __task_cred(t); f->uid = tcred->uid; f->gid = tcred->gid; f->groups = get_group_info(tcred->groups); rcu_read_unlock(); ... }}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhM;hj hhubh)}(h如果需要长时间持有另一个任务的凭据,并且可能在此过程中休眠,则调用方 应该使用以下函数来获取对这些凭据的引用::h]h如果需要长时间持有另一个任务的凭据,并且可能在此过程中休眠,则调用方 应该使用以下函数来获取对这些凭据的引用:}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMHhj hhubj )}(h;const struct cred *get_task_cred(struct task_struct *task);h]h;const struct cred *get_task_cred(struct task_struct *task);}hj;sbah}(h]h ]h"]h$]h&]hhuh1j hhhMKhj hhubh)}(h这个函数内部完成了所有的RCU操作。当使用完这些凭据时,调用方必须调用put_cred() 函数释放它们。h]h这个函数内部完成了所有的RCU操作。当使用完这些凭据时,调用方必须调用put_cred() 函数释放它们。}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMMhj hhubh)}(h~``__task_cred()`` 的结果不应直接传递给 ``get_cred()`` , 因为这可能与 ``commit_cred()`` 发生竞争条件。h]h)}(h~``__task_cred()`` 的结果不应直接传递给 ``get_cred()`` , 因为这可能与 ``commit_cred()`` 发生竞争条件。h](j)}(h``__task_cred()``h]h __task_cred()}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubh 的结果不应直接传递给 }(hj[hhhNhNubj)}(h``get_cred()``h]h get_cred()}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubh , 因为这可能与 }(hj[hhhNhNubj)}(h``commit_cred()``h]h commit_cred()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubh 发生竞争条件。}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMQhjWubah}(h]h ]h"]h$]h&]uh1hhj hhhhhNubh)}(ht还有一些方便的函数可以访问另一个任务凭据的特定部分,将RCU操作对调用方隐藏起来::h]hs还有一些方便的函数可以访问另一个任务凭据的特定部分,将RCU操作对调用方隐藏起来:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMThj hhubj )}(hduid_t task_uid(task) Task's real UID uid_t task_euid(task) Task's effective UIDh]hduid_t task_uid(task) Task's real UID uid_t task_euid(task) Task's effective UID}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhMVhj hhubh)}(h>如果调用方在此时已经持有RCU读锁,则应使用::h]h=如果调用方在此时已经持有RCU读锁,则应使用:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMYhj hhubj )}(h.__task_cred(task)->uid __task_cred(task)->euidh]h.__task_cred(task)->uid __task_cred(task)->euid}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhM[hj hhubh)}(hX类似地,如果需要访问任务凭据的多个方面,应使用RCU读锁,调用 ``__task_cred()`` 函数,将结果存储在临时指针中,然后从临时指针中调用凭据的各个方面,最后释放锁。 这样可以防止多次调用昂贵的RCU操作。h](hX类似地,如果需要访问任务凭据的多个方面,应使用RCU读锁,调用 }(hjhhhNhNubj)}(h``__task_cred()``h]h __task_cred()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 函数,将结果存储在临时指针中,然后从临时指针中调用凭据的各个方面,最后释放锁。 这样可以防止多次调用昂贵的RCU操作。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM^hj hhubh)}(hM如果需要访问另一个任务凭据的其他单个方面,可以使用::h]hL如果需要访问另一个任务凭据的其他单个方面,可以使用:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMbhj hhubj )}(htask_cred_xxx(task, member)h]htask_cred_xxx(task, member)}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhMdhj hhubh)}(hB这里的‘member’是cred结构体的非指针成员。例如::h]hA这里的‘member’是cred结构体的非指针成员。例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMfhj hhubj )}(h uid_t task_cred_xxx(task, suid);h]h uid_t task_cred_xxx(task, suid);}hj#sbah}(h]h ]h"]h$]h&]hhuh1j hhhMhhj hhubh)}(h将从任务中检索‘struct cred::suid’,并执行适当的RCU操作。对于指针成员, 不能使用这种形式,因为它们指向的内容可能在释放RCU读锁的瞬间消失。h]h将从任务中检索‘struct cred::suid’,并执行适当的RCU操作。对于指针成员, 不能使用这种形式,因为它们指向的内容可能在释放RCU读锁的瞬间消失。}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMjhj hhubeh}(h]jah ]h"]访问其他任务的凭据ah$]h&]uh1jjhj hhhhhM0ubjk)}(hhh](jp)}(h 修改凭据h]h 修改凭据}(hjIhhhNhNubah}(h]h ]h"]h$]h&]jMjuh1johjFhhhhhMoubh)}(h如先前提到的,一个任务只能修改自己的凭据,不能修改其他任务的凭据。这意味 着它不需要使用任何锁来修改自己的凭据。h]h如先前提到的,一个任务只能修改自己的凭据,不能修改其他任务的凭据。这意味 着它不需要使用任何锁来修改自己的凭据。}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMqhjFhhubh)}(h8要修改当前进程的凭据,函数应首先调用::h]h7要修改当前进程的凭据,函数应首先调用:}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMthjFhhubj )}(h!struct cred *prepare_creds(void);h]h!struct cred *prepare_creds(void);}hjssbah}(h]h ]h"]h$]h&]hhuh1j hhhMvhjFhhubh)}(h这将锁定current->cred_replace_mutex,然后分配并构建当前进程凭据的副本。 如果成功,函数返回时仍然保持互斥锁。如果不成功(内存不足),则返回NULL。h]h这将锁定current->cred_replace_mutex,然后分配并构建当前进程凭据的副本。 如果成功,函数返回时仍然保持互斥锁。如果不成功(内存不足),则返回NULL。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMxhjFhhubh)}(h互斥锁防止 ``ptrace()`` 在进行凭据构建和更改的安全检查时更改进程的ptrace 状态,因为ptrace状态可能会改变结果,特别是在 ``execve()`` 的情况下。h](h互斥锁防止 }(hjhhhNhNubj)}(h ``ptrace()``h]hptrace()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 在进行凭据构建和更改的安全检查时更改进程的ptrace 状态,因为ptrace状态可能会改变结果,特别是在 }(hjhhhNhNubj)}(h ``execve()``h]hexecve()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 的情况下。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM{hjFhhubh)}(h新的凭据集应适当地进行修改,并进行任何安全检查和挂钩。在此时,当前和建议的 凭据集都可用,因为current_cred()将返回当前的凭据集。h]h新的凭据集应适当地进行修改,并进行任何安全检查和挂钩。在此时,当前和建议的 凭据集都可用,因为current_cred()将返回当前的凭据集。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM~hjFhhubh)}(hX在替换组列表时,必须在将其添加到凭据之前对新列表进行排序,因为使用二分查找 测试成员资格。实际上,这意味着在set_groups()或set_current_groups()之 前应调用groups_sort()。groups_sort()不能在共享的 ``struct group_list`` 上调用,因为即使数组已经排序,它也可能作为排序过程的一部分对元素进行排列。h](hX在替换组列表时,必须在将其添加到凭据之前对新列表进行排序,因为使用二分查找 测试成员资格。实际上,这意味着在set_groups()或set_current_groups()之 前应调用groups_sort()。groups_sort()不能在共享的 }(hjhhhNhNubj)}(h``struct group_list``h]hstruct group_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhp 上调用,因为即使数组已经排序,它也可能作为排序过程的一部分对元素进行排列。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubh)}(hS当凭据集准备好时,应通过调用以下函数将其提交给当前进程::h]hR当凭据集准备好时,应通过调用以下函数将其提交给当前进程:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubj )}(h#int commit_creds(struct cred *new);h]h#int commit_creds(struct cred *new);}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhMhjFhhubh)}(hX9这将修改凭据和进程的各个方面,给LSM提供机会做同样的修改,然后使用 ``rcu_assign_pointer()`` 将新的凭据实际提交给 ``current->cred`` , 释放 ``current->cred_replace_mutex`` 以允许 ``ptrace()`` 进行操 作,并通知调度程序和其他组件有关更改的情况。h](ha这将修改凭据和进程的各个方面,给LSM提供机会做同样的修改,然后使用 }(hj hhhNhNubj)}(h``rcu_assign_pointer()``h]hrcu_assign_pointer()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 将新的凭据实际提交给 }(hj hhhNhNubj)}(h``current->cred``h]h current->cred}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh , 释放 }(hj hhhNhNubj)}(h``current->cred_replace_mutex``h]hcurrent->cred_replace_mutex}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 以允许 }(hj hhhNhNubj)}(h ``ptrace()``h]hptrace()}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhM 进行操 作,并通知调度程序和其他组件有关更改的情况。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubh)}(hd该函数保证返回0,以便可以在诸如 ``sys_setresuid()`` 函数的末尾进行尾调用。h](h/该函数保证返回0,以便可以在诸如 }(hjahhhNhNubj)}(h``sys_setresuid()``h]hsys_setresuid()}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh" 函数的末尾进行尾调用。}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubh)}(h请注意,该函数会消耗调用者对新凭据的引用。调用者在此之后不应调用 ``put_cred()`` 释放新凭据。h](ha请注意,该函数会消耗调用者对新凭据的引用。调用者在此之后不应调用 }(hjhhhNhNubj)}(h``put_cred()``h]h put_cred()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 释放新凭据。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubh)}(hZ此外,一旦新的凭据上调用了该函数,就不能进一步更改这些凭据。h]hZ此外,一旦新的凭据上调用了该函数,就不能进一步更改这些凭据。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubh)}(ho如果在调用 ``prepare_creds()`` 之后安全检查失败或发生其他错误, 则应调用以下函数::h](h如果在调用 }(hjhhhNhNubj)}(h``prepare_creds()``h]hprepare_creds()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhK 之后安全检查失败或发生其他错误, 则应调用以下函数:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubj )}(h#void abort_creds(struct cred *new);h]h#void abort_creds(struct cred *new);}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhMhjFhhubh)}(hm这将释放 ``prepare_creds()`` 获取的 ``current->cred_replace_mutex`` 的锁, 并释放新的凭据。h](h 这将释放 }(hjhhhNhNubj)}(h``prepare_creds()``h]hprepare_creds()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 获取的 }(hjhhhNhNubj)}(h``current->cred_replace_mutex``h]hcurrent->cred_replace_mutex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# 的锁, 并释放新的凭据。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubh)}(h5一个典型的凭据修改函数看起来像这样::h]h4一个典型的凭据修改函数看起来像这样:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjFhhubj )}(hX`int alter_suid(uid_t suid) { struct cred *new; int ret; new = prepare_creds(); if (!new) return -ENOMEM; new->suid = suid; ret = security_alter_suid(new); if (ret < 0) { abort_creds(new); return ret; } return commit_creds(new); }h]hX`int alter_suid(uid_t suid) { struct cred *new; int ret; new = prepare_creds(); if (!new) return -ENOMEM; new->suid = suid; ret = security_alter_suid(new); if (ret < 0) { abort_creds(new); return ret; } return commit_creds(new); }}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhMhjFhhubeh}(h]jah ]h"] 修改凭据ah$]h&]uh1jjhj hhhhhMoubjk)}(hhh](jp)}(h 管理凭据h]h 管理凭据}(hj5hhhNhNubah}(h]h ]h"]h$]h&]jMjuh1johj2hhhhhMubh)}(h(有一些函数用来辅助凭据管理:h]h(有一些函数用来辅助凭据管理:}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj2hhubj])}(hX- ``void put_cred(const struct cred *cred);`` 这将释放对给定凭据集的引用。如果引用计数为零,凭据集将由 RCU系统安排进行销毁。 - ``const struct cred *get_cred(const struct cred *cred);`` 这将获取对活动凭据集的引用。返回指向凭据集的指针。 - ``struct cred *get_new_cred(struct cred *cred);`` 这将获取对当前正在构建且可变的凭据集的引用。返回指向凭据集的指针。 h]j)}(hhh](j)}(h``void put_cred(const struct cred *cred);`` 这将释放对给定凭据集的引用。如果引用计数为零,凭据集将由 RCU系统安排进行销毁。 h](h)}(h+``void put_cred(const struct cred *cred);``h]j)}(hj^h]h'void put_cred(const struct cred *cred);}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhhhMhjXubj])}(ht这将释放对给定凭据集的引用。如果引用计数为零,凭据集将由 RCU系统安排进行销毁。 h]h)}(hs这将释放对给定凭据集的引用。如果引用计数为零,凭据集将由 RCU系统安排进行销毁。h]hs这将释放对给定凭据集的引用。如果引用计数为零,凭据集将由 RCU系统安排进行销毁。}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjsubah}(h]h ]h"]h$]h&]uh1j\hhhMhjXubeh}(h]h ]h"]h$]h&]uh1jhjUubj)}(h``const struct cred *get_cred(const struct cred *cred);`` 这将获取对活动凭据集的引用。返回指向凭据集的指针。 h](h)}(h9``const struct cred *get_cred(const struct cred *cred);``h]j)}(hjh]h5const struct cred *get_cred(const struct cred *cred);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhMhjubj])}(hL这将获取对活动凭据集的引用。返回指向凭据集的指针。 h]h)}(hK这将获取对活动凭据集的引用。返回指向凭据集的指针。h]hK这将获取对活动凭据集的引用。返回指向凭据集的指针。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j\hhhMhjubeh}(h]h ]h"]h$]h&]uh1jhjUubj)}(h``struct cred *get_new_cred(struct cred *cred);`` 这将获取对当前正在构建且可变的凭据集的引用。返回指向凭据集的指针。 h](h)}(h1``struct cred *get_new_cred(struct cred *cred);``h]j)}(hjh]h-struct cred *get_new_cred(struct cred *cred);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhMhjubj])}(hd这将获取对当前正在构建且可变的凭据集的引用。返回指向凭据集的指针。 h]h)}(hc这将获取对当前正在构建且可变的凭据集的引用。返回指向凭据集的指针。h]hc这将获取对当前正在构建且可变的凭据集的引用。返回指向凭据集的指针。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j\hhhMhjubeh}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]j:j;uh1jhhhMhjQubah}(h]h ]h"]h$]h&]uh1j\hhhMhj2hhubeh}(h]jah ]h"] 管理凭据ah$]h&]uh1jjhj hhhhhMubeh}(h]j(ah ]h"] 任务凭据ah$]h&]uh1jjhjlhhhhhKubjk)}(hhh](jp)}(h打开文件凭据h]h打开文件凭据}(hj hhhNhNubah}(h]h ]h"]h$]h&]jMjuh1johjhhhhhMubh)}(hX*当打开新文件时,会获取对打开任务凭据的引用,并将其附加到文件结构体的 ``f_cred`` 字段中,替代原来的 ``f_uid`` 和 ``f_gid`` 。原来访问 ``file->f_uid`` 和 ``file->f_gid`` 的代码现在应访问 ``file->f_cred->fsuid`` 和 ``file->f_cred->fsgid`` 。h](hg当打开新文件时,会获取对打开任务凭据的引用,并将其附加到文件结构体的 }(hj.hhhNhNubj)}(h ``f_cred``h]hf_cred}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 字段中,替代原来的 }(hj.hhhNhNubj)}(h ``f_uid``h]hf_uid}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 和 }(hj.hhhNhNubj)}(h ``f_gid``h]hf_gid}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 。原来访问 }(hj.hhhNhNubj)}(h``file->f_uid``h]h file->f_uid}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 和 }hj.sbj)}(h``file->f_gid``h]h file->f_gid}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 的代码现在应访问 }(hj.hhhNhNubj)}(h``file->f_cred->fsuid``h]hfile->f_cred->fsuid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 和 }(hj.hhhNhNubj)}(h``file->f_cred->fsgid``h]hfile->f_cred->fsgid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh 。}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(h安全访问 ``f_cred`` 的情况下可以不使用RCU或加锁,因为指向凭据的指针 以及指向的凭据结构的内容在文件结构的整个生命周期中保持不变,除非是 上述列出的例外情况(参阅任务凭据部分)。h](h 安全访问 }(hjhhhNhNubj)}(h ``f_cred``h]hf_cred}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 的情况下可以不使用RCU或加锁,因为指向凭据的指针 以及指向的凭据结构的内容在文件结构的整个生命周期中保持不变,除非是 上述列出的例外情况(参阅任务凭据部分)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(h为了避免“混淆代理”权限提升攻击,在打开的文件后续操作时,访问控制检查 应该使用这些凭据,而不是使用“当前”的凭据,因为该文件可能已经被传递给 一个更具特权的进程。h]h为了避免“混淆代理”权限提升攻击,在打开的文件后续操作时,访问控制检查 应该使用这些凭据,而不是使用“当前”的凭据,因为该文件可能已经被传递给 一个更具特权的进程。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]jah ]h"]打开文件凭据ah$]h&]uh1jjhjlhhhhhMubjk)}(hhh](jp)}(h覆盖VFS对凭据的使用h]h覆盖VFS对凭据的使用}(hjhhhNhNubah}(h]h ]h"]h$]h&]jMjuh1johjhhhhhMubh)}(h在某些情况下,需要覆盖VFS使用的凭据,可以通过使用不同的凭据集调用 如 ``vfs_mkdir()`` 来实现。以下是一些进行此操作的位置:h](he在某些情况下,需要覆盖VFS使用的凭据,可以通过使用不同的凭据集调用 如 }(hjhhhNhNubj)}(h``vfs_mkdir()``h]h vfs_mkdir()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh5 来实现。以下是一些进行此操作的位置:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj])}(h=* ``sys_faccessat()``. * ``vfs_coredump()``. * nfs4recover.c.h]j)}(hhh](j)}(h``sys_faccessat()``.h]h)}(hj)h](j)}(h``sys_faccessat()``h]hsys_faccessat()}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj'ubah}(h]h ]h"]h$]h&]uh1jhj$ubj)}(h``vfs_coredump()``.h]h)}(hjNh](j)}(h``vfs_coredump()``h]hvfs_coredump()}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjLubah}(h]h ]h"]h$]h&]uh1jhj$ubj)}(hnfs4recover.c.h]h)}(hjsh]hnfs4recover.c.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjqubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]j:j uh1jhhhMhj ubah}(h]h ]h"]h$]h&]uh1j\hhhMhjhhubeh}(h]jah ]h"]覆盖vfs对凭据的使用ah$]h&]uh1jjhjlhhhhhMubeh}(h]linuxah ]h"]linux中的凭据ah$]h&]uh1jjhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(joN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjj9j4jjj jj jjj(j jGj jijCjj/jjjjjjju nametypes}(jj9jj j jj j jCj/jjjuh}(jjlj4jjj<jjjj j(j jGj jij jj jjFjj2jjjjjjjjjjj"jjAj8jcjZjj|jjjjjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages] transformerN include_log]9Documentation/translations/zh_CN/security/credentials.rst(NNNNta decorationNhhub.