在安全框架的上下文中,通常会出现一些术语,即主体、用户和主体,我一直无法找到明确的定义和它们之间的区别。
那么,这些术语究竟是什么意思,为什么需要区分主体和主体?
它们是等级的,就像属、种和个体的等级一样。
主体 - 在安全上下文中,主体是请求访问对象的任何实体。这些是用于表示请求访问的事物和发出请求的事物的通用术语。当您登录应用程序时,您是主体,应用程序是客体。当有人敲门时,访客是请求访问的主体,而您的家是请求访问的对象。
主体 - 由帐户、角色或其他唯一标识符表示的主题子集。当我们达到实现细节的水平时,主体是我们在访问控制列表中使用的唯一键。它们可能代表人类用户、自动化、应用程序、连接等。
用户 - 通常指人工操作员的主体子集。随着时间的推移,这种区别变得越来越模糊,因为“用户”或“用户 ID”这两个词通常与“帐户”互换。但是,当您需要区分作为主体的广泛事物类别和以非确定性方式驱动事务的交互式操作符的子集时,“用户”是正确的词。
主题/对象继承自语法中使用的相同术语。在一个句子中,主语是演员,客体是被作用的事物。从这个意义上说,这种用途早在计算机发明之前就已经存在。在安全上下文中,主题是可以发出请求的任何东西。如上所述,这不必局限于 IT 安全,因此是一个非常广泛的分类。有趣的是,主体意味着客体。没有客体,就没有主体。
主体是主体解决的问题。当您出示信用卡时,您是主体,帐号是委托人。在其他情况下,您的用户 ID 或国家颁发的身份证明是您的委托人。但是主体可以与非人的许多类型的主体相关联。当应用程序请求系统级功能时,主体可能是已签名可执行代码模块的签名者,但即使在这种情况下,驱动请求的用户仍然是主体。
用户比主题或主体更具体,因为它通常指的是交互式操作员。这就是为什么我们有一个图形用户界面而不是一个图形主体界面。用户是解析为主体的主体实例。单个用户可以解析为任意数量的主体,但任何主体都应解析为单个用户(假设人们遵守不共享 ID 的要求)。在上面的例子中,一个可执行代码模块的签名者肯定不是用户,而是一个有效的委托人。试图加载模块的交互式操作员是用户。
正如评论中所指出的,即使是权威人士也不同意这些条款。在准备此回复时,我搜索了 NIST、SANS、IEEE、MITRE 和几个“准权威”资源,例如安全考试指南。我发现没有一个至少是准权威的单一来源涵盖所有三个术语,并且它们的用法都存在显着差异。这是我对如何使用这些术语的看法,但从实际的角度来看,当您在半夜仔细阅读手册时,定义往往是供应商或作者所说的任何内容。希望这里的回复能够提供足够的洞察力来导航水域并使用这些术语解析任何安全文档。
看看我的 Authentication concept map:
https://i.stack.imgur.com/5bT0L.jpg
我认为该术语取自JAAS。
当应用程序使用 JAAS 身份验证来验证用户(或其他实体,如服务)时,会创建一个 Subject 作为结果。 Subject 的目的是代表经过身份验证的用户。一个 Subject 由一组 Principal 组成,其中每个 Principal 代表该用户的一个身份。例如,一个 Subject 可以有一个名字 Principal(“Susan Smith”)和一个社会安全号码 Principal(“987-65-4321”),从而将该 Subject 与其他 Subject 区分开来。
主题是请求服务的实体。它可以是用户或进程。可能这就是为什么选择名称主题而不是用户的原因。
当主体尝试访问服务时,必须首先对主体进行身份验证。成功的身份验证以加载该主题的安全主体结束。例如,在基于角色的访问控制系统中,经过身份验证(登录)的用户通常有两个主体 - userId 和 roleId。在这样的系统中,特权(即谁可以访问什么)是为角色和用户指定的。在授权期间(即检查是否应允许请求的服务),安全系统将检查两个主体的可访问性。
因此,从授权的角度来看,主体是允许或不允许访问的实际实体。主题只是一个拥有一些主体的用户/线程/进程。
正如 T.Rob 所解释的,Subject 是任何请求访问对象的实体。从那时起,我发现了一条关于 javax.security.auth.Subject 代码的评论,我发现它非常有用且易于理解:
“主体可能有多个身份。每个身份都表示为主体中的一个主体。主体只是将名称绑定到主体。例如,碰巧是人的主体,爱丽丝,可能有两个主体:一个绑定“ Alice Bar”,她的驾驶执照上的名字,与主题,另一个绑定,“999-99-9999”,她的学生证上的号码,与主题。两个校长都指的是同一个主题,即使每个校长有不同的名字。”
希望能帮助到你。
这是来自 Oracle JAVA SE 文档的以下解释的 link。
主题、主体、身份验证和凭据 要授权对资源的访问,应用程序首先需要对请求的来源进行身份验证。 JAAS 框架定义术语主题来表示请求的来源。主体可以是任何实体,例如人或服务。主题由 javax.security.auth.Subject 类表示。身份验证表示验证主体身份的过程,并且必须以安全的方式执行;否则,犯罪者可能会冒充他人来访问系统。身份验证通常涉及主体展示某种形式的证据来证明其身份。此类证据可能是只有主体可能知道或拥有的信息(例如密码或指纹),也可能是只有主体可以产生的信息(例如使用私钥签名的数据)。一旦通过身份验证,Subject 就会填充相关的身份或主体(类型为 java.security.Principal)。一个 Subject 可能有许多 Principal。例如,一个人可能有一个名字 Principal(“John Doe”)和一个 SSN Principal(“123-45-6789”),这将其与其他 Subject 区分开来。除了关联的 Principal 之外,Subject 还可能拥有与安全相关的属性,这些属性称为凭证。凭证可能包含用于对新服务的主体进行身份验证的信息。此类凭据包括密码、Kerberos 票证和公钥证书。凭证还可能包含使主体能够执行某些活动的数据。例如,加密密钥表示使主体能够签署或加密数据的凭据。公共和私有凭证类不是核心 J2SE API 的一部分。因此,任何类都可以代表一个凭证。
根据 rahulmohan 的说法,我认为,在 Authentication 是 subjet 之前,在 Authentication 是 pricipal 之后,在不同的意义上,一个 subjet 可能有很多 pricipal
John (human) SUBJECT > username_1 PRINCIPAL > password_1 USER
John (human) SUBJECT > username_1 PRINCIPAL > password_2 USER
{3 }John (human) SUBJECT > username_1 PRINCIPAL > cellphone_1 USER