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

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

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

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

前提条件

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

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

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

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

サービス プリンシパル名 (SPN) を登録するときは、マシンのホスト名またはコンテナーの名前を使用できますが、コンテナーに外部から接続したときに表示されるようにしたいものに従って設定する必要があります。

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

ホスト レコードを追加する

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

注意

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

adutil をインストールする

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

AD ユーザー、SPN、SQL Server サービスの keytab の作成

SQL Server on Linux コンテナー ホストをドメインの一部にするのが望ましくなく、マシンをドメインに参加させる手順に従っていない場合は、既に AD ドメインの一部になっている別の Linux マシンで、次の手順のようにします。

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

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

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

SQL Server 用の AD ユーザーを作成し、adutil ツールを使用して ServicePrincipalName を設定する

SQL Server on Linux コンテナーで AD 認証を有効にするには、以下で説明するステップ 1 から 3 を、AD ドメインの一部である Linux マシンで実行する必要があります。

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

    重要

    このコマンドを実行する前に、前のステップで示したように、ホストが既にドメインに属している必要があります。

    kinit privilegeduser@DOMAIN.COM
    

    例:上で説明した環境の場合、特権アカウントは amvin@CONTOSO.COM です

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

    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 を登録します。 接続を外部に表示する方法に応じて、必要な場合は、コンテナー名の代わりにホスト マシン名を使用できます。 このチュートリアルでは、1433 の代わりにポート 5433 を使用します。 これは、コンテナーのポート マッピングです。 ポート番号は異なる場合があります。

    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 接続は機能します。

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:これは、前に作成した特権 AD ユーザー アカウントのパスワードです。
  • -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 コンテナーをデプロイするのと同じ Linux ホストで上記の手順を行った場合は、同じホストで次の手順を行います。

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

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

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    

    注意

    • privilagedadaccount:AD 認証に使用する特権 AD ユーザー。
    • kerberoskeytabfile:mssql.keytab ファイルが格納されるコンテナー内のパス。
  2. krb5.conf ファイルを作成します。 サンプルを次に示します。 これらのファイルでは大文字と小文字が区別されます。

    [libdefaults]
    default_realm = DOMAIN.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. Copy all files, mssql.conf, krb5.conf, mssql.keytab to a location that will be mounted to the SQL Server container. In this example, these files are placed on the host at the following locations: mssql.conf and krb5.conf at /container/sql1/. mssql.keytab is placed at the location /container/sql1/secrets/.

  4. Make sure there's enough permission on these folders for the user running the docker/podman command. When the container starts, the user needs access to the folder path created. In this example, we provided the below permissions given to the folder path:

    sudo chmod 755 /container/sql1/
    

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

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

sudo docker run -e "ACCEPT_EULA=Y" -e "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

注意

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

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

sudo docker run -e "ACCEPT_EULA=Y" -e "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 上にあるため、AD の詳細を同じ順序で docker run コマンドに追加する必要があります。 この例では、ドメイン コントローラー adVM はドメイン contoso.com 内にあり、IP アドレスは 10.0.0.4 です。 ドメイン コントローラーにより DNS と KDC が実行されます。

Transact-SQL で AD ベースの SQL Server ログインを作成する

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

create login [contoso\amvin] From Windows
SELECT name FROM sys.server_principals;

AD 認証を使用して SQL Server に接続する。

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

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

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

次の手順