Cognito 多租户:一个大用户池还是每个租户一个池?

hug*_*ugo 2 authentication multi-tenant amazon-cognito

我了解 Cognito 的各种多租户方法,并且我在心里致力于每个租户 xe2x80x9d 方法的 xe2x80x9cone 用户池。因此,例如,我们的 AWS 帐户将为租户 A 提供租户_a_user_pool,为租户 B 提供租户_b_user_pool,等等。但是,现在我\xe2\x80\x99m 已准备好实施此方法,我\xe2\x80\x99m 开始拥有第二个我的想法和我\xe2\x80\x99m 想知道我是否可以使用一个用户池做一些更简单的事情,同时仍然实现我的目标,即:安全性灵活性

\n

关于安全性,我\xe2\x80\x99ve 做出了这样的假设:通过用户池分隔用户本质上更安全,这仅仅是因为用户分隔的本质。所以,我的第一个问题是:

\n
    \n
  1. 单独的用户池是否更安全?
  2. \n
  3. 或者,使用一个用户池并将租户/用户关系信息存储在数据库中是否同样安全?
  4. \n
\n

至于灵活性,每个租户拥有 \xe2\x80\x9cone 用户池\xe2\x80\x9d 将允许为租户 A 配置 SAML 身份验证,而租户 B 可能会选择其他身份验证方法,例如针对其用户池使用 un/pw 进行身份验证。或者,租户 C 可以打开 MFA,而租户 D 可能会将其关闭。虽然我不怀疑这种方法是否灵活,但我开始怀疑它是否太复杂以及我是否可以使用一个用户池实现相同的目的?

\n

如果我为所有用户使用一个用户池,我正在考虑这样的方法:

\n

在此输入图像描述

\n

在上面的模型中,I\xe2\x80\x99 添加了一个关联表,tenant_users,因为在使用一组登录凭据时可能需要让用户成为多个租户的一部分(类似于 Slack,I\xe2\x80 \x99d 说)。但是,如果我采用这种方法,我就会开始怀疑灵活性。例如,我仍然可以让租户 A 使用 SAML 而租户 B 使用其他身份验证方法吗? 如果您注意到租户表中,我\xe2\x80\x99添加了一个 auth_methods 列,它将存储租户首选的身份验证方法。I\xe2\x80\x99m 希望我可以在 Cognito 触发器调用的 lambda 中添加各种身份验证方法的身份验证逻辑。但是,我\xe2\x80\x99m进入了陌生的领域,所以我\xe2\x80\x99不知道\xe2\x80\x99可能或不可能。

\n

回顾一下,我的问题是\xe2\x80\xa6

\n
    \n
  1. 所有租户的一个用户池是否与每个租户一个用户池一样安全?
  2. \n
  3. 如果我将 auth_methods 列添加到指定每个租户的身份验证首选项的租户表中,我能否保持一个用户池的灵活性(例如,允许租户选择不同的身份验证方法)?
  4. \n
\n

对于这一整体方法的任何其他评论将不胜感激。

\n

Rav*_*car 7

我认为在不知道您要保护哪些资源以及如何保护它们的情况下,这是一个很难回答的问题,例如

  • 你是白盒吗?
  • 所有登录是否都相同,都访问相同的应用程序和资源吗?
  • “租户”中的所有数据在该租户的用户之间是否相同?
  • 授权是如何在 Cognito 或其他地方完成的?

如果所有登录都几乎相同,那么我会说单租户可能是有意义的。

需要记住的一些事情:

  • 您希望为部分用户提供设备跟踪选项吗?
  • 艺术硕士怎么样?
  • 支付 SMS MFA 怎么样?
  • 自定义身份验证怎么样,例如无密码?
  • 高级安全性怎么样(每个用户额外 5c)?

如果其中任何一个的答案是肯定的,那么我认为您可能会考虑多个用户池,每个帐户的默认上限为 1000 个用户池,但您可以请求亚马逊增加此上限。

就我个人而言,我使用了“大用户池”方法进行身份验证,但是我们在 Cognito 之外跟踪授权。最令人头疼的是,当租户需要高级安全性(能够查看登录失败、帐户风险等)或 SMS MFA 时,因为它们必须在整个用户池中启用,从而导致成本大幅增加。

您可能要考虑的另一件事是,托管 UI 不允许您预先设置用户名,因此,如果您使用的表单采用电子邮件/用户名,然后重定向到相应的托管 UI(在多租户情况下) )对于他们所在的用户池,那么他们将需要再次重新输入他们的电子邮件。

如果您决定不使用托管 UI 并使用您自己的 UI(或 aws amplify),那么您将丢失所有 oauth2/oidc 内容,例如代码流,因此没有 SSO,这会使移动应用程序变得更加困难。

另请注意,自定义身份验证不能与 MFA 混合,如果您使用自定义身份验证,您也无法使用托管 UI。