Microsoft Defender for SQL とデータ分類を有効にする
推定所要時間:30 分
学生は、レッスンで得た情報を利用して、Azure portal と AdventureWorks データベース内でセキュリティを構成して実装します。
データベース環境のセキュリティを確保するために、シニア データベース管理者として採用されました。 これらのタスクは Azure SQL Database に焦点を当てます。
📝 これらの演習では、T-SQL コードをコピーして貼り付け、既存の SQL リソースを使うように求められます。 コードを実行する前に、コードが正しくコピーされていることを確認してください。
環境をセットアップします
ラボ仮想マシンが提供され、事前に構成されている場合は、C:\LabFiles フォルダーにラボ ファイルが用意されているはずです。 少し時間をとって確認してください。ファイルが既に存在存在している場合には、このセクションをスキップしてください。 ただし、独自のマシンを使用している場合、またはラボ ファイルが見つからない場合は、 GitHub からそれらを複製して続行する必要があります。
-
ラボ仮想マシン、または提供されていない場合はローカル コンピューターから、Visual Studio Code のセッションを起動します。
-
コマンド パレット (Ctrl+Shift+P) を開き、「Git Clone」と入力します。 [Git: Clone] オプションを選択します。
-
[Repository URL] フィールドに次の URL を貼り付け、Enter キーを押します。
https://github.com/MicrosoftLearning/dp-300-database-administrator.git
-
リポジトリを、ラボ仮想マシン、または提供されていない場合はローカル コンピューターの [C:\LabFiles] フォルダーに保存してください(フォルダーが存在しない場合は作成します)。
Azure で SQL Server を構成する
Azure にログインし、Azure で実行されている既存の Azure SQL Server インスタンスがあるかどうかを確認します。 Azure で SQL Server インスタンスが既に実行されている場合は、このセクションをスキップします。
-
ラボ仮想マシン、または提供されていない場合はローカル コンピューターから、Visual Studio Code セッションを起動し、前のセクションから複製されたリポジトリに移動します。
-
/Allfiles/Labs フォルダーを右クリックし、[統合ターミナルで開く] を選択します。
-
Azure CLI を使用して Azure に接続しましょう。 次のコマンドを入力して、Enter キーを押します。
az login
📝 ブラウザー ウィンドウが開くことに注意してください。 ログインには Azure 資格情報を使用してください。
-
Azure にログインしたら、リソース グループがまだ存在しない場合は作成し、そのリソース グループの下に SQL サーバーとデータベースを作成します。 次のコマンドを入力して、Enter キーを押します。 スクリプトが完了するまで数分かかります。
cd ./Setup ./deploy-sql-database.ps1
📝 既定では、このスクリプトは contoso-rg というリソース グループを作成するか、名前が contoso-rg (存在する場合) で始まるリソースを使用していることに注意してください。 既定では、 West US 2 リージョン (westus2) にもすべてのリソースが作成されます。 最後に、 SQL 管理者パスワードのランダムな 12 文字のパスワードを生成します。 これらの値は、パラメーター -rgName、-location、-sqlAdminPw のいずれかまたは複数を使用して、任意の値に変更することができます。 パスワードは Azure SQL のパスワードの複雑さの要件を満たす必要があります。具体的には、12文字以上で、大文字 1 文字、小文字 1 文字、数字 1 つ、特殊文字 1 つを含める必要があります。
📝 スクリプトによって、現在のパブリック IP アドレスが SQL Server ファイアウォール規則に追加されることに注意してください。
-
スクリプトが完了すると、リソース グループ名、SQL Server 名とデータベース名、管理者ユーザー名とパスワードが返されます。 これらの値は、後でラボで必要になりますのでメモしておきます。
Microsoft Defender for SQL を有効にする
-
ラボ仮想マシン、または提供されていない場合はローカル コンピューターから、ブラウザー セッションを起動し、 https://portal.azure.comに移動します。 Azure 資格情報を使用して、Azure portal に接続します。
-
Azure portal の上部にある検索ボックスで SQL サーバーを検索し、オプションの一覧から SQL サーバーを選択します。
-
SQL Server dp300-lab-xxxxxxxx を選択します。xxxxxxxx はランダムな数値文字列です。
📝 このラボで作成されていない独自の Azure SQL Server を使用している場合は、その SQL Server の名前を選択します。
-
[概要] ブレードで、Microsoft Defender for SQL の横にある **[未構成] **を選択します。
-
右上にある [X] を選択して、 Microsoft Defender for Cloud の[概要] ペインを閉じます。
-
Microsoft Defender for SQL の下にある [有効にする] を選択します。
-
運用環境では、複数の推奨事項が一覧表示されている必要があります。 *[Defender for Cloud のすべての推奨事項を表示する] **を選択し、 Azure SQL Server に関するすべての *Microsoft Defender の推奨事項を確認し、必要に応じて実装します。
脆弱性評価
-
Azure SQL Server のメイン ブレードで、 [設定] セクションに移動し、 [SQL データベース] を選択して、AdventureWorksLT という名前のデータベースを選択します。
-
[セキュリティ] の下で [Microsoft Defender for Cloud] を選択します。
-
右上にある [X] を選択して [Microsoft Defender for Cloud] の [概要] ペインを閉じ、
AdventureWorksLT
データベースの [Microsoft Defender for Cloud] ダッシュボードを表示します。 -
脆弱性評価機能の確認を開始するには、[脆弱性評価の結果] で、[脆弱性評価のその他の結果を表示] を選択します。
-
[スキャン] を選択して最新の脆弱性評価の結果を取得します。 脆弱性評価によってデータベースがスキャンされるため、このプロセスには少し時間がかかります。
-
すべてのセキュリティ リスクにリスク レベル (高、中、低) と追加情報があります。 実施されている規則は、Center for Internet Security が提供するベンチマークに基づいています。 [検出結果] タブで、脆弱性を選びます。 脆弱性の IDを書き留めておきます (例: VA1143)(記載されている場合)。
-
セキュリティ チェックによっては、代替ビューと推奨事項が表示されます。 提供された情報を確認します。 このセキュリティ チェックでは、[すべての結果をベースラインとして追加] ボタンを選んでから [はい] を選んで、ベースラインを設定できます。 ベースラインが配置されたので、このセキュリティ チェックは、結果がベースラインと異なる将来のスキャンでは失敗します。 右上の [X] を選択して、特定のルールのウィンドウを閉じます。
-
[スキャン] を再度実行し、選択した脆弱性が合格したセキュリティ チェックとして表示されていることを確認します。
上の合格したセキュリティ チェックを選ぶと、構成したベースラインを確認できます。 今後変更が加えられた場合、それは脆弱性評価スキャンによって検出され、セキュリティ チェックは失敗します。
Advanced Threat Protection
-
右上の [X] を選んで [脆弱性評価] ペインを閉じ、データベースの [Microsoft Defender for Cloud] ダッシュボードに戻ります。 [セキュリティ インシデントとアラート] には、どの項目も表示されません。 これは、Advanced Threat Protection で問題が検出されていないことを意味します。 データベースにアクセスしたりそれを悪用したりしようとする、通常とは異なる、害を及ぼす可能性のある試行を示す異常なアクティビティは、Advanced Threat Protection によって検出されます。
📝 この段階では、セキュリティ アラートは表示されません。 次の手順ではアラートをトリガーするテストを実行します。これにより、Advanced Threat Protection で結果を確認できるようになります。
Advanced Threat Protection を使って、次のいずれかの発生が疑われる場合に、脅威を特定し、アラートを受け取ることができます。
- SQL インジェクション
- SQL インジェクションの脆弱性
- データ窃盗
- 安全でないアクション
- ブルート フォース
- 異常なクライアント ログイン
このセクションでは、SSMS を使用して SQL インジェクション アラートをトリガーする方法について説明します。 SQL インジェクション アラートは、SSMS などの標準ツール用ではなく、カスタム記述のアプリケーションを対象としています。 そのため、SQL インジェクションのテストとして SSMS を使用してアラートをトリガーするには、アプリケーション名を “設定” する必要があります。これは SQL Server または Azure SQL に接続するクライアントの接続プロパティです。
-
ラボ仮想マシン、または提供されていない場合はローカル コンピューターから、SQL Server Management Studio (SSMS) を開きます。 [サーバーへの接続] ダイアログ ボックスで、Azure SQL Database サーバーの名前を貼り付け、次の資格情報でログインします。
- サーバー名: <Azure SQL Database のサーバー名をここに貼り付けてください>__
- 認証: SQL Server 認証
- [サーバー管理者ログイン]: Azure SQL Databaseサーバー管理者ログイン
- パスワード: Azure SQL Database サーバー管理者パスワード
-
[接続] を選択します。
-
SSMS で、[ファイル] > [新規] > [データベース エンジン クエリ] の順に選択し、新しい接続を使用してクエリを作成します。
-
メイン ログイン ウィンドウで、SQL 認証と Azure SQL Server の名前と管理者の資格情報を使用して、通常と同様に AdventureWorksLT データベースにログインします。 接続する前に、[オプション] » > [接続プロパティ] を選びます。 [データベースへの接続] オプションに「AdventureWorks」と入力します。
-
[追加の接続パラメーター] タブを選択して、テキスト ボックスに次の接続文字列を挿入します。
Application Name=webappname
-
[接続] を選択します。
-
新しいクエリ ウィンドウで、次のクエリを貼り付け、[実行] を選択します。
SELECT * FROM sys.databases WHERE database_id like '' or 1 = 1 --' and family = 'test1';
-
Azure portal で、AdventureWorksLT データベースに移動します。 左側のペインの [セキュリティ] で、[Microsoft Defender for Cloud] を選択します。
-
[セキュリティ インシデントとアラート] で、[Microsoft Defender for Cloud でこのリソースに関するアラートを確認する] を選択します。
-
全体的なセキュリティ アラートが表示されるようになりました。
-
[潜在的な SQL インジェクション] を選択して、より具体的なアラートを表示し、調査手順を受け取ります。
-
[すべての詳細を表示] を選択して、アラートの詳細を表示します。
-
[アラートの詳細] タブで、脆弱なステートメントが表示されていることに注意してください。 これは、アラートをトリガーするために実行された SQL ステートメントです。 SSMS で実行された SQL ステートメントでもあります。 さらに、 クライアント アプリケーションは webappname として表示されることに注意してください。 これは、SSMS の接続文字列で指定した名前です。
-
クリーンアップ手順として、次の演習で追加のアラートを誤ってトリガーしないように、SSMS でご利用のすべてのクエリ エディターを閉じ、すべての接続を削除することを検討してください。
データ分類を有効にする
-
Azure SQL Server のメイン ブレードで、 [設定] セクションに移動し、 [SQL データベース] を選択して、AdventureWorksLT という名前のデータベースを選択します。
-
AdventureWorksLT データベースのメイン ブレードで、 [セキュリティ] セクションに移動し、 [データの検出と分類] を選択します。
-
[データの検出と分類] ページに、「現在、SQL Information Protection ポリシーを使用しています。分類の推奨事項を含む列が 15 個見つかりました。 」という情報メッセージが表示されます。 このリンクを選択します。
-
次の [データの検出と分類] 画面で、[すべて選択] の横にあるチェック ボックスをオンにして、[選択した推奨事項を受け入れます] を選択し、[保存] を選択して分類をデータベースに保存します。
-
[データの検出と分類] 画面に戻り、5 つの異なるテーブルで 15 個の列が正常に分類されたことがわかります。 各列の [情報の種類] と [秘密度ラベル] を確認します。
データ分類とデータ マスクを構成する
-
Azure portal で、(論理サーバーではなく) Azure SQL Database インスタンス AdventureWorksLT に移動します 。
-
左側のペインの [セキュリティ] で、[データの検出と分類] を選択します。
-
顧客テーブル SalesLT では、データの検出と分類によって
FirstName
とLastName
が分類対象として識別されましたが、MiddleName
は識別されていません。 ドロップダウン リストを使用して、今すぐ追加します。 [情報の種類] として名前を、[秘密度ラベル] として機密 - GDPR を選択してから、[分類の追加] を選択します。 -
[保存] を選択します。
-
[概要] タブを表示して分類の追加が成功したことを確認し、さらに SalesLT スキーマの下の分類済みの列の一覧に
MiddleName
が表示されるようになったことを確認します。 -
左側のウィンドウで、[概要] を選択して、ご利用のデータベースの概要に戻ります。
動的データ マスク (DDM) は、Azure SQL と SQL Server の両方で使用できます。 DDM では、SQL Server レベル (その種のルールをコーディングする必要があるアプリケーション レベルではなく) で非特権ユーザーに対して機密データをマスクすることによりデータの公開が制限されます。 マスクすべき項目は Azure SQL によって推奨されます。マスクを手動で追加することもできます。
次の手順では、前のステップで確認した
FirstName
、MiddleName
、LastName
の各列をマスクします。 -
Azure portal で、Azure SQL Database に移動します。 左側のウィンドウにある [セキュリティ] で、[動的データ マスク] を選択して、[マスクの追加] を選択します。
-
ドロップダウン リストで、SalesLT スキーマ、Customer テーブル、FirstName 列を選択します。 マスクのオプションを確認できますが、このシナリオでは既定のオプションが適しています。 [追加] を選択してマスク ルールを追加します。
-
このテーブルの MiddleName と LastName の両方に対して、前の手順を繰り返します。
これで、3 つのマスク ルールが作成されました。
-
[保存] を選択します。
📝 Azure SQL Server 名が小文字、数字、ダッシュのみで構成されていない場合、この手順は失敗し、データ マスキング セクションを続行できなくなることに注意してください。
-
左側のウィンドウで、[概要] を選択して、ご利用のデータベースの概要に戻ります。
分類およびマスクされたデータを取得する
次に、分類された列に対して誰かがクエリを実行する場合をシミュレートし、動的データ マスクの動作を検証します。
-
SQL Server Management Studio (SSMS) に移動し、Azure SQL サーバーに接続して、新しいクエリ ウィンドウを開きます。
-
AdventureWorksLT データベースを右クリックし、[新しいクエリ] を選択します。
-
次のクエリを実行すると、分類されたデータが、場合によっては、マスクされたデータとしてマークされた列が返されます。 [実行] を選択してクエリを実行します。
SELECT TOP 10 FirstName, MiddleName, LastName FROM SalesLT.Customer;
結果には、マスクが適用されていない最初の 10 個の名前が表示されます。 なぜですか? あなたがこの Azure SQL Database 論理サーバーの管理者であるためです。
-
次のクエリでは、新しいユーザーを作成し、そのユーザーとして前のクエリを実行します。 また、
EXECUTE AS
を使用してBob
を借用することもできます。EXECUTE AS
ステートメントを実行すると、セッションの実行コンテキストはそのログインまたはユーザーに切り替わります。 つまり、EXECUTE AS
コマンドを実行するユーザー (この場合は管理者) ではなく、ログインまたはユーザーに対してアクセス許可がチェックされます。 次に、REVERT
を使って、ログインまたはユーザーの借用を停止します。次に示すコマンドの最初のいくつかの部分は、前の演習からの繰り返しであるため、見覚えがあるかもしれません。 次のコマンドを使用して新しいクエリを作成し、[実行] を選択してクエリを実行し、結果を確認します。
-- Create a new SQL user and give them a password CREATE USER Bob WITH PASSWORD = 'c0mpl3xPassword!'; -- Until you run the following two lines, Bob has no access to read or write data ALTER ROLE db_datareader ADD MEMBER Bob; ALTER ROLE db_datawriter ADD MEMBER Bob; -- Execute as our new, low-privilege user, Bob EXECUTE AS USER = 'Bob'; SELECT TOP 10 FirstName, MiddleName, LastName FROM SalesLT.Customer; REVERT;
結果には最初の 10 個の名前が表示されますが、マスクが適用されています。 Bob は、このデータのマスクされていない形式へのアクセスを許可されていません。
何らかの理由で Bob が名前にアクセスする必要があり、アクセス許可を取得する場合はどうでしょうか。
Azure portal で [セキュリティ] の下の [動的データ マスク] ペインに移動してマスクから除外されたユーザーを更新することもできますが、T-SQL を使用してこの操作を行うこともできます。
-
AdventureWorksLT データベースを右クリックし、[新しいクエリ] を選択し、次のクエリを入力して Bob がマスクなしで名前の結果に対するクエリを実行できるようにします。 [実行] を選択してクエリを実行します。
GRANT UNMASK TO Bob; EXECUTE AS USER = 'Bob'; SELECT TOP 10 FirstName, MiddleName, LastName FROM SalesLT.Customer; REVERT;
結果には、すべての名前が含まれています。
-
新しいクエリで次の T-SQL コマンドを実行して、ユーザーのマスク解除特権を取り上げ、そのアクションを確認することもできます。
-- Remove unmasking privilege REVOKE UNMASK TO Bob; -- Execute as Bob EXECUTE AS USER = 'Bob'; SELECT TOP 10 FirstName, MiddleName, LastName FROM SalesLT.Customer; REVERT;
結果には、マスクが適用された名前が含まれています。
リソースをクリーンアップする
Azure SQL Server を他の目的で使用していない場合は、このラボで作成したリソースをクリーンアップできます。
リソース グループを削除します
このラボの新しいリソース グループを作成した場合は、リソース グループを削除して、このラボで作成されたすべてのリソースを削除できます。
-
Azure portal で、左側のナビゲーション ペインから リソース グループ を選択するか、検索バーで リソース グループを検索して、結果からそのリソース グループを選択します。
-
このラボ用に作成したリソース グループに移動します。 リソース グループには、Azure SQL Server と、このラボで作成されたその他のリソースが含まれます。
-
トップ メニューから [リソース グループの削除] を選択します。
-
[リソース グループの削除] ダイアログで、リソース グループの名前を入力して確認した後、[削除] を選択します。
-
リソース グループが削除されるのを待ちます。
-
Azure Portal を閉じます。
ラボ リソースのみを削除する
このラボ用の新しいリソース グループを作成せず、リソース グループとその以前のリソースをそのまま残したい場合は、このラボで作成したリソースを削除できます。
-
Azure portal で、左側のナビゲーション ペインから リソース グループ を選択するか、検索バーで リソース グループを検索して、結果からそのリソース グループを選択します。
-
このラボ用に作成したリソース グループに移動します。 リソース グループには、Azure SQL Server と、このラボで作成されたその他のリソースが含まれます。
-
ラボで以前に指定した SQL Server 名のプレフィックスが付いたすべてのリソースを選択します。
-
トップ メニューから、削除を選択します。
-
[リソースの削除] ダイアログで、「delete」と入力し、[削除] を選択します。
-
[削除] をもう一度選択し、リソースの削除を確定します。
-
リソースが削除されるまで待ちます。
-
Azure Portal を閉じます。
LabFiles フォルダーを削除する
このラボ用に新しい LabFiles フォルダーを作成して、それが不要になった場合は、LabFiles フォルダーを削除して、このラボで作成されたすべてのファイルを削除できます。
- ラボ仮想マシン、または提供されていない場合はローカル コンピューターから、エクスプローラーを開き、 C:\ ドライブに移動します。
- LabFiles フォルダーを右クリックし、[削除] を選択します。
- [はい] を選択して、フォルダーの削除を確認します。
このラボは以上で完了です。
この演習では、Microsoft Defender for SQL を有効にすることで、Azure SQL Database のセキュリティを強化しました。 また、Azure portal の推奨事項に基づいて分類された列を作成しました。