なむゆだよ

なむゆなのだよ

隠せーーーー!!!デリケートなデータを隠すSQL Databaseの動的データマスク

f:id:nam_yu_sql:20210131165214j:plain この記事は後でclouf.config tech blogにマルチポストしています。

tech-blog.cloud-config.jp

はじめに

どうも、データベース設計やチューニングタスクが降ってくるのに備えて毎日素振りを欠かさないなむゆです。
最近DP-300の試験を受けようかと考えていて、その学習途中で触って気になったSQL Databaseの機能の「動的データマスク」について一席打ちたいと思います。

動的データマスクとは

動的データマスクとは、特権のないユーザーに対してデリケートなデータをマスクして表示し、データの公開を制限する機能です。
例えば、データベースの電話番号を保存するカラムをSELECT文で取得したとき、普通は全部のデータが表示されますが、この機能によって指定した電話番号のカラムに保存された番号全体を「XXX-XXX-XXXX」と表示したり、あるいは頭3文字だけ表示させたりといったことが可能になります。

使い方の例

まずは適当にSQL Databaseのインスタンスを作ります。
f:id:nam_yu_sql:20210131165319p:plainサーバーファイアウォールの設定」から現在のIPからの接続を許可することを忘れずに!
f:id:nam_yu_sql:20210131165343p:plain テーブルと初期データを挿入していきます。
SQL Databaseのクエリエディターで以下のようなクエリを打ちます。

CREATE TABLE [dbo].[User](  
    [UserId] [uniqueidentifier] NOT NULL,  
    [UserName] [nvarchar](max) NOT NULL,  
    [MailAddress] [nvarchar](max) NOT NULL,  
    [PhoneNumber] [nvarchar](max) NOT NULL,  
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED   
(  
    [UserId] ASC  
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]  
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]  
INSERT [dbo].[User] ([UserId], [UserName], [MailAddress], [PhoneNumber]) VALUES (N'a65571b6-a0d2-4711-a2b2-4dc7127ad901', N'Namuyu', N'namuyu@namuyuno.com', N'012-345-6789')  
INSERT [dbo].[User] ([UserId], [UserName], [MailAddress], [PhoneNumber]) VALUES (N'9fe245ea-a570-41c1-8ebf-9bd95d17c0ed', N'FumiFumi', N'fumifumi@fumii.com', N'098-765-4321')  

上記のクエリでUserテーブルとそこに2つ分のデータが挿入されます。
中でもメールアドレス(MailAddress)と電話番号(PhoneNumber)は機微なデータになります。
これらをいい感じに隠していきます。

Azure Portalの作成したSQL Databaseのメニューから「動的データマスキング」を選びます。
f:id:nam_yu_sql:20210131165356p:plain そうするとSQL Database上にあるマスキングした方がよさそうなカラムが自動でいくつかピックアップされます。マスキングしたいカラムは「マスクを追加」をクリックしてマスキングするルールに追加します。
f:id:nam_yu_sql:20210131165416p:plain 次はマスキングするルールでどのようなマスキングを施すか設定していきます。
設定したいルールをクリックして設定を開きます。
f:id:nam_yu_sql:20210131165425p:plain 例えばMailAddressのカラムには「電子メール」を選択します。選択したら「更新」を押しておきましょう。
f:id:nam_yu_sql:20210131165442p:plain 「電話番号」のカラムではもう少しカスタムしたフィールドを設定してみましょう。
マスクフィールド形式では「カスタム文字列」を選択します。
そうすると下に「公開されたプレフィックス」「文字列のパティング」「公開されたサフィックス」を設定するテキストボックスが出てきます。
この中の、プレフィクスとサフィックスはそれぞれ頭から何文字、最後から何文字は見せる形でマスキングをかけるかを設定します。
そして文字列のパディングはそれ以外の部分をどんな文字列で置き換えてマスキングするかを設定できます。
今回は公開されたプレフィックスは3文字、パディングは公開される3文字以降を全部Xで置き換えた「-XXX-XXXX」、差フィクスは0文字で設定してみましょう。
こちらも設定できたら更新を押して戻ります。
最後にマスクルール全体を「保存」を押して保存して設定完了となります。
f:id:nam_yu_sql:20210131165450p:plain これだけだけどこれだけじゃない!
この動的データマスクはデータベースの管理者には適用されません。データベース管理者(SQL Databaseの作成時に設定するアカウントがそれ)はDB作成初期から存在して最強の権限を持っている神なので少なくともその権限ではデータ全体を確認できるようになっています。
なので、動的データマスクによるマスキングが適用される一般ユーザーを作っておきましょう。
f:id:nam_yu_sql:20210131165458p:plain 再びクエリエディタに戻り、ユーザー作成のクエリ、権限付与のクエリを順に打ちます。
画像を参考にパスワード等はそれぞれ考えて設定してください。
f:id:nam_yu_sql:20210131165506p:plain 設定できたらクエリエディタ左上の「ログイン」から今しがた作成したユーザー情報でログインします。
そして、以下のようなクエリを打ってみましょう。

SELECT * FROM [User]  

すると画像のようにメールアドレスや電話番号がマスクされた結果が出力されるはずです!
f:id:nam_yu_sql:20210131165519p:plain ついでなので元の管理者ユーザーで再度ログインして同じクエリを打ってみましょう。
f:id:nam_yu_sql:20210131165528p:plain 今度は全部のデータが見えてしまいました。見てしまいましたね?

このようにして開発者でもあまり見てほしくないデータについては動的データマスクを施したうえで開発者には動的データマスクが行われる一般ユーザーでDBの操作を行ってもらい、一方でアプリケーションは動的データマスクの影響を受けないユーザーを使わせるような設定ができます。
これにより、アプリケーションでは必要なデータをすべて使うことができ、、開発者がデータベースを覗くときにはそれらのデータは見えないようにすることがでいます。

おわりに

今回はSQL データベースの機能でユーザーがデリケートな情報を見ようとしたときに自動でマスクがかけられる動的データマスクについて紹介しました。
これを使うことで、アプリケーションの機能には影響を与えずに「たとえ開発者といえどもユーザーの個人情報を見てはならない」といった要件にも対応できるようになります。
機微な個人情報を扱う際の要件によって出番が増えそうな気がする機能ですので、「こんなのあるんだ」と心に留めていただけると幸いです。

参考