具有旧应用程序的 Amazon RDS SQL Server 权限

具有旧应用程序的 Amazon RDS SQL Server 权限

我正在尝试在 AWS 中运行旧版 Windows 应用程序而不修改代码。该应用程序使用 Windows 身份验证进行数据库连接,因此我进行了如下设置:

  1. 一个简单目录服务实例(具有“真实” AD,而不是具有 2 个域控制器的 Samba 服务)
  2. 已加入域的 Windows 2012r2 Server EC2 实例:这是我想要运行应用程序的地方
  3. 一个小型 RDS SQL Server 2014 Express 版本,也加入了域

我在 EC2 服务器上安装了 SSMS,并且我可以使用 SQL Server 身份验证和主凭据或使用 Windows 身份验证作为委派的域管理员帐户对 RDS 进行身份验证。

我的应用程序有一个用于连接的服务用户。我在 RDS 中为该用户创建了一个登录名(使用 SSMS),并授予其访问应用程序数据库的权限。

当我尝试启动我的应用程序时,它尝试连接但失败并出现以下错误:

无法以数据库主体身份执行,因为主体“guest”不存在、无法模拟此类主体或者您没有权限。

为了追踪这个问题,我使用 Wireshark 进行了数据包跟踪。Wireshark 无法完全解析所有流量。我确实注意到了一些事情。首先,发送了“use [master]”,它(成功)将上下文从我想要使用的数据库切换到 master。我知道我的用户对 master 的访问权限很小,而且这受到 RDS 的限制——除非我错过了授予更多访问权限的方法。有一个版本检查,然后是这个查询:

select loginname from dbo.sysusers u, master.dbo.syslogins l 
    where u.name = user and u.sid = l.sid

似乎得到了一个空结果(确认:我在 SMSS 中以同一用户身份针对 master 运行此查询时得到了一个空结果)。然后执行这个未记录的存储过程:

exec sp_MSdbuserpriv N'ver'

响应是此失败(如上):

无法以数据库主体身份执行,因为主体“guest”不存在、无法模拟此类主体或者您没有权限。

我知道这在告诉我有关权限的事情,但我不知道根据它该尝试什么。据我所知,我的用户无权在主数据库中执行任何操作。

更新

更详细地查看 wireshark 捕获显示,与数据库的初始连接工作正常。我可以看到信息已成功从数据库中提取。然后它断开连接,重新连接,切换到主数据库并执行上面提到的 SP(失败并产生我看到的错误)。如果我发现更多信息,将进一步更新。

更新 #2

我仍在努力解决这个问题,但并没有取得任何实质性进展。我注意到的一件事是,工作连接是通过某种 .Net 客户端完成的,而失败的连接则使用 DMO。

这些是DMO客户端在失败之前发送的命令:

set quoted_identifier off
SET TEXTSIZE 64512
select @@microsoftversion
SELECT ISNULL(SUSER_SNAME(), SUSER_NAME())
use [master]
if (object_id('master.dbo.sp_MSSQLDMO90_version') is not null)
    exec .dbo.sp_MSSQLDMO90_version
else if (object_id('master.dbo.sp_MSSQLDMO80_version') is not null)
    exec master.dbo.sp_MSSQLDMO80_version
else if (object_id('master.dbo.sp_MSSQLDMO70_version') is not null)
    exec master.dbo.sp_MSSQLDMO70_version
else select 0
select loginname from dbo.sysusers u, master.dbo.syslogins l where u.name = user and u.sid = l.sid<
exec sp_MSdbuserpriv N'ver'

除了“用户主”行之外,所有这些都可以正常工作。此时,我预计这可能是该应用程序与亚马逊的 SQL Server RDS 产品之间的不匹配。

相关内容