セキュリティ管理者がデータベース内のdb_datareaderロールに新しいSQLログインを追加する機能を委任するために、セキュリティ管理者が持つ必要がある最低限の権限またはロールは何ですか?
これが許可であれば、WITH GRANT OPTION
を使用できますが、許可されていません。
誰か、または特定のデータベースレベルのロールの誰かにこの操作の実行を許可するが、他のロールの割り当てを許可しないと仮定すると、そのための権限や役割はありません。
ただし、モジュール署名を使用して、このきめ細かい「許可」を実現できます。誰かが必要とする最低限の権限は、その特定のデータベースロールにログインまたはロールを追加すること以外に何もしないように記述したストアドプロシージャに対するEXECUTE
です。
これは、次の回答で概説したものと似ています。
SQL Serverエージェントサービスのステータスを確認できるように、ユーザーに最低限必要なアクセス許可を提供する必要がありますか?
特定の場合を除いて、サーバーレベルのアクセス許可が必要ないため、さらに簡単です。次のようにしてください:
db_datareader
データベースレベルのロールに追加するだけです。db_owner
データベースレベルのロールに追加するEXECUTE
権限をそのストアードプロシージャに対して実行できる必要があるユーザーに付与します完全を期すために:
技術的に言えば、EXECUTE AS 'dbo'
をCREATE PROCEDURE
ステートメントに追加することもできますが、これには問題があり、上記で説明したモジュール署名アプローチよりも安全性の低い偽装を使用します。
固定データベースロールのメンバーシップを変更するには、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」を変更できません。
ユーザーtestPerm1
をdb_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
上記のすべての回答に1つずつコメントすることができますが、ここでは簡潔な回答を1つ書いたほうがよいと思います。問題は、ユーザーをFIXED DATABASE ROLEdb_datareader
に追加することであり、それが重要です。 [〜#〜] bol [〜#〜] から
固定データベースロールにメンバーを追加するには、
db_owner
固定データベースロールのメンバーシップが必要です。
また、OPは最小の権限について尋ねたため、db_owner
データベースロールのメンバーシップはデータベース内で使用できる最大数であり、ここで可能な解決策は署名された手順です。だから私はソロモン・ラッキーの答えに賛成
ごと データベースレベルのロールに関する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
の場合はメンバーシップを調整できます。