Разрешения Amazon RDS SQL Server с унаследованным приложением
Я пытаюсь запустить устаревшее приложение Windows в AWS без изменения кода. Приложение использует проверку подлинности Windows для подключения к БД, поэтому я настроил это так:
- экземпляр простой службы каталогов (с "настоящим" AD, а не с сервисом Samba с двумя контроллерами домена)
- экземпляр Windows 2012r2 Server EC2, присоединенный к домену: здесь я хочу запустить свое приложение
- небольшой 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 против master). Затем выполняется эта недокументированная хранимая процедура:
exec sp_MSdbuserpriv N'ver'
И ответом является этот сбой (как указано выше):
Невозможно выполнить роль участника базы данных, так как участник "Гость" не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.
Я понимаю, что это говорит мне кое-что о разрешениях, но я не знаю, что попробовать на его основе. Насколько я знаю, мой пользователь не имеет никакого дела делать что-либо в master db.
Обновить
Более подробное рассмотрение захвата 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'
Все это будет работать, за исключением строки 'user master'. На данный момент я ожидаю, что это может быть фактически несоответствием между этим приложением и предложением Amazon SQL Server RDS.