SQL Server on Linux 用の keytab をーテーションする

適用対象:SQL Server - Linux

組織のセキュリティのベスト プラクティスに基づいて、mssql.confnetwork.privilegedadaccount として提供されている Windows Active Directory アカウント、または SQL Server サービス用のサービス プリンシパル名 (SPN) を所有するその他のアカウントのパスワードを、定期的にローテーションすることが必要な場合があります。 この記事では、アカウントのパスワードを変更するためにサポートされている方法について説明します。 パスワードの変更は、Linux 上の SQL Server サービスを再起動しなくても有効になります。

keytab を更新するには、adutil ツールを使用します。 adutil コマンドは、ドメイン参加済みのコンピューターから実行する必要があります。 adutil ツールとそのダウンロード方法の詳細については、「adutil の概要 - Active Directory ユーティリティ」を参照してください。

Active Directory で更新する前に、keytab の新しいパスワードを次の kvno 番号で更新することが重要です。 次の kvno 番号を使用すると、パスワードの変更後に SQL Server サービスを再起動する必要がありません。 先に Active Directory でパスワードを更新してから、keytab を変更した場合、Active Directory 認証を正しく機能させるには、SQL Server サービスを再起動する必要があります。

keytab をローテーションするシナリオ

具体的な例を考えてみましょう。 SQL Server on Linux では Active Directory 認証が既に有効になっています。 mssql.conf ファイルでは、network.privilegedadaccountsqluser に設定してあります。 アカウント sqluser@CONTOSO.COM は Active Directory で既に作成されており、keytab も既定の場所 /var/opt/mssql/secrets/mssql.keytab に作成されています。 このような状況で、sqluser@CONTOSO.COM のパスワードを変更します。 次の手順のようにする必要があります。

  1. ドメインに参加しているコンピューターに adutil をインストールします

  2. kinit コマンドを使用して、Kerberos TGT (Ticket Granting Ticket) を取得または更新します。 kinit コマンドには特権アカウントを使用します。 このアカウントには、ドメインに接続するためのアクセス許可が必要であり、ドメインにアカウントと SPN を作成できる必要があります。 この場合、CONTOSO.COM という名前のドメインでアカウントと SPN を作成するアクセス許可を持つアカウント privilegeduser@CONTOSO.COM を使用します。

    kinit privilegeduser@CONTOSO.COM
    
  3. kinit を実行して TGT を取得または更新した後、network.privilegedadaccount の現在の kvno 番号を照会します。 このケースでは sqluser@CONTOSO.COM です。

    kvno sqluser@CONTOSO.COM
    

mssql-conf を使って keytab をローテーションするか、adutil を使って手動で keytab をローテーションすることができます。

mssql-conf を使用して keytab をローテーションする

adutil をインストールして、それを mssql-conf と統合できます。つまり、mssql-conf を使用して keytab をローテーションできます。

  1. ルート ユーザーとしてサインインし、mssql ユーザーに切り替えます。

    su mssql
    
  2. kinit コマンドを使用して、Kerberos TGT (Ticket Granting Ticket) を取得または更新します。 kinit コマンドには特権アカウントを使用します。 このアカウントには、ドメインに接続するためのアクセス許可が必要であり、ドメインにアカウントと SPN を作成できる必要があります。 この場合、CONTOSO.COM という名前のドメインでアカウントと SPN を作成するアクセス許可を持つアカウント privilegeduser@CONTOSO.COM を使用します。

    kinit privilegeduser@CONTOSO.COM
    
  3. mssql-conf コマンドを実行して、SQL Server の keytab と network.privilegedadaccount の詳細を指定します。 この例では、privilegedadaccountsqluser です。

    ./mssql-conf setup-ad-keytab /var/opt/mssql/secrets/mssql.keytab sqluser --use-next-kvno'
    

    パスワードを求められたら、使用する新しいパスワードを入力します。 --use-next-kvno オプションは、現在の kvno に 1 を加えた値を割り当てます。

    省略可能: mssql-confsetup-ad-keytab コマンドと --kvno オプションを使って、特定の kvno を指定することもできます。 最初にユーザーの現在の kvno を取得してから、それに応じて新しい kvno に更新する必要があります。これは現在の kvno + 1 になります。

  4. 次のコマンドを使って、keytab のキーの一覧を表示できます。

    klist -kte /var/opt/mssql/secrets/mssql.keytab
    

    ユーザーと SPN 両方のエントリで、keytab が次の kvno に更新されていることがわかります。

  5. ここで、sqluser ユーザーのパスワードを変更できます。 次に例を示します。

    重要

    このステップの間に SQL Server の再起動を求められた場合は、無視してかまいません。 忘れずに、Active Directory でのパスワードの変更も行ってください。

    bash-4.4$ kinit privilegedaccount@CONTOSO.COM
    Password for privilegedaccount@CONTOSO.COM:
    
    bash-4.4$ ./mssql-conf setup-ad-keytab /var/opt/mssql/secrets/mssql.keytab sqluser --use-next-kvno
    sqluser@contoso.com's password:
    Confirm sqluser@contoso.com's password:
    
    SQL Server needs to be restarted in order to adopt the new AD configuration, please run 'systemctl restart mssql-server.service'.
    
    bash-4.4$ klist -kte /var/opt/mssql/secrets/mssql.keytab
    Keytab name: FILE:/var/opt/mssql/secrets/mssql.keytab
    KVNO Timestamp           Principal
    ---- ------------------- ------------------------------------------------------
       4 12/30/2021 14:02:08 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       4 12/30/2021 14:02:08 MSSQLSvc/sql1.contoso.com:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       4 12/30/2021 14:02:08 MSSQLSvc/sql1.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       4 12/30/2021 14:02:08 MSSQLSvc/sql1:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       4 12/30/2021 14:02:08 MSSQLSvc/sql1@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 MSSQLSvc/sql1.contoso.com:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 MSSQLSvc/sql1.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 MSSQLSvc/sql1:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 MSSQLSvc/sql1@CONTOSO.COM (aes256-cts-hmac-sha1-96)
    

adutil を使用して keytab を手動でローテーションする

adutil を使って手動で keytab を更新する場合は、次の手順を参照してください。

adutil を使って keytab を更新すると、現在の keytab にエントリが追加されます。 たとえば、前のコマンドで得た kvno 番号が 2 の場合は、keytab を更新するときに kvno 番号として 3 を使用します。 次に示す adutil コマンドを実行する必要があります。

  • 実際の環境に合わせて、ポート番号 (-p)、ホスト名 (-H)、keytab へのパス (-k)、kvno 番号を変更してください。
adutil keytab createauto -k /var/opt/mssql/secrets/mssql.keytab -p 1433 -H mssql.contoso.com --password '<newpassword>' -s MSSQLSvc --kvno 3
adutil keytab create -k /var/opt/mssql/secrets/mssql.keytab -p sqluser --password '<newpassword>' --kvno 3

-k: は、SQL Server によって使用されていて、mssql.conf ファイルのオプション network.kerberoskeytabfile を使用して設定される、現在の keytab へのパスです。

-H: は、SQL Server ホストの完全修飾ドメイン名です。

-p: は、最初のコマンドでは、SQL Server サービスがリッスンするように構成するポートです。 2 番目のコマンドの -p は、パスワードを更新する network.privilegedadaccount を表します。

kvno: の値は、現在の kvno に 1 を加えた値にする必要があります。 現在の kvno の値は、ステップ 3 で取得します。

上のコマンドを実行した後、keytab エントリに対して選択した暗号化の種類を指定する必要があります。 環境に適切なものを選択してください。

keytab のエントリを調べる

keytab を更新した後は、同じアカウント sqluser@CONTOSO.COM と SPN に対し、kvno 3 (新) と kvno 2 (旧) のエントリが keytab に表示されるようになるはずです。 次の klist コマンドを実行して、keytab のエントリを確認できます。

klist -kte /var/opt/mssql/secrets/mssql.keytab

Active Directory でアカウントのパスワードを変更する

最後のステップでは、network.privilegedadaccount または Windows Active Directory で SQL Server の SPN を所有するアカウントのパスワードを更新します。 上のシナリオでは、Active Directory で sqluser@CONTOSO.COM のパスワードを更新する必要があります。 パスワードを、前のセクションのステップ 3 で指定した <newpassword> に変更します。 Active Directory 認証は引き続き機能し、SQL Server サービスを再起動する必要はありません。