Suatu hari, saya mengalami masalah yang agak menarik bagi beberapa pengguna, yaitu, ketidakmampuan untuk mengautentikasi dengan sejumlah layanan domain karena melebihi ukuran maksimum tiket Kerberos (token). Pada artikel ini kami akan mencoba untuk mempertimbangkan fitur-fitur pembentukan token Kerberos, metodologi untuk menentukan ukurannya untuk pengguna tertentu dan meningkatkan buffer untuk menyimpannya..
Dalam kasus kami, masalahnya memanifestasikan dirinya sebagai berikut. Beberapa pengguna tidak dapat mengakses sejumlah layanan yang digunakan. Secara khusus, ada masalah ketika mencoba terhubung ke layanan RDS (kesalahan "Akses ditolak")
Di server Remote Desktop log, kesalahan Event Id 6 direkam:
Paket SSPI kerberos menghasilkan token output ukuran 22041 byte, yang terlalu besar untuk muat dalam buffer token ukuran 12000 byte, disediakan oleh id proses 4.Token SSPI keluaran yang terlalu besar mungkin merupakan hasil dari pengguna pengguna @ domain menjadi anggota dari sejumlah besar kelompok.
Disarankan untuk meminimalkan jumlah grup milik pengguna. Jika masalah tidak dapat diperbaiki dengan pengurangan keanggotaan grup pengguna ini, silakan hubungi administrator sistem Anda untuk meningkatkan ukuran token maksimum, yang dalam artian dikonfigurasi mesin-lebar melalui nilai registri berikut: HKLM \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parameters \ MaxTokenSize.
Ketika mencoba terhubung ke SQL Server, kesalahan berikut diamati:
Kesalahan basis data tidak dikenal.
Status SQL: HY000, Kode Kesalahan SQL: 0
Tidak dapat menghasilkan konteks SSPI. Hubungi administrator sistem Anda.
Dan kesalahan telah dicatat dalam log Id Acara -40960
Sistem Keamanan mendeteksi kesalahan otentikasi untuk server XXXXXX. Kode kegagalan dari protokol otentikasi Kerberos adalah “Buffer Too SmallBuffer terlalu kecil untuk memuat entri. Tidak ada informasi telah ditulis ke buffer. (0xc0000023).
Memeriksa hak akses ke sumber daya tidak mengungkapkan masalah. Penyelidikan lebih lanjut atas insiden tersebut mengungkapkan ketergantungan - semua pengguna "bermasalah" berada dalam sejumlah besar kelompok keamanan Direktori Aktif (dengan mempertimbangkan lebih dari 200 kelompok yang ada di kelompok bersarang). Dengan demikian, kami secara bertahap sampai pada kesimpulan bahwa masalahnya melebihi panjang maksimum tiket Kerberos yang digunakan untuk mengesahkan pengguna.
Konten:
- Ukuran Tiket Kerberos
- Cara mengetahui ukuran tiket Kerberos pengguna saat ini
- Mengurangi ukuran token Kerberos untuk pengguna
- Cara meningkatkan ukuran token Kerberos
Ukuran Tiket Kerberos
Ukuran tiket Kerberos tergantung pada faktor-faktor berikut:
- Jumlah grup keamanan Direktori Aktif (termasuk yang bersarang) di mana pengguna menjadi anggota (grup tipe distribusi tidak termasuk dalam token)
- Penggunaan SIDHistory.Catatan. Masalah dengan melebihi ukuran tiket maksimum sangat umum ketika memigrasikan pengguna antara domain Direktori Aktif dan mempertahankan akses ke sumber daya dari domain lama melalui mekanisme SIDHistory
- Mekanisme otentikasi yang digunakan (kata sandi reguler atau multi-faktor, misalnya, kartu pintar)
- Apakah akun didelegasikan untuk didelegasikan atau tidak
Kerberos menggunakan buffer untuk menyimpan informasi otorisasi dan mentransfer ukurannya ke aplikasi menggunakan Kerberos. Parameter sistem MaxTokenSize - itu menentukan ukuran buffer. Ukuran buffer penting karena beberapa protokol, seperti RPC dan HTTP, menggunakannya ketika mengalokasikan blok memori untuk otentikasi. Jika data otentikasi pengguna yang mencoba mengautentikasi melebihi ukuran MaxTokenSize, upaya otentikasi dianggap tidak berhasil. Ini dapat menjelaskan kesalahan otentikasi ketika mengakses IIS, sementara akses file ke sumber daya jaringan dipertahankan..
Secara default, ukuran buffer Kerberos (MaxTokenSize)
- Pada Windows 7 dan Windows Server 2008R2 - 12 Kb.
- Pada Windows 8 dan Windows Server 2012, ukurannya meningkat menjadi 48Kb.
Jadi, jika pengguna berada dalam sejumlah besar grup, semua deskripsi grup tidak sesuai dengan 12 KB, dan ketika mengakses beberapa otentikasi sumber daya gagal.
Kiat. Ada batasan keras pada jumlah grup yang dimiliki pengguna. Batasnya adalah 1015 grup. Jika jumlah grup terlampaui, pengguna masuk ke sistem. "Sistem tidak dapat login Anda karena kesalahan berikut: Selama upaya login, konteks keamanan pengguna mengumpulkan terlalu banyak ID keamanan. Silakan coba lagi atau konsultasikan dengan administrator sistem Anda"Cara mengetahui ukuran tiket Kerberos pengguna saat ini
Windows tidak memiliki alat bawaan yang nyaman untuk mengetahui ukuran token Kerberos untuk pengguna tertentu.
Untuk mendapatkan ukuran tiket saat ini, kami menggunakan skrip Powershell pihak ketiga CheckMaxTokenSize.ps1 (dari Tim Springston - Microsoft). Skrip memungkinkan Anda untuk mendapatkan ukuran token saat ini dari pengguna yang ditentukan, jumlah grup keamanan yang disertakan, jumlah SID yang disimpan dalam SIDHistory pengguna, dan juga apakah akun untuk delegasi tepercaya atau tidak.
Untuk menggunakan skrip, unduh dari tautan di atas dan simpan dengan nama CheckMaxTokenSize.ps1
Nonaktifkan verifikasi skrip:
Set-ExecutionPolicy RemoteSigned
Pergi ke direktori dengan skrip
Cd c: \ install \ ps
Dan cari tahu ukuran tiket Kerberos untuk user_name:
.\ CheckMaxTokenSize.ps1 -Principals 'user_name' -OSEmulation $ true -Details $ true
Script meminta Anda untuk menentukan lingkungan mana yang ukuran tiket pengguna harus dihitung. Ada dua opsi.
1 - Pada Windows 7 / Windows Server 2008 R2 dan yang lebih lama (ukuran token 12K)
4 - Pada Windows 8 / Windows Server 2012 dan OS berikutnya (ukuran token 48K)
Tekan 1 dan Enter. Setelah beberapa saat (3-4 menit), skrip akan mengembalikan informasi berikut:
Detail Token untuk nama pengguna pengguna
**********************************
Domain pengguna adalah CORP.
Total ukuran token yang diperkirakan adalah 22648.
Untuk akses ke DC dan sumber daya yang dapat didelegasikan, ukuran total estimasi token yang diperkirakan adalah 4.5296.
Nilai MaxTokenSize yang efektif adalah: 12000
Masalah terdeteksi. Token itu terlalu besar untuk otorisasi yang konsisten. Ubah ukuran maksimum per KB http://support.microsoft.com/kb/327825 dan pertimbangkan untuk mengurangi keanggotaan grup langsung dan transitif.
* Detail Token untuk nama_pengguna *
Ada 957 grup dalam token.
Ada SID di pengguna SIDHistory.
Ada 248 SID di kelompok pengguna atribut SIDHistory.
Ada 248 total SID Histories untuk pengguna dan grup yang menjadi anggota.
1188 adalah grup domain lingkup keamanan global.
37 adalah grup domain keamanan lokal.
68 adalah grup keamanan universal di dalam domain pengguna.
0 adalah grup keamanan universal di luar domain pengguna.
Detail Grup termasuk dalam file output di C: \ Windows \ temp \ TokenSizeDetails.txt
Rincian SID History termasuk dalam file output di C: \ Windows \ temp \ TokenSizeDetails.txt
Jadi, kami menentukan bahwa user_name adalah anggota dari 957 grup domain keamanan, dan ukuran tiket Kerberos-nya - 22648, yang hampir 2 kali lebih besar dari Ukuran Token Kerberos standar di Windows 7 / Windows Server 2008 R.
Dengan demikian, untuk menyelesaikan masalah otentikasi, Anda harus mengurangi ukuran token pengguna atau menambah ukuran buffer pada semua sistem server tempat otorisasi Kerberos diamati.
Mengurangi ukuran token Kerberos untuk pengguna
Jika memungkinkan, coba kurangi tiket Kerberos pengguna dengan:
- Mengurangi jumlah grup pengguna.Kiat. Ini dapat difasilitasi oleh pengenalan mekanisme baru untuk mengendalikan akses ke sumber daya file, yang muncul di Windows Server 2012 - Kontrol Akses Dinamis
- Pembersihan Riwayat SID
- Penolakan kepercayaan untuk mendelegasikan akun (secara signifikan mengurangi ukuran token)
Cara meningkatkan ukuran token Kerberos
Jika tidak mungkin untuk mengurangi ukuran tiket Kerberos untuk pengguna, Anda dapat meningkatkan ukuran buffer untuk itu. Untuk ini, registri memiliki parameter khusus MaxTokenSize.
Microsoft tidak merekomendasikan pengaturan ukuran MaxTokenSize ke lebih dari 64K, secara umum, disarankan agar Anda terlebih dahulu meningkatkan batas ke 48K (batas untuk Windows 8/2012). Untuk menambah ukuran buffer:
- Buka editor registri dan buka bagian HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parameter.
- Buat parameter tipe baru Nilai DWORD (32-bit) dengan namanya MaxTokenSize
- Tentukan nilai yang diinginkan untuk ukuran buffer maksimum (kami tentukan 48000, karena ukuran token pengguna tidak melebihi nilai ini)
- Sistem boot ulang
Operasi ini harus dilakukan pada semua sistem server yang mengalami masalah otentikasi..
Jika masalah otentikasi terjadi di situs IIS, Anda juga perlu meningkatkan ukuran header HTTP menjadi 64 KB (0000ffff). Secara default, ukuran header maksimum adalah 16 KB. Untuk melakukan ini, perubahan berikut pada registri harus dilakukan pada server IIS (reboot juga diperlukan):
HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters \ MaxFieldLength
DWORD: 0000ffff
HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters \ MaxRequestBytes
DWORD: 0000ffff
Windows 8 dan Windows Server 2012 memiliki kebijakan baru yang memungkinkan Anda untuk mengatur ukuran maksimum MaxTokenSize - Setel maksimum Kerberos SSPI konteks token penyangga ukuran. Itu terletak di bawah Konfigurasi Komputer -> Kebijakan -> Template Administratif -> Sistem -> Kerberos.
Selain itu, ada kebijakan menarik lainnya. Peringatan untuk tiket Kerberos besar , memungkinkan Anda untuk mengonfigurasi output di log sistem peringatan tentang kelebihan tiket.
Setelah mengaktifkan kebijakan, ketika ukuran ambang tiket terlampaui, acara akan dicatat dalam log Peristiwa 31 dengan teks:
Tiket ke ldap layanan / "Nama DC" / "Nama Domain" dikeluarkan untuk akun "Nama Akun" @ "Nama Domain". Ukuran bagian terenkripsi dari tiket ini adalah 17421 byte, yang dekat atau lebih besar dari ambang ukuran tiket yang dikonfigurasi (12000 byte). Tiket ini atau tiket tambahan apa pun yang dikeluarkan dari tiket ini dapat mengakibatkan kegagalan otentikasi jika aplikasi klien atau server mengalokasikan buffer token SSPI yang dibatasi oleh nilai yang dekat dengan nilai ambang batas.
.