チュートリアル:Azure AD サーバー プリンシパル (ログイン) を使用した Azure SQL Managed Instance のセキュリティ

適用対象: Azure SQL Managed Instance

Azure SQL Managed Instance には、最新の SQL Server (Enterprise Edition) データベース エンジンにあるセキュリティ機能がほとんどすべて備わっています。

  • 分離環境におけるアクセスの制限
  • ID の入力を求める認証メカニズムの使用: Azure Active Directory (Azure AD) および SQL 認証
  • ロールベースのメンバーシップとアクセス許可による認可の使用
  • セキュリティ機能の有効化

このチュートリアルでは、以下の内容を学習します。

  • マネージド インスタンス用に Azure AD サーバー プリンシパル (ログイン) を作成する
  • マネージド インスタンスの Azure AD サーバー プリンシパル (ログイン) にアクセス許可を付与する
  • Azure AD サーバー プリンシパル (ログイン) から Azure AD ユーザーを作成する
  • Azure AD ユーザーにアクセス許可を割り当ててデータベースのセキュリティを管理する
  • Azure AD ユーザーで偽装を使用する
  • Azure AD ユーザーでデータベース間クエリを使用する
  • 脅威の防止、監査、データ マスク、暗号化などのセキュリティ機能について学習する

詳細については、Azure SQL Managed Instance の概要に関する記事を参照してください。

前提条件

このチュートリアルを完了するには、前提条件として次のものが必要です。

アクセスを制限する

マネージド インスタンスには、プライベート IP アドレスを介してのみアクセスできます。 分離された SQL Server 環境とほぼ同様に、接続を確立するには、アプリケーションまたはユーザーが SQL Managed Instance のネットワーク (VNet) にアクセスする必要があります。 詳細については、SQL Managed Instance へのアプリケーションの接続に関するページを参照してください。

また、マネージド インスタンスでサービス エンドポイントを構成することもできます。これにより、Azure SQL Database の場合と同じ方法でパブリック接続を使用できるようになります。 詳細については、「Azure SQL Managed Instance でパブリック エンドポイントを構成する」を参照してください。

注意

サービス エンドポイントが有効な状態であっても、Azure SQL Database のファイアウォール規則は適用されません。 Azure SQL Managed Instance には、接続を管理するための組み込みのファイアウォールが独自に備わっています。

SSMS を使用して Azure AD サーバー プリンシパル (ログイン) を作成する

最初の Azure AD サーバー プリンシパル (ログイン) は、標準の SQL 管理者アカウント (Azure AD 以外) である sysadmin によって、またはプロビジョニング処理中に作成されたマネージド インスタンスの Azure AD 管理者によって作成できます。 詳細については、SQL Managed Instance の Azure Active Directory 管理者のプロビジョニングに関するページを参照してください。

SQL Managed Instance に接続する例については、以下の記事を参照してください。

  1. SQL Server Management Studio を利用し、標準の SQL ログイン アカウント (Azure AD 以外) である sysadmin を使用するか、SQL Managed Instance 用の Azure AD 管理者を使用して、マネージド インスタンスにログインします。

  2. オブジェクト エクスプローラー で、サーバーを右クリックし、 [新しいクエリ] を選択します。

  3. クエリ ウィンドウで、次の構文を使用して、ローカルの Azure AD アカウント用のログインを作成します。

    USE master
    GO
    CREATE LOGIN login_name FROM EXTERNAL PROVIDER
    GO
    

    この例では、nativeuser@aadsqlmi.onmicrosoft.com アカウントのログインが作成されます。

    USE master
    GO
    CREATE LOGIN [nativeuser@aadsqlmi.onmicrosoft.com] FROM EXTERNAL PROVIDER
    GO
    
  4. ツール バーの [実行] を選択して、ログインを作成します。

  5. 次の T-SQL コマンドを実行して、新しく追加されたログインを確認します。

    SELECT *  
    FROM sys.server_principals;  
    GO
    

    SSMS オブジェクト エクスプローラーの [結果] タブのスクリーンショット。新しく追加されたログインの name、principal_id、sid、type、および type_desc が表示されています。

詳細については、「CREATE LOGIN」を参照してください。

ログインを作成するためのアクセス許可を付与する

他の Azure AD サーバー プリンシパル (ログイン) を作成するには、SQL Server のロールまたはアクセス許可をプリンシパル (SQL または Azure AD) に付与する必要があります。

SQL 認証

  • ログインが SQL プリンシパルの場合、作成コマンドを使用して Azure AD アカウントのログインを作成できるのは、sysadmin ロールに属しているログインのみです。

Azure AD 認証

  • 新しく作成した Azure AD サーバー プリンシパル (ログイン) が他の Azure AD ユーザー、グループ、またはアプリケーションのログインを作成できるように、そのログインに sysadmin または securityadmin サーバー ロールを付与します。
  • 少なくとも、他の Azure AD サーバー プリンシパル (ログイン) を作成するには ALTER ANY LOGIN アクセス許可を Azure AD サーバー プリンシパル (ログイン) に付与する必要があります。
  • 既定では、マスターに新しく作成された Azure AD サーバー プリンシパル (ログイン) に付与される標準的なアクセス許可は CONNECT SQLVIEW ANY DATABASE です。
  • sysadmin サーバー ロールは、マネージド インスタンス内の多くの Azure AD サーバー プリンシパル (ログイン) に付与できます。

sysadmin サーバー ロールにログインを追加するには:

  1. マネージド インスタンスにもう一度ログインするか、Azure AD 管理者または SQL プリンシパルである sysadmin で既存の接続を使用します。

  2. オブジェクト エクスプローラー で、サーバーを右クリックし、 [新しいクエリ] を選択します。

  3. 次の T-SQL 構文を使用して、Azure AD サーバー プリンシパル (ログイン) に sysadmin サーバー ロールを付与します。

    ALTER SERVER ROLE sysadmin ADD MEMBER login_name
    GO
    

    次の例では、ログイン nativeuser@aadsqlmi.onmicrosoft.com に sysadmin サーバー ロールを付与します。

    ALTER SERVER ROLE sysadmin ADD MEMBER [nativeuser@aadsqlmi.onmicrosoft.com]
    GO
    

SSMS を使用して追加の Azure AD サーバー プリンシパル (ログイン) を作成する

Azure AD サーバー プリンシパル (ログイン) が作成され、sysadmin の特権が付与されると、そのログインは、CREATE LOGINFROM EXTERNAL PROVIDER 句を使用して追加のログインを作成できます。

  1. SQL Server Management Studio を使用して、Azure AD サーバー プリンシパル (ログイン) でマネージド インスタンスに接続します。 SQL Managed Instance のホスト名を入力します。 SSMS での認証の場合、Azure AD アカウントを使ってログインするときに選択できるオプションは 3 つあります。

  2. [Active Directory - MFA サポートで汎用] を選択します。 これで、Multi-Factor Authentication のログイン ウィンドウが表示されます。 Azure AD のパスワードを使ってサインインします。

    Multi-Factor Authentication のログイン ウィンドウのスクリーンショット。[パスワードの入力] フィールドにカーソルがあります。

  3. SSMS の オブジェクト エクスプローラー で、サーバーを右クリックし、 [新しいクエリ] を選択します。

  4. クエリ ウィンドウで、次の構文を使用して、別の Azure AD アカウント用のログインを作成します。

    USE master
    GO
    CREATE LOGIN login_name FROM EXTERNAL PROVIDER
    GO
    

    この例では、Azure AD ユーザー bob@aadsqlmi.net のログインが作成されます。このユーザーのドメイン aadsqlmi.net は、Azure AD の aadsqlmi.onmicrosoft.com ドメインとフェデレーションされます。

    次の T-SQL コマンドを実行します。 フェデレーションされた Azure AD アカウントは、SQL Managed Instance でオンプレミスの Windows のログインとユーザーの代わりに使用されます。

    USE master
    GO
    CREATE LOGIN [bob@aadsqlmi.net] FROM EXTERNAL PROVIDER
    GO
    
  5. CREATE DATABASE 構文を使用して、マネージド インスタンスにデータベースを作成します。 このデータベースは、次のセクションでユーザー ログインをテストする際に使用されます。

    1. オブジェクト エクスプローラー で、サーバーを右クリックし、 [新しいクエリ] を選択します。

    2. クエリ ウィンドウで、次の構文を使用して、MyMITestDB という名前のデータベースを作成します。

      CREATE DATABASE MyMITestDB;
      GO
      
  6. Azure AD 内のグループに SQL Managed Instance のログインを作成します。 SQL Managed Instance にログインを追加するには、事前にこのグループが Azure AD に存在する必要があります。 「Azure Active Directory を使用して基本グループを作成してメンバーを追加する」を参照してください。 mygroup グループを作成し、このグループにメンバーを追加します。

  7. SQL Server Management Studio で新しいクエリ ウィンドウを開きます。

    この例では、mygroup というグループが Azure AD に存在することを前提としています。 たとえば、次のコマンドを実行します。

    USE master
    GO
    CREATE LOGIN [mygroup] FROM EXTERNAL PROVIDER
    GO
    
  8. テストとして、新しく作成したログインまたはグループを使用してマネージド インスタンスにログインします。 マネージド インスタンスへの新しい接続を開き、認証時に新しいログインを使用します。

  9. オブジェクト エクスプローラー で、サーバーを右クリックし、新しい接続に [新しいクエリ] を選択します。

  10. 次のコマンドを実行して、新しく作成した Azure AD サーバー プリンシパル (ログイン) のサーバー アクセス許可を確認します。

    SELECT * FROM sys.fn_my_permissions (NULL, 'DATABASE')
    GO
    

ゲスト ユーザーは (AAD グループに所属することは可能ですが、そうせずに) 個々のユーザーとしてサポートされ、現在のログイン構文を使用して、マスターに直接ログインを作成できます (例: joe@contoso.con)。

Azure AD サーバー プリンシパル (ログイン) から Azure AD ユーザーを作成する

個々のデータベースに対する承認は、SQL Managed Instance でも、SQL Server のデータベースの場合とほぼ同じように動作します。 ユーザーは、既存のログインからデータベースに作成し、そのデータベースに対するアクセス許可を付与するかデータベース ロールに追加することができます。

MyMITestDB という名前のデータベースと、既定のアクセス許可のみを持つログインを作成したので、次の手順では、そのログインからユーザーを作成します。 この時点では、ログインはマネージド インスタンスに接続し、すべてのデータベースを表示できますが、そのデータベースを操作することはできません。 既定のアクセス許可を持つ Azure AD アカウントでサインインし、新しく作成したデータベースを展開しようとすると、次のエラーが表示されます。

SSMS オブジェクト エクスプローラー ウィンドウのエラー メッセージのスクリーンショット。"The database MyMITestDB is not accessible. (ObjectExplorer) (データベース MyMITestDB にアクセスできません。(ObjectExplorer))" と表示されています。

データベースのアクセス許可の付与の詳細については、「データベース エンジンの権限の概要」を参照してください。

Azure AD ユーザーを作成してサンプル テーブルを作成する

  1. SQL Server Management Studio で、sysadmin アカウントを使用してマネージド インスタンスにログインします。

  2. オブジェクト エクスプローラー で、サーバーを右クリックし、 [新しいクエリ] を選択します。

  3. クエリ ウィンドウで、次の構文を使用して、Azure AD サーバー プリンシパル (ログイン) から Azure AD ユーザーを作成します。

    USE <Database Name> -- provide your database name
    GO
    CREATE USER user_name FROM LOGIN login_name
    GO
    

    次の例では、ログイン bob@aadsqlmi.net: からユーザー bob@aadsqlmi.net を作成します。

    USE MyMITestDB
    GO
    CREATE USER [bob@aadsqlmi.net] FROM LOGIN [bob@aadsqlmi.net]
    GO
    
  4. また、グループである Azure AD サーバー プリンシパル (ログイン) から Azure AD ユーザーを作成することもサポートされています。

    次の例では、Azure AD インスタンスに存在する mygroup という名前の Azure AD グループのログインを作成します。

    USE MyMITestDB
    GO
    CREATE USER [mygroup] FROM LOGIN [mygroup]
    GO
    

    mygroup に属しているすべてのユーザーが MyMITestDB データベースにアクセスできます。

    重要

    AD サーバー プリンシパル (ログイン) から USER を作成するときは、user_name を LOGIN と同じ login_name として指定します。

    詳細については、「CREATE USER」を参照してください。

  5. 新しいクエリ ウィンドウで、次の T-SQL コマンドを使用してテスト テーブルを作成します。

    USE MyMITestDB
    GO
    CREATE TABLE TestTable
    (
    AccountNum varchar(10),
    City varchar(255),
    Name varchar(255),
    State varchar(2)
    );
    
  6. 作成されたユーザーとの接続を SSMS で作成します。 以前に sysadmin が作成した TestTable テーブルが表示されないことがわかります。 ユーザーに、データベースからデータを読み取るためのアクセス許可を付与する必要があります。

  7. 次のコマンドを実行すると、ユーザーが所有する現在のアクセス許可を確認できます。

    SELECT * FROM sys.fn_my_permissions('MyMITestDB','DATABASE')
    GO
    

データベースレベルのロールにユーザーを追加する

ユーザーがデータベース内のデータを表示できるように、データベースレベルのロールをユーザーに付与します。

  1. SQL Server Management Studio で、sysadmin アカウントを使用してマネージド インスタンスにログインします。

  2. オブジェクト エクスプローラー で、サーバーを右クリックし、 [新しいクエリ] を選択します。

  3. 次の T-SQL 構文を使用して、Azure AD ユーザーに db_datareader データベース ロールを付与します。

    Use <Database Name> -- provide your database name
    ALTER ROLE db_datareader ADD MEMBER user_name
    GO
    

    次の例では、ユーザー bob@aadsqlmi.net とグループ mygroupMyMITestDB データベースに対する db_datareader アクセス許可を付与します。

    USE MyMITestDB
    GO
    ALTER ROLE db_datareader ADD MEMBER [bob@aadsqlmi.net]
    GO
    ALTER ROLE db_datareader ADD MEMBER [mygroup]
    GO
    
  4. 次のコマンドを実行して、データベースに作成された Azure AD ユーザーが存在することを確認します。

    SELECT * FROM sys.database_principals
    GO
    
  5. db_datareader ロールに追加されたユーザーを使用して、マネージド インスタンスへの新しい接続を作成します。

  6. オブジェクト エクスプローラー でデータベースを展開してテーブルを表示します。

    MyMITestDB の [テーブル] のフォルダー構造を示す SSMS のオブジェクト エクスプローラーのスクリーンショット。 dbo.TestTable folder フォルダーが強調表示されています。

  7. 新しいクエリ ウィンドウを開き、次の SELECT ステートメントを実行します。

    SELECT *
    FROM TestTable
    

    テーブルのデータを確認できますか。 列が返されていることがわかるはずです。

    SSMS のオブジェクト エクスプローラーのスクリーンショット。テーブルの列ヘッダー、AccountNum、City、Name、State が表示されています。

Azure AD サーバーレベル プリンシパル (ログイン) を偽装する

SQL Managed Instance では、Azure AD サーバーレベル プリンシパル (ログイン) の偽装がサポートされています。

偽装のテスト

  1. SQL Server Management Studio で、sysadmin アカウントを使用してマネージド インスタンスにログインします。

  2. オブジェクト エクスプローラー で、サーバーを右クリックし、 [新しいクエリ] を選択します。

  3. クエリ ウィンドウで、次のコマンドを使用して新しいストアド プロシージャを作成します。

    USE MyMITestDB
    GO  
    CREATE PROCEDURE dbo.usp_Demo  
    WITH EXECUTE AS 'bob@aadsqlmi.net'  
    AS  
    SELECT user_name();  
    GO
    
  4. 次のコマンドを使用して、このストアド プロシージャの実行時に偽装しているユーザーが bob@aadsqlmi.net であることを確認します。

    Exec dbo.usp_Demo
    
  5. EXECUTE AS LOGIN ステートメントを使用して偽装をテストします。

    EXECUTE AS LOGIN = 'bob@aadsqlmi.net'
    GO
    SELECT SUSER_SNAME()
    REVERT
    GO
    

注意

Azure AD プリンシパルを対象とした次の操作を実行できるのは、sysadmin ロールに属している SQL サーバーレベル プリンシパル (ログイン) のみです。

  • EXECUTE AS USER
  • EXECUTE AS LOGIN

複数データベース間のクエリを使用する

データベース間クエリは、Azure AD サーバー プリンシパル (ログイン) を使用する Azure AD アカウントのためにサポートされています。 Azure AD グループでデータベース間クエリをテストするには、データベースとテーブルをもう 1 つ作成する必要があります。 データベースとテーブルが既にもう 1 つ存在する場合は、作成をスキップできます。

  1. SQL Server Management Studio で、sysadmin アカウントを使用してマネージド インスタンスにログインします。

  2. オブジェクト エクスプローラー で、サーバーを右クリックし、 [新しいクエリ] を選択します。

  3. クエリ ウィンドウで、次のコマンドを使用して、MyMITestDB2 という名前のデータベースと TestTable2 という名前のテーブルを作成します。

    CREATE DATABASE MyMITestDB2;
    GO
    USE MyMITestDB2
    GO
    CREATE TABLE TestTable2
    (
    EmpId varchar(10),
    FirstName varchar(255),
    LastName varchar(255),
    Status varchar(10)
    );
    
  4. 新しいクエリ ウィンドウで、次のコマンドを実行して、新しいデータベース MyMITestDB2 にユーザー mygroup を作成し、そのデータベースに対する SELECT アクセス許可を mygroup に付与します。

    USE MyMITestDB2
    GO
    CREATE USER [mygroup] FROM LOGIN [mygroup]
    GO
    GRANT SELECT TO [mygroup]
    GO
    
  5. SQL Server Management Studio を使用して、Azure AD グループ mygroup のメンバーとしてマネージド インスタンスにサインインします。 新しいクエリ ウィンドウを開き、データベース間の SELECT ステートメントを実行します。

    USE MyMITestDB
    SELECT * FROM MyMITestDB2..TestTable2
    GO
    

    TestTable2 からテーブル結果が表示されます。

サポートされているその他のシナリオ

  • SQL エージェントの管理とジョブの実行が、Azure AD サーバー プリンシパル (ログイン) に対してサポートされています。
  • データベースのバックアップと復元操作は、Azure AD サーバー プリンシパル (ログイン) が実行できます。
  • Azure AD サーバー プリンシパル (ログイン) と認証イベントに関連するすべてのステートメントの監査
  • sysadmin サーバー ロールのメンバーである Azure AD サーバー プリンシパル (ログイン) の専用管理者接続。
  • Azure AD サーバー プリンシパル (ログイン) は、sqlcmd ユーティリティSQL Server Management Studio ツールの使用でサポートされています。
  • Azure AD サーバー プリンシパル (ログイン) によるログオン イベントでは、ログオン トリガーがサポートされています。
  • Service Broker とデータベース メールは、Azure AD サーバー プリンシパル (ログイン) を使用して設定できます。

次のステップ

セキュリティ機能の有効化

データベースをセキュリティで保護する方法の包括的な一覧については、SQL Managed Instance のセキュリティ機能に関する記事を参照してください。 次のセキュリティ機能について説明しています。

SQL Managed Instance の機能

SQL Managed Instance の機能全体の概要については、以下を参照してください。