チュートリアル:SQL Server on Linux で Active Directory 認証を使用する

適用対象:SQL Server - Linux

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

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

  • SQL Server ホストを Active Directory ドメインに参加させる
  • SQL Server 用の Active Directory ユーザーを作成し、SPN を設定する
  • SQL Server サービスの keytab を構成する
  • keytab ファイルをセキュリティで保護する
  • Kerberos 認証に keytab ファイルを使用するように SQL Server を構成する
  • Transact-SQL で Active Directory ベースのログインを作成する
  • Active Directory 認証を使用して SQL Server に接続する

前提条件

Active Directory 認証を構成する前に、次のことを行う必要があります。

SQL Server ホストを Active Directory ドメインに参加させる

SQL Server Linux ホストを Active Directory ドメイン コントローラーに参加させます。 Active Directory ドメインに参加する方法については、「Linux ホスト上の SQL Server を Active Directory ドメインに参加させる」をご覧ください。

SQL Server 用の Active Directory ユーザーを作成し、SPN を設定する

Note

以下の手順では、完全修飾ドメイン名 (FQDN) を使います。 Azure を使用している場合は、先に進む前に FQDN を作成する必要があります。

  1. ドメイン コントローラーで New-ADUser PowerShell コマンドを実行して、有効期限がないパスワードを持つ新しい Active Directory ユーザーを作成します。 次の例では sqlsvc というアカウント名を使っていますが、任意のアカウント名にすることができます。 アカウントの新しいパスワードを入力するように求められます。

    Import-Module ActiveDirectory
    
    New-ADUser sqlsvc -AccountPassword (Read-Host -AsSecureString "Enter Password") -PasswordNeverExpires $true -Enabled $true
    

    Note

    SQL Server 専用の Active Directory アカウントを使用して、SQL Server インスタンスの資格情報が同じアカウントを使用する他のサービスと共有されないようにすることが、セキュリティのベスト プラクティスです。 ただし、アカウントのパスワードがわかっている場合は、必要に応じて既存の Active Directory アカウントを再利用できます (次のステップで keytab ファイルを生成するために必要です)。 さらに、このアカウントは、ユーザー アカウントで 128 ビットおよび 256 ビットの Kerberos AES 暗号化 (msDS-SupportedEncryptionTypes 属性) をサポートする場合は有効にする必要があります。 アカウントで AES 暗号化が有効になっていることを確認するには、 [Active Directory ユーザーとコンピューター] ユーティリティでアカウントを見つけ、 [プロパティ] を選択します。 [プロパティ][アカウント] タブを見つけて、次の 2 つのチェックボックスが選択されていることを確認します。

    1. [このアカウントで Kerberos AES 128 ビット暗号化をサポートする]

    2. [このアカウントで Kerberos AES 256 ビット暗号化をサポートする]

  2. setspn.exe ツールを使って、このアカウントの ServicePrincipalName (SPN) を設定します。 SPN は、次の例で指定したとおりに書式設定されている必要があります。 SQL Server ホスト コンピューターの完全修飾ドメイン名は、SQL Server ホスト上で hostname --all-fqdns を実行することによって確認できます。 別のポート番号を使うように SQL Server を構成している場合を除き、TCP ポートは 1433 にする必要があります。

    setspn -A MSSQLSvc/<fully qualified domain name of host machine>:<tcp port> sqlsvc
    setspn -A MSSQLSvc/<netbios name of the host machine>:<tcp port> sqlsvc
    

    Note

    エラー Insufficient access rights が発生する場合は、ドメイン管理者に連絡して、このアカウントに SPN を設定するための十分なアクセス許可があることを確認してください。 SPN の登録に使用されるアカウントには Write servicePrincipalName 権限が必要になります。 詳細については、「 Kerberos 接続用のサービス プリンシパル名の登録」を参照してください。

    後で TCP ポートを変更する場合は、新しいポート番号を指定して setspn コマンドを再度実行する必要があります。 また、次のセクションの手順に従って、SQL Server サービスの keytab に新しい SPN を追加する必要があります。

詳細については、「 Kerberos 接続用のサービス プリンシパル名の登録」を参照してください。

SQL Server サービスの keytab を構成する

SQL Server on Linux に Active Directory 認証を構成するには、Active Directory ユーザー アカウントと前のセクションで作成した SPN が必要です。

重要

Active Directory アカウントのパスワードが変更された場合、または SPN が割り当てられているアカウントのパスワードが変更された場合は、新しいパスワードとキー バージョン番号 (KVNO) を使用して、keytab を更新する必要があります。 一部のサービスでは、パスワードが自動的にローテーションされる場合もあります。 問題のアカウントのパスワード ローテーション ポリシーを確認し、予期しないダウンタイムが発生しないように、スケジュールされたメンテナンス アクティビティと一致させます。

SPN の keytab エントリ

  1. 前のステップで作成した Active Directory アカウントのキー バージョン番号 (KVNO) を確認します。 通常は 2 ですが、アカウントのパスワードを複数回変更した場合は、別の整数になることがあります。 SQL Server のホスト コンピューターで、次のコマンドを実行します。

    • 次の例では、user@CONTOSO.COM ドメインにあることを前提としています。 ユーザーとドメイン名を自分のユーザーとドメイン名に変更します。
    kinit user@CONTOSO.COM
    kvno user@CONTOSO.COM
    kvno MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM
    

    Note

    SPN がドメインに反映されるまでに数分かかる場合があります (特に、ドメインが大きい場合)。 kvno: Server not found in Kerberos database while getting credentials for MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM というエラーが発生する場合は、数分待ってからもう一度やり直してください。

    上記のコマンドは、サーバーが Active Directory ドメインに参加している場合にのみ機能します。これについては前のセクションで説明しました。

  2. ktpass を使用し、各 SPN の keytab エントリを追加します。その際、Windows コンピューターのコマンド プロンプトで次のコマンドを使用します。

    • <DomainName>\<UserName> - Active Directory ユーザー アカウント
    • @CONTOSO.COM - お使いのドメインの名前を使用します
    • /kvno <#> - <#> を前の手順で取得した KVNO に置換します
    • <StrongPassword> - 強力なパスワードを使用します
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    

    Note

    上記のコマンドでは、Active Directory 認証に AES と RC4 の両方の暗号化による暗号を使用できます。 RC4 は古い暗号化暗号です。より高度なセキュリティが必要な場合、AES 暗号化暗号のみを使用して keytab エントリを作成することを選択できます。 最後の 2 つの UserName エントリは小文字で指定する必要があります。そうしないと、許可認証に失敗する可能性があります。

  3. 上記のコマンドの実行後、mssql.keytab という名前の keytab ファイルが与えられるはずです。 SQL Server コンピューターにあるフォルダー /var/opt/mssql/secrets にこのファイルをコピーします。

  4. keytab ファイルをセキュリティで保護します。

    この keytab ファイルにアクセスできるすべてのユーザーは、ドメインで SQL Server を偽装できるので、mssql アカウントのみに読み取りアクセス権が付与されるように、ファイルへのアクセスを制限する必要があります。

    sudo chown mssql:mssql /var/opt/mssql/secrets/mssql.keytab
    sudo chmod 400 /var/opt/mssql/secrets/mssql.keytab
    
  5. 次の構成オプションを mssql-conf ツールで設定し、keytab ファイルにアクセスするときに使用するアカウントを指定する必要があります。

    sudo mssql-conf set network.privilegedadaccount <username>
    

    Note

    ユーザー名のみを含め、domainname\username や username@domain は含めません。 SQL Server の内部では、このユーザー名と共に必須となるドメイン名が使用時に追加されます。

  6. 次の手順を使用して、Kerberos 認証用の keytab ファイルを使って開始するように SQL Server を構成します。

    sudo mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
    sudo systemctl restart mssql-server
    

    ヒント

    必要に応じて、パフォーマンスを向上させるため、ドメイン コントローラーへの UDP 接続を無効にします。 多くの場合、ドメイン コントローラーに接続するときは UDP 接続が常に失敗するので、UDP の呼び出しをスキップするように /etc/krb5.conf の構成オプションを設定できます。 /etc/krb5.conf を編集して、次のオプションを設定します。

    /etc/krb5.conf
    [libdefaults]
    udp_preference_limit=0
    

この時点で、SQL Server で Active Directory ベースのログインを使用できるようになります。

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

  1. SQL Server に接続し、Active Directory ベースの新しいログインを作成します。

    CREATE LOGIN [CONTOSO\user] FROM WINDOWS;
    
  2. sys.server_principals システム カタログ ビューにログインが表示されていることを確認します。

    SELECT name FROM sys.server_principals;
    

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

ドメイン資格情報を使用してクライアント コンピューターにサインインします。 Active Directory 認証を使用してパスワードを再入力することなく SQL Server に接続できるようになります。 Active Directory グループに対するログインを作成した場合は、そのグループのメンバーであるすべての Active Directory ユーザーが、同じ方法で接続できます。

クライアントで Active Directory 認証を使用するための特定の接続文字列パラメーターは、使用しているドライバーによって異なります。 次のセクションの例を検討してください。

ドメインに参加している Linux クライアントでの sqlcmd

ssh とドメイン資格情報を使用して、ドメインに参加している Linux クライアントにサインインします。

ssh -l user@contoso.com client.contoso.com

mssql-tools パッケージがインストールされていることを確認した後、資格情報を指定せずに sqlcmd を使用して接続します。

sqlcmd -S mssql-host.contoso.com

SQL Windows とは異なり、Kerberos 認証は SQL Linux のローカル接続で動作します。 ただし、SQL Linux ホストの FQDN を指定する必要があります。.localhost127.0.0.1 などに接続しようとしても、Active Directory 認証は機能しません。

ドメインに参加している Windows クライアントでの SSMS

ドメイン資格情報を使用して、ドメインに参加している Windows クライアントにサインインします。 SQL Server Management Studio がインストールされていることを確認した後、[サーバーへの接続] ダイアログで [Windows 認証] を指定して、SQL Server インスタンス (例 : mssql-host.contoso.com) に接続します。

他のクライアント ドライバーを使用した Active Directory 認証

次の表では、他のクライアント ドライバーに関する推奨事項について説明します。

クライアント ドライバー 推奨
JDBC Kerberos 統合認証を使用して、SQL Server に接続します。
ODBC 統合認証を使用します。
ADO.NET 接続文字列の構文。

追加の構成オプション

PBISVASCentrify などのサードパーティ製ユーティリティを使用して Linux ホストを Active Directory ドメインに参加させていて、SQL Server で OpenLDAP ライブラリを直接使いたい場合は、次のように mssql-confdisablesssd オプションを構成できます。

sudo mssql-conf set network.disablesssd true
systemctl restart mssql-server

Note

realmd のように SSSD が設定されるユーティリティもありますが、PBIS、VAS、Centrify などの他のツールでは SSSD は設定されません。 Active Directory ドメインへの参加に使用しているユーティリティで SSSD が設定されない場合は、disablesssd オプションを true に設定することをおすすめします。 OpenLDAP メカニズムにフォールバックする前に、SQL Server では Active Directory に対して SSSD の使用が試みられるので、必須ではありませんが、SQL Server で SSSD メカニズムをバイパスして OpenLDAP が直接呼び出されるように構成すると、パフォーマンスが向上します。

ドメイン コントローラーで LDAPS がサポートされている場合は、SQL Server からドメイン コントローラーへのすべての接続で LDAPS が使用されるように強制することができます。 クライアントが LDAPS 経由でドメイン コントローラーに接続できることを確認するには、Bash コマンド ldapsearch -H ldaps://contoso.com:3269 を実行します。 LDAPS のみを使うように SQL Server を設定するには、以下を実行します。

sudo mssql-conf set network.forcesecureldap true
systemctl restart mssql-server

これにより、ホストでの Active Directory ドメイン参加が SSSD パッケージによって行われていて、disablesssd が true に設定されていない場合は、SSSD で LDAPS が使用されます。 disablesssd が true に設定されていて、forcesecureldap が true に設定されている場合は、SQL Server によって行われる OpenLDAP ライブラリの呼び出しで LDAPS プロトコルが使われます。

SQL Server 2017 CU 14 以降

SQL Server 2017 (14.x) CU 14 以降では、SQL Server で、Active Directory ドメイン コントローラーへの参加にサードパーティのプロバイダーが使われていて、disablesssd を true に設定することによって一般的な Active Directory 参照に OpenLDAP の呼び出しが使われるように構成されている場合は、enablekdcfromkrb5 オプションを使うことにより、KDC サーバーの逆引き DNS 参照ではなく、krb5 ライブラリを使って KDC 参照を行うように、SQL Server を強制することができます。

これは、SQL Server が通信を試みるドメイン コントローラーを手動で構成する場合に便利です。 また、krb5.conf で KDC リストを使うことにより、OpenLDAP ライブラリのメカニズムを使用します。

まず、disablesssdenablekdcfromkrb5conf を true に設定し、次に SQL Server を再起動します。

sudo mssql-conf set network.disablesssd true
sudo mssql-conf set network.enablekdcfromkrb5conf true
systemctl restart mssql-server

次に、/etc/krb5.conf で KDC リストを次のように構成します。

[realms]
CONTOSO.COM = {
  kdc = dcWithGC1.contoso.com
  kdc = dcWithGC2.contoso.com
}

推奨されませんが、Linux ホストをドメインに参加させるときに SSSD が設定される realmd などのユーティリティを使用しながら、disablesssd を true に設定することで、SQL Server による Active Directory 関連の呼び出しに SSSD ではなく OpenLDAP の呼び出しが使われるようにすることができます。

Note

FQDN (例: CONTOSO.COM\Username) を使用した SQL Server ログインはサポートされていません。 CONTOSO\Username という形式を使用します。

ドメイン ローカル グループからの SQL Server ログインはサポートされていません。 代わりにグローバル セキュリティ ドメイン グループを使用してください。

SQL ドキュメントへの投稿

SQL コンテンツを自分で編集できることはご存じですか。 これにより、ドキュメントが改善されるだけでなく、ページの共同作成者としてもクレジットされます。

詳細については、「SQL Server のドキュメントに投稿する方法」を参照してください。