sql >> データベース >  >> RDS >> Sqlserver

SQLServerセキュリティ関数HAS_Permis_BY_Nameとそのユースケースを理解する

    プリンシパルのセキュリティ保護可能なものの許可を確認したい場合は、複数のインスタンスがあります。先に進む前に、プリンシパル、セキュリティ保護可能なもの、および権限が何であるかを見てみましょう。

    Microsoftのドキュメントによると、

    1. セキュリティ保護対象 SQL Serverコンテキストでは、SQLServerデータベースエンジン認証システムがアクセスを制御する特定のリソースです。これらは、サーバー、データベース、スキーマの3つのカテゴリに分類されます。一般に、SQLServerまたはデータベースオブジェクトはセキュリティで保護できます。
    2. 許可 は、セキュリティ保護可能なものへの特定のレベルのアクセスを許可または拒否するために使用するコントロールです。
    3. プリンシパル は、セキュリティで保護可能なものへの許可を受け取るエンティティです。最も一般的なプリンシパルは、ログインとデータベースユーザーです。

    SQL Serverには、セキュリティ機能が組み込まれています HAS_Permis_BY_Name これは、特定されたプリンシパルが特定のセキュリティ保護可能なものに対して特定の許可を持っているかどうかを取得するのに役立ちます。このシステム関数は、特定のセキュリティ保護対象のプリンシパルに有効なアクセス許可が割り当てられている場合は1を返し、有効なアクセス許可が割り当てられていない場合は0を返します。有効な権限または保護可能なクラスが無効な場合は、NULL値を取得します。

    HAS_Permis_BY_Nameシステム関数は、ログインの許可を確認するのにも非常に役立ちます。この記事では、私のプリンシパルと他のプリンシパルのセキュリティ保護可能なものに対する特定の許可を確認するためのステップバイステップのプロセスを示します。

    このシステム関数のT-SQL構文は次のとおりです。

    --T-SQL syntax
    HAS_PERMS_BY_NAME (securable, securable_class, permission)
       

    このシステムSQLServerセキュリティ機能を実行するには、3つの必須パラメータが必要です。

    • 保護可能なの名前を入力します 許可を確認したいものについて。セキュリティ保護可能なサーバー自体がサーバーである場合は、NULLを使用する必要があります。
    • 2番目のパラメータはsecurable_class これはクラスの名前です。よくわからない場合は、別のシステム関数sys.fn_builtin_permissionsを使用して、保護可能なクラスとその使用可能な権限の完全なリストを取得できます。
    • 3番目のパラメータは許可です 指定されたセキュリティで保護できるものを確認する有効な許可を入力する必要がある場合。

    ここで、システム関数sys.fn_builtin_permissionsを実行して、使用可能なすべてのセキュリティ保護可能なクラスを示します。 DISTINCTを使用して、セキュリティ保護可能なクラスごとの行を表示しました。

    --Display all securable_class
    SELECT distinct class_desc FROM sys.fn_builtin_permissions(default)

    ここで、保護可能なクラスのリストを取得できます。

    セキュリティ保護可能なクラスのすべての可能な権限を確認する場合は、このシステム関数を使用することもできます。次のT-SQLステートメントを実行します。

    --Display each permission for all securable class
    SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default);

    下の画像でリストを見ることができます。 class_desc はセキュリティで保護可能なクラスであり、 permit_name 許可の一種です。セキュリティ保護可能なクラスと、セキュリティ保護可能なものについてチェックする権限がわからない場合は、このシステム関数を使用できます。

    HAS_Permis_BY_Nameのユースケース

    SQLServerインスタンスへの自分のログインとmanvendraという名前の追加ログインのさまざまなアクセス許可を確認する5つの使用例を示します。 。

    1. サーバーまたはインスタンスレベルの権限を確認する
    2. データベースレベルの権限を確認する
    3. オブジェクトレベルの権限を確認する
    4. ログイン権限を確認する
    5. フルテキストカタログ、スキーマなどの他の権限を確認してください。

    インスタンスレベルの権限を確認する最初のユースケースから始めましょう。

    ユースケース1:SQLServerまたはインスタンスレベルのアクセス許可を確認する

    この使用例では、サーバーのプリンシパル\ログインのさまざまなアクセス許可を確認する方法を示します。上記のT-SQLステートメントは、システム関数sys.fn_builtin_permissionsを使用して実行できます。この関数のWHERE句を使用して、サーバーレベルの権限のみを一覧表示できます。ここでは、自分の接続ログインのアクセス許可を示します。

    • サーバーの状態を表示
    • サーバーの役割を作成する
    • 任意のデータベースを接続する

    サーバーレベルで権限を探している場合は、セキュリティ保護可能な引数として常にNULLを渡す必要があります。この例では、NULLはサーバーレベルとして保護可能であり、上記のアクセス許可名にはアクセス許可引数があります。以下のT-SQLステートメントを実行して、サーバーレベルの権限を確認します。

    --Display server level permission for your own login using which you have established the database connection
    SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') AS [VIEW SERVER STATE],
    	HAS_PERMS_BY_NAME(null, null, 'CREATE SERVER ROLE') AS [CREATE SERVER ROLE],
    	HAS_PERMS_BY_NAME(null, null, 'CONNECT ANY DATABASE') AS [CONNECT ANY DATABASE]

    以下の画像に出力を示します。 T-SQLは、ログインのすべてのアクセス許可に対して1を返しました。これは、3つの操作すべてに対する権限があることを意味します。サーバーの状態を表示したり、サーバーの役割を作成したり、このサーバーまたはインスタンス上の任意のデータベースに接続したりできます。

    「manvendra」という名前のログインに上記の3つの操作に対する権限があるかどうかを示します。 EXECUTE AS LOGIN T-SQLステートメントを使用して、アクセスレベルを確認します。権限を確認しているログインに対して、IMPERSONATE権限があることを確認してください。 EXECUTE AS LOGINステートメントの後に、上記と同じT-SQLステートメントを実行します。

    --Display server level permission for another login ‘manvendra’
    EXECUTE AS LOGIN = ‘manvendra’
    GO
    SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') AS [VIEW SERVER STATE],
    	HAS_PERMS_BY_NAME(null, null, 'CREATE SERVER ROLE') AS [CREATE SERVER ROLE],
    	HAS_PERMS_BY_NAME(null, null, 'CONNECT ANY DATABASE') AS [CONNECT ANY DATABASE]

    ここでは、ログイン「manvendra」が、出力が0を返したため、サーバーレベルでこれら3つのアクティビティのいずれにもアクセスできないことがわかります。

    ユースケース2:データベースレベルの権限を確認する

    上記のセクションでは、サーバーまたはインスタンスレベルでプリンシパルのさまざまな権限を確認する方法を説明しました。次に、データベースレベルでプリンシパルのさまざまな権限を確認する方法を説明します。以下のステートメントを参照してください:

    --Display each permission for securable class ‘DATABASE’
    SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default)
    WHERE class_desc = ‘DATABASE’

    以下のスクリーンショットで、データベースレベルで利用可能な82の権限があることがわかります。

    以下の権限を選択して、自分のログインまたは追加のログイン「manvendra」にこれらのアクティビティを実行する権限があるかどうかを確認しました。

    • 任意
    • テーブルの作成
    • 手順の作成
    • 挿入
    • SELECT

    ここで、securableは権限を確認するデータベース名になり、securableクラスは「Database」になり、permissionは上記の権限名になります。以下のT-SQLステートメントを実行して、さまざまな権限を確認します。

    --Display few specific permissions for your own connected login on a DATABASE
    SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY') AS [DB Access],
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'INSERT') AS [INSERT Access],
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'SELECT') AS [SELECT Access]

    出力は、パーミッションごとに1を返しました。これは、現在のデータベースコンテキストで上記のすべてのアクティビティを実行する権限があることを意味します。

    以下のT-SQLステートメントを実行して、現在選択されているデータベースコンテキストでのログイン「manvendra」に対する同じ権限を確認します。

    --Display few specific permissions for login ‘manvendra’ on current database
    EXECUTE AS LOGIN ='manvendra'
    GO
    SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY') AS [DB Access],
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'INSERT') AS [INSERT Access],
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'SELECT') AS [SELECT Access]

    出力は、ログイン「manvendra」がこのデータベースに対して非常に制限された権限を持っていることを示しています。このログインはデータベースにのみ接続でき、残りの権限は許可されていません。

    ここでは、データベースコンテキストを変更し、データベース「AdventureWorksDW2019-TSQL」をセキュリティ保護可能な引数として選択し、ログイン「manvendra」に対して以下のステートメントを実行しました。

    --Display few specific permissions for login ‘manvendra’ on database ‘AdventureWorksDW2019-TSQL’
    EXECUTE AS LOGIN ='manvendra'
    GO
    SELECT HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'ANY') AS [DB Access],
    HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
    HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
    HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'INSERT') AS [INSERT Access],
    HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'SELECT') AS [SELECT Access]

    同じログイン「manvendra」には、このデータベース「AdventureWorks2019-TSQL」でのINSERTおよびSELECT操作に対する権限があります

    同様に、上記のT-SQLステートメントを実行して、ログイン用の個別のデータベースのアクセス許可を確認できます。出力には、すべての権限にアクセスできることが示されています。

    上記のシステムSQLServerセキュリティ機能を使用して、任意のプリンシパルに対する他のデータベースレベルの権限を確認できます。

    ユースケース3:オブジェクトレベルの権限を確認する

    このユースケースは、データベース内でのオブジェクトレベルのアクセス許可の使用を示しています。ここでも、以下のT-SQLステートメントを実行して、セキュリティ保護可能なクラス「OBJECT」で使用可能なすべての権限を一覧表示できます。システム関数sys.fn_builtin_permissionsのWHERE句を使用して、オブジェクトレベルの権限リストを表示しました。

    --Check all object level permissions
    SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default)
    WHERE class_desc ='OBJECT'

    これが、保護可能なクラスObjectの権限のリストです。

    次に、ログインアカウントの特定のオブジェクトに対する以下の権限を確認し、そのアカウントが以下の操作を実行するためのアクセス権を持っているかどうかを確認します。

    • 挿入
    • SELECT
    • 削除
    • 定義を表示

    データベースオブジェクト「dbo.dimAccount」をセキュリティ保護可能なクラスとして使用し、OBJECTをセキュリティ保護可能なクラスとして使用し、上記の権限を権限引数として使用しました。以下のステートメントを実行して、権限の詳細を表示します。

    --Check some specific object level permissions for your own login
    SELECT HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'INSERT') AS [Insert Permission],
    HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'SELECT') AS [Select Permission],
    HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'DELETE') AS [DELETE Permission],
    HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'VIEW DEFINITION') AS [VIEW DEFINITION Access]
    

    私はこのインスタンスのシステム管理者であるため、あらゆるレベルでチェックしている権限に対して、アカウントは1を返します。これは、私が完全な権限を持っていることを意味します。これは、以下のステートメントを実行することでも確認できます。

    以下のステートメントを実行して、ログイン「manvendra」の権限を確認します。

    --Check some specific object level permissions for another login ‘manvendra’
    EXECUTE AS USER ='manvendra'
    GO
    USE [AdventureWorksDW2019-TSQL]
    GO
    SELECT HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'INSERT') AS [Insert Permission],
    HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'SELECT') AS [Select Permission],
    HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'DELETE') AS [DELETE Permission],
    HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'VIEW DEFINITION') AS [VIEW DEFINITION Access]
    

    ログイン「manvendra」にはINSERT、SELECT、およびDELETE権限へのアクセス権がありますが、このアカウントにはデータベース「AdventureWorksDW2019-TSQL」内のこのオブジェクトの定義を表示する権限がありません。

    データベースAdventureWorksDW2019-TSQLのオブジェクト「DimAccount」で、このアカウント「manvendra」のDELETE操作へのDENYアクセスを適用します。これは下の画像で確認できます。

    この出力は、ログイン「manvendra」がINSERTステートメントとSELECTステートメントにのみアクセスでき、DELETEステートメントへのアクセス許可がないことを示していることがわかります。

    上記のシステム機能を使用して、データベースオブジェクトへのログインのさまざまなレベルのアクセスを確認します。

    ユースケース4:ログイン権限を確認する

    このユースケースは、ログインのさまざまな権限を確認する方法を理解するのに役立ちます。このシステムSQLServerセキュリティ関数HAS_PERMS_BY_NAMEを使用して、これらすべての種類の詳細を取得できます。

    以下のT-SQLステートメントを実行することで、特定のログインに使用できるすべてのアクセス許可を一覧表示できます。

    --List all available permission for securable class ‘LOGIN’
    SELECT class_desc, permission_name FROM sys.fn_builtin_permissions(default)
    WHERE class_desc ='LOGIN'

    以下は、セキュリティ保護可能なクラス「LOGIN」の権限名のリストです。

    以下のT-SQLステートメントを実行して、ログインにALTERまたはVIEWDEFINITION権限があるかどうかを確認します。このシステム関数では、ログインsaをセキュリティ保護可能な引数として使用し、LOGINをセキュリティ保護可能なクラス引数として使用し、ALTER&VIEWDEFINITIONをアクセス許可引数として使用しました。

    --Check ALTER & VIEW DEFINITION permission on securable sa
    SELECT HAS_PERMS_BY_NAME('sa', 'LOGIN', 'ALTER'),
    HAS_PERMS_BY_NAME('sa', 'LOGIN', 'VIEW DEFINITION')

    システム管理者として、私はこれらのアクセスレベルを持ち、出力も1として値を返すことによって検証されます。

    ログイン「manvendra」がログインsaのALTERまたはVIEW定義に対する権限を持っているかどうかを確認しましょう。

    --Check ALTER & VIEW DEFINITION permission on securable sa for principal ‘manvendra’
    EXECUTE AS USER ='manvendra'
    GO
    
    SELECT HAS_PERMS_BY_NAME('sa', 'LOGIN', 'ALTER'),
    HAS_PERMS_BY_NAME('sa', 'LOGIN', 'VIEW DEFINITION')

    出力はゼロ(0)として返されます。これは、ログイン「manvendra」に、ALTERまたはVIEWDEFINITIONログインsaへのアクセス許可がないことを意味します。

    このシステム機能を使用して、さまざまなログインのアクセスレベルを確認および理解します。

    ユースケース5:その他の権限を確認する

    ここでは、SCHEMAやFULLTEXT CATALOG、ENDPOINT、AVAILABILITYGROUPなどの他のセキュリティ保護可能なクラスについて説明します。

    まず、以下のステートメントを実行して、SCHEMAおよびFULLTEXTCATALOGのセキュリティ保護可能なクラスで使用可能なすべての権限をリストアップしましょう。

    --List all available permission for securable class ‘SCHEMA’ & ‘FTCatalog’. FTCatalog is full text catalog.
    SELECT class_desc, permission_name FROM sys.fn_builtin_permissions(default)
    WHERE class_desc='SCHEMA' OR
    class_desc= 'FULLTEXT CATALOG'

    次のステップは、プリンシパルをチェックするために探している権限を特定することです。セキュリティ保護可能なクラスSCHEMAのDELETEおよびALTER権限と、セキュリティ保護可能なクラスFULLTEXTCATALOGのALTERおよびVIEWDEFINITION権限を確認します。

    以下のステートメントで、SCHEMAセキュリティ保護クラスのdboとセキュリティ保護クラスFULLTEXT CATALOGのFTCatalogを渡したように、それぞれのセキュリティ保護可能ファイルを渡す必要があります。

    以下のT-SQLステートメントを実行して、ログインのアクセス許可を取得します。

    --List below permissions for securable class ‘SCHEMA’ & ‘FTCatalog’. 
    SELECT HAS_PERMS_BY_NAME('dbo', 'SCHEMA', 'DELETE') AS [Schema Deletion Access],
    HAS_PERMS_BY_NAME('dbo', 'SCHEMA', 'ALTER') AS [Schema Alter Access],
    HAS_PERMS_BY_NAME('[FTCatalog]', 'FULLTEXT CATALOG', 'ALTER') AS [FTC Alter Access],
    HAS_PERMS_BY_NAME('[FTCatalog]', 'FULLTEXT CATALOG', 'VIEW DEFINITION') AS [VIEW DEFINITION]

    以下の出力は、ログイン「manvendra」がSCHEMA削除にのみアクセスでき、残りのアクセスが拒否または取り消されたことを示しています。

    結論

    この記事では、プリンシパルの複数のセキュリティ保護可能なクラスのさまざまなアクセス許可を確認するためのステップバイステップのプロセスについて説明しました。このシステムSQLServerセキュリティ機能を使用して、アクセス許可チェックの要件を満たすこともできます。この記事を共有し、コメントセクションでフィードバックをお寄せください。改善できるようになります。


    1. 複合キーの行のグループごとのシリアル番号

    2. VMwareWorkstationを使用した仮想マシンへのSQLServer2019用のUbuntu18.04のインストール

    3. SQL置換関数内の正規表現パターン?

    4. Pythonpsycopg2がpostgresqlテーブルに挿入されていません