Condividi tramite


Procedura: Configurazione dei servizi di origine per la protezione avanzata del dialogo (Transact-SQL)

SQL Server utilizza la protezione del dialogo per qualsiasi conversazione con un servizio per il quale esiste un'associazione al servizio remoto nel database che ospita il servizio di origine. Se il database che ospita il servizio di destinazione contiene un utente corrispondente all'utente che ha creato il dialogo e se per l'associazione al servizio remoto non è specificata la protezione anonima, per il dialogo viene utilizzata la protezione avanzata.

Per verificare l'utilizzo della protezione del dialogo da parte del servizio di origine è possibile creare un'associazione al servizio remoto per il servizio in questione. Per impostare l'utilizzo della protezione avanzata da parte di SQL Server, nell'associazione al servizio remoto non deve essere specificata la protezione anonima e il database di destinazione deve essere configurato per l'utilizzo della protezione avanzata con questo servizio.

Per configurare la protezione avanzata del dialogo per il servizio di origine

  1. Ottenere un certificato per il proprietario del servizio di destinazione nel database remoto da una fonte attendibile. In genere, questo comporta l'invio del certificato mediante un messaggio di posta elettronica crittografato o il trasferimento del certificato per mezzo di un supporto fisico, ad esempio un disco floppy.

    Nota sulla protezioneNota sulla protezione

    Installare i certificati solo da fonti attendibili.

    [!NOTA]

    Il certificato deve essere crittografato con la chiave master del database. Per ulteriori informazioni, vedere CREATE MASTER KEY (Transact-SQL).

  2. Creare un utente senza account di accesso per il servizio remoto.

  3. Installare il certificato per l'utente del servizio remoto. L'utente creato nel passaggio precedente è il proprietario del certificato.

  4. Creare un'associazione al servizio remoto con l'indicazione dell'utente del servizio remoto e del servizio.

  5. Creare un utente senza account di accesso come proprietario del servizio locale.

  6. Creare un certificato per il servizio locale. L'utente creato nel passaggio precedente è il proprietario del certificato.

    [!NOTA]

    Il certificato deve essere crittografato con la chiave master del database. Per ulteriori informazioni, vedere CREATE MASTER KEY (Transact-SQL).

  7. Eseguire il backup del certificato.

    Nota sulla protezioneNota sulla protezione

    Eseguire questa operazione solo per questo utente. Non eseguire il backup della chiave privata associata al certificato, né distribuirla.

  8. Fornire il certificato e il nome del servizio di origine all'amministratore del database remoto. A tale scopo è possibile, ad esempio, copiare il certificato in un supporto fisico, quale un disco floppy o un CD-ROM, o in una condivisione file oppure inviarlo mediante un messaggio di posta elettronica protetto.

    [!NOTA]

    Per consentire l'utilizzo della protezione avanzata del dialogo da parte di SQL Server, il certificato deve essere installato nel database remoto e l'utente creato nel passaggio 7 deve corrispondere all'utente che inizia la conversazione.

Esempio

USE AdventureWorks ;
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