web-dev-qa-db-ja.com

sysadminサーバーロールがストアドプロシージャを実行しないようにする方法

SQL Server認証を使用するSQL Serverのデフォルトインスタンスと2人のユーザー、User1とUser2があります。

User1はパブリックサーバーの役割を持ち、User2はパブリックサーバーの役割+ sysadminサーバーの役割を持っています。

1つのデータベースsptest1を作成しました。そのデータベース内で、ストアドプロシージャsp_viewtblを作成し、スキーマも作成しました。スキーマを使用して、User1のストアドプロシージャの実行を無効にしました。

Sysadminサーバーの役割を持つUser2によるストアドプロシージャの実行を拒否するにはどうすればよいですか?

User3を作成し、sysadminおよびpublicとして権限を付与したとします。では、その新しいユーザーが同じストアドプロシージャを実行できないようにするにはどうすればよいでしょうか。たとえsysadmin権限を持っていても、他のログインからsp_viewtblを保護する必要があります。

4
user3771136

Sysadminロールのメンバーは、SQL Serverのすべてに対する権限を拒否することはできません。 DENY(Transact-SQL) のドキュメントには次のように記載されています。

...ただし、オブジェクトの所有者またはsysadmin固定サーバーロールのメンバーにはDENYは適用されません。

したがって、sysadminがストアドプロシージャを実行できないようにするには、ストアドプロシージャにコードを配置して、ユーザーがsysadminであるかどうかを確認し、そうである場合はエラーを返す必要があります。ただし、システム管理者は次の方法で簡単に回避できます。

  • ストアドプロシージャの変更
  • 同じコードで新しいストアドプロシージャを作成し、sysadminをチェックする部分を取り除きます
  • sQLクライアントから、sysadminをチェックする部分を除いた同じコードを実行する
  • eXECUTE ASを使用して、別のユーザーとしてプロシージャを実行する

Sysadminユーザーが機密データを表示できないようにすることが目的である場合、その方法は Always Encrypted を使用することです。これにより、アプリケーションのみがアクセスできるキーを使用してデータが暗号化および復号化されます。システム管理者がテーブルを読み取る場合、暗号化されたデータのみが表示されます。

14
Tony Hinkle