適切なKerberos接続を取得するためにSPN(サービスプリンシパル名)を正確にフォーマットする方法と、SQLインスタンスごとに必要な数について、矛盾する情報を見つけています。
この2017年のMSドキュメント には以下が含まれます。
SQL Server 2008以降、TCP/IP、名前付きパイプ、および共有メモリでのKerberos認証をサポートするために、SPN形式が変更されました。名前付きインスタンスとデフォルトインスタンスでサポートされるSPN形式は次のとおりです。
- 名前付きインスタンス:
MSSQLSvc/FQDN:[port|instancename]
- デフォルトのインスタンス:
MSSQLSvc/FQDN:port|MSSQLSvc/FQDN
新しいSPN形式では、ポート番号は必要ありません。つまり、マルチポートサーバーまたはポート番号を使用しないプロトコルは、Kerberos認証を使用できます。
この最後の段落は、次のいずれか1つのエントリのみが必要であることを意味します。
MSSQLSvc/sqlbox1.mydomain.org/instance2
MSSQLSvc/sqlbox1.mydomain.org
これは矛盾しているようです この古い(2011)MSドキュメント 、ポート番号だけでなく、使用する名前についても:
SPNを作成するには、SQLサーバーのNetBIOS名または完全修飾ドメイン名(FQDN)を使用できます。ただし、NetBIOS名とFQDNの両方のSPNを作成する必要があります。
私の環境にすでに存在するSPNを見ると、さまざまな組み合わせがあり、一部のサーバーには最大4つのエントリがあります。
MSSQLSvc/sqlbox1
MSSQLSvc/sqlbox1:1433
MSSQLSvc/sqlbox1.mydomain.org
MSSQLSvc/sqlbox1.mydomain.org:1433
でも MS独自のKerberos構成マネージャー は、最後の2つのバージョンを(適切な難読化を使用して)生成したいようです。
同様に、既存の名前付きインスタンスの場合、奇妙な組み合わせが見られます。それらの一部はほぼ確実に無効です。
MSSQLSvc/sqlbox1:1522
MSSQLSvc/sqlbox1:instance2
MSSQLSvc/sqlbox1.mydomain.org:1522
MSSQLSvc/sqlbox1.mydomain.org:instance2
MSSQLSvc/sqlbox1.mydomain.org/instance2
MSSQLSvc/sqlbox1.mydomain.org:1522:instance2
だから、もし私の環境でTCPを使用するだけなら、デフォルトと名前付きインスタンスの両方で、私のDSNは実際にはどのように見えるでしょうか?
ポートを含めるかどうかを指定しますか?または、ポートのあるものとないものを含めますか?
FQDNのみを使用しますか、それともNetbios名のみのエントリが必要ですか?それとも、名前付きパイプを使用している場合のみ(そうではありません)?
(コンテキストでは、SQL 2005から2014を実行し、一部はクラスター化され、その他はスタンドアロンです。接続はTCPのみであり、名前付きパイプは構成マネージャーで無効になっています。これらを手動で修正/作成するのではなく、 SQLサービスアカウントがサーバーの起動時にそれらを作成できるようにします。)
インスタンスへの接続にTCP/IPのみを使用している場合は、-need指定されたポートのみを使用します。インスタンス名は、名前付きパイププロトコルを介してSQLインスタンスに接続するときに使用されます。悲しいことに、MSの記事では、どのプロトコルにどのフォーマットが必要であるかを明記していませんが、(私の環境での多くのテスト)と次の MS記事のセンテンス から派生しています。
名前付きパイプと共有メモリ接続の場合、名前付きインスタンスにはMSSQLSvc/FQDN:instancenameという形式のSPNが使用され、MSSQLSvc/FQDNはデフォルトのインスタンスに使用されます。
FQDNとNETBIOS名については、ランダムなDNSサーバーの問題に直面した場合に問題が発生しにくいため、FQDNをお勧めします。
私の ブログ投稿 から引き上げると、問題については、フォーマットは次のようになります。
MSからのソースリファレンスは、 here にあります。
ネットワーク管理者の日を作成します(例:自己登録SPNを許可するOU構成)
ネットワーク管理者は、ドメインにOUを作成できます。このOUには、サービスアカウントが自分自身と自分自身のSPNを作成できるように構成できる、すべてのSQL Serverサービスアカウントが含まれます。この方法は、主に Ryan Reisのブログ に従っていますが、過剰な発言が行われないように若干の調整が行われています。
このプロセスでは、ドメイン内のアカウントが自分のSPNを自己登録できるようにするドメイン上のOUの作成について説明します。
上記の手順を実行した後、問題のOUコンテナーは、コンテナーに追加されたアカウントがそれ自体およびそれ自体のSPNを登録および削除できるように構成されます。これらのアカウントは他のアカウントによって登録されたSPNを踏みにじることができないため、これはまさに適切な権限の量です。
手順16でSQL Serverを再起動する目的は、SPNが期待どおりに登録されていることを確認することです。 SQLは、シャットダウン時に登録済みのSPNを削除し、スタートアップ時に追加しようとします。そのため、再起動が必要になるのは、そのSQL Serverサービスに現在SPNが存在しない場合だけです。
このアプローチに関する最後のメモは、SQL Serverを従来のフェールオーバークラスターインスタンス(FCI)構成で実行している場合、このインスタンスのサービスアカウントをこのOUに追加することはお勧めできません( KB 2443457 を参照)。
私は本当にKerberosシリーズのパート2を投稿する必要があります...
SQL ServerサービスがSPNを作成すると、インスタンスごとに2つ作成されます。これが使用する形式です。
デフォルトのインスタンス:
MSSQLSvc/servername.domain.com
MSSQLSvc/servername.domain.com:1433
名前付きインスタンス:
MSSQLSvc/servername.domain.com:54321
MSSQLSvc/servername.domain.com:instancename
名前付きインスタンスの場合、SPNを手動で作成する場合は、デフォルトの動的ポートではなく静的ポートが必要です。