【发布时间】:2023-03-11 21:55:01
【问题描述】:
我正在开发一个多用户应用程序 Windows 桌面应用程序。 对于用户管理,我使用 DMBS(Oracle、MySQL、MSSQL、Postgre)。 所以每个用户都有一个数据库用户帐户。
我不希望用户直接连接到数据库并读取/写入数据。 数据应该只能访问连接应该只有在他们使用我的应用程序时才有效。
我发现了这个website by SQLDUDE,他在其中描述了一些技术。
仅通过特定应用程序访问数据的一种方法是检查 application_name 的登录触发器。 然而,他还描述了这种方法很容易被欺骗,因为用户一旦在连接字符串中知道了 application_name 就可以指定它。 (detailed explanation here - see Solution for Scenario #2)
他还提到了应用程序角色。
您可以为此使用的更安全的方法称为“应用程序 角色”。从应用程序连接时,您假设一个特定的 角色,并且仅授予该角色所需的权限 数据库。
所以基本上用户使用他的登录凭据登录,但根本没有权限(仅连接)。
然后在应用程序内部,我使用密码调用 sp_setapprole,一旦建立连接,应用程序规则就会被授予。
一旦调用成功,连接就会获得 应用程序角色并失去实际用户的权限,即 我们想要什么。所以如果有人试图从 SSMS 连接到数据库 或 SQLCMD,他们将使用他们的凭据访问数据库,这 不会对表拥有所需的权限,因为只有 应用程序角色对表具有权限。这更安全& 可靠的方法,但需要更改应用程序代码和 作为 DBA,您必须在 SQL Server 中创建应用程序角色。
所以应用程序角色听起来像是要走的路。
我的问题是:
应用程序角色 DMBS 是标准的并且可用于大多数 DBMS 系统吗?
有没有办法跟踪 sp_setapprole 登录(例如使用 WireShark)?
当然有人可以对应用程序进行逆向工程并获得应用程序角色的凭据 - 但我想这是不可避免的 :)
【问题讨论】:
-
我强烈建议朝相反的方向工作。让它在用户选择直接连接时不重要。或者引入一个中间层(在您的控制下,在您的服务器上)并且不允许任何直接访问数据库,无论使用什么应用程序。
标签: mysql sql sql-server database oracle