列レベルのセキュリティ

列レベルのセキュリティでは、ユーザーの実行コンテキストまたはグループ メンバーシップに基づいて、テーブルの列へのアクセスを制御できます。

列レベルのセキュリティにより、アプリケーションのセキュリティの設計とコーディングが簡略化されるため、列のアクセスを制限して機密データを保護することができます。 たとえば、特定のユーザーが、所属する部門に関連するテーブルの一定の列にのみアクセスできるようにします。 アクセスの制限のロジックは、別のアプリケーション層のデータから離れてではなく、データベース層にあります。 任意の階層からデータ アクセスが試行されるたびに、データベースによってアクセス制限が適用されます。 この制限により、セキュリティ全体の外部からのアクセスが減り、そのシステムの信頼性と堅牢性が向上します。 さらに、列レベルのセキュリティは、列を除外してユーザーにアクセス制限を課すためのビューの導入も不要にします。

列レベルのセキュリティは GRANT (オブジェクトのアクセス許可の許可) T-SQL 構文で実装できます。 このメカニズムでは、SQL 認証と Microsoft Entra ID (旧称 Azure Active Directory) 認証の両方がサポートされます。

WHERE 句フィルターに基づいて、テーブルに行レベルのセキュリティを適用する機能も検討してください。

最初の列は、ヘッダーに閉じた南京錠が示され、セルがオレンジ色になっており、その他の列は白色のセルである概略テーブルを示す図。

構文

オブジェクトのアクセス許可の GRANT ステートメントの構文を使用すると、テーブル上のコンマ区切りの列リストにアクセス許可を付与できます。

GRANT <permission> [ ,...n ] ON
    [ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
    TO <database_principal> [ ,...n ]
    [ WITH GRANT OPTION ]
    [ AS <database_principal> ]
<permission> ::=
    SELECT
  | UPDATE
<database_principal> ::=
      Database_user
    | Database_role
    | Database_user_mapped_to_Windows_User
    | Database_user_mapped_to_Windows_Group

次の例では、TestUserMembership テーブルの SSN 列にアクセスするのを制限する方法を示します。

社会保障番号を格納するために使用される SSN 列が含まれる Membership テーブルを作成します。

CREATE TABLE Membership
  (MemberID int IDENTITY,
   FirstName varchar(100) NULL,
   SSN char(9) NOT NULL,
   LastName varchar(100) NOT NULL,
   Phone varchar(12) NULL,
   Email varchar(100) NULL);

機密データを含む SSN以外のすべての列へのアクセスを TestUser に許可します。

GRANT SELECT ON Membership(MemberID, FirstName, LastName, Phone, Email) TO TestUser;

TestUser として実行されたクエリは、SSN 列が含まれている場合に失敗します。

SELECT * FROM Membership;

結果として発生するエラーと:

Msg 230, Level 14, State 1, Line 12
The SELECT permission was denied on the column 'SSN' of the object 'Membership', database 'CLS_TestDW', schema 'dbo'.

ユース ケース

現在、列レベルのセキュリティを使用する方法の例を次に示します。

  • 金融サービス会社は、アカウント マネージャーだけが、顧客の社会保障番号 (SSN) や電話番号などの個人情報にアクセスできるようにします。
  • 医療機関は、医師と看護師だけが機密の医療記録にアクセスできるようにする一方で、請求担当部門のメンバーがそのようなデータを表示できないようにします。

次の手順