列レベルのセキュリティ
列レベルのセキュリティでは、ユーザーの実行コンテキストまたはグループ メンバーシップに基づいて、テーブルの列へのアクセスを制御できます。
列レベルのセキュリティにより、アプリケーションのセキュリティの設計とコーディングが簡略化されるため、列のアクセスを制限して機密データを保護することができます。 たとえば、特定のユーザーが、所属する部門に関連するテーブルの一定の列にのみアクセスできるようにします。 アクセスの制限のロジックは、別のアプリケーション層のデータから離れてではなく、データベース層にあります。 任意の階層からデータ アクセスが試行されるたびに、データベースによってアクセス制限が適用されます。 この制限により、セキュリティ全体の外部からのアクセスが減り、そのシステムの信頼性と堅牢性が向上します。 さらに、列レベルのセキュリティは、列を除外してユーザーにアクセス制限を課すためのビューの導入も不要にします。
列レベルのセキュリティは 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
例
次の例では、TestUser
が Membership
テーブルの 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) や電話番号などの個人情報にアクセスできるようにします。
- 医療機関は、医師と看護師だけが機密の医療記録にアクセスできるようにする一方で、請求担当部門のメンバーがそのようなデータを表示できないようにします。