発信側サービスを完全ダイアログ セキュリティ用に構成する方法 (Transact-SQL)
SQL Server では、発信側サービスをホストするデータベース内にリモート サービス バインドが存在する場合、そのサービスとのメッセージ交換に、ダイアログ セキュリティを使用します。対象サービスをホストするデータベースにダイアログを作成したユーザーと一致するユーザーが含まれていて、かつリモート サービス バインドで匿名セキュリティが指定されていない場合は、ダイアログで完全セキュリティが使用されます。
発信側サービスで確実にダイアログ セキュリティが使用されるようにするには、そのサービスに対してリモート サービス バインドを作成します。SQL Server で完全セキュリティを使用するには、リモート サービス バインドで匿名セキュリティを指定しないようにする必要があります。また、このサービスに完全セキュリティを使用するように対象データベースを構成する必要があります。
発信側サービスを完全ダイアログ セキュリティ用に構成するには
信頼されたソースから、リモート データベース内の対象サービスの所有者の証明書を取得します。この場合、証明書は、暗号化された電子メールを使用して送信されるか、フロッピー ディスクなどの物理メディアで受け渡されるのが一般的です。
セキュリティに関する注意 信頼できる発行元の証明書以外はインストールしないでください。
注 証明書は、データベースのマスター キーで暗号化する必要があります。詳細については、「CREATE MASTER KEY (Transact-SQL)」を参照してください。
リモート サービスに対しログインのないユーザーを作成します。
リモート サービス ユーザーの証明書をインストールします。前の手順で作成したユーザーが、この証明書を所有します。
リモート サービス ユーザーとサービスを指定するリモート サービス バインドを作成します。
ローカル サービスを所有する、ログインのないユーザーを作成します。
ローカル サービスの証明書を作成します。前の手順で作成したユーザーが、この証明書を所有します。
注 証明書は、データベースのマスター キーで暗号化する必要があります。詳細については、「CREATE MASTER KEY (Transact-SQL)」を参照してください。
証明書をバックアップします。
セキュリティに関する注意 このユーザーの証明書のみをバックアップします。証明書に関連付けられた秘密キーは、バックアップまたは配布しないでください。
発信側サービスの証明書および名前を、リモート データベースの管理者に通知します。証明書の交換には、フロッピー ディスクや CD-ROM などの物理的なメディアを使用する方法、ファイル共有に証明書を配置する方法、セキュリティで保護された電子メールを使用する方法などがあります。
注 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