Компонент SQL Server Service Broker - связь между серверами, не входящими в домен, через VPN - PullRequest
2 голосов
/ 16 февраля 2010

Есть ли хорошие варианты для соединения двух экземпляров SQL Server 2008 через Service Broker, если ни один из этих серверов не находится в домене, но мы полностью контролируем имена входа и учетные данные?

Мы думаем оиспользуя эту технологию для консолидации данных на уровне предприятия, но наши серверы работают на клиентских сайтах и ​​не настроены в качестве членов какого-либо домена.Мы ищем наименее болезненный вариант, чтобы Service Broker мог взаимодействовать в этой среде.

1 Ответ

2 голосов
/ 16 февраля 2010

Вы используете сертификаты, которые являются опцией аутентификации Service Broker, разработанной специально для такого сценария, как ваш. См. Как работает аутентификация на основе сертификатов . Когда конечные точки настроены с аутентификацией на основе сертификатов, ручной пакет будет содержать обмен аутентификацией на основе SSPI Schannel (более известный как SSL или TLS). Полученный сертификат, используемый партнером, используется для авторизации соединения на основе доверия, полученного при развертывании сертификата. Это означает, что используемые сертификаты не проверяются для конкретного свойства, как в случае https://example.com', где example.com должен иметь конкретный OID в сертификате и подпись доверенной авторизации, а вместо этого, если сертификат развернут (т.е. найден в базе данных master), тогда владельцем развернутого сертификата является личность. Это позволяет вам использовать самозаверяющие сертификаты безопасным способом с корнем доверия при развертывании (т. Е. Системный администратор), а не по доверенности (т. Е. Verisign). Это, вероятно, больше информации, чем вам нужно :)

Суть этого звучит так:

-------------------------------------
-- connect to server
-------------------------------------
use master;
go
create master key encryption by password = '...';
create certificate [<servername>]
  with subject = '<servername>'
  , start_date = '20100216'
  , expiry_date = '20150216';

create endpoint broker 
state = started
as tcp (listener_port = 4022)
for service_broker (authentication = certificate [<servername>]);

-- Export the public key to disk
backup certificate [<servername>]
to file = '\\someshare\<servername>.cer';

--------------------------------
-- connect to client
--------------------------------
use master;
go
create master key encryption by password = '...';
create certificate [<clientname>]
  with subject = '<clientname>'
  , start_date = '20100216'
  , expiry_date = '20150216';

create endpoint broker 
state = started
as tcp (listener_port = 4022)
for service_broker (authentication = certificate [<clientname>]);

-- Export the public key to disk
backup certificate [<clientname>]
to file = '\\someshare\<clientname>.cer';

--create an identity for server and import the server's certificate:
create login [<servername>] with password = '...';
alter login [<servername>] disable;
create user [<servername>];

create certificate [<servername>]
  authorization [<servername>]
  from file = '\\someshare\<servername>.cer';

--authorize <servername> to connect on the broker endpoint 
grant connect on endpoint::broker to [<servername>];

---------------------------------------
-- connect to the server
---------------------------------------

--create an identity for client and import the client's certificate:
create login [<clientname>] with password = '...';
alter login [<clientname>] disable;
create user [<clientname>];

create certificate [<clientname>]
  authorization [<clientname>]
  from file = '\\someshare\<clientname>.cer';

--authorize <clientname> to connect on the broker endpoint 
grant connect on endpoint::broker to [<clientname>];
...