Назад | Перейти на главную страницу

Разрешения Amazon RDS SQL Server с устаревшим приложением

Я пытаюсь запустить устаревшее приложение Windows в AWS, не изменяя код. Приложение использует проверку подлинности Windows для подключения к БД, поэтому я настроил следующее:

  1. экземпляр Simple Directory Service (с «реальной» AD, а не с Samba с двумя контроллерами домена)
  2. экземпляр Windows 2012r2 Server EC2, присоединенный к домену: именно здесь я хочу запустить свое приложение
  3. небольшой RDS SQL Server 2014 Express Edition, также присоединенный к домену

У меня установлен SSMS на сервере EC2, и я могу пройти аутентификацию в RDS либо с использованием аутентификации SQL Server с использованием основных учетных данных, либо с использованием аутентификации Windows в качестве делегированной учетной записи администратора домена.

В моем приложении есть пользователь службы, который используется для подключения. Я создал логин для этого пользователя в RDS (используя SSMS) и предоставил ему доступ к базе данных приложения.

Когда я пытаюсь запустить свое приложение, оно пытается подключиться, но выдает следующую ошибку:

Невозможно выполнить в качестве участника базы данных, так как главный «гость» не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.

Пытаясь отследить это, я запустил трассировку пакетов с помощью Wireshark. Wireshark не может полностью проанализировать весь трафик. Я заметил несколько вещей. Во-первых, отправляется 'use [master]', который (успешно) переключает контекст из БД, которую я хочу использовать для управления. Я знаю, что у моего пользователя минимальный доступ к мастеру, и он ограничен RDS - если только я не пропущу способ предоставить больше доступа. Есть проверка версии, тогда этот запрос:

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

Кажется, что дает пустой результат (подтверждение: я получаю пустой результат, выполняя этот запрос от имени того же пользователя в SMSS против мастера). Затем выполняется эта недокументированная хранимая процедура:

exec sp_MSdbuserpriv N'ver'

И ответ - это сбой (как указано выше):

Невозможно выполнить в качестве участника базы данных, потому что главный «гость» не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.

Я понимаю, что это что-то говорит мне о разрешениях, но я не знаю, что попробовать на основании этого. Насколько я знаю, моему пользователю нечего делать в master db.

Обновить

Более подробное рассмотрение захвата wirehark показывает, что первоначальное подключение к БД работает нормально. Я вижу, что информация успешно получена из БД. Затем он отключается, повторно подключается, переключается на главную базу данных и выполняет 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'

Все это будет работать, кроме строки «пользовательский мастер». На данный момент я ожидаю, что это может быть фактическим несоответствием между этим приложением и предложением Amazon SQL Server RDS.