web-dev-qa-db-ja.com

DDL_adminとdb_ownerの権限

サーバーファーム全体のすべてのデータベースユーザーのアクセス許可を削除および制限するプロジェクトを引き継ぎます。 (楽しい時間)

現在制限されている権限の1つは、db_owner権限です。
この権限はケースバイケースで検討されていますが、一般的な変更は、db_owner権限を次のものに置き換えることです:

(クライアントに通知するために)2つの間の正確な違いを定義したいと思います。
しかし、私の知る限り、この2つの違いは次のとおりです。

  • db_accessadmin権限
  • db_backupoperator権限
  • db_securityadmin権限

つまり、実質的には次のようになります。
[ALTER ANY USER]
[CREATE SCHEMA]
[BACKUP DATABASE][BACKUP LOG][CHECKPOINT]
[ALTER ANY APPLICATION ROLE][ALTER ANY ROLE]
[DROP DATABASE]

Db_ownerが上記の4つのロールに置き換えられたら、ユーザーが失うものは他にありますか?
これは実際にはセキュリティの目的で多くの目的に役立ちますか?

16
Reaces

db_ddladmin対db_owner

私がテストして読んだ内容からわかることから、db_ddladminを除いて、リストの大部分は正確に見えますが、CREATE SCHEMAは許可されています。あなたがリストした他のセキュリティ許可が実際に拒否されたことを確認しました。

DDLADMINのみで拒否:

[ALTER ANY USER]

[BACKUP DATABASE][BACKUP LOG][CHECKPOINT]

[ALTER ANY APPLICATION ROLE][ALTER ANY ROLE]

[DROP DATABASE]

なお、 。 。

  1. db_datareaderは、すべてのテーブルへのSELECTアクセスを許可します
  2. db_datarwriterは、すべてのテーブルへのINSERTUPDATE、およびDELETEアクセスを許可します
  3. db_executorは、すべての実行可能オブジェクトへのEXECUTEアクセスを許可します

さらに、db_ddladminロールの権限を持つことは意味があるかもしれません。 。 。

注:SQL Serverのバージョンは2005年から2014年まで非常に多くあるため、小さいバージョンを使用することをお勧めしますユーザーのセットは、最初にこれをテストして、誰がねじれなどを解決するために叫んでいるかを確認します。

  • このロールで所有するオブジェクトはDBOによって所有されないため、このレベルで何か問題が発生した場合は、所有権の変更の問題に対処する必要があります。これが問題になることは100%確実ではありませんが、念のため言及する価値はあります。

    出典: 所有権の連鎖

  • このロールを使用すると(SQL Serverのバージョンによって異なる場合があります)現在のDBで定義されているSQLセキュリティ原則を、すべてのオブジェクトではなく、まだ所有しているオブジェクトに追加できる場合があります。 (所有していないもの)または新しいサーバーレベルで定義されたプリンシパルをDBレベルに追加します。


さらに、DBOロールの権限がないことは意味があるかもしれません。 。 。

注:SQL Serverのバージョンは2005年から2014年まで非常に多くあるため、小さいバージョンを使用することをお勧めしますユーザーのセットは、最初にこれをテストして、誰がねじれなどを解決するために叫んでいるかを確認します。

  • DBOロールがないと、特定のSSMSデザイナGUIインターフェイス(SQL Serverのバージョンは異なります)がエラーなしで入力または開くことができない(たとえば、テーブルまたは列を変更するとき) T-SQLを介してそれが機能し、権限が設定されている場合でも、GUIを介して) SQL Serverの一部のバージョンでは、これが問題であるGRANT VIEW DEFINITIONを許可することで解決される場合があり、特定のバージョンのSQL Serverでのみ警告になることもあります。

    リソース

    • データベース所有者またはdb_ownerロールのメンバーであるユーザーとしてログインしていません。所有していないテーブルへの変更を保存することはできません。

    • db_ddladminロールでは、SSMSでの「設計」機能の使用は許可されていません

      「私たちはできる限りQAデータベースでユーザー/開発者にdboを与えないようにしています。これに関する問題の1つは、ユーザーテーブルなどのデータベースオブジェクトを作成および変更できる必要があることです。多くの開発者は、 MS SQLは、この種の作業ではGUI(SSMS)に固執する傾向があります。db_ddladmin(dboではなく)を付与すると、テーブルデザイナーGUIを介してテーブルまたは列を変更できなくなるという問題が発生します。代わりに、彼らはTSQLコマンドとその構文を学習するために追加の時間を費やす必要があります(二度と必要になることはないかもしれません)、または他のアクティビティから時間を費やすDBAチームを雇う必要があります。

      これがバグなのか機能リクエストなのかはわかりませんが、ユーザーがTSQLを介してテーブルを変更するための十分な権限を持っているので、GUIは次のようなメッセージを表示するため、バグと見なします。

      "データベースの所有者またはシステム管理者としてログオンしていません。所有していないテーブルへの変更を保存できない可能性があります。" AND "テーブル[schema].[table]は読み取り専用に設定されています。ユーザーにはこのテーブルに対する十分な権限がありません。"

      トレースは、チェックがis_member( 'db_owner')であることを示しているようですが、実際にはオブジェクトを変更する権限があるにもかかわらず、db_ddladminのメンバーは除外されます。 Microsoft SQL Server Management Studio」


      2010年1月25日午前7時6分にエージェントDBAが投稿

      私は同様の問題を抱えており、次の助成金を実行することでそれを解決することができました

      GRANT view definition on schema:: <schemaname> to <username>
      

その他の考慮事項

これはケースバイケースでレビューされていると述べているので

現在制限されている権限の1つは、db_owner権限です。

この権限はケースバイケースで検討されていますが、一般的な変更は、db_owner権限を次のものに置き換えることです。

  • db_datareader
  • db_datawriter
  • db_ddladmin
  • db_executor

db_ddladminロールを付与するのではなく、各ユーザーが必要とする「すべてのオブジェクト」のDBレベルアクセスのために追加のカスタムロールを作成することを検討したことがあります。

私は通常、彼らが仕事をするのに必要なものだけを提供します。DB内のすべてのオブジェクトへのDBレベルのオブジェクトアクセスへの「通常」または「標準」のニーズがある場合は、次のようなカスタムDBロールを作成します。 db_executorでも、以下の例をご覧ください。この方法では、セキュリティのためにDBでオブジェクトレベルを明示的に取得しない場合に、特定のDBのすべてのDBオブジェクトに本当に必要なものを人々に付与できます。

----Custom Database Roles

/* CREATE A NEW ROLE  -- Execute to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Execute
GRANT EXECUTE TO db_All_StoredProc_Execute

/* CREATE A NEW ROLE  -- Alter to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Alter
GRANT ALTER ANY SCHEMA TO db_All_StoredProc_Alter

/* CREATE A NEW ROLE  -- View Definition to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_View
GRANT VIEW DEFINITION TO db_All_StoredProc_View

/* CREATE A NEW ROLE - Any schema alter and create procedure permissions */
-- Database specific
CREATE ROLE db_All_CreateProc_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateProc_AlterSchema
GRANT CREATE PROCEDURE TO db_All_CreateProc_AlterSchema
GO

/* CREATE A NEW ROLE - Any schema alter and create table permissions */
-- Database specific
CREATE ROLE db_All_CreateTable_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateTable_AlterSchema
GRANT CREATE TABLE TO db_All_CreateTable_AlterSchema

/* CREATE A NEW ROLE - Any schema alter and create function permissions */
-- Database specific
CREATE ROLE db_All_CreateFunction_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateFunction_AlterSchema
GRANT CREATE FUNCTION TO db_All_CreateFunction_AlterSchema

/* CREATE A NEW ROLE - Any schema alter and create aggregate permissions */
-- Database specific
CREATE ROLE db_All_CreateAggregate_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateAggregate_AlterSchema
GRANT CREATE AGGREGATE TO db_All_CreateAggregate_AlterSchema

/* CREATE A NEW ROLE - Any schema alter and create view permissions */
-- Database specific
CREATE ROLE db_All_CreateView_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateView_AlterSchema
GRANT CREATE VIEW TO db_All_CreateView_AlterSchema

/* CREATE A NEW ROLE - Any schema alter and create schema permissions */
-- Database specific
CREATE ROLE db_All_CreateSchema_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateSchema_AlterSchema
GRANT CREATE SCHEMA TO db_All_CreateSchema_AlterSchema

また、明示的にDENYを使用して作成することを検討する必要があるdb_DDLAdmin_Restrictionロールを共有したいのですが、db_ddladminがアクセスを許可するものを制限して、少なくとも、付与するDBでこれを作成できるようにしましたこのロールを使用して、実際のオブジェクトタイプなどに明示的にDENYを設定します。アクセスを許可しないようにします。

たとえば、確実にストアドプロシージャと関数を作成することがわかっている場合は、DENY CREATE FUNCTIONDENY CREATE PROCEDUREDENY ALTER ANY SCHEMAを除外できます。

---Create ddladmin restriction custom DB role
DENY ALTER ANY Assembly                    TO db_DDLAdmin_Restriction
DENY ALTER ANY ASYMMETRIC KEY              TO db_DDLAdmin_Restriction
DENY ALTER ANY CERTIFICATE                 TO db_DDLAdmin_Restriction
DENY ALTER ANY CONTRACT                    TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE DDL TRIGGER        TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE EVENT NOTIFICATION TO db_DDLAdmin_Restriction
DENY ALTER ANY DATASPACE                   TO db_DDLAdmin_Restriction
DENY ALTER ANY FULLTEXT CATALOG            TO db_DDLAdmin_Restriction
DENY ALTER ANY MESSAGE TYPE                TO db_DDLAdmin_Restriction
DENY ALTER ANY REMOTE SERVICE BINDING      TO db_DDLAdmin_Restriction
DENY ALTER ANY ROUTE                       TO db_DDLAdmin_Restriction
DENY ALTER ANY SCHEMA                      TO db_DDLAdmin_Restriction
DENY ALTER ANY SERVICE                     TO db_DDLAdmin_Restriction
DENY ALTER ANY SYMMETRIC KEY               TO db_DDLAdmin_Restriction
DENY CHECKPOINT                            TO db_DDLAdmin_Restriction
DENY CREATE AGGREGATE                      TO db_DDLAdmin_Restriction
DENY CREATE DEFAULT                        TO db_DDLAdmin_Restriction
DENY CREATE FUNCTION                       TO db_DDLAdmin_Restriction
DENY CREATE PROCEDURE                      TO db_DDLAdmin_Restriction
DENY CREATE QUEUE                          TO db_DDLAdmin_Restriction
DENY CREATE RULE                           TO db_DDLAdmin_Restriction
DENY CREATE SYNONYM                        TO db_DDLAdmin_Restriction
DENY CREATE TABLE                          TO db_DDLAdmin_Restriction
DENY CREATE TYPE                           TO db_DDLAdmin_Restriction
DENY CREATE VIEW                           TO db_DDLAdmin_Restriction
DENY CREATE XML SCHEMA COLLECTION          TO db_DDLAdmin_Restriction
DENY REFERENCES                            TO db_DDLAdmin_Restriction
GO
16
Pimp Juice IT

SQLスクリプトを使用してすべての権限を一覧表示し、各ケースのユーザーを作成しました。

EXECUTE AS USER = 'test_user'
SELECT 
    permission_name 
FROM fn_my_permissions(null, 'DATABASE')
ORDER BY subentity_name, permission_name
REVERT;

次に、結果を比較して、主に msdn からのドキュメントとともに、次のリストに行きました(特に参照されていない引用符はmsdnリンクからのものです)。
以下は、dboパーミッションを失うことになる人々に失うものを正確に通知するために使用したドキュメントの一部です。

[〜#〜] alter [〜#〜]

特定のセキュリティ保護可能なプロパティの所有権以外のプロパティを変更する機能を付与します。スコープに付与されると、ALTERはそのスコープ内に含まれるセキュリティ保護可能なものを変更、作成、または削除する機能も付与します。たとえば、スキーマに対するALTER権限には、スキーマからオブジェクトを作成、変更、および削除する機能が含まれています。

ALTER ANY APPLICATION ROLE
ALTER ANY DATABASE AUDIT
ALTER ANY ROLE
ALTER ANY USER

セキュリティ保護可能なデータベースの個々のインスタンスを作成、変更、または削除する機能を付与します。たとえば、ALTER ANY SCHEMAは、データベース内のスキーマを作成、変更、または削除する機能を提供します。

アプリケーションロール は、アプリケーションを独自のユーザーのような権限で実行できるようにするデータベースプリンシパルです。

Auditing SQL ServerまたはSQL Serverデータベースのインスタンスには、システムで発生するイベントの追跡とログ記録が含まれます。データベースレベルの監査仕様オブジェクトは監査に属します。監査ごとに、SQL Serverデータベースごとに1つのデータベース監査仕様を作成できます。

データベースロール は、データベースの権限を簡単に管理するために使用されます。SQLServerには、他のプリンシパルをグループ化するセキュリティプリンシパルであるいくつかのロールが用意されています。これらは、Microsoft Windowsオペレーティングシステムのグループのようなものです。データベースレベルのロールは、権限のスコープがデータベース全体に及びます。

[〜#〜]認証[〜#〜]
msdn. にあります

AUTHENTICATEおよびAUTHENTICATE SERVER権限は、クロスデータベースおよびサーバーアクセス(それぞれ)のシナリオでEXECUTE ASを使用する場合にのみ使用されます。

バックアップデータベース
バックアップログ

CONNECT REPLICATION

database replication 権限に使用されます。

[〜#〜]コントロール[〜#〜]

被付与者に所有権のような機能を付与します。被付与者は、セキュリティ保護可能なデバイスに対するすべての定義済み権限を効果的に持っています。 CONTROLを付与されたプリンシパルは、セキュリティ保護可能なオブジェクトに対するアクセス許可も付与できます。

CREATE ROLE

セキュリティ保護可能なデータベースを作成する権限を被付与者に付与します。

[〜#〜]ショープラン[〜#〜]

プラン表示権限は、Transact-SQLバッチで使用されるときにさまざまなプラン表示SETステートメントオプションに 使用されます

購読クエリの通知

クエリ通知に関するドキュメント。

Service Brokerインフラストラクチャ上に構築されたクエリ通知により、データが変更されたときにアプリケーションに通知できます。この機能は、Webアプリケーションなど、データベースからの情報のキャッシュを提供し、ソースデータが変更されたときに通知を受ける必要があるアプリケーションで特に役立ちます。

TAKE OWNERSHIP

被付与者が、付与されたセキュリティ保護可能なファイルの所有権を取得できるようにします。

データベースの状態を表示

動的管理ビューおよび関数(Transact-SQL) を表示するために使用されます。

VIEW DEFINITION

ビュー定義権限に関するドキュメント。

VIEW DEFINITION権限により、ユーザーは権限が付与されているセキュリティ保護可能なリソースのメタデータを表示できます。ただし、VIEW DEFINITION権限は、セキュリティ保護可能な自体へのアクセスを許可しません。たとえば、テーブルに対するVIEW DEFINITION権限のみが付与されているユーザーは、sys.objectsカタログビューでテーブルに関連するメタデータを表示できます。ただし、SELECTやCONTROLなどの追加の権限がないと、ユーザーはテーブルからデータを読み取ることができません。

8
Reaces