web-dev-qa-db-ja.com

データベースのdb_datareaderロールを他のログインに付与できるようにするには、SQL Serverログインが持つ必要のある最小限の権限やロールはどれですか。

セキュリティ管理者がデータベース内のdb_datareaderロールに新しいSQLログインを追加する機能を委任するために、セキュリティ管理者が持つ必要がある最低限の権限またはロールは何ですか?

4
Guessed

これが許可であれば、WITH GRANT OPTIONを使用できますが、許可されていません。

誰か、または特定のデータベースレベルのロールの誰かにこの操作の実行を許可するが、他のロールの割り当てを許可しないと仮定すると、そのための権限や役割はありません。

ただし、モジュール署名を使用して、このきめ細かい「許可」を実現できます。誰かが必要とする最低限の権限は、その特定のデータベースロールにログインまたはロールを追加すること以外に何もしないように記述したストアドプロシージャに対するEXECUTEです。

これは、次の回答で概説したものと似ています。

SQL Serverエージェントサービスのステータスを確認できるように、ユーザーに最低限必要なアクセス許可を提供する必要がありますか?

特定の場合を除いて、サーバーレベルのアクセス許可が必要ないため、さらに簡単です。次のようにしてください:

  1. プリンシパル名の入力パラメーターを持つストアドプロシージャを作成し、そのデータベースプリンシパルをdb_datareaderデータベースレベルのロールに追加するだけです。
  2. 同じDBに証明書を作成する
  3. その証明書から、同じDBにユーザーを作成します。
  4. 証明書ベースのユーザーをdb_ownerデータベースレベルのロールに追加する
  5. その証明書で(手順1からの)ストアドプロシージャに署名する
  6. このEXECUTE権限をそのストアードプロシージャに対して実行できる必要があるユーザーに付与します

完全を期すために:

技術的に言えば、EXECUTE AS 'dbo'CREATE PROCEDUREステートメントに追加することもできますが、これには問題があり、上記で説明したモジュール署名アプローチよりも安全性の低い偽装を使用します。

3
Solomon Rutzky

固定データベースロールのメンバーシップを変更するには、db_owner固定データベースロールのメンバーである必要があります。

ユーザー定義のデータベースロールのメンバーシップを少なくとも変更するには、alter any role権限が必要です。

これは長い例になりますが、うまくいけば、これに従うことができます。

セットアップ。

USE [Master]
GO
CREATE DATABASE [TestPerm];
GO
CREATE LOGIN testPerm1 WITH PASSWORD = 'testPerm1###',DEFAULT_DATABASE=[master], 
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
GO
CREATE LOGIN testPerm2 WITH PASSWORD = 'testPerm2###',DEFAULT_DATABASE=[master], 
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
GO
USE  [TestPerm]
GO
CREATE USER testPerm1;
GO
CREATE USER testPerm2;
GO
ALTER ROLE [DB_DATAREADER] ADD MEMBER testPerm1;
GO
GRANT ALTER ANY ROLE  TO testPerm1;
GO

次に、testPerm1ユーザーとして実行し、testPerm2ユーザーを固定データベースロールdb_datareaderに追加してみます。

USE  [TestPerm]
GO
EXECUTE AS USER='testPerm1'
SELECT SUSER_NAME(), USER_NAME();  
ALTER ROLE [DB_DATAREADER] ADD MEMBER testPerm2;
REVERT;

次のエラーが発生しました:

メッセージ15151、レベル16、状態1、行21存在しないか、権限がないため、ロール「DB_DATAREADER」を変更できません。

ユーザーtestPerm1db_securityadminロールのメンバーとして追加し、testPerm2ユーザーを固定データベースロールdb_datareaderに追加してみます。前のステップと同じエラーが発生します。

 USE [testPerm]
 GO
 ALTER ROLE [db_securityadmin] ADD MEMBER testPerm1;
 GO
 EXECUTE AS USER='testPerm1'
 SELECT SUSER_NAME(), USER_NAME();  
 ALTER ROLE [DB_DATAREADER] ADD MEMBER testPerm2;
 REVERT;

メッセージ15151、レベル16、状態1、行21存在しないか、権限がないため、ロール「DB_DATAREADER」を変更できません。

testPerm1ユーザーをdb_owner固定データベースロールのメンバーとして追加しています。

USE [testPerm]
GO
ALTER ROLE [db_owner] ADD MEMBER testPerm1;
GO

次に、testPerm2ユーザーを固定データベースロールdb_datareaderに追加してみます。コマンドは成功します。

 USE [testPerm]
 GO
 EXECUTE AS USER='testPerm1'
 SELECT SUSER_NAME(), USER_NAME();  
 ALTER ROLE [DB_DATAREADER] ADD MEMBER testPerm2;
 REVERT;

ユーザー定義のデータベースロールにメンバーを追加するために必要な権限を確認してみましょう。

新しいロールを作成し、testPerm1ユーザーをこのロールに追加します。

USE [TestPerm]
GO
CREATE ROLE [testPermission]
GO
ALTER ROLE [DB_DATAREADER] ADD MEMBER testPerm1;
GO

testPerm1ユーザーをdb_ownerおよびdb_securityadminロールから削除します。

USE [TestPerm]
GO
ALTER ROLE [db_owner] DROP MEMBER testPerm1;
GO
ALTER ROLE [db_securityadmin] DROP MEMBER testPerm1;
GO

ユーザー定義データベースロールtestPermissionをユーザーtestPerm1で変更しようとすると、testPermユーザーがalter any role特権を持っているため、成功します。

EXECUTE AS USER='testPerm1'
SELECT SUSER_NAME(), USER_NAME();  
ALTER ROLE [testPermission] ADD MEMBER testPerm2;
REVERT;

alter any roleユーザーのtestPerm1権限を取り消します。

USE [TestPerm]
GO
REVOKE ALTER ANY ROLE  TO testPerm1;
GO

ユーザー定義データベースロールtestPermissionをユーザーtestPerm1で変更しようとすると、次のエラーメッセージが表示されます。

EXECUTE AS USER='testPerm1'
SELECT SUSER_NAME(), USER_NAME();  
ALTER ROLE [testPermission] DROP MEMBER testPerm2;
REVERT;

メッセージ15151、レベル16、状態1、行3存在しないか、権限がないため、ロール「testPermission」を変更できません。

コードをクリーンアップします。

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'TestPerm'
GO
USE [master]
GO
ALTER DATABASE [TestPerm] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
DROP DATABASE [TestPerm]
GO
DROP LOGIN [testPerm1]
GO
DROP LOGIN [testPerm2]
GO
0
SqlWorldWide

上記のすべての回答に1つずつコメントすることができますが、ここでは簡潔な回答を1つ書いたほうがよいと思います。問題は、ユーザーをFIXED DATABASE ROLEdb_datareaderに追加することであり、それが重要です。 [〜#〜] bol [〜#〜] から

固定データベースロールにメンバーを追加するには、db_owner固定データベースロールのメンバーシップが必要です。

また、OPは最小の権限について尋ねたため、db_ownerデータベースロールのメンバーシップはデータベース内で使用できる最大数であり、ここで可能な解決策は署名された手順です。だから私はソロモン・ラッキーの答えに賛成

0
sepupic

ごと データベースレベルのロールに関するMicrosoftのドキュメント データベース内のユーザーは、ALTER ROLEコマンドを実行するには、db_ownerまたはdb_securityadminロールのいずれかのメンバーである必要があります。

https://docs.Microsoft.com/en-us/sql/t-sql/statements/alter-role-transact-sql ごとに、ALTERロールの場合、またはALTER ANY ROLEの場合はメンバーシップを調整できます。

0
Nic