web-dev-qa-db-ja.com

データベースの上書きまたは作成以外のすべてを許可するための適切な権限は何ですか?

ADグループmycompany\developersは現在sysadminです。

最近、特にデータベースの復元に関する問題が発生しました。私の懸念は:

  1. 時々、データベースは レプリケーションに関与します

  2. 権限は上書きされます-正しい方法は、復元前に現在の権限を保存し、復元後にそれらを再適用することです。

  3. すべてのドライバー、特にこの復元で使用されるドライバーで現在使用可能なディスク容量を確認しましたか?

  4. その特定のデータベースを使用または作業している他の人々がいる可能性があり、通信なしでそれを復元すると、他の誰かの作業が失われる可能性があります

  5. 開発環境では、データベースをシンプルリカバリモードにすることができます。ログを縮小し、データベースを単純復旧モードに変更しましたか。

  6. この特定のケースでは、すべてのユーザーデータベースの完全バックアップが毎晩自動的に実行されます。とにかく、スケジュールされたバックアップを確認しましたか?

  7. 復元に使用したバックアップをサーバーから削除しましたか?

  8. フォルダーとドライブ、またはデータとログは、ライブとテストで異なります。ファイルを正しい場所に移動してよろしいですか?

  9. 孤立したユーザーとログインを確認しましたか?

開発者が開発環境であっても、新しいデータベースを作成するときは特に心配です。どうして?

なぜなら、彼らは開発でデータベースを作成することから始めて、それをライブにコピーするように私に頼むからです。このデータベースの容量計画を実行しましたか?それはどれくらいの大きさでなければならず、それは1ヶ月でどのくらい成長しますか?

  1. 残りのオブジェクト\インデックス用に異なるファイルグループを分離または検討しましたか?

  2. すべてのドライバー、特にこのDBの作成に使用されるドライバーで現在使用可能なディスク容量を確認しましたか?

  3. トランザクションログのサイズとその理由最初は最大のクラスター化インデックスの1.5倍に設定します。

  4. 自動拡張設定とは何ですか?

  5. 現在の権限は何ですか?

一部の人々はそれほど簡単に対処できないことに気づきました。むしろ、そのサーバーに対する彼らの力を減らします。

私は彼らの仕事をしたくありませんが、新しいデータベースを作成したり、ファイルを復元したり添付したりして、既存のデータベースを上書きしないように制限したいと思います。

ジョブの作成と実行、ユーザーデータベースを使用したオブジェクトの作成と変更、ログインの作成、権限の付与などができるはずです。

基本的に問題は:

現在のシステム管理者の能力を制限する方法は?私は、sysadminを許可するのではなく、他のすべてを実行できるようにする一連のサーバー権限(データベースを作成/変更する権限を除く)を許可することを考えました。

そのサーバー権限のセットは何でしょうか?

4

TL; DR

DEVが「間違った」ことをしないように制限するには、少なくともsysadmin SQL Serverロールを削除する必要があります。

はじめましょう

個々のデータベースごとにdb_ownerデータベースロールをDEVに割り当てることができます。ただし、その役割は、ユーザーがBACKUP DATABASE ...またはBACKUP LOG ...を実行することを許可しますが、ユーザーが実行できないようにしたいと述べました。

ソリューション

SQL Server 2014以降では、db_ownerロールを使用してSQL Serverログインを制限し、さらに個々の特権/権限を削除できます。 1つの例は、データベースで次のコマンドを発行して、データベースのバックアップ特権とトランザクションログレベルを削除することです。

USE <database_name>
GO
DENY BACKUP DATABASE TO <database_principal>
GO
DENY BACKUP LOG TO <database_principal>

参照:データベース権限の拒否(Transact-SQL ) (Microsoft Docs)

アクセス許可には3つのレベルがあります。

GRANT  : You are granted/granting a specific permission  
REVOKE : A previously granted/denied permission is revoked (removed) again  
DENY   : You are denied/denying a specific permission  

オルタナティブ

これで、DENYGRANTよりも優先されるため、新しいデータベースロールを作成し、そのロールに<database_principals>を追加するという代替ソリューションを使用できます。

USE <database_name>
GO
CREATE ROLE [deny_backup]
GO
DENY BACKUP DATABASE TO [deny_backup]
GO
DENY BACKUP LOG TO [deny_backup]
GO
EXEC sp_addrolemember N'deny_backup', N'<database_principal>'
GO

参照:ユーザーにバックアップ権限を制限する =(ソーシャルMSDN)

ステップバイステップガイド

一部の人々はこの投稿で行った発言に懐疑的であるため、実際にどのようにできるかを示すために個別のステップを追加しています[〜#〜]拒否[〜#〜]ログインにdb_ownerロールがある場合でも、SQLログインからの権限。

  1. SQLログインの作成とマッピング

    SQLログインを作成してdb_ownerデータベースロールを割り当てます。

    SQL Login with Mapping and Role

  2. バックアップデータベース権限の拒否

    次に、sa SQL Serverロールとsysadminを持つDENYまたはWindowsログイン(DBA、この質問をする人)のようなより高い特権アカウントに切り替えます。データベースプリンシパルからのbackup databaseの権利hot2use

    sa Account revokes backup database permission

    完璧な世界では、DENY BACKUP LOG TO hot2useも提出する必要があります。

  3. Hot2useでサーバーにログインし、データベースをバックアップします

    hot2useにはTestデータベースのdb_ownerデータベースロールがあるため、hot2use...でログインします。

    SQL Login logs in to instance

    ...そしてデータベースのバックアップを試みます:

    SQL Login tries to back up database and fails

    それはうまくいかず、私たちが期待していたことです。これは、SQL Serverログインhot2useに、データベースロールdb_ownerがあるにもかかわらず、データベースをバックアップする権限がないためです。

  4. SQLログインは権限をハッキングしたい

    SQL Serverログインがdb_ownerロールを持っていることを確認し、一部の人々によると、自分に権限を割り当てることができるとのことですので、試してみましょう。

    SQL Login tries to hack permission and fails

    (テストは新しいデータベースのSQL Serverクエリウィンドウで行われました)

  5. 概要

    より高い特権のアカウントでDENY権限を付与した場合、SQLログイン(例:hot2use)にこれらの特権が必要であると考えていても、これらの特権を低い特権のアカウントからGRANTed戻すことはできません。データベースロールdb_ownerからの権限。これはSQL Server 2014で変更されたものです(はい、テストはSQL Server 2014インスタンスで行われました)。

追加のリソース

ここで見つけることができる公式の概要に従って許可をさらに制限できます:

権限(データベースエンジン)

さらにお読みください:

データベースエンジンのアクセス許可の概要

しばらくお待ちください...

そうそう、私たちはBACKUP DATABASE特権だけを否定しましたね。それはRESTORE DATABASEとは何の関係もありませんか?確認してみましょう。より高い特権のアカウント/ログインでデータベースバックアップを作成します。

High privilege account backs up Test database

動作するようです。 hot2use SQL Serverクエリウィンドウに戻り、バックアップを復元しましょう。

SQL Login tries to restores database and fails

ご覧のとおり、BACKUP DATABASE特権はそのSQL Serverログインの復元機能も制限しているため、機能しません。

バックアップ特権なし=復元特権なし

DENY BACKUP DATABASE FROM SYSADMINはどうですか?

さて、あなたが尋ねたので。試してみましょう。データベースロールを取り消す方法を示すスクリーンショットは省略します。

SQLログインにsysadmin SQL Serverロールを割り当てました。

ALTER SERVER ROLE [sysadmin] ADD MEMBER [hot2use]
GO

...次に、上記のDENY BACKUP DATABASE..コマンドを使用してデータベースをバックアップする権限を削除し、次のコマンドでデータベースのバックアップを実行しました:

backup database Test to disk = 'C:\temp\Test_Full_Backup_20171121.bak'

...その結果:

SQL Login backs up database with sysadmin role

したがって、DENYサーバーロールを使用してSQLログインからsysadmin権限を付与することはできませんが、SQLログインに 'sysadmin'データベースロールがない場合はDENY権限を付与できます。 。

データベースのバックアップ/復元に必要な最小限の権限

SQL Serverログインをまったく割り当てず、SQL Serverロールを割り当てず、特定のデータベースにdb_backupoperatorデータベースロールのみを割り当てる場合、データベースをバックアップおよび復元できます。これは、SQLログインが実行できないと他の人が信じていることです。高い特権のアカウントがバックアップを作成したため、低い特権のアカウント(sysadmin以外)はバックアップ/復元を実行できません。

SQL Serverログインのすべての権限hot2useをサーバーでpublicに、データベースレベルでdb_backupoperatorにリセットすると、次の列挙された権限が表示されます。

SQL Server Login Listing of Permissions

他の人によると、SQLサーバーの役割がないため、バックアップを実行できないはずです。

SQL Server Login performs backup without SQL Server role

したがって、db_backupoperatorの役割を持っている場合は、実際にデータベースをバックアップできます。

また、SQL Serverログイン(SQL Server 2014以上のインスタンス)にDENY BACKUP DATABASEすると、db_backupoperatorの役割が残っているにもかかわらず、データベースをバックアップできなくなりますデータベースレベル:

SQL Login cannot perform backup due to DENY

SQLログインhot2useが以前に拒否された権限を取り消そうとすると、失敗し、以前に上記で示したのと同様のメッセージが表示されます。

概要

DEVに割り当てるアクセス許可/特権/ロールを決定することは、sysadmin SQL Serverロールを放棄したくないため、骨の折れる戦い/問題になります。どのSQL Server RolesおよびどのDatabase Rolesを見つける必要があります彼らはまさに自分の仕事をする必要があります。最悪の場合、すべてが同じままです。最良の場合は、DEVの権限/特権を制限できることです。

DEVからsysadmin SQL Serverロールを削除して、DEVが必要なすべてを実行できないように制限する必要があります。ただし、SQL Serverロールが削除されたら、たとえばdb_ownerロールやDENY BACKUP DATABASE ...などのロールを割り当てて、データベースのバックアップや復元を禁止できます。

開発者はデータベース内で(DROP DATABASEを含む)必要なことは何でも実行できますが、バックアップや復元を実行することはできません。データベースロールhot2useを持つSQL Serverログインdb_ownerの次の列挙された権限を参照してください。ただし、DENY BACKUP DATABASE ...DENY BACKUP LOG ...の両方を持っています。

SQL Server Login with db_owner role but without backup permissions

db_ownerロールを使用したSQL Serverログイン(バックアップ権限なし)

3

あなたの質問に答えられるようにするには、私たちは知る必要があります開発者が必要とするサーバーレベルでの正確なパーミッション

反対側からアプローチしています:sysadminサーバーレベルの役割を与え、sysadminを制限しようとしましたが、それは不可能です(前のバージョンではいくつかの変更がありましたが、データアクセスに関係しています) 、管理者権限ではなく、sysadminからデータを非表示にできるようになりましたが、管理タスクでの権限を制限することはできません)。

したがって、DENYに何かをsysadminしようとする代わりに(それは不可能です)、どの権限をGRANTにすべきかを考える必要があります。

開発者はsysadminのメンバーであってはなりません。そうでない場合、開発者は何かを拒否することはできません。

開発者ができることのリストを作成し、質問を更新してください。カスタムserver roleを作成し、必要な権限のみを付与することで実現できる場合と、certificateで署名されたstored proceduresを使用して実現できる場合があります。

Sysadmin権限なしで達成するのが最も難しいのはこれです。

彼らはまだジョブを作成して実行できるはずです

sysadminロールからログインを削除するとすぐに、SQL Server AgentがSSMSから削除されます。

SQL Serverエージェントのサーバープリンシパルを使用できるようにするには、少なくともSQLAgentUserRoleのメンバーである必要があります。ジョブを実行できるようにするためには、SQLAgentOperatorRoleのメンバーであり、ここで詳細を読むことができます。 SQL Serverエージェントの固定データベースロール 。ただし、SQLAgentOperatorRoleでもsysadminと比較すると制限があるため、記事を読んで、それらの権限が開発者にとって十分であるかどうかを判断してください。そうでない場合、SQL Server Agentの使用にはsysadminメンバーシップ。

復元権限について

復元するデータベースが存在しない場合、ユーザーはRESTOREを実行できるようにCREATE DATABASE権限を持っている必要があります。データベースが存在する場合、RESTORE権限はデフォルトでsysadminおよびdbcreator固定サーバーロールのメンバーとデータベースの所有者(dbo)に設定されます(FROM DATABASE_SNAPSHOTオプションの場合、データベースは常に存在します)。

RESTORE権限は、サーバーがメンバーシップ情報をいつでもすぐに利用できるロールに付与されます。固定データベースロールのメンバーシップは、データベースがアクセス可能で損傷していない場合にのみ確認できるため、RESTOREが実行された場合は常にそうであるとは限りませんdb_owner固定データベースロールのメンバーにはRESTORE権限がありません

これは、MSの公式ドキュメントの引用です。これは、PERMISSIONSの下にある RESTOREステートメント(Transact-SQL) です。

これは、誰かが[〜#〜]できない[〜#〜]restore/create databaseなしでSERVER LEVEL PERMISSIONSがないことを明確に示しています。

つまり、問題を解決するためにデータベースレベルで何も否定する必要はありません。RESTORE機能の制限には役立ちません。

server permissionsを持たないユーザー(dbcreatorまたはsysadminサーバーロールのメンバーシップ)はすでにrestore/create databaseできません。

これらの権限を持っている人は、あなたがdenydatabase level permission.


今、他の回答者は私が対処する必要があると感じていると主張しました:

「バックアップ特権なし=復元特権なし」

調べてみましょう。ここに簡単な再現があります。

BOLの記事で述べたように、データベースを復元するには、dbcreatorまたはsysadminサーバーの役割のメンバーである必要があります。したがって、それがdb_ownerである場合(そして確かにbackup権限がある場合)、データベースを復元できません。

新しいデータベースを作成し、それをバックアップし、そのデータベースにマップされ、db_ownerデータベースロールに追加されるログインを作成しましょう。コードよりも説得力のある画像を使用します。

use master;
GO

create database test;
GO

create login hot2use with password = '*****';
GO


use test;
create user hot2use from login hot2use;
exec sp_addrolemember 'db_owner', 'hot2use';
go


execute as login = 'hot2use';
select is_member('db_owner') as is_db_owner;
select HAS_PERMS_BY_NAME('test', 'database', 'backup database') as has_backup_database;
select HAS_PERMS_BY_NAME('test', 'database', 'backup log') as has_backup_log;

hot2usedb_ownerであり、backup databaseおよびbackup log権限があるため、最後の3つのクエリはすべて1を返します。

次に、hot2useがsysadminまたはdbcreatorサーバーロールメンバー(restoreが可能な)かどうかを確認します。

select IS_SRVROLEMEMBER('sysadmin') as is_sysadmin;
select IS_SRVROLEMEMBER('dbcreator') as is_dbcreator;

このコードはどちらの場合も0を返します。 enter image description here

testデータベースへのすべての接続を閉じて、バックアップします。

backup database test to disk = 'Z:\TEMP\test_full.bak';
go

今度は、hot2useがtestデータベースの復元を試みます。

restore database test from disk = 'Z:\TEMP\test_full.bak' with replace;

ワオ。

メッセージ3110、レベル14、状態1、行1ユーザーには、データベース 'test'を復元する権限がありません。

enter image description here


hot2usebackup databasebackup logの両方の権限があり、restoreができないのはどうしてですか?

それは簡単です。 Backupbackup権限が必要です。restoreを実行するには、BOLの記事を再度読み、WHOがRESTORE権限を持っていることを確認してください。 RESTOREへ:

enter image description here

したがって、復元するには、sysadminまたはdbcreatorサーバーレベルの役割のメンバーである必要があります。

それを修正して、ログインhot2usedbcreatorロールに入れます。

exec sp_addsrvrolemember 'hot2use', 'dbcreator';

これでhot2userestoreできるようになりました:

enter image description here

最後に、DENYbackup databaseおよびbackup logへのhot2useへのアクセス許可を付与すると、restoreに再試行します。

use test;
deny backup database to hot2use;
deny backup log to hot2use;
GO

execute as login = 'hot2use';

select is_member('db_owner') as is_db_owner;
select HAS_PERMS_BY_NAME('test', 'database', 'backup database') as has_backup_database;
select HAS_PERMS_BY_NAME('test', 'database', 'backup log') as has_backup_log;
select IS_SRVROLEMEMBER('sysadmin') as is_sysadmin;
select IS_SRVROLEMEMBER('dbcreator') as is_dbcreator;
revert;

enter image description here

そのため、hot2useにはbackup databasebackup log権限はありませんが、それでもdbcreator server roleのメンバーです。

彼は復元できますか?

enter image description here

はい、もちろん。これは、BOLで述べられ、上記で示されているように、復元できるようにするためにバックアップ権限は不要であるためです。

3
sepupic