動的なデータ マスキングDynamic Data Masking

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse noParallel Data Warehouse

動的なデータ マスキング

動的データ マスク (DDM) では、機密データをマスクすることにより、特権のないユーザーへの機密データの公開を制限します。Dynamic data masking (DDM) limits sensitive data exposure by masking it to non-privileged users. DDM を使用すると、アプリケーションのセキュリティの設計とコーディングを大幅に簡略化することができます。It can be used to greatly simplify the design and coding of security in your application.

動的データ マスクでは、公開する機密データの量を指定することで、そのようなデータに対する未承認のアクセスを防ぎ、アプリケーション レイヤーへの影響が最小限に抑えられます。Dynamic data masking helps prevent unauthorized access to sensitive data by enabling customers to specify how much sensitive data to reveal with minimal impact on the application layer. DDM は、指定されたデータベース フィールドで、クエリの結果セットに含まれる機密データを隠蔽するように構成できます。DDM can be configured on designated database fields to hide sensitive data in the result sets of queries. DDM によって、データベース内のデータが変更されることはありません。With DDM the data in the database is not changed. 動的データ マスクは、クエリの結果にマスク ルールが適用されるため、既存のアプリケーションで簡単に使用できます。Dynamic data masking is easy to use with existing applications, since masking rules are applied in the query results. 多くのアプリケーションは、既存のクエリを変更せずに、デリケートなデータをマスクすることができます。Many applications can mask sensitive data without modifying existing queries.

  • 中央のデータ マスク ポリシーは、データベースの機密フィールドに対して直接動作します。A central data masking policy acts directly on sensitive fields in the database.
  • 機密データに対するアクセス権を持つ特権のあるユーザーまたはロールを指定します。Designate privileged users or roles that do have access to the sensitive data.
  • DDM には、フル マスク関数と部分マスク関数、および数値データ用のランダム マスクがあります。DDM features full masking and partial masking functions, and a random mask for numeric data.
  • 単純な Transact-SQLTransact-SQL コマンドで、マスクを定義し、管理します。Simple Transact-SQLTransact-SQL commands define and manage masks.

たとえば、コール センターのサポート担当者は、社会保障番号やクレジット カード番号などの数桁から顧客を識別することがあります。As an example, a call center support person may identify callers by several digits of their social security number or credit card number. 社会保障番号やクレジット カード番号はサポート担当者にすべて公開するべきではありません。Social security numbers or credit card numbers should not be fully exposed to the support person. クエリの結果セットの社会保障番号やクレジット カード番号の末尾 4 桁を除くすべての番号をマスクするマスク ルールを設定することができます。A masking rule can be defined that masks all but the last four digits of any social security number or credit card number in the result set of any query. また、別の例として、適切なデータ マスクを使用して、個人を特定できる情報 (PII) データを保護すると、開発者は法令遵守規定に違反せずに、トラブルシューティングを行うために運用環境に対してクエリを実行することができます。For another example, by using the appropriate data mask to protect personally identifiable information (PII) data, a developer can query production environments for troubleshooting purposes without violating compliance regulations.

動的データ マスクの目的は、アクセスすべきではないユーザーがデータを閲覧することを防ぎ、デリケートなデータの公開を制限することにあります。The purpose of dynamic data masking is to limit exposure of sensitive data, preventing users who should not have access to the data from viewing it. 動的データ マスクは、ユーザーが直接データベースに接続し、徹底的なクエリを実行して、デリケートなデータの漏えいを防ぐことを目的としてはいません。Dynamic data masking does not aim to prevent database users from connecting directly to the database and running exhaustive queries that expose pieces of the sensitive data. 動的データ マスクは、その他の SQL ServerSQL Server セキュリティ機能 (監査、暗号化、行レベルのセキュリティなど) を補完します。データベース内のデリケートなデータの保護をより強化するために、セキュリティ機能と連携して動的データ マスクを使用することをお勧めします。Dynamic data masking is complementary to other SQL ServerSQL Server security features (auditing, encryption, row level security...) and it is highly recommended to use this feature in conjunction with them in addition in order to better protect the sensitive data in the database.

動的データ マスクは SQL Server 2016 (13.x)SQL Server 2016 (13.x)Azure SQL データベースAzure SQL Databaseで使用できます。 Transact-SQLTransact-SQL をコマンドを使用して構成します。Dynamic data masking is available in SQL Server 2016 (13.x)SQL Server 2016 (13.x) and Azure SQL データベースAzure SQL Database, and is configured by using Transact-SQLTransact-SQL commands. Azure portal で動的データ マスクを構成する方法の詳細については、SQL Database 動的データ マスクの使用 (Azure ポータル)に関するページを参照してください。For more information about configuring dynamic data masking by using the Azure portal, see Get started with SQL Database Dynamic Data Masking (Azure portal).

動的データ マスクを定義するDefining a Dynamic Data Mask

マスク ルールは、列のデータを難読化するために、テーブル内の列で定義することがあります。A masking rule may be defined on a column in a table, in order to obfuscate the data in that column. 4 種類のマスクを利用できます。Four types of masks are available.

機能Function [説明]Description 使用例Examples
既定Default 指定のフィールドのデータ型に応じたフル マスク。Full masking according to the data types of the designated fields.

文字列データ型 (charncharvarcharnvarchartextntext) のフィールドのサイズが 4 文字未満の場合は、XXXX またはそれ未満の数の X を使用します。For string data types, use XXXX or fewer Xs if the size of the field is less than 4 characters (char, nchar, varchar, nvarchar, text, ntext).

数値データ型 (bigintbitdecimalintmoneynumericsmallintsmallmoneytinyintfloatreal) の場合は値 0 を使用します。For numeric data types use a zero value (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real).

日付/時刻のデータ型 (datedatetime2datetimedatetimeoffsetsmalldatetimetime) の場合は、01.01.1900 00:00:00.0000000 を使用します。For date and time data types use 01.01.1900 00:00:00.0000000 (date, datetime2, datetime, datetimeoffset, smalldatetime, time).

バイナリ データ型 (binaryvarbinaryimage) の場合は、ASCII 値 0 のシングル バイトを使用します。For binary data types use a single byte of ASCII value 0 (binary, varbinary, image).
列定義の構文例: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULLExample column definition syntax: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

ALTER 構文例: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')Example of alter syntax: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
EmailEmail メール アドレスの最初の 1 文字と定数サフィックスの ".com" をメール アドレスのフォームで公開するマスク方法。Masking method that exposes the first letter of an email address and the constant suffix ".com", in the form of an email address. aXXX@XXXX.comaXXX@XXXX.com. 定義の構文例: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULLExample definition syntax: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

ALTER 構文例: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')Example of alter syntax: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
ランダムRandom ランダム マスク関数は任意の数字型に使用でき、指定した範囲内で生成したランダムな値でオリジナルの値をマスクします。A random masking function for use on any numeric type to mask the original value with a random value within a specified range. 定義の構文例: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')Example definition syntax: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')

ALTER 構文例: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')Example of alter syntax: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
カスタム文字列Custom String 間にカスタム埋め込み文字列を追加し、最初と最後の文字を公開するマスク方法。Masking method that exposes the first and last letters and adds a custom padding string in the middle. prefix,[padding],suffix

注:元の文字列が全体をマスクするには短すぎる場合、プレフィックスまたはサフィックスの一部は公開されません。Note: If the original value is too short to complete the entire mask, part of the prefix or suffix will not be exposed.
定義の構文例: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULLExample definition syntax: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

ALTER 構文例: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')Example of alter syntax: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

その他の例:Additional examples:

ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)')

ALTER COLUMN [Social Security Number] ADD MASKED WITH (FUNCTION = 'partial(0,"XXX-XX-",4)')

アクセス許可Permissions

動的データ マスクでテーブルを作成するのに特別なアクセス許可は要りません。スキーマ アクセス許可に対する CREATE TABLEALTER のみ必要です。You do not need any special permission to create a table with a dynamic data mask, only the standard CREATE TABLE and ALTER on schema permissions.

列のマスクを追加、置換、削除するには、 ALTER ANY MASK アクセス許可と、テーブルに対する ALTER アクセス許可が必要です。Adding, replacing, or removing the mask of a column, requires the ALTER ANY MASK permission and ALTER permission on the table. セキュリティの責任者には、 ALTER ANY MASK の付与が適切です。It is appropriate to grant ALTER ANY MASK to a security officer.

テーブルに対して SELECT アクセス許可を持つユーザーは、テーブル データを閲覧できます。Users with SELECT permission on a table can view the table data. マスク済みとして定義されている列には、マスクされたデータが表示されます。Columns that are defined as masked, will display the masked data. UNMASK アクセス許可を付与されたユーザーは、マスクが定義された列から、マスクを解除したデータを取得できます。Grant the UNMASK permission to a user to enable them to retrieve unmasked data from the columns for which masking is defined.

データベースに対する CONTROL アクセス許可には、 ALTER ANY MASKUNMASK の両方のアクセス許可が含まれます。The CONTROL permission on the database includes both the ALTER ANY MASK and UNMASK permission.

ベスト プラクティスと一般的なユース ケースBest Practices and Common Use Cases

  • 列にマスクを作成しても、その列に対する更新を妨げることはありません。Creating a mask on a column does not prevent updates to that column. マスクされた列にクエリを実行すると、ユーザーはマスクされたデータを受け取りますが、書き込みアクセス許可があるユーザーは、データを更新できます。So although users receive masked data when querying the masked column, the same users can update the data if they have write permissions. 更新する許可を制限するために、適切なアクセス制御ポリシーを使用する必要があります。A proper access control policy should still be used to limit update permissions.

  • SELECT INTO または INSERT INTO を使用して、マスクされた列を別のテーブルにコピーすると、対象のテーブルにマスクされたデータが表示されます。Using SELECT INTO or INSERT INTO to copy data from a masked column into another table results in masked data in the target table.

  • 動的データ マスクは、 SQL ServerSQL Server インポートとエクスポートを実行すると適用されます。Dynamic Data Masking is applied when running SQL ServerSQL Server Import and Export. マスクされた列を含むデータベースは、マスクされたデータを含むエクスポートされたデータ ファイルを生成し (UNMASK 特権がないユーザーがエクスポートしたことを前提とします)、インポートされたデータベースは、マスクされたデータを静的に格納します。A database containing masked columns will result in an exported data file with masked data (assuming it is exported by a user without UNMASK privileges), and the imported database will contain statically masked data.

マスクされた列に対してクエリを実行するQuerying for Masked Columns

sys.masked_columns ビューを使用して、マスク関数が適用されたテーブルの列に対してクエリを実行します。Use the sys.masked_columns view to query for table-columns that have a masking function applied to them. このビューが継承、 sys.columns ビューです。This view inherits from the sys.columns view. sys.columns ビューのすべての列と、 is_masked 列および masking_function 列を返して、マスクされた列かどうかを示し、マスクされた列の場合は、どのようなマスキング関数が定義されているかを示します。It returns all columns in the sys.columns view, plus the is_masked and masking_function columns, indicating if the column is masked, and if so, what masking function is defined. これは、列があるマスキング関数が適用されるは表示のみを表示します。This view only shows the columns on which there is a masking function applied.

SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function  
FROM sys.masked_columns AS c  
JOIN sys.tables AS tbl   
    ON c.[object_id] = tbl.[object_id]  
WHERE is_masked = 1;  

制限事項と制約事項Limitations and Restrictions

次の列の型には、マスク ルールを定義することはできません。A masking rule cannot be defined for the following column types:

  • 暗号化された列 (常に暗号化されます)Encrypted columns (Always Encrypted)

  • FILESTREAMFILESTREAM

  • COLUMN_SET、または列セットの一部であるスパース列COLUMN_SET or a sparse column that is part of a column set.

  • マスクは計算列に構築できません。ただし、計算列が MASK を所有する列に依存する場合は、計算列がマスクされたデータを返します。A mask cannot be configured on a computed column, but if the computed column depends on a column with a MASK, then the computed column will return masked data.

  • データ マスクを持つ列を FULLTEXT インデックスのキーにすることはできません。A column with data masking cannot be a key for a FULLTEXT index.

UNMASK アクセス許可のないユーザーの場合、非推奨とされている READTEXTUPDATETEXT、および WRITETEXT ステートメントは、動的データ マスク用に構成された列で適切に動作しません。For users without the UNMASK permission, the deprecated READTEXT, UPDATETEXT, and WRITETEXT statements do not function properly on a column configured for Dynamic Data Masking.

動的データ マスクの追加は基になっているテーブルでのスキーマ変更として実装されるため、依存関係を持つ列では実行できません。Adding a dynamic data mask is implemented as a schema change on the underlying table, and therefore cannot be performed on a column with dependencies. この制限を回避するには、最初に依存関係を削除してから、動的データ マスクを追加した後、依存関係を再作成します。To work around this restriction, you can first remove the dependency, then add the dynamic data mask and then re-create the dependency. たとえば、依存関係がその列に依存するインデックスによるものである場合は、インデックスを削除し、マスクを追加してから、依存するインデックスを再作成します。For example, if the dependency is due to an index dependent on that column, you can drop the index, then add the mask, and then re-create the dependent index.

セキュリティに関する注意:推論またはブルートフォース手法を使用してマスクをバイパスするSecurity Note: Bypassing masking using inference or brute-force techniques

動的データ マスクは、アプリケーションに使用される事前定義されたクエリ セットのデータ公開を制限することで、アプリケーション開発を単純化するために設計されています。Dynamic Data Masking is designed to simplify application development by limiting data exposure in a set of pre-defined queries used by the application. 動的データ マスクは、実稼働データベースに直接アクセスするときに機密データが誤って公開されることを防ぐためにも有効ですが、アドホック クエリ アクセス許可を持つ特権のないユーザーが、実際のデータに対するアクセス権を得る手法を適用する可能性にも注意する必要があります。While Dynamic Data Masking can also be useful to prevent accidental exposure of sensitive data when accessing a production database directly, it is important to note that unprivileged users with ad-hoc query permissions can apply techniques to gain access to the actual data. このようなアドホック アクセス権を付与する必要がある場合、すべてのデータベース操作を監視し、このシナリオを軽減するために監査を使用することをお勧めします。If there is a need to grant such ad-hoc access, Auditing should be used to monitor all database activity and mitigate this scenario.

たとえば、データベースに対してアドホック クエリを実行する十分な特権を持つデータベース プリンシパルがいて、基になるデータを ’推測’ し、最終的には実際の値を推測しようと試みているとします。As an example, consider a database principal that has sufficient privileges to run ad-hoc queries on the database, and tries to 'guess' the underlying data and ultimately infer the actual values. 管理者は [Employee].[Salary] 列に対してマスクを定義しましたが、このユーザーはデータベースに直接接続し、値の推測を開始し、最終的には従業員セットの [Salary] 値を推測します。Assume that we have a mask defined on the [Employee].[Salary] column, and this user connects directly to the database and starts guessing values, eventually inferring the [Salary] value of a set of Employees:

SELECT ID, Name, Salary FROM Employees
WHERE Salary > 99999 and Salary < 100001;
IdId NameName SalarySalary
6254362543 Jane DoeJane Doe 00
9124591245 John SmithJohn Smith 00

この例は、データベースに対してアドホック クエリを実行するユーザーから、機密データをセキュリティで完全に保護する唯一の手段として動的データ マスクを使用すべきではないことを示しています。This demonstrates that Dynamic Data Masking should not be used as an isolated measure to fully secure sensitive data from users running ad-hoc queries on the database. 動的データ マスクは偶発的な機密データの公開を防ぐ場合に適していますが、基になるデータを推測する悪意のある攻撃を防ぐためのものではありません。It is appropriate for preventing accidental sensitive data exposure, but will not protect against malicious intent to infer the underlying data.

データベースのアクセス許可を適切に管理し、必要最小限のアクセス許可の原則に常に従うことが重要です。It is important to properly manage the permissions on the database, and to always follow the minimal required permissions principle. また、データベースに対して実行されるすべてのアクティビティを追跡するために、必ず監査を有効にしてください。Also, remember to have Auditing enabled to track all activities taking place on the database.

使用例Examples

動的データ マスクを作成するCreating a Dynamic Data Mask

次の例では、3 種類の動的データ マスクでテーブルを作成します。The following example creates a table with three different types of dynamic data masks. この例ではテーブルを作成し、結果を表示するように選びます。The example populates the table, and selects to show the result.

CREATE TABLE Membership  
  (MemberID int IDENTITY PRIMARY KEY,  
   FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') NULL,  
   LastName varchar(100) NOT NULL,  
   Phone varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,  
   Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL);  
  
INSERT Membership (FirstName, LastName, Phone, Email) VALUES   
('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com'),  
('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co'),  
('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net');  
SELECT * FROM Membership;  

新しいユーザーが作成され、テーブルに対する SELECT アクセス許可が付与されました。A new user is created and granted SELECT permission on the table. TestUser ビューのマスクされたデータとして、クエリが実行されます。Queries executed as the TestUser view masked data.

CREATE USER TestUser WITHOUT LOGIN;  
GRANT SELECT ON Membership TO TestUser;  
  
EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;  

次のようにデータが変更された結果によって、マスクが示されます。The result demonstrates the masks by changing the data from

1 Roberto Tamburello 555.123.4567 RTamburello@contoso.com

変更前:into

1 RXXXXXXX Tamburello xxxx RXXX@XXXX.com

既存の列のマスクを追加または編集するAdding or Editing a Mask on an Existing Column

ALTER TABLE ステートメントを使用して、テーブル内の既存の列にマスクを追加したり、その列のマスクを編集したりします。Use the ALTER TABLE statement to add a mask to an existing column in the table, or to edit the mask on that column.
次の例では、マスク関数を LastName 列に追加します。The following example adds a masking function to th LastName column:

ALTER TABLE Membership  
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"XXX",0)');  

次の例では、 LastName 列のマスク関数を変更します。The following example changes a masking function on the LastName column:

ALTER TABLE Membership  
ALTER COLUMN LastName varchar(100) MASKED WITH (FUNCTION = 'default()');  

アクセス許可を付与して、マスクが解除されたデータを表示するGranting Permissions to View Unmasked Data

UNMASK アクセス許可が付与されると、 TestUser は、マスクが解除されたデータを閲覧できるようになります。Granting the UNMASK permission allows TestUser to see the data unmasked.

GRANT UNMASK TO TestUser;  
EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;   
  
-- Removing the UNMASK permission  
REVOKE UNMASK TO TestUser;  

動的データ マスクをドロップするDropping a Dynamic Data Mask

次のステートメントは、先ほどの例で作成された LastName 列のマスクをドロップします。The following statement drops the mask on the LastName column created in the previous example:

ALTER TABLE Membership   
ALTER COLUMN LastName DROP MASKED;  

参照See Also

CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
column_definition (Transact-SQL) column_definition (Transact-SQL)
sys.masked_columns (Transact-SQL) sys.masked_columns (Transact-SQL)
SQL Database 動的データ マスクの使用 (Azure portal)Get started with SQL Database Dynamic Data Masking (Azure portal)