setspnコマンド一覧:SPNの-L・-Q・-X確認と削除、HTTP/HTTPSの違い

SPN一覧はsetspn -L 対象アカウント、特定SPNの登録先はsetspn -Q SPN文字列で確認します。削除は-D、重複検査は-Xです。照会と書き込みのオプションを区別し、登録先・検索範囲・認証に使うアカウントを確認してから変更します。

setspn -Lは指定アカウントの一覧、-QはSPN文字列の所在照会、-Xは重複検査なので、一覧が欲しいのか登録先を探したいのかで使い分けます。

オプション目的例・注意点
-L指定アカウントの登録済みSPN一覧setspn -L CONTOSO\svc_web
-Q指定したSPNの登録先を照会setspn -Q HTTP/app.contoso.com
-X重複するSPNを検索setspn -X。ワイルドカード照会とは別
-F照会・重複検査をフォレスト範囲にする-Qや-Xと組み合わせる。特定DCのレプリケーション確認を指定するオプションではない
-T対象ドメイン、-F併用時はフォレストを指定複数の対象指定も可能。実際の検索範囲を記録する
-S重複を確認してSPNを追加書き込み。確認した正しい所有先だけへ追加する
-D指定アカウントから指定SPNを削除書き込み。文字列とアカウントを正確に指定する
-Rコンピューターの既定SPNをリセット照会ではない。単なる一覧取得のつもりで使わない
目次

setspnコマンドの前提と例示名

Active Directory Domain Servicesの環境と、対象を照会できる権限が必要です。Microsoftのsetspn資料は、AD DSサーバーロールと昇格したコマンドプロンプトを案内しています。利用端末でsetspn /?の使用法と利用可否を確認し、追加・削除には対象AD属性への書き込み権限も確認してください。

以下のCONTOSO、svc_web、SERVER01、app.contoso.comは例示名です。実環境のドメイン、アカウント、アクセス先へ置き換えます。特定のSPNが存在することや登録変更を推奨する実環境の結果ではありません。

1. アカウントのSPNを一覧表示:setspn -L

サービスアカウントの一覧を表示する例です。ドメイン名を含めて対象の取り違えを減らします。

setspn -L CONTOSO\svc_web

コンピューターアカウントを明示して一覧表示する例です。-Cはコンピューター、-Uはユーザーの指定で、同時には使用しません。両者を指定しない場合の自動解釈に頼るより、対象の種類も記録します。

setspn -C -L CONTOSO\SERVER01

一覧に登録された文字列を確認します。Microsoft WindowsではSPNは大文字小文字を区別しませんが、Windows以外のクライアント等には区別する実装があるため、実際に使う表記を揃えます。一覧にあることだけでアプリの認証成功まで証明したとはいえません。

2. SPNの登録先を探す:setspn -Q

現在のドメインで、対象の文字列を照会します。出力に表示される所有先を、想定アカウントと照合してください。

setspn -Q HTTP/app.contoso.com

関連する名前の棚卸しにはワイルドカードも使えます。ただし、異なるSPNが別アカウントから返るのは正常なこともあります。「複数の結果が出た」だけで重複とは判断せず、同じ完全なSPN文字列が複数の所有先にあるかを確認します。

setspn -Q HTTP/app*

フォレスト範囲の照会は-F、対象の指定は-Tです。次は例示するフォレストを対象にした照会です。信頼関係の別フォレストや別ドメインがある場合は、実際の対象範囲と権限を決めてください。

setspn -T contoso.com -F -Q HTTP/app.contoso.com

3. 重複検査:setspn -Xと検索範囲

setspn -X
setspn -F -X

上の2行は、それぞれドメイン範囲とフォレスト範囲の検査例です。大きな環境では処理に時間がかかるため、点検対象と時間を決めます。同じSPNを複数のアカウントへ登録する問題を調べるもので、個々のサーバーに異なるSPNがあることをまとめて削除する手順ではありません。

フォレストを越えた同名SPNは常に同じ一意性の条件というわけではありませんが、クロスフォレスト認証で問題になる場合があります。出力の範囲を省略せずに評価してください。

IISの登録先:アプリプールIDだけで決めない

SPNの所有先は、対象のKerberosチケットを処理する認証アカウントと整合させます。IISではアプリプールのIDに加え、カーネルモード認証とuseAppPoolCredentialsも確認してください。

MicrosoftのIIS資料では、カーネルモードで通常はコンピューターアカウントを使ってチケットを処理します。ドメインユーザーのアプリプールIDにSPNを登録する構成では、useAppPoolCredentials=trueでそのIDの資格情報を使う設計が説明されています。アプリプールIDがドメインユーザーだからという理由だけで、コンピューター側からSPNを移してよいとはいえません。

負荷分散・DNS別名・共有サービスアカウントでは、利用URL、各ノード、認証設定を一緒に設計します。同じSPNを各ノードの別アカウントへ複製しないでください。IISの認証設定や委任設定の変更は、SPN照会とは別の作業として計画します。

HTTPSのURLでもHTTP SPN:ただし文字列だけで削除しない

HTTPSは通信のTLS、HTTP/ホスト名はWeb認証で使うSPNのサービスクラスで、目的が異なります。MicrosoftのSharePoint構成例でも、内部URLhttps://sharepointに対してSPNはHTTP/sharepointです。URLがhttpsだからHTTPS/を作るという置換規則にはしません。

また、コンピューターのHOST SPNがHTTP等の組み込みサービスを代替する場合があります。setspn -Q HTTP/...の結果がないだけで認証不能や追加必須と断定しないでください。実際に要求されるSPN、所有先、HOSTの対応とIIS設定を確認します。

既存のHTTPS/...も、名前だけで不要と決めません。他の製品やクライアントが要求する文字列か、用途と所有先を確認してから整理します。Kerberosのチケットが取れない時は、DNS・URL別名・時刻・通信・権限なども切り分けます。

PowerShellでユーザー・コンピューター・gMSAの一覧を読む

ActiveDirectoryモジュールが利用でき、対象DCへ接続できる環境で実行します。次の3例は属性の読み取りで、SPNを追加・削除しません。DC01.contoso.comは実際の対象DCへ、Identityは実際の対象アカウントへ置き換えます。

Get-ADUser -Identity 'svc_web' -Server 'DC01.contoso.com' -Properties ServicePrincipalNames |
    Select-Object -ExpandProperty ServicePrincipalNames
Get-ADComputer -Identity 'SERVER01' -Server 'DC01.contoso.com' -Properties ServicePrincipalNames |
    Select-Object -ExpandProperty ServicePrincipalNames
Get-ADServiceAccount -Identity 'gmsa_webapp' -Server 'DC01.contoso.com' -Properties ServicePrincipalNames |
    Select-Object -ExpandProperty ServicePrincipalNames

変更直後のDCごとの差を調べる場合は、同じ対象に対して-Serverを各DCへ変えて読み取り結果を比較します。setspn -Fは範囲の拡大であり、DCごとのレプリケーション完了を保証するものではありません。

削除・追加は別の変更操作:一覧と所有先を保管してから

  1. 対象アカウントの一覧と完全なSPN文字列、検索範囲、関連するアプリ・URL・認証設定を記録する。
  2. 使っているアプリと認証アカウントを確認し、対象の削除・移動が必要だと判断できる変更計画と復旧手順を用意する。
  3. 対象の文字列だけを対象アカウントから削除する。一括クリアやHTTPSからHTTPへの機械的な一括置換をしない。
  4. 必要な追加は正しい所有先へ重複検査付きの-Sで行い、再照会・重複検査・アプリで検証する。

以下は、使用していないと確認済みの例示SPNを対象アカウントから削除する構文です。実行するとADが変更されるので、照会だけが目的なら実行しません。

setspn -D HTTP/old-app.contoso.com CONTOSO\svc_web

追加が必要だと確認した場合の構文例です。-Sは重複を調べますが、サービスに適切な所有先やアプリ動作まで判断してくれるわけではありません。

setspn -S HTTP/app.contoso.com CONTOSO\svc_web

PowerShellでのSPN削除:まず-WhatIfで対象を確認

ユーザーのサービスアカウントから特定値を除く例です。-RemoveのハッシュテーブルではLDAP属性名servicePrincipalNameを使います。以下は-WhatIfによる変更予定の確認であり、削除を実行しません。

Set-ADUser -Identity 'svc_web' -Server 'DC01.contoso.com' -Remove @{
    servicePrincipalName = 'HTTP/old-app.contoso.com'
} -WhatIf

本当に変更する段階では、照会結果・対象・権限・復旧手順を確認してから-WhatIfを外します。gMSAやコンピューターへは対応するSet-ADServiceAccount/Set-ADComputerを用いる別操作です。型の違うアカウントへSet-ADUserを一律に使いません。直接の-Addを、setspn -Sの事前重複検査と同じ処理だと説明しないでください。

変更後:チケット取得と実際のWeb認証を別々に確認

同じ利用者・同じセッションで対象サイトへのアクセス前後にキャッシュされたチケットを表示します。klistのみは現在のログオンセッションの一覧表示です。

klist

指定SPNへのチケット要求は別操作です。実際の接続先とアカウントを確認した診断時だけ行います。取得に成功しても、IISがそのチケットを受け入れたことや、その後の委任・アプリ操作の成功までは証明しません。

klist get HTTP/app.contoso.com

最終的には対象アプリのアクセスと認証記録を照合します。KRB_AP_ERR_MODIFIEDは所有先・鍵等の不整合を疑う材料ですが、番号だけで原因を確定せず、IISの認証設定、DNS別名、DCの反映、実際の要求SPNを確認してください。NTLMへの切替を「二段階認証に弱い」と一括して説明したり、キャッシュの全消去や委任権限の拡大を先に行ったりしません。

公式資料

この記事の例は構文と確認順を示すもので、本番ADやIISでの実行結果ではありません。照会結果を保管する場合も、ドメイン構成・アカウント名等の内部情報を公開しないよう、組織の保管場所と共有範囲を使ってください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次