ユーザーまたは関数を作成するオプションを開発者に与えることなく、オブジェクトに対するユーザー権限を付与する権限を開発者に与える方法はありますか?
開発者のアクセス許可を制限しようとしていますが、最近、開発者が開発db_owner
環境と本番環境でアクセス許可を持っていることがわかりました! だから私はこの狂気を止めるために最善を尽くしています。
この件について何か良い記事はありますか?
ユーザーまたは関数を作成するオプションを開発者に与えることなく、オブジェクトに対するユーザー権限を付与する権限を開発者に与える方法はありますか?
開発者のアクセス許可を制限しようとしていますが、最近、開発者が開発db_owner
環境と本番環境でアクセス許可を持っていることがわかりました! だから私はこの狂気を止めるために最善を尽くしています。
この件について何か良い記事はありますか?
それらを「db_securityadmin」データベースロールのメンバーにすることができます
前述のように、誰かが許可を与えることができれば、自分自身 (またはダミー アカウント) に許可を与えることができます。SQL Server に「自分よりも少ないユーザー権限を与える」というトリックがあるかどうかはわかりません。
私がそれを行う方法は、ストアドプロシージャを使用することです。
特定のユーザーに特定の権利または一連の権利を付与するストアド プロシージャを作成します(これらの権利は、通常のユーザーが持つことを許可されているものです)。次に、このストアド プロシージャへの実行アクセス権を開発者に付与します。実際には、ストアド プロシージャを使用して GRANT の制限付きバージョンを作成し、完全な GRANT コマンドを自分自身に保持します。
誰かが他の人に許可を与えることができれば、その人は自分がやりたいことをする許可を自分自身に与えることもできます。では、これは何の役に立つのでしょうか。おそらく、あなたの状況を理解していないでしょう。
オブジェクトの所有者は、それらのオブジェクトに対するアクセス許可を付与できます。開発者が CREATE TABLE 権限などを付与する必要がない場合、アクセス許可を付与するオブジェクトの所有権を開発者に付与できる場合があります。
I've found that the most dangerous aspect of the db_owner role is that if you issue a deny on a permissions, then the members of the role can grant it back to themselves. I've just started reading about this and I'm testing this
Create role db_ControlDatabase
grant control to db_ControlDatabase
deny backup database to db_ControleDatabase
alter role db_ControlDatabase add member TestUser
So far, I've found that the subject TestUser
has permissions without being able to add or remove members of the fixed database roles. You should be able to deny whatever you need at this point like backup certificate, backup master key, etc.
Here is a list of permissions that can be denied or granted:
ステファンが言ったように、許可を与えることは事実上、すべての許可を彼らに与えることになります。
ただし、開発者を敵と考えるのではなく、データベースの管理に使用する 2 つ目のユーザー アカウントを開発者に与えることを検討することをお勧めします。少なくとも開発アカウントでは、開発者に本番環境へのアクセス許可をまったく与えないことはかなり一般的です。
ストアド プロシージャなどのオブジェクトに対するアクセス許可の設定は、"GRANT EXECUTE ON . to ;" で実行できます。
ただし、ログイン レベルとユーザー レベルの両方でセキュリティ権限を付与することもできます。アクセスが必要なオブジェクト (実行など) に必要な権限のみを決定して付与する必要があります。別のユーザーの偽装を可能にする「EXECUTE AS」機能の使用を検討してください。これにより、基礎となるすべてのオブジェクト (テーブルなど) に必要なすべての権限を付与することなく、コードを実行するために必要なアクセス許可を検証できます。EXECUTE AS は、ストアド プロシージャ、関数、トリガーなどに追加できます。
ストアド プロシージャ内で次のようにコードに追加します。 CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
この場合、呼び出されるモジュールの所有者になりすますことになります。また、SELF を偽装するか、モジュールを作成または変更するユーザーを偽装するか、または ... CALLER を偽装して、モジュールが現在のユーザーの権限を引き継ぐことができるようにするか、または ... OWNER を偽装して、呼び出されるプロシージャの所有者または... 'user_name' を偽装して、特定のユーザーを偽装するか、または 'login_name' を偽装して、特定のログインを偽装します。
ほとんどの場合、ストアド プロシージャに EXECUTE 権限を付与するだけで、ストアド プロシージャ内で参照されるすべてのオブジェクトに権限が付与されます。
このように、暗黙的な権限を与える必要はありません (例: データを更新したり、追加のプロシージャを呼び出したりするため)。所有権チェーンがこれを処理します。これは、動的 SQL の場合、または CREATE TABLE などの高度なセキュリティ タスクを作成する必要がある場合に特に役立ちます。EXECUTE AS は、これらを検討するための便利なツールです。
この例は、これらすべてを明確にするのに役立ちます。
データベースへのパブリック アクセスを持つ NoPrivUser というユーザーを作成します (例: dbadb)
USE [master] GO CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], CHECK_EXPIRATION=ON, CHECK_POLICY=ON GO USE [DBAdb] GO CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser] GO
注: この手順の作成者または所有者は、ターゲット データベース内で CREATE TABLE 権限を必要とします。
use DBAdb go CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER AS IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].MyTable') AND type in (N'U')) CREATE TABLE MyTable (PKid int, column1 char(10)) INSERT INTO MyTable VALUES (1,'ABCDEF')
行く
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 行く
-- NoPrivUser としてデータベース サーバーにログインし、次のコマンドを実行します。
dbdb を使用する
EXEC dbo.MyProcedure
(1 行が影響を受けます)
ここで、NoPrivuser としてログオンしているときに、新しいテーブルから選択してみます。
次のものが得られます。
select * from MyTable go
メッセージ 229、レベル 14、状態 5、行 1 オブジェクト 'MyTable'、データベース 'DBAdb'、スキーマ 'dbo' に対する SELECT 権限が拒否されました。
これは、NoPrivUser としてログオンしているときに、Owner のセキュリティ コンテキストでのみプロシージャを実行したためです。テーブルを実際に読み取る権限がないため、NoPrivUser。行を作成して挿入する手順を実行するだけです。
EXECUTE AS 句を使用すると、ストアド プロシージャはオブジェクト所有者のコンテキストで実行されます。このコードは dbo.MyTable を正常に作成し、行が正常に挿入されます。この例では、ユーザー「NoPrivUser」には、テーブルを変更したり、このテーブル内のデータを読み取ったり変更したりする権限がまったく付与されていません。この手順のコンテキスト内でコード化されたこの特定のタスクを完了するために必要な権限のみを取得します。
高度なセキュリティ権限を必要とするタスクを実行できるストアド プロシージャを作成するこの方法は、これらの権限を永続的に割り当てることなく非常に便利です。