可能性があります、「アクセス許可が拒否されました」エラー メッセージが表示するとき、アプリケーション ロール ベースのアプリケーションが、SQL Server 2005 の master データベースのシステム テーブルのいずれかからレコードを選択しようとしています。

現象

アプリケーション ロール ベースのアプリケーションが Microsoft SQL Server 2005 の master データベースのシステム テーブルのいずれかからすべてのレコードを選択しようとすると場合、に、以下の現象のいずれかが発生することがあります。
  • レコードは返されません。
  • 次のエラー メッセージが表示されます。
    アクセスが拒否されました。
たとえば、アプリケーションは、次のクエリを使用する場合に、この問題が発生する可能性があります。
select * from master.dbo.syslogins

原因

アプリケーション ロール ベースのアプリケーションは、データベース内の特定の情報を操作するのには設計されています。これらのアプリケーションは、マスター ビューや動的管理ビューのシステム テーブルにアクセスできません。これらのビューには、サーバー レベルの情報が含まれます。

解決策

この問題を解決するのにには、サーバー レベルのシステム テーブルにアクセスするのには証明書で署名されたプロシージャを使用します。証明書で署名されたプロシージャには、次の利点があります。
  • トレース フラグを使用する必要はありません。
  • 少ないサーバー レベル情報を公開することがあります。 アプリケーション ロール ベースのアプリケーションでは、一般的なクエリを使用する代わりにストアド プロシージャを使用する必要があります。ストアド プロシージャは、アプリケーションで必要とされる特定のデータを返す可能性が高い。

回避策

この問題を回避するには、グローバル トレース フラグ 4616 を有効にします。

詳細

次のコード例は、証明書で署名されたプロシージャの例です。
USE masterGO

CREATE DATABASE approle_db ;
GO

CREATE LOGIN some_login WITH PASSWORD = 'SomePa$$word!' ;
GO

USE approle_db
GO

CREATE USER some_user FOR LOGIN some_login
GO

EXEC sp_addapprole 'an_approle', 'SomeAppRolePa$$word!' ;
GO

---------------------------------------------------------------------
-- This section shows how to use a certificate to authenticate
-- a signed procedure.
---------------------------------------------------------------------

CREATE LOGIN execute_as_login WITH PASSWORD = 'SomePa$$word!' ;
GO

USE master
GO

GRANT VIEW ANY DEFINITION TO execute_as_login ;
GRANT VIEW SERVER STATE TO execute_as_login ;
GO

USE approle_db
GO

CREATE USER execute_as_user FOR LOGIN execute_as_login ;
GO

--
-- You must use EXECUTE AS 'authenticator' here because the application role
-- does not have a server identity. Therefore, the application role cannot use
-- the certificate permissions on the server. Therefore, you
-- need a new execution context to which you can grant
-- the needed VIEW* permissions.
--
CREATE PROC access_server_system_tables
WITH EXECUTE AS 'execute_as_user'
AS
SELECT * FROM master.dbo.syslogins ;
SELECT * FROM master.dbo.sysprocesses ;
GO

GRANT EXECUTE ON access_server_system_tables TO an_approle ;
GO

CREATE CERTIFICATE signing_cert ENCRYPTION BY PASSWORD = 'SomeCertPa$$word'
WITH SUBJECT = 'Signing Cert' ;
GO

BACKUP CERTIFICATE signing_cert TO FILE = 'signing_cert.cer' ;
GO

ADD SIGNATURE TO access_server_system_tables
BY CERTIFICATE signing_cert WITH PASSWORD = 'SomeCertPa$$word' ;
GO

---------------------------------------------------------------------
-- We must create a copy of the signing certificate in the target
-- database. In this case, the target database is the master database.
-- This copy of the signing certificate can vouch
-- for the execution contexts that enter this database from the
-- signed procedure.
---------------------------------------------------------------------
USE master
GO

CREATE CERTIFICATE signing_cert FROM FILE = 'signing_cert.cer' ;
GO

--
-- Because the VIEW* permissions in question are server-level permissions,
-- we need an AUTHENTICATE SERVER on a login-mapped certificate.
--
CREATE LOGIN signing_cert_login FROM CERTIFICATE signing_cert ;
GO

GRANT AUTHENTICATE SERVER TO signing_cert_login
GO


---------------------------------------------------------------------
-- Now you can open a new connection as "some_login" and
-- set the application role. Then, call the "access_server_system_tables"
-- procedure, and obtain verification that you can access server-level information
-- when the application role-based application runs.




---------------------------------------------------------------------


---------------------------------------------------------------------
-- Clean up after the procedure.

---------------------------------------------------------------------
USE master
GO

DROP DATABASE approle_db ;
GO

DROP LOGIN some_login;
GO

DROP LOGIN execute_as_login;
GO

DROP LOGIN signing_cert_login ;
GO

DROP CERTIFICATE signing_cert;
GO

--
-- Make sure to delete the certificate file. For example, delete
-- C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\signing_cert.cer
--
EXEC sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE ;
GO
EXEC sp_configure 'xp_cmdshell', 1 ;
GO
RECONFIGURE ;
GO

EXEC xp_cmdshell 'del "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\signing_cert.cer"' ;
GO

EXEC sp_configure 'xp_cmdshell', 0 ;
GO
RECONFIGURE ;
GO


-- ============================================================================
-- - Application role access to server information - Demo usage.sql
--
--
-- This code is companion code that shows an example of application role access
-- to server information by using a certificate-signed procedure.
--
-- ============================================================================

--------------------------------------------------
-- Connect as some_login
--------------------------------------------------
USE approle_db
GO

EXEC sp_setapprole 'an_approle', 'SomeAppRolePa$$word!'
GO

EXEC access_server_system_tables
GO
プロパティ

文書番号:906549 - 最終更新日: 2017/02/02 - リビジョン: 2

フィードバック