チュートリアル: SQL Server on Linux コンテナーに Active Directory 認証を構成する

適用対象:SQL Server - Linux

このチュートリアルでは、Active Directory 認証 (統合認証とも呼ばれます) をサポートするように SQL Server on Linux コンテナーを構成する方法について説明します。 概要については、「SQL Server on Linux に対する Active Directory 認証」をご覧ください。

Note

ネットワーク構成に関する現在のガイダンスについては、オペレーティング システム (OS) のドキュメントを参照してください。

このチュートリアルは、次のタスクで構成されています。

  • adutil をインストールする
  • Linux ホストを Active Directory ドメインに参加させる
  • SQL Server 用の Active Directory ユーザーを作成し、adutil ツールを使用してサービス プリンシパル名 (SPN) を設定する
  • SQL Server サービスの keytab ファイルを作成する
  • SQL Server コンテナーによって使用される mssql.conf ファイルと krb5.conf ファイルを作成する
  • 構成ファイルをマウントし、SQL Server コンテナーをデプロイする
  • Transact-SQL を使用して Active Directory ベースの SQL Server ログインを作成する
  • Active Directory 認証を使用して SQL Server に接続する

前提条件

Active Directory 認証を構成する前に、次のものが必要です。

  • ネットワーク上に Active Directory ドメイン コントローラー (Windows) を配置します。
  • ドメインに参加させる Linux ホスト マシンに adutil をインストールします。 詳細については、「adutil をインストールする」セクションに従ってください。

コンテナーのデプロイと準備

コンテナーを設定するには、ホスト上のコンテナーによって使用されるポートを事前に知っておく必要があります。 お使いのコンテナー ホストでは、デフォルトのポート 1433 が異なる方法でマッピングされている場合があります。 このチュートリアルでは、ホスト上のポート 5433 がコンテナーのポート 1433 にマッピングされます。 詳細については、クイックスタート「クイックスタート: Docker を使用して SQL Server コンテナー イメージを実行する」を参照してください。

サービス プリンシパル名 (SPN) を登録するときは、マシンのホスト名またはコンテナーの名前を使用できます。 ただし、コンテナーに外部で接続する場合は、表示する内容に従って構成する必要があります。

Active Directory に、Linux ホストの IP アドレスの転送ホスト (A) のエントリが追加されていることを確認します。これは、SQL Server コンテナーの名前へのマッピングです。 このチュートリアルでは、sql1 ホスト マシンの IP アドレスは 10.0.0.10 であり、SQL Server コンテナーの名前は sql1 です。 スクリーンショットに示すように、Active Directory に転送ホスト エントリを追加します。 このエントリにより、ユーザーが sql1.contoso.com に接続すると、適切なホストに到達することが保証されます。

Screenshot of adding a host record.

このチュートリアルでは、3 つの仮想マシン (VM) がある Azure の環境を使用しています。 ある VM は Windows ドメイン コントローラー (DC) として機能し、ドメイン名は contoso.com です。 ドメイン コントローラーの名前は adVM.contoso.com です。 2 つ目のマシンは winbox という名前の Windows マシンで、Windows 10 デスクトップがを実行されており、クライアント ボックスとして使用され、SQL Server Management Studio (SSMS) がインストールされています。 3 つ目のマシンは、sql1 という名前の Ubuntu 18.04 LTS マシンで、SQL Server コンテナーがホストされています。 すべてのマシンが contoso.com ドメインに参加しています。 詳細については、「Linux ホスト上の SQL Server を Active Directory ドメインに参加させる」を参照してください。

Note

この記事で後ほど説明するように、ホスト コンテナー マシンをドメインに参加させることは必須ではありません。

adutil をインストールする

adutil ツールをインストールするには、ドメインに参加しているホスト コンピューターで、「adutil の概要 - Active Directory ユーティリティ」で説明されている手順に従います。

Active Directory ユーザー、SPN、SQL Server サービスの keytab を作成する

コンテナー ホストをドメインの一部にするのが望ましくなく、マシンをドメインに参加させる手順に従っていない場合は、既に Active Directory ドメインの一部になっている別の Linux マシンで、次の手順を実行する必要があります。

  1. SQL Server 用の Active Directory ユーザーを作成し、adutil を使用して SPN を設定します。

  2. SQL Server サービスの keytab ファイルを作成して構成します。

作成された mssql.keytab ファイルを SQL Server コンテナーを実行するホスト マシンにコピーし、コピーした mssql.keytab を使用するようにコンテナーを構成します。 必要に応じて、SQL Server コンテナーを実行する Linux ホストを Active Directory ドメインに参加させ、同じマシンで次の手順のようにすることもできます。

SQL Server 用の Active Directory ユーザーを作成し、adutil ツールを使用してサービス プリンシパル名を設定する

SQL Server on Linux コンテナーで Active Directory 認証を有効にするには、Active Directory ドメインの一部である Linux マシンで次の手順を実行する必要があります。

  1. kinit コマンドを使用して、Kerberos TGT (Ticket Granting Ticket) を取得または更新します。 kinit コマンドには特権アカウントを使用します。 このアカウントには、ドメインに接続するためのアクセス許可が必要であり、ドメインにアカウントと SPN を作成できる必要もあります。

    このサンプル スクリプトでは、privilegeduser@CONTOSO.COM という特権ユーザーがドメイン コントローラー上に既に作成されています。

    kinit privilegeduser@CONTOSO.COM
    
  2. adutil を使用して、SQL Server によって特権 Active Directory アカウントとして使用される新しいユーザーを作成します。

    adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
    

    パスワードは、次の 3 つの方法のいずれでも指定できます。

    • パスワード フラグ: --password <password>
    • 環境変数 - ADUTIL_ACCOUNT_PWD
    • 対話形式での入力

    パスワードの入力方法の優先順位は、上記のオプションの順序に従います。 推奨されるオプションは、環境変数または対話形式の入力を使用してパスワードを指定することです。これらの方がパスワード フラグより安全です。

    上で示したように、識別名 (-distname) を使用してアカウントの名前を指定することも、組織単位 (OU) 名を使用することもできます。 両方を指定した場合は、OU 名 (--ou) が識別名より優先されます。 次のコマンドを実行して詳細を確認できます。

    adutil user create --help
    
  3. 上で作成したユーザーに SPN を登録します。 接続を外部に表示する方法に応じて、必要な場合は、コンテナー名の代わりにホスト マシン名を使用できます。 このチュートリアルでは、5433 の代わりにポート 1433 を使用します。 これは、コンテナーのポート マッピングです。 ポート番号は異なる場合があります。

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • kinit アカウントに十分な特権がある場合、addauto により SPN が自動的に作成されます。
    • -n:SPN が割り当てられるアカウントの名前。
    • -s:SPN の生成に使用するサービス名。 この場合は、SQL Server サービス用であるため、サービス名は MSSQLSvc です。
    • -H:SPN の生成に使用するホスト名。 指定しないと、ローカル ホストの FQDN が使用されます。 コンテナー名の FQDN も指定します。 この場合、コンテナー名は sql1 であり、FQDN は sql1.contoso.com です。
    • -p:SPN の生成に使用するポート。 指定しないと、ポートなしで SPN が生成されます。 この場合、SQL Server がデフォルトのポート 1433 をリッスンしている場合にのみ、接続は機能します。

SQL Server サービスの keytab ファイルを作成する

前に作成した 4 つの各 SPN に対するエントリと、ユーザー用の 1 つが含まれる、keytab ファイルを作成します。 keytab ファイルはコンテナーにマウントされるので、ホスト上の任意の場所に作成できます。 docker や podman を使用してコンテナーをデプロイするときに、結果の keytab が正しくマウントされている限り、このパスを変更しても安全です。

すべての SPN に対して keytab を作成するには、createauto オプションを使用します。

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
  • -k:mssql.keytab ファイルの作成先となるパス。 前の例では、ディレクトリ /container/sql1/secrets が既にホスト上に存在している必要があります。
  • -p:SPN の生成に使用するポート。 指定しないと、ポートなしで SPN が生成されます。
  • -H:SPN の生成に使用するホスト名。 指定しないと、ローカル ホストの FQDN が使われます。 コンテナー名の FQDN も指定します。 この場合、コンテナー名は sql1 であり、FQDN は sql1.contoso.com です。
  • -s:SPN の生成に使用するサービス名。 この場合は、SQL Server サービス用であるため、サービス名は MSSQLSvc です。
  • --password: これは前に作成した特権 Active Directory ユーザー アカウントのパスワードです。
  • -e または --enctype: keytab エントリの暗号化の種類。 コンマで区切られた値のリストを使用します。 指定しないと、対話形式のプロンプトが表示されます。

暗号化の種類を選択する場合は、複数選択できます。 この例では、aes256-cts-hmac-sha1-96arcfour-hmac を選択しています。 ホストとドメインで確実にサポートされている暗号化の種類を確認してください。

暗号化の種類を非対話形式で選択する場合は、上のコマンドの -e 引数を使用して暗号化の種類の選択を指定できます。 adutil コマンドの詳細については、次のコマンドを実行してください。

adutil keytab createauto --help

注意

arcfour-hmac は弱い暗号化であり、運用環境での暗号化の種類として使用することは推奨されません。

ユーザーの keytab を作成するには、次のコマンドを使用します。

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
  • -k:mssql.keytab ファイルの作成先となるパス。 前の例では、ディレクトリ /container/sql1/secrets が既にホスト上に存在している必要があります。
  • -p:keytab に追加するプリンシパル。

adutil による keytab の作成と自動作成では、以前のファイルは上書きされません。既に存在する場合は、ファイルにアペンドされます。

コンテナーをデプロイするとき、作成された keytab に適切なアクセス許可が確実に設定されているようにします。

chmod 440 /container/sql1/secrets/mssql.keytab

この時点で、現在の Linux ホストから SQL Server コンテナーをデプロイする Linux ホストに mssql.keytab をコピーし、SQL Server コンテナーを実行する Linux ホストで残りの手順を行います。 SQL Server コンテナーをデプロイするのと同じ Linux ホストで上記の手順を行った場合は、同じホストで次の手順を行います。

SQL Server コンテナーによって使用される構成ファイルを作成する

  1. Active Directory の設定を使用して mssql.conf ファイルを作成します。 このファイルはホスト上の任意の場所に作成でき、docker run コマンドの間に正しくマウントする必要があります。 この例では、このファイル mssql.conf/container/sql1の下に格納します。これはコンテナー ディレクトリです。 mssql.conf の内容は次のようになります。

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    
    • privilegedadaccount: Active Directory 認証に使用する特権 Active Directory ユーザー。
    • kerberoskeytabfile: mssql.keytab ファイルが格納されるコンテナー内のパス。
  2. 次の例のように、krb5.conf ファイルを作成します。 これらのファイルでは大文字と小文字が区別されます。

    [libdefaults]
    default_realm = CONTOSO.COM
    
    [realms]
    CONTOSO.COM = {
        kdc = adVM.contoso.com
        admin_server = adVM.contoso.com
        default_domain = CONTOSO.COM
    }
    
    [domain_realm]
    .contoso.com = CONTOSO.COM
    contoso.com = CONTOSO.COM
    
  3. すべてのファイル (mssql.confkrb5.confmssql.keytab) を、SQL Server コンテナーにマウントされる場所にコピーします。 この例では、これらのファイルは次の場所にあるホストに配置されます: mssql.confkrb5.conf/container/sql1/ に。 mssql.keytab/container/sql1/secrets/ の場所に配置されます。

  4. docker や podman コマンドを実行するユーザーに、これらのフォルダーに対する十分なアクセス許可があることを確認します。 コンテナーの起動時に、ユーザーは作成されたフォルダー パスにアクセスする必要があります。 この例では、フォルダー パスに対して次のアクセス許可を指定しています。

    sudo chmod 755 /container/sql1/
    

構成ファイルをマウントし、SQL Server コンテナーをデプロイする

SQL Server コンテナーを実行し、前に作成した正しい Active Directory 構成ファイルをマウントします。

重要

SA_PASSWORD 環境変数は非推奨です。 代わりに MSSQL_SA_PASSWORD を使用してください

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>" \
-p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
-d mcr.microsoft.com/mssql/server:2019-latest

Note

SELinux が有効なホストのような LSM (Linux セキュリティ モジュール) でコンテナーを実行する場合は、Z オプションを使用してボリュームをマウントする必要があります。これは、プライベートな非共有ラベルでコンテンツにラベルを付けるよう docker に指示するものです。 詳細については、SE Linux ラベルの構成に関するページを参照してください。

この例には、次のコマンドが含まれています。

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/ \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
--dns-search contoso.com \
--dns 10.0.0.4 \
--add-host adVM.contoso.com:10.0.0.4 \
--add-host contoso.com:10.0.0.4 \
--add-host contoso:10.0.0.4 \
-d mcr.microsoft.com/mssql/server:2019-latest
  • ファイル mssql.confkrb5.conf は、ホスト ファイルのパス /container/sql1 にあります。
  • 作成された mssql.keytab は、ホスト ファイルのパス /container/sql1/secrets にあります。
  • ホスト マシンは Azure 上にあるため、Active Directory の詳細を同じ順序で docker run コマンドにアペンドする必要があります。 この例では、ドメイン コントローラー adVM はドメイン contoso.com 内にあり、IP アドレスは 10.0.0.4 です。 ドメイン コントローラーにより DNS と KDC が実行されます。

Transact-SQL を使用して Active Directory ベースの SQL Server ログインを作成する

SQL Server コンテナーに接続します。 次のコマンドを使用して、ログインを作成し、それが存在することを確認します。 このコマンドは、SSMS、Azure Data Studio、またはその他のコマンド ライン インターフェイス (CLI) ツールを実行しているクライアント コンピューター (Windows または Linux) から実行できます。

CREATE LOGIN [contoso\amvin] FROM WINDOWS;

SELECT name FROM sys.server_principals;

Active Directory 認証を使用して SQL Server に接続する

SQL Server Management Studio (SSMS) または Azure Data Studio を使用して接続するには、SQL Server の名前とポート番号 (名前はコンテナー名またはホスト名) を使用し、Windows 資格情報を使用して、SQL Server にログインします。 この例では、サーバー名は sql1.contoso.com,5433 です。

また、sqlcmd などのツールを使用して、コンテナー内の SQL Server に接続することもできます。

sqlcmd -E -S 'sql1.contoso.com,5433'

リソース