Azure中Service Principal和Managed Identities的区别

88

我想知道在 Azure 中是否总是建议使用托管身份验证,主要是系统分配的还是服务主体? 与托管标识相比,何时应该在 Azure 中使用服务主体?其中一个的优点是什么? 任何帮助都将不胜感激。


1
你尝试过搜索吗?有相当多的信息可供查阅... - rickvdbosch
7个回答

56
内部而言,托管身份是一种特殊类型的服务主体,只能与Azure资源一起使用。当删除托管标识时,相应的服务主体会自动删除。此外,创建用户指定或系统指定的托管标识时,托管标识资源提供程序(MSRP)为该标识内部发放证书。
那么两者之间有什么区别呢?简单来说,托管身份管理代表您创建和自动更新服务主体的过程,而服务主体则是对资源进行身份验证和授权的标识。
来源:Azure 资源的托管标识是什么? 所以两者之间的区别是什么? 简单地说,托管身份代表您管理服务主体的创建和自动更新,而服务主体是用于对资源进行身份验证和授权的标识。
来源:Azure 服务主体与托管身份是什么?

8
这个答案并不合理,因为用户指定的托管标识也存在。https://learn.microsoft.com/zh-cn/azure/active-directory/managed-identities-azure-resources/overview - Atte Juvonen
嗨@AtteJuvonen,答案实际上是有道理的,因为基本信息是正确的:“托管标识是一种特殊类型的服务主体,仅锁定用于Azure资源”,“托管标识管理代表您创建和自动续订服务主体”。即使您创建的托管标识是用户托管的,平台也会管理服务主体。 - rickvdbosch
感谢@rickvdbosch的回答。Azure文档给人的印象是,“用户分配”的托管标识不会自动创建,而是由用户创建。这里有一句直接引用:“您可以创建一个用户分配的托管标识,并将其分配给一个或多个Azure服务实例”。对我来说,这听起来像是用户负责创建服务主体;它不是“代表用户”创建的。或者也许我没有理解服务主体和托管标识之间的某些区别。 - Atte Juvonen
2
这部分是正确的:用户分配的“托管标识”是由用户创建的。然而,用于访问资源的基础“服务主体”是为用户创建和自动更新的。因此,每种类型的托管标识(系统和用户分配)都是底层服务主体的抽象。 - rickvdbosch
1
@AtteJuvonen - 唯一的区别是,托管标识始终与 Azure 资源相关联,而不像上面提到的应用程序或第三方连接器。它们会自动为您创建,包括凭据;这里的巨大优势是没有人知道凭据。 - Gautam Sharma

17

托管标识是服务主体的一种类型。

服务主体可以是三种类型之一:应用程序、托管标识和遗留身份。将它们分为不同类型是基于其使用情况。因此,它们的具体处理也因其类型而异。

rickvdbosch提供了一篇文章的链接,介绍了服务主体中托管标识类型的详细信息。 对于那些想学习服务主体对象及其类型概念的人,这里有另一篇文章的链接: Azure Active Directory中的应用程序和服务主体对象


13

服务主体

可以说,服务主体中最相关的部分是 Azure Active Directory 下的企业应用程序。它基本上是一个应用程序,允许您的用户应用程序根据基于 RBAC 的角色控制对 Azure 资源进行身份验证和访问。

它本质上是需要访问 Azure 资源的应用程序的标识符。简单来说,就像您必须为同事分配某些访问权限以便他/她可以访问 Azure 资源并执行所需的任务,您可以使用他们的电子邮件 ID 作为验证用户的一种方式。

托管标识

我们可以说,托管标识实际上是服务主体,它们在功能和目的上都是相同的。

唯一的区别是托管标识始终与 Azure 资源关联,而不像上面提到的应用程序或第三方连接器那样。它们会自动为您创建,包括凭据;这里的一个重要优点是没有人知道凭据。

有两种类型的托管标识:

1.) 系统分配的;在这种情况下,标识与单个 Azure 资源(如虚拟机、Web 应用程序、函数等)关联。接下来,它们也“属于” Azure 资源,这意味着当 Azure 资源被删除时,它们也会被删除。

2.) 用户分配的托管标识,这意味着您首先必须将其作为单独的 Azure 资源创建,然后将其链接到多个 Azure 资源。一个例子是与密钥保管库的集成,同一应用程序堆栈中属于不同工作负载服务需要从密钥保管库中读取信息。在这种情况下,可以创建一个“读取 KV”托管标识,并将其链接到 Web 应用程序、存储帐户、函数、逻辑应用程序等所有属于相同应用程序架构的资源。


1
我喜欢你的回答,因为它同时提到了系统MSI和用户MSI以及SP。请问您能否进一步解释为什么已经有SP时还需要用户MSI的原因?谢谢! - Rajesh Swarnkar
@RajeshSwarnkar - 如果已经存在SP,则没有必要拥有单独的用户MSI,您可以通过SP对Azure资源进行身份验证。但是,这会增加维护的额外负担。因此,在Azure中,每个资源都是为特定需求而设计的。用户MSI比SP具有自己的优势。 - Gautam Sharma

5

Azure服务主体类似于一个应用程序,其他Azure资源可以使用其令牌进行身份验证,并授予对Azure资源的访问权限。

托管标识是一种特殊类型的服务主体,仅可与Azure资源一起使用。

两者之间的主要区别在于,在托管标识中,您无需在代码中指定任何凭据,而在服务主体中,您需要指定应用程序ID、客户端ID等来生成令牌以访问任何Azure资源。理想情况下,只有在您使用的服务不支持托管标识时,才应选择服务主体。


如果他们没有凭据,那么你如何登录? - pabrams

3
(专业)托管身份与服务主体有何不同?
  1. 它们始终与 Azure 资源关联,而不是与应用程序或第三方连接器关联。

  2. 它们可以在资源创建时自动创建(适用于支持托管标识的资源)。

    有两种类型:用户分配系统分配。上述句子指的是后者;即使在资源创建时没有设置,也可以通过单击启用。

  3. 托管标识使用访问令牌,因此不需要凭据。

    要设置服务主体,需要提供客户端 ID、租户 ID 和密码/密钥(例如作为环境变量)。

    相比之下,从/通过托管标识资源访问目标资源是通过访问令牌完成的。

(这些项目最初来自于Demystifying Service Principals – Managed Identities一文,但已经重新表述得足够不适用直接引用。)

缺点

在我看来,问题在于复杂性:

  • 一个必须对"身份"、"安全主体"、"服务主体"、"角色"等术语有透彻的理解,并了解它们之间的关系。

  • 令牌的使用并不直观。

    文档内容杂乱无章,我所做的大部分工作都是通过试错和在网上查找大量错误信息来完成的。

    例如,请求令牌需要使用"根"资源 URI(在密钥保管库的情况下,为https://vault.azure.net),并且需要在特定的"目标资源"上使用。后者很简单,但前者不是。不确定文档中是否明确说明了这一点,但它让我陷入了困境一段时间(参见例如this thread)。

  • 其他一些怪异之处

    注意
    这些问题可能在其他工具(如Azure CLI)中不存在,或者我可能忽略了某些东西...

    • 在门户上查找托管标识(MSI)

      "用户分配的"托管标识有自己的子类别"托管标识",但这不会显示"系统分配的"托管标识。后者需要单独搜索。

    • 资源组和托管标识

      这仅基于我在门户上的经验,但似乎"系统分配的"托管标识不属于任何资源组(或者它们被隐藏了)。也就是说,当调用时,"用户分配的"托管标识明确显示它所属的资源组,但对于"系统分配的"托管标识,我找不到这些信息,而且这没有意义。后者与MSI资源紧密相关,因此我进入特定资源的资源组,列出所有成员,但它们也不会显示在那里。奇怪。

术语

Azure 身份的简要概述(其中“身份”指的是 Azure Active Directory identities):

    │
    ├─► user
    │
    ├─► group
    │                  managed
    └─► service  ────► identity
       principal      (MSI)
  • 服务主体

    应用程序或服务用于访问特定 Azure 资源的安全标识。您可以将其视为应用程序的用户标识(用户名和密码或证书)。
    (来源:分配 Azure 角色的步骤)

    "一种应用程序,其令牌可用于身份验证并授予用户应用、服务或自动化工具对特定 Azure 资源的访问权限,当组织使用 Azure Active Directory 时"

    实质上,通过使用服务主体,您可以避免在需要访问 Azure 资源时在 Azure AD 中创建“虚拟用户”(我们在本地 Active Directory 中称其为服务帐户)来管理身份验证。
    (来源:解密服务主体 - 托管标识)

  • 托管标识 (MSI)

    托管标识MSI)是 一种特殊类型的 服务主体,分配给支持托管标识的 Azure 资源,以便在访问其他 Azure 服务/资源时无需凭据
    (来源:此答案)

    托管标识在功能和用途上与服务主体完全相同。实际上,它们实际上就是服务主体。
    (来源:解密服务主体 - 托管标识)

  • MSI 资源支持具有(或赋予)托管标识的 Azure 资源

  • 目标资源MSI 资源 正试图访问的 Azure 资源


1
托管身份与资源(虚拟机、逻辑应用等)绑定。为了授予资源访问(CRUD)其他资源的授权和权限,您可以使用托管标识。
服务主体不必与资源绑定,它们位于租户下方和订阅上方,并且更重要的是 - 具有某些身份验证令牌,这些令牌可以存储在某个地方(密钥保管库)。它就像一个带有一些凭据和令牌的虚假用户。

0
一个服务主体可以被看作是类似于传统本地应用程序或服务场景中的服务帐户。托管标识用于将服务主体安全对象“链接”到 Azure 资源,例如虚拟机、Web 应用程序、逻辑应用程序或类似资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接