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

適用対象:Linux 上の SQL Server

このチュートリアルでは、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認証を設定する前に、以下のことをする必要があります:

Note

SQL Server 2025 (17.x) 以降、SUSE Linux Enterprise Server (SLES) はサポートされていません。

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
    

    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. このアカウントの サービスプリンシパル名(SPN) を setspn.exe ツールで設定してください。 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 が必要です。

Important

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を使い、Windowsコマンドプロンプト内の以下のコマンドで各SPNのキータブエントリを追加します:

    • <DomainName>\<UserName> - Active Directory ユーザー アカウント
    • @CONTOSO.COM - お使いのドメインの名前を使用します
    • /kvno <#> - <#> を前の手順で取得した KVNO に置換します
    • <password> - パスワードは SQL Server の既定のパスワード ポリシーに従う必要があります。 既定では、パスワードの長さは少なくとも 8 文字で、大文字、小文字、10 進数の数字、記号の 4 種類のうち 3 種類を含んでいる必要があります。 パスワードには最大 128 文字まで使用できます。 可能な限り長く複雑なパスワードを使用してください。
    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 <password>
    
    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 <password>
    
    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 <password>
    
    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 <password>
    
    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 <password>
    
    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 <password>
    

    上記のコマンドでは、Active Directory 認証に AES と RC4 の両方の暗号化による暗号を使用できます。 RC4 は古い暗号化暗号です。より高度なセキュリティが必要な場合、AES 暗号化暗号のみを使用して keytab エントリを作成することを選択できます。

    Note

    最後の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. keytab ファイルへのアクセス時に使用するアカウントを指定するには、 mssql-conf ツールで次の構成オプションを設定する必要があります。

    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 を編集して、次のオプションを設定します。

    [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

WindowsのSQL Serverとは異なり、Kerberos認証はLinux上のSQL Server on Linuxへのローカル接続に機能します。 ただし、SQL ServerホストのFQDNは必ず提供する必要があります。 Active Directory認証は.、localhost、127.0.0.1に接続しようとすると機能しません。

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

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

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

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

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

その他の構成オプション

PBIS、VAS、Centrifyなどのサードパーティユーティリティを使ってLinuxホストをActive Directoryドメインに接続し、SQL ServerにOpenLDAPライブラリを直接使わせたい場合は、mssql-confでdisablesssdオプションを以下のように設定できます:

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

Note

realmdのようなユーティリティはSSSDを設定していますが、PBIS、VAS、CentrifyなどのツールはSSSDを設定しません。 Active Directoryドメインに参加するユーティリティがSSSDを設定しない場合は、disablesssdオプションをtrueに設定してください。 SQL ServerはActive DirectoryでSSSDを使おうとし、その後OpenLDAP機構にフォールバックするため必須ではありませんが、このオプションを設定することでSQL Serverは直接OpenLDAP呼び出しを行い、SSSDを回避できます。

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

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

ホストがSSSDを使ってActive Directoryドメインに参加し、disablesssdがtrueに設定されていない場合、SQL ServerはSSSDよりもLDAPSを使用します。 disablesssdとforcesecureldapの両方がtrueに設定されている場合、SQL ServerはOpenLDAPではなくLDAPSを使用します。

SQL Server 2017 CU 14以降のバージョン

2017 SQL Server(14.x)CU 14から、SQL Serverがサードパーティプロバイダーを使ってActive Directoryドメインコントローラーに接続され、disablesssdをtrueに設定してOpenLDAPコールを一般的なActive Directory検索に使うように設定されている場合、enablekdcfromkrb5confオプションを使ってKDCサーバーの逆DNS検索ではなくkrb5ライブラリをSQL Server KDC検索に強制的に使うこともできます。

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

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

sudo mssql-conf set network.disablesssd true
sudo mssql-conf set network.enablekdcfromkrb5conf true
sudo 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 コンテンツを自分で編集できることはご存じですか。 これにより、ドキュメントが改善されるだけでなく、ページの共同作成者としてもクレジットされます。

詳細については、 Microsoft Learn ドキュメントの編集を参照してください。