SQL Serverの情報スキーマへのアクセスを拒否する


13

sys.tables/ へのアクセスを無効にする最良の方法を探していますInformation SchemaSQL Serverのユーザー/グループのます。

見つけた は2008年からこのスレッド

次のようにアクセスを拒否する方法を示します[sys].[something]

 DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
 GO

しかし、アクセスを無効にする方法はありませんInformation Schema

DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole

これは機能しないようです。

information_schemaへのアクセスを無効にするにはどうすればよいですか?

そして、すべてへのアクセスを無効にする簡単な方法がありますsys/information_schema

更新: 実際には、次のステートメントの両方を実行することはできません。

DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO

ユーザーが存在する特定のDBでそれらを実行しようとし、「マスター」でも試しました。

私はまだ実行できます:

 SELECT * from
 INFORMATION_SCHEMA.TABLES 

->まだ結果を返します

 SELECT * from
 sys.TABLES 

->もう結果なし

SCHEMA::クエリに含めると、セキュリティ保護可能なオブジェクトを作成できるようになりました

DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO

しかし、今でもDBからすべての情報を選択できます。

Management Studio 2008のユーザーのプロパティウィンドウで「セキュリティ保護可能な」タブを確認したところ、次のようになりました。

sys.tablesの選択をブロックするエントリ

スキーマ:sys、名前:テーブル、タイプ:ビュー

sys.tablesのアクセス許可:Permission:Select、Grantor:dbo、Denyがチェックされます

選択をブロックしないエントリ

スキーマ:、名前:INFORMATION_SCHEMA、タイプ:スキーマ

INFORMATION_SCHEMAの権限:Permission:Select、Grantor:dbo、Denyはチェックされません(チェックしようとしましたが、チャンスはありません。)

Permission:Select、Grantor:INFORMATION_SCHEMA、Denyがチェックされます


GUIでアクセス許可を設定しようとしましたが、アクセス許可の設定がマスターDBでのみ可能であるという同じエラーが表示されます。しかし、マスターDBセキュリティにユーザー/ログインを追加していません。

解決:

deny作業を行うことができる唯一の方法は、ユーザーをmaster-dbinformation_schema追加し、マスターで実行することでしたdeny select

DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO

また、このコードのように、単一のテーブルに対してのみ実行できます。


1
また、チェックアウトこのdba.seの質問とレムスRusanuによってその答えを並べ替えカバーの同じトピック-
marc_s

そう、ありがとう。実際には、[information_schema]ビューと[sys]ビューの拒否の違いは、[information_schema]をマスターで無効にする必要があり(すべてのDBに影響する)、[sys]ビューを無効にする必要があることです。すべてのデータベース自体、およびマスターで無効になっている場合でも、現在のデータベースでも無効になっていない場合、ユーザーはビューから選択できます。
SwissCoder

回答:


10

スキーマ全体sysinformation_schemaスキーマ全体のアクセス許可を単に拒否できる必要があります。

DENY SELECT On SCHEMA::sys To [user_name]
DENY SELECT On SCHEMA::INFORMATION_SCHEMA To [user_name]

基本的には、そのユーザーがこれら2つのスキーマで選択を行うことを防ぐだけです。


答えとしてマークされていますが、問題はSCHEMA ::です。助けにはならなかったので、もう一度削除してください。解決策は、ユーザーをmasterデータベースに追加してから、マスターで拒否スクリプトを実行することです。ご協力ありがとうございました!
スイスコーダー

ああ、実際には、SCHEMA全体を無効にすることもできません。このように、単一のテーブルへのアクセスのみを無効にできます。
-SwissCoder

5

まず、[sys]および[INFORMATION_SCHEMA]スキーマへのアクセスを防止する(やや直感に反する)方法は、最初にログイン(サーバーレベルのプリンシパル)がユーザー(erm、データベースレベルのプリンシパル)マスターデータベース。

簡単にするためにSQLログインがあると仮定します。

CREATE LOGIN [testy] WITH PASSWORD=N'SCoBIqlJELGzrY9zYsKWC5z3kHtMsyCAP6yBHLUYQ0w='
go

次に、masterデータベースに対応するユーザーを作成します。

use [master]
go
CREATE USER [testy] FOR LOGIN [testy]
go

ここで、このログインがシステム提供のスキーマ([sys]および[INFORMATION_SCHEMA])のテーブルにアクセスするのを防ぎたいとします。

SQL Server 2008 R2とSQL Server 2012の間に動作の変更があったようです。

SQL Server 2012(およびおそらくそれ以降のバージョン)では、[master]データベースで次を実行すると、期待どおりに動作します。

DENY SELECT, VIEW DEFINITION ON SCHEMA::[sys] to [testy];
GO
DENY SELECT, VIEW DEFINITION ON SCHEMA::[INFORMATION_SCHEMA] to [testy];
GO

ただし、SQL Server 2008 R2(およびおそらく以前のバージョン)では、これらのスキーマのオブジェクトへのアクセスを[public]のメンバーに許可する株式付与ステートメントは、上記のDENYステートメントをオーバーライドするようです。したがって、2008 R2では、[public]への各GRANTに対して明示的に拒否する必要があります。これを行うスクリプトを次に示します。

declare
    @database_principal sysname,
    @cur cursor,
    @sql nvarchar( 4000 );

set @database_principal = 'testy';

set @cur = cursor local forward_only static for
    select 
        'DENY ' +
        permission_name + ' on ' +
        case class 
            when 1 then
                case minor_id
                    when 0 then 'OBJECT'
                    else 'COLUMN'
                end
            else
                class_desc
        end + '::' +
        case class
            when 0 then db_name()
            when 1 then quotename( OBJECT_SCHEMA_NAME(major_id) ) + '.' + quotename( object_name( major_id ) ) + case minor_id when 0 then '' else ( select '.' + quotename( name ) collate database_default from sys.columns where column_id=minor_id) end
            when 3 then schema_name( major_id )
        end + ' to ' +
        quotename( @database_principal )
    from
        sys.database_permissions
    where
        [grantee_principal_id] = 0 -- public
        and
        [state_desc] = 'GRANT'
        and
        [permission_name] = 'SELECT'
;

open @cur;

while
    1 = 1
begin
    fetch @cur into @sql;
    if @@fetch_status <> 0 break;

    print @sql;
    exec sys.sp_executesql @sql;
end;

close @cur;

deallocate @cur;

masterデータベースで上記を実行すると、これらのスキーマのコンテンツへのアクセスが削除されました。

ノート:

  1. これらは明示的なDENYステートメントであるため、スクリプトが実行される時点で正しいです。その後、誰かがパブリックに付与された許可を変更した場合(たとえば、サービスパックが新しいシステムテーブルを作成した場合)、それは拒否されたユーザーに公開されます
  2. データベースロールをDENYステートメントのターゲットとして使用し、拒否されたユーザーをそのロールに配置することをお勧めします。
  3. これを取り消すには、拒否を取り消しに変更します。
  4. 上記のスクリプトで次の2行をコメントアウトした場合:

        and
        [permission_name] = 'SELECT'

    パブリックのすべてのデフォルトGRANTを取り消す効果があります。これにより、たとえばsys.sp_tablesへのアクセスが妨げられるため、たとえばMicrosoft Accessがテーブルを列挙する機能をまったく破壊しますが、これを行うだけでユーザーが明示的に許可した場所にのみアクセスできるようにすることは、高セキュリティシナリオで役立ちますそれ。


3

誰も言及していないので、このトリックがいつ利用可能になったかはわかりませんが、少なくともSQL Server 2008以降は機能しているようです。

DENY VIEW DEFINITION to [database-role / database-user];

上記作品なしにユーザーを追加する必要がmaster他の回答の一部で述べたように、データベース。


素晴らしい答えです!パーtechnet.microsoft.com/en-us/library/ms175808(v=sql.105).aspx「ネゲート指定されたデータベースで付与者のためのメタデータアクセス権限は、ベース」
クリス・アントン・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.