SQL ServerユーザーがDDLステートメントにアクセスできないがTRUNCATE TABLE
コマンドを実行できるように構成することは可能ですか?私は舞台裏でそれがDDLであることを知っています。
検索エンジンでこれを見つけることができませんでした。
ユーザーにALTERを付与せずにTRUNCATEを付与することはできません。
ただし、ユーザーにDELETEを付与することで回避できます。
Jonathan Kehayiasによる この手法 を使用して、ユーザーがテーブルをTRUNCATE
できるストアドプロシージャを作成できます。
ヨハサンが言うように:
「何らかの理由でその権限が存在しないため、切り捨てを許可することはできません。ストアドプロシージャを使用し、EXECUTE AS OWNERを使用して回避できます。」
上記の投稿のサンプルコードを以下に示します。
CREATE DATABASE foo
GO
CREATE LOGIN foobar
WITH password = 'Pa$$w0rd';
GO
USE foo
GO
CREATE user foobar
FROM LOGIN foobar;
GO
CREATE TABLE test (rowid INT identity)
GO
INSERT INTO test DEFAULT
VALUES;
GO
SELECT *
FROM test
GO
CREATE PROCEDURE dbo.truncate_test
WITH EXECUTE AS OWNER
AS
TRUNCATE TABLE test
GO
GRANT EXECUTE
ON dbo.truncate_test
TO foobar
GO
EXECUTE AS LOGIN = 'foobar'
EXECUTE dbo.truncate_test
REVERT
GO
SELECT *
FROM test
GO
USE master
GO
DROP DATABASE foo
DROP LOGIN foobar
最後に、これは最も詳細で安全なオプションであるため、これを実現するには モジュール署名 を使用することをお勧めします。これは、なりすましオプション @ Scottで推奨 に似ていますが、ストアドプロシージャで必要な機能をラップしますが、セキュリティを変更しないため、EXECUTE AS
を使用するよりも問題が少なくなります。誰かがストアドプロシージャの1バイトを変更すると、昇格されたアクセス許可が削除され、変更を確認して、変更に同意した場合にのみアクセス許可を再適用する必要があります。
次のようにしてください:
TRUNCATE TABLE
およびその他の必要な処理をすべて行うストアドプロシージャを作成します。
問題のDBで証明書を作成します(私の好みは、保護のためにデータベースマスターキー(DMK)に依存するのではなく、パスワードを指定することです)。
CREATE CERTIFICATE [TruncatePermission]
ENCRYPTION BY PASSWORD = 'password-123'
WITH SUBJECT = 'Grant temporary db_owner status';
ADD SIGNATURE
を使用して、証明書でストアドプロシージャに署名します。
ADD SIGNATURE
TO dbo.[{new_Stored_Procedure_name}]
BY CERTIFICATE [TruncatePermission]
WITH PASSWORD = 'password-123';
証明書を次の場所にバックアップします。
ファイル(a。cer公開鍵(「証明書」)、および。pvk秘密鍵のファイル):
BACKUP CERTIFICATE [TruncatePermission]
TO FILE = 'path_to_public_key_(.cer)_file'
WITH PRIVATE KEY
(
FILE = 'path_to_private_key_(.pvk)_file',
ENCRYPTION BY PASSWORD = 'password-123',
DECRYPTION BY PASSWORD = 'password-123'
);
[〜#〜]または[〜#〜]:
組み込み関数を使用するVARBINARY
リテラル:
SELECT
CERTENCODED(CERT_ID(N'TruncatePermission')) AS [Cert/PublicKey],
CERTPRIVATEKEY(CERT_ID(N'TruncatePermission'),
'password-123', 'password-123') AS [PrivateKey];
ALTER CERTIFICATE
を使用して証明書の秘密鍵を削除し、他のものが証明書で署名されないようにします(ただし、パスワードも必要になるため、リスクは高くありません)。
ALTER CERTIFICATE [TruncatePermission]
REMOVE PRIVATE KEY;
その証明書からユーザーを作成します。
CREATE USER [Mr.Truncate] FROM CERTIFICATE [TruncatePermission];
そのユーザーに、目標を達成するために必要な権限を付与します。機能する最小限の特権/最も制限の厳しいアクセス許可を見つけようとしますが、この場合、(db_owner
固定データベースロールを介して)「dbo」が必要になる可能性があります。
ALTER ROLE [db_owner] ADD MEMBER [Mr.Truncate];
ストアドプロシージャのEXECUTE
を、この操作を実行できるユーザーまたはロール、あるいはその両方の組み合わせに付与します。
証明書ベースのユーザーに付与されるアクセス許可は少し多めですしかしユーザーは偽装できず(つまり、EXECUTE AS USER = N'Mr.Truncate';
)、ログインできません。そのユーザーは、追加のアクセス許可の単なるコンテナーであり、それらは、その証明書で署名されたものにのみ適用されます。この場合、これは1つのストアドプロシージャにすぎません。
ストアドプロシージャ内のコードを変更する必要がある場合、またはADD SIGNATURE
で署名して別のモジュールにそれらの権限を付与する必要がある場合は、署名する新しいコードが存在する場合、別のDBに同じ証明書を作成する必要があります。別のDB、またはALTER CERTIFICATE
ステートメントを使用して、秘密鍵をこの証明書に復元する必要があります。
テーブルを変更する権限が必要です。
あなたはそれをここで見つけることができます: https://technet.Microsoft.com/en-us/library/ms177570(v = sql.105).aspx
下:権限。