Как настроить службы, инициирующие взаимодействие, для полного обеспечения безопасности диалога (Transact-SQL)

SQL Server применяет средства обеспечения безопасности диалогов для любого сеанса связи со службой, для которой в базе данных, обслуживающей инициирующую диалог службу, имеется привязка удаленной службы. Если база данных, обслуживающая целевую службу, включает данные пользователя, соответствующего пользователю, который создал диалог, а привязка удаленной службы не требует анонимного обеспечения безопасности, выполняется полное обеспечение безопасности диалога.

Чтобы гарантировать, что инициирующая взаимодействие служба будет обеспечивать безопасность диалога, для службы нужно создать привязку удаленной службы. Если SQL Server должен обеспечивать полную безопасность диалога, привязка удаленной службы не должна требовать анонимного обеспечения безопасности, а целевую базу данных нужно настроить для полного обеспечения безопасности диалога с данной службой.

Настройка инициирующей службы взаимодействия для полного обеспечения безопасности диалога

  1. Получите из доверенного источника сертификат для владельца целевой службы в удаленной базе данных. Обычно в таких случаях сертификат пересылается в зашифрованном электронном письме или передается на физическом носителе, например на гибком диске.

    Примечание по безопасностиПримечание по безопасности

    Устанавливайте сертификаты, полученные только из доверенных источников.

    ПримечаниеПримечание

    Сертификат должен быть зашифрован главным ключом базы данных. Дополнительные сведения см. в разделе CREATE MASTER KEY (Transact-SQL).

  2. Создайте для удаленной службы учетную запись пользователя без имени входа.

  3. Установите сертификат для пользователя удаленной службы. Владельцем сертификата является пользователь, созданный на предыдущем этапе.

  4. Создайте привязку удаленной службы, определяющую пользователя удаленной службы и службу.

  5. Создайте для локальной службы учетную запись пользователя без имени.

  6. Создайте сертификат для локальной службы. Пользователь, созданный на предыдущем этапе, станет владельцем сертификата.

    ПримечаниеПримечание

    Сертификат должен быть зашифрован главным ключом базы данных. Дополнительные сведения см. в разделе CREATE MASTER KEY (Transact-SQL).

  7. Создайте резервную копию сертификата.

    Примечание по безопасностиПримечание по безопасности

    Создайте резервную копию сертификата только этого пользователя. Не создавайте резервные копии связанного с сертификатом закрытого ключа и не распространяйте его.

  8. Предоставьте сертификат и имя службы, инициирующей взаимодействие, администратору удаленной базы данных. Для этого можно передать сертификат на физическом носителе, таком, как дискета или компакт-диск, поместить сертификат в общую папку или отправить его в защищенном письме.

    ПримечаниеПримечание

    Чтобы SQL Server обеспечивал полную безопасность диалога, сертификат должен быть установлен в удаленной базе данных, а инициировать диалог должен пользователь, созданный на этапе 7.

Пример

USE AdventureWorks2008R2 ;
GO

--------------------------------------------------------------------
-- The first part of the script configures security to allow the
-- remote service to send messages in this database. The script creates
-- a user in this database, loads the certificate for the remote service,
-- grants permission to the user, and creates a remote service binding.

-- Given a certificate for the owner of the remote target service
-- SupplierOrders, create a remote service binding for
-- the service.  The remote user will be granted permission
-- to send messages to the local service OrderParts. 
-- This example assumes that the certificate for the service 
-- is saved in the file'C:\Certificates\SupplierOrders.cer' and that
-- the initiating service already exists.


-- Create a user without a login.  For convenience,
-- the name of the user is based on the name of the
-- the remote service.

CREATE USER [SupplierOrdersUser]
    WITHOUT LOGIN ;
GO

-- Install a certificate for a user
-- in the remote database. The certificate is
-- provided by the owner of the remote service. The
-- user for the remote service owns the certificate.

CREATE CERTIFICATE [SupplierOrdersCertificate]
    AUTHORIZATION [SupplierOrdersUser]
    FROM FILE='C:\Certificates\SupplierOrders.cer' ;
GO

-- Create the remote service binding. Notice
-- that the user specified in the binding
-- does not own the binding itself.

-- Creating this binding specifies that messages from
-- this database are secured using the certificate for
-- the [SupplierOrdersUser] user.

-- When the anonymous option is omitted, anonymous is OFF.
-- Therefore, the credentials for the user that begins
-- are used in the remote database.

CREATE REMOTE SERVICE BINDING [SupplierOrdersBinding]
    TO SERVICE 'SupplierOrders'
    WITH USER = [SupplierOrdersUser] ;
GO

--------------------------------------------------------------------
-- The second part of the script creates a local user that will begin
-- conversations to the remote service. The certificate for this
-- user must be provided to the owner of the remote service.


-- Create a user without a login for the local service.

CREATE USER [OrderPartsUser]
    WITHOUT LOGIN ;
GO

-- Create a certificate for the local service.
CREATE CERTIFICATE [OrderPartsCertificate]
    AUTHORIZATION [OrderPartsUser]
    WITH SUBJECT = 'Certificate for the order service user.';
GO

-- Make this user the owner of the initiator service.

ALTER AUTHORIZATION ON SERVICE::OrderParts TO OrderPartsUser 

-- Backup the certificate for the user that initiates the
-- conversation. This example assumes that the certificate
-- is named OrderServiceCertificate.
BACKUP CERTIFICATE [OrderPartsCertificate]
    TO FILE = 'C:\Certificates\OrderParts.cer' ;
GO

-- Grant RECEIVE permissions on the queue for the service.
-- This allows the local user to begin conversations from
-- services that use the queue.

GRANT RECEIVE ON [OrderPartsQueue] TO [OrderPartsUser] ;
GO