Seperti apa seharusnya entri SPN saya untuk setiap instance SQL?


8

Saya menemukan informasi yang bertentangan untuk cara memformat SPN (Nama Prinsip Layanan) yang tepat untuk mendapatkan koneksi Kerberos yang tepat, dan berapa banyak yang saya butuhkan untuk setiap instance SQL.

Dokumen MS 2017 ini berisi yang berikut:

Dimulai dengan SQL Server 2008, format SPN diubah untuk mendukung otentikasi Kerberos pada TCP / IP, pipa bernama, dan memori bersama. Format SPN yang didukung untuk instance bernama dan default adalah sebagai berikut.

  • Contoh bernama: MSSQLSvc/FQDN:[port|instancename]
  • Contoh default: MSSQLSvc/FQDN:port|MSSQLSvc/FQDN

Format SPN baru tidak memerlukan nomor port . Ini berarti bahwa server multi-port atau protokol yang tidak menggunakan nomor port dapat menggunakan otentikasi Kerberos.

Saya mengambil paragraf terakhir ini berarti bahwa saya hanya perlu satu entri, salah satu dari yang berikut:

  • Contoh bernama: MSSQLSvc/sqlbox1.mydomain.org/instance2
  • Contoh default: MSSQLSvc/sqlbox1.mydomain.org

Itu tampaknya bertentangan dengan dokumen MS yang lebih lama (2011) ini , tidak hanya tentang nomor port, tetapi juga mengenai nama yang akan digunakan:

Untuk membuat SPN, Anda bisa menggunakan nama NetBIOS atau FQDN dari SQL Server. Namun, Anda harus membuat SPN untuk nama NetBIOS dan FQDN .

Ketika saya melihat SPN yang sudah ada di lingkungan saya, saya melihat berbagai kombinasi, beberapa server memiliki hingga 4 entri:

  • MSSQLSvc/sqlbox1
  • MSSQLSvc/sqlbox1:1433
  • MSSQLSvc/sqlbox1.mydomain.org
  • MSSQLSvc/sqlbox1.mydomain.org:1433

Bahkan manajer konfigurasi MS Kerberos sendiri tampaknya ingin membuat dua versi terakhir (dengan kebingungan yang tepat):

masukkan deskripsi gambar di sini

Demikian pula untuk instance bernama yang ada, saya melihat campuran aneh, beberapa dari mereka hampir pasti tidak valid:

  • 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

Jadi seperti apa seharusnya DSN saya sebenarnya, untuk instance default dan bernama, jika saya hanya menggunakan TCP di lingkungan saya?

Haruskah saya memasukkan port, atau tidak? Atau termasuk satu dengan port dan satu tanpa?

Gunakan FQDN saja, atau apakah saya perlu entri hanya dengan nama Netbios? Atau apakah itu hanya jika kita menggunakan pipa bernama (yang bukan kita)?

(Untuk konteks, kami menjalankan SQL 2005 hingga 2014, beberapa berkerumun, yang lain berdiri sendiri. Konektivitas hanya melalui TCP, pipa bernama dinonaktifkan di config manager. Kami akan memperbaiki / membuat ini secara manual alih-alih membiarkan akun layanan SQL untuk membuatnya pada mulai server.)


1
Adakah alasan khusus yang ingin Anda kelola sendiri SPN daripada membiarkan SQL (dan akun layanannya) melakukannya untuk Anda?
Nic

1
sejauh SPN pergi, jika berhasil, apakah penting formatnya? I second @Nic comment
Bob Klimes

@Nic Karena itu akan membutuhkan pemberian beberapa lusin akun layanan hak Active Directory baru, admin Active Directory kami mengatakan penambahan manual satu kali lebih mudah untuk dikelola. Juga ditemukan beberapa tautan yang mengatakan hal-hal lucu dapat terjadi ketika SPN mencoba menyinkronkan beberapa pengontrol domain ketika mereka secara dinamis ditambahkan / dihapus pada saat start / stop / cluster failover. Semua yang mengatakan, saya menanyakan hal ini: ketika Anda melakukan memungkinkan account layanan untuk menambahkan SPN pada startup, apa yang terlihat seperti? Satu entri dengan FQDN dan port? Atau tanpa port? Atau dua entri?
BradC

@ BobKlimes Yah, beberapa dari mereka tidak bekerja, itu masalahnya. Saya kira tidak ada salahnya memiliki lebih banyak entri daripada yang diperlukan, tetapi hanya mencoba memahami mana yang benar-benar melakukan pekerjaan.
BradC

1
@BradC Saya pasti memiliki masalah dengan failover cluster dan beberapa DC. Itu hanya SPN saya yang dibuat secara manual.
Bob Klimes

Jawaban:


5

Jika Anda hanya menggunakan TCP / IP untuk terhubung ke instance Anda, Anda hanya perlu port yang ditentukan. Nama Instance digunakan saat menghubungkan ke SQL Instances melalui protokol Named Pipes. Sayangnya artikel MS tidak langsung mengatakan format mana yang diperlukan untuk protokol mana, tetapi berasal dari (banyak tes di lingkungan saya) dan kalimat artikel MS berikut :

Untuk pipa bernama dan koneksi memori bersama, SPN dalam format MSSQLSvc / FQDN: instancename digunakan untuk instance bernama dan MSSQLSvc / FQDN digunakan untuk instance default.

Mengenai FQDNs vs nama NETBIOS, saya akan merekomendasikan FQDNs karena mereka tidak rentan terhadap masalah jika Anda menghadapi masalah server DNS acak.

Diangkat dari posting blog saya tentang masalah ini, format akan terlihat sebagai berikut:

masukkan deskripsi gambar di sini

Referensi sumber dari MS dapat ditemukan di sini .

Sekarang untuk menjadikan Hari Admin Jaringan Anda (mis. Konfigurasi OU yang memungkinkan untuk Mendaftarkan Diri SPN)

Admin Jaringan Anda dapat membuat OU di domain yang berisi semua akun Layanan SQL Server Anda yang dapat dikonfigurasi sedemikian rupa sehingga Akun Layanan dapat membuat SPN untuk dirinya sendiri dan sendiri. Metode ini terutama mengikuti blog Ryan Reis , tetapi memiliki beberapa penyesuaian kecil sehingga pemberian yang berlebihan tidak dilakukan.

Proses ini menjelaskan pembuatan OU di domain yang memungkinkan akun di dalamnya mendaftarkan sendiri SPN mereka:

  1. Sebagai akun dengan hak tinggi pada domain, buka ADSI Edit (adsiedit dari command prompt)
  2. Klik kanan pada ADSI Edit -> Connect to ...
  3. Hubungkan ke konteks penamaan default
  4. Arahkan ke / Buat wadah OU yang memegang akun layanan yang ingin Anda berikan hak SPN
  5. Klik kanan pada OU -> Properties
  6. Klik pada Tab Keamanan
  7. Klik tombol Lanjut
  8. Sorot MANDIRI dan klik Edit ... atau jika pengguna khusus MANDIRI tidak muncul dalam daftar nama grup atau pengguna, klik Tambahkan ... dan masukkan SELF untuk nama objek
  9. Klik tab Properties
  10. Pilih objek Descendant User dari daftar turun bawah di sebelah Terapkan ke: Catatan: Ini adalah sedikit penyesuaian pada langkah-langkah yang diuraikan dalam posting blog Ryan karena alasan yang lebih baik diuraikan oleh posting ServerFault / StackExchange ini .
  11. Centang kotak Izinkan di sebelah yang berikut ini:
    • Baca servicePrincipalName
    • Tulis servicePrincipalName
  12. Klik Oke (pada jendela entri izin)
  13. Klik Oke (pada jendela Pengaturan Keamanan Lanjutan)
  14. Klik Oke (pada jendela properti OU)
  15. Tambahkan akun layanan yang menjalankan layanan SQL Server ke OU
  16. (Opsional) Mulai ulang Layanan SQL Server berjalan di bawah akun tersebut
  17. Selamat menikmati

Setelah mengikuti langkah-langkah di atas, wadah OU yang dimaksud sekarang dikonfigurasikan sedemikian sehingga setiap akun yang ditambahkan ke dalamnya akan dapat mendaftar dan menghapus SPN untuk dirinya sendiri dan sendiri. Ini adalah jumlah izin yang tepat karena akun ini tidak dapat menginjak-injak SPN yang terdaftar oleh akun lain.

Tujuan memulai kembali SQL Server pada langkah 16 adalah untuk memastikan SPN terdaftar seperti yang diharapkan. SQL akan mencoba untuk menghapus SPN yang terdaftar pada saat shutdown dan menambahkannya pada Startup, sehingga restart hanya diperlukan jika tidak ada SPN yang ada saat ini untuk layanan SQL Server tersebut.

Catatan terakhir pada pendekatan ini adalah bahwa jika Anda menjalankan SQL Server dalam konfigurasi Failover Clustered Instance (FCI) tradisional, TIDAK disarankan untuk menambahkan akun layanan instance ini ke OU ini, per KB 2443457 .

Saya benar-benar perlu memposting Bagian 2 dari seri Kerberos saya ...


Ini bukan Objek Pengguna Turunan , ini adalah Objek Komputer Turunan .
Isaac Kleiman

1

Ketika layanan SQL Server membuat SPN, itu menciptakan dua untuk setiap contoh. Ini adalah format yang digunakannya.

Mesin Virtual Default:

MSSQLSvc/servername.domain.com
MSSQLSvc/servername.domain.com:1433

Mesin Virtual Bernama:

MSSQLSvc/servername.domain.com:54321
MSSQLSvc/servername.domain.com:instancename

Untuk instance bernama Anda, jika membuat SPNs secara manual, Anda harus memiliki port statis alih-alih port dinamis default.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.