何时在数据库中使用应用程序角色?

When to use an application role in a database?

在 SQL 服务器中选择数据库角色和应用程序角色时应考虑哪些事项?

我了解每种类型的角色是如何工作的,但我很难理解应用程序角色何时适合使用数据库角色。

到目前为止,我只是在我的应用程序中使用了数据库角色。我基本上为每个用户创建了一个帐户,然后使用 GRANT 语句将他们分配给他们需要访问的任何角色。有问题的应用程序只是一个简单的 data-entry/reporting 应用程序。

使用应用程序角色会有任何好处吗?如果有,我该如何使用它们?具体来说,我如何确保给定用户无法访问他们不应该访问的对象。我需要多个应用程序角色还是有其他方法?

应用程序角色的既定目的是将一组安全性附加到 'application'。这个想法是 approle 密码只有应用程序知道,并且实际上是在其中定义的(以适当的混淆方式)

如果您的用户具有固定的数据库安全级别,而在使用特定应用程序时需要不同的安全级别,那么您可能希望使用应用程序角色。不然别打扰了

例如,Joe 使用他的数据库凭据登录到数据库,但应该只读取(而不是更改)table

中的数据

Joe 通过财务应用程序使用相同的数据库。该应用程序恰好使用相同的凭据进行连接 (Joe)

然而,通过申请,他还需要被允许 insert/update table。

在这种情况下,您将使用应用程序角色通过在应用程序中调用 sp_setapprole 来覆盖 Joe 的安全性

(如果乔知道密码是什么,他实际上可以自己调用这个 sp...但他不应该知道)

应用程序将在前端进行一些验证,以阻止他对数据做愚蠢的事情。

这是一个非常具体的案例。

通常当我们创建应用程序角色时,它们适用于那些喜欢管理自己的安全性并希望独立于 SQL 服务器安全性的应用程序,我们希望它们可以访问数据库中的某些表不是所有的对象。这些用于静态应用程序,用户来这里做一些事情,并且该用户将使用这些应用程序角色在数据库中进行更改

应用程序角色在以下情况下很有用:

  • 数据库在 >1 个应用程序之间共享,并且
  • 同一用户可能使用超过 1 个应用程序,并且
  • 任一应用程序都有 'particular to that application' 和
  • 的数据
  • 授予 用户 访问该数据的权限没有意义(因为他们可能会从不同的应用程序中弄乱它),并且
  • 为应用程序提供自己的登录名来维护该数据没有意义

注意到:

  • 上述情况只会出现在企业中,应用程序来来去去,但数据是永恒的,访问控制决策 'pushed down to the database' 尽可能使用数据库角色。在这种情况下,'summarizing' 一个人根据他们可以使用的应用程序访问数据的策略是不够的。
  • 旨在根据用户身份由不同应用程序访问的数据不会受到 'application role'.
  • 的保护
  • 为了维护自己的数据,为应用程序提供自己的登录名几乎总是可以的。两个例外可能是: ** 其中审计或访问控制由数据库级触发器执行,这些触发器需要区分当前正在执行的应用程序角色和调用应用程序角色的用户;要么 ** 非常严格的安全策略不允许应用程序拥有自己的登录名,但只能在特定用户的更广泛上下文中在数据库中操作

在什么神秘的领域需要应用程序角色?一种现代(2020 年左右)用例是存储 OAuth 令牌和刷新令牌。这些需要存储在数据库中,但是 'grant' 已专门指定给一个应用程序……而不是指定给访问数据库的所有应用程序。为了允许应用程序管理自己的 app1.oauth_tokens table 并且当用户通过另一个应用程序访问数据库时不向用户授予 app1.oauth_tokens table 的权限,应用程序角色是一种可能的策略。

遗憾的是应用程序角色功能没有得到更好的考虑:表达访问控制会很好:“A 组中的用户可以查看该数据;A 组中的用户正在访问它从应用程序 X 可以另外修改它”。但这不是我们得到的:-(