ADグループmycompany\developers
は現在sysadmin
です。
最近、特にデータベースの復元に関する問題が発生しました。私の懸念は:
時々、データベースは レプリケーションに関与します
権限は上書きされます-正しい方法は、復元前に現在の権限を保存し、復元後にそれらを再適用することです。
すべてのドライバー、特にこの復元で使用されるドライバーで現在使用可能なディスク容量を確認しましたか?
その特定のデータベースを使用または作業している他の人々がいる可能性があり、通信なしでそれを復元すると、他の誰かの作業が失われる可能性があります
開発環境では、データベースをシンプルリカバリモードにすることができます。ログを縮小し、データベースを単純復旧モードに変更しましたか。
この特定のケースでは、すべてのユーザーデータベースの完全バックアップが毎晩自動的に実行されます。とにかく、スケジュールされたバックアップを確認しましたか?
復元に使用したバックアップをサーバーから削除しましたか?
フォルダーとドライブ、またはデータとログは、ライブとテストで異なります。ファイルを正しい場所に移動してよろしいですか?
孤立したユーザーとログインを確認しましたか?
開発者が開発環境であっても、新しいデータベースを作成するときは特に心配です。どうして?
なぜなら、彼らは開発でデータベースを作成することから始めて、それをライブにコピーするように私に頼むからです。このデータベースの容量計画を実行しましたか?それはどれくらいの大きさでなければならず、それは1ヶ月でどのくらい成長しますか?
残りのオブジェクト\インデックス用に異なるファイルグループを分離または検討しましたか?
すべてのドライバー、特にこのDBの作成に使用されるドライバーで現在使用可能なディスク容量を確認しましたか?
トランザクションログのサイズとその理由最初は最大のクラスター化インデックスの1.5倍に設定します。
自動拡張設定とは何ですか?
現在の権限は何ですか?
一部の人々はそれほど簡単に対処できないことに気づきました。むしろ、そのサーバーに対する彼らの力を減らします。
私は彼らの仕事をしたくありませんが、新しいデータベースを作成したり、ファイルを復元したり添付したりして、既存のデータベースを上書きしないように制限したいと思います。
ジョブの作成と実行、ユーザーデータベースを使用したオブジェクトの作成と変更、ログインの作成、権限の付与などができるはずです。
基本的に問題は:
現在のシステム管理者の能力を制限する方法は?私は、sysadminを許可するのではなく、他のすべてを実行できるようにする一連のサーバー権限(データベースを作成/変更する権限を除く)を許可することを考えました。
そのサーバー権限のセットは何でしょうか?
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
これで、DENY
がGRANT
よりも優先されるため、新しいデータベースロールを作成し、そのロールに<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ログインからの権限。
SQLログインの作成とマッピング
SQLログインを作成してdb_owner
データベースロールを割り当てます。
バックアップデータベース権限の拒否
次に、sa
SQL Serverロールとsysadmin
を持つDENY
またはWindowsログイン(DBA、この質問をする人)のようなより高い特権アカウントに切り替えます。データベースプリンシパルからのbackup database
の権利hot2use
:
完璧な世界では、DENY BACKUP LOG TO hot2use
も提出する必要があります。
Hot2useでサーバーにログインし、データベースをバックアップします
hot2use
にはTest
データベースのdb_owner
データベースロールがあるため、hot2use
...でログインします。
...そしてデータベースのバックアップを試みます:
それはうまくいかず、私たちが期待していたことです。これは、SQL Serverログインhot2use
に、データベースロールdb_owner
があるにもかかわらず、データベースをバックアップする権限がないためです。
SQLログインは権限をハッキングしたい
SQL Serverログインがdb_owner
ロールを持っていることを確認し、一部の人々によると、自分に権限を割り当てることができるとのことですので、試してみましょう。
(テストは新しいデータベースのSQL Serverクエリウィンドウで行われました)
概要
より高い特権のアカウントでDENY
権限を付与した場合、SQLログイン(例:hot2use
)にこれらの特権が必要であると考えていても、これらの特権を低い特権のアカウントからGRANT
ed戻すことはできません。データベースロールdb_owner
からの権限。これはSQL Server 2014で変更されたものです(はい、テストはSQL Server 2014インスタンスで行われました)。
ここで見つけることができる公式の概要に従って許可をさらに制限できます:
さらにお読みください:
そうそう、私たちはBACKUP DATABASE
特権だけを否定しましたね。それはRESTORE DATABASE
とは何の関係もありませんか?確認してみましょう。より高い特権のアカウント/ログインでデータベースバックアップを作成します。
動作するようです。 hot2use
SQL Serverクエリウィンドウに戻り、バックアップを復元しましょう。
ご覧のとおり、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'
...その結果:
したがって、DENY
サーバーロールを使用してSQLログインからsysadmin
権限を付与することはできませんが、SQLログインに 'sysadmin'データベースロールがない場合はDENY
権限を付与できます。 。
SQL Serverログインをまったく割り当てず、SQL Serverロールを割り当てず、特定のデータベースにdb_backupoperator
データベースロールのみを割り当てる場合、データベースをバックアップおよび復元できます。これは、SQLログインが実行できないと他の人が信じていることです。高い特権のアカウントがバックアップを作成したため、低い特権のアカウント(sysadmin以外)はバックアップ/復元を実行できません。
SQL Serverログインのすべての権限hot2use
をサーバーでpublic
に、データベースレベルでdb_backupoperator
にリセットすると、次の列挙された権限が表示されます。
他の人によると、SQLサーバーの役割がないため、バックアップを実行できないはずです。
したがって、db_backupoperator
の役割を持っている場合は、実際にデータベースをバックアップできます。
また、SQL Serverログイン(SQL Server 2014以上のインスタンス)にDENY BACKUP DATABASE
すると、db_backupoperator
の役割が残っているにもかかわらず、データベースをバックアップできなくなりますデータベースレベル:
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 ...
の両方を持っています。
db_ownerロールを使用したSQL Serverログイン(バックアップ権限なし)
あなたの質問に答えられるようにするには、私たちは知る必要があります開発者が必要とするサーバーレベルでの正確なパーミッション。
反対側からアプローチしています: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
できません。
これらの権限を持っている人は、あなたがdeny
database 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;
hot2use
はdb_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;
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'を復元する権限がありません。
hot2use
にbackup database
とbackup log
の両方の権限があり、restore
ができないのはどうしてですか?それは簡単です。 Backup
にbackup
権限が必要です。restore
を実行するには、BOLの記事を再度読み、WHOがRESTORE
権限を持っていることを確認してください。 RESTORE
へ:
したがって、復元するには、sysadmin
またはdbcreator
サーバーレベルの役割のメンバーである必要があります。
それを修正して、ログインhot2use
をdbcreator
ロールに入れます。
exec sp_addsrvrolemember 'hot2use', 'dbcreator';
これでhot2use
がrestore
できるようになりました:
最後に、DENY
backup 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;
そのため、hot2use
にはbackup database
、backup log
権限はありませんが、それでもdbcreator
server roleのメンバーです。
彼は復元できますか?
はい、もちろん。これは、BOLで述べられ、上記で示されているように、復元できるようにするためにバックアップ権限は不要であるためです。