付与されているにもかかわらず、「オブジェクトに対するSELECT権限が拒否されました」を受け取る


11

私はプログラマーであり、dbaではありません...私は危険なだけのことを知っています。

私は、データベースのdb_ownerであるレガシーユーザーを持つデータベースを継承しました。ビジネス上の理由から、既存のテーブル、スキーマなどに対するこのユーザーの権限を調整することはできませんが、いくつかの新しいテーブルが作成されており、このユーザーにそれらのSELECTアクセスのみを許可します。

これらのテーブルに対するこのユーザーの権限が設定されているため、GRANTに設定されているSELECTを除いてすべてが拒否されます。

ただし、このユーザー(dbadmin)がこれらのテーブル(AccountingAudit)の1つでSELECTを実行しようとすると、次のエラーが発生します。

The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'.

このSQLを実行して、このテーブル/ユーザーに設定されている権限を確認しました。

select object_name(major_id) as object,
 user_name(grantee_principal_id) as grantee,
 user_name(grantor_principal_id) as grantor,
 permission_name,
 state_desc
from sys.database_permissions

そして、これは私が返すものです:

AccountingAudit dbadmin dbo ALTER   DENY
AccountingAudit dbadmin dbo CONTROL DENY
AccountingAudit dbadmin dbo DELETE  DENY
AccountingAudit dbadmin dbo INSERT  DENY
AccountingAudit dbadmin dbo REFERENCES  DENY
AccountingAudit dbadmin dbo SELECT  GRANT
AccountingAudit dbadmin dbo TAKE OWNERSHIP  DENY
AccountingAudit dbadmin dbo UPDATE  DENY
AccountingAudit dbadmin dbo VIEW DEFINITION DENY
AccountingAudit dbadmin dbo VIEW CHANGE TRACKING    DENY

それは正しく機能しているようです?

私が行っているSELECT呼び出しは、SSMS内からの非常に基本的なSELECT * FROM AccountingAuditです。私は特別なsp_executesqlやそのようなことをしていません。

私は明示的に許可を与えようとしました:

GRANT SELECT ON [dbo].AccountingAudit TO dbadmin

これは効果がありません(なぜそうなのか、上記のクエリはすでに許可されていることを示しています!;-)

私はstackoverflow.comやその他の場所を検索しましたが、まだ試していないものは見つかりません。スキーマの設定方法と関係があるのでしょうか。(現時点では、スキーマについてはほとんど知りません。)

何か案は?ありがとう!

回答:


10

ここではよくわかりませんが、手足を外に出ます。あなたの問題はあなたのDENY CONTROL記録にあるのではないかと思います。ページの下半分についてはこちらをご覧ください:

データベースのCONTROL権限を拒否すると、データベースのCONNECT権限が暗黙的に拒否されます。データベースのCONTROL権限が拒否されたプリンシパルは、そのデータベースに接続できません。

私はデータベースの例であることを理解していますが、もう1つ段階的なレベルで説明します。DENY CONTROLテーブルのA は、そのテーブルに対するすべての特権を拒否すると思います。a REVOKE CONTROLを実行してそれを取り除き、問題が解決するかどうかを確認します。

その場合、ユーザーをデータベースロールに配置するか、テーブルに対する明示的な権限を拒否する必要があります。


1
ありがとうございました!私が最初に実験したところ、CONTROLが拒否されなければSELECTできることがわかりました。しかし、BOLを読んで、私はこれを誤ってユーザーにテーブルの完全な制御権を与えていることを意味すると解釈しました。CONTROLを拒否しない限り、他のアクセス許可(INSERT、DELETEなど)をDENYレベルに維持し、必要なアクセス許可レベルを達成できることがわかりました。ありがとう!
Mason G. Zhwiti、2011年

これは、私の問題を解決していなくても、ほとんど見落とすだろうと私が賛成した繊細さです。これとは別に、Active Directoryグループを使用しているかどうか、グループメンバーシップを変更した場合、repadmin / syncallで問題が解決するわけではなく、サーバーを再起動すると問題が解決することがわかりました。しかし、まだハンマーアプローチの少ないものを探しています。
John Zabroski、

0
  1. ケンフィッシャーのsp_DBPermissionsストアドプロシージャを使用して、アクセス許可を確認します。

    1. ことを確認してくださいDENY CONTROL共通に加えて、テーブルに適用されていないDENY SELECTDENY INSERTDENY UPDATEDENY DELETEDENY REFERENCES
    2. 場合SELECTステートメントがテーブル値関数が含まれ、必ずどちらかがあることを確認してくださいEXECUTE AS OWNERテーブル値関数または上のGRANT EXECUTEそれに(なしDENY EXECUTE!)。これが事実である場合は、エラーメッセージを注意深く読んでください。SELECT権限がテーブルで拒否されたとは言えず、代わりにEXECUTEが拒否されたということです。
  2. ユーザーがADユーザーまたはグループの場合、次のスクリプトを使用してユーザーのlogin_token(s)を判別します。

EXECUTE AS LOGIN = 'EXAMPLEDOMAIN\JOHN.DOE';
SELECT * FROM sys.login_token;
REVERT;
  1. 実際の実行計画を見てください。エラーがのあるストアドプロシージャの内部にある場合、SET NOCOUNT ON;実際の実行計画は、SSMSの[メッセージ]タブを見るだけでは注意を払わないかもしれない洞察を提供します。

    1. トリガーまたはテンポラル表を探します。
  2. ステートメントをストアドプロシージャおよびSSMSの「オブジェクトの依存関係の表示」としてコンパイルし、Svetlana GolovkoがSQL Serverオブジェクトの依存関係を見つけるためのさまざまな方法で概説したトリックをコンパイルできます。

  3. SQL Serverプロファイラセキュリティイベント「監査スキーマオブジェクトアクセスイベント」と列「TextData」と「Success」を使用して、SQL Serverが権限を評価しているオブジェクトを追跡します。-このイベントで2つの行が発行され、1つの値がSuccess = 1を示し、もう1つの値がSuccess = 0を示す状況を見ました。このシナリオで、動作することがわかった唯一の解決策は、サーバーを再起動することです。実行repadmin /syncallしても問題は解決せず、アプリケーション(および接続プール)の起動と停止も行われませんでした。

  4. ログインの有効な権限を決定します。

-- '<domain>\<username>' is a domain user in the group you wish to test
EXECUTE AS LOGIN = '<domain>\<username>';
SELECT * FROM fn_my_permissions('Database.Schema.Table', 'OBJECT');
REVERT;
  1. ユーザーがADユーザーまたはグループに関連付けられている場合は、実行repadmin /syncallして、Active Directoryで行われた変更をドメインコントローラー間で強制的に同期することを検討してください。-誰かが2つのドメインコントローラの現在の値を比較する良い方法を知っている場合は、私に知らせてください。

  2. システム全体のハードリブートを検討する前に、そのユーザーのすべてのアクティブな接続を強制終了してみてください。その理由は、ユーザーがグループを含むDCからWindowsトークンを取得するためです。トークンは、ユーザーが新しいトークンを取得するまで更新されません。通常、ログオフしてからログオンし直します。

  3. システムをハードリブートします。それは私のために働いています。まだ理由はまだ100%わかりません。ダウンタイムを乗り切ることができる場合にのみ、これを行ってください!トランザクションが非常に大きい場合は、これを行うときに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.