チュートリアル: 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
に接続すると、適切なホストに到達することが保証されます。
このチュートリアルでは、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 マシンで、次の手順を実行する必要があります。
SQL Server 用の Active Directory ユーザーを作成し、adutil を使用して SPN を設定します。
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 マシンで次の手順を実行する必要があります。
kinit
コマンドを使用して、Kerberos TGT (Ticket Granting Ticket) を取得または更新します。kinit
コマンドには特権アカウントを使用します。 このアカウントには、ドメインに接続するためのアクセス許可が必要であり、ドメインにアカウントと SPN を作成できる必要もあります。このサンプル スクリプトでは、
privilegeduser@CONTOSO.COM
という特権ユーザーがドメイン コントローラー上に既に作成されています。kinit privilegeduser@CONTOSO.COM
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
- パスワード フラグ:
上で作成したユーザーに 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
をリッスンしている場合にのみ、接続は機能します。
- kinit アカウントに十分な特権がある場合、
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-96
と arcfour-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 コンテナーによって使用される構成ファイルを作成する
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
ファイルが格納されるコンテナー内のパス。
次の例のように、
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
すべてのファイル (
mssql.conf
、krb5.conf
、mssql.keytab
) を、SQL Server コンテナーにマウントされる場所にコピーします。 この例では、これらのファイルは次の場所にあるホストに配置されます:mssql.conf
とkrb5.conf
は/container/sql1/
に。mssql.keytab
は/container/sql1/secrets/
の場所に配置されます。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.conf
とkrb5.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'
リソース
- SQL Server on Linux およびコンテナーに対する Active Directory 認証を理解する
- SQL Server on Linux およびコンテナーに対する Active Directory 認証のトラブルシューティング