Autentikasi Windows Terintegrasi dengan Perlindungan yang Diperluas
Penyempurnaan dibuat yang memengaruhi cara autentikasi Windows terintegrasi ditangani oleh HttpWebRequest, HttpListener, SmtpClient, SslStream, NegotiateStream, dan kelas terkait di System.Net dan namespace terkait. Dukungan ditambahkan untuk perlindungan yang diperluas guna meningkatkan keamanan.
Perubahan ini dapat memengaruhi aplikasi yang menggunakan kelas ini untuk membuat permintaan web dan menerima respons tempat autentikasi Windows terintegrasi digunakan. Perubahan ini juga dapat memengaruhi server web dan aplikasi klien yang dikonfigurasi untuk menggunakan autentikasi Windows terintegrasi.
Perubahan ini juga dapat memengaruhi aplikasi yang menggunakan kelas ini untuk membuat jenis permintaan lain dan menerima respons tempat autentikasi Windows terintegrasi digunakan.
Perubahan untuk mendukung perlindungan yang diperluas hanya tersedia untuk aplikasi di Windows 7 dan Windows Server 2008 R2. Fitur perlindungan yang diperluas tidak tersedia pada versi Windows sebelumnya.
Gambaran Umum
Desain autentikasi Windows terintegrasi memungkinkan beberapa respons tantangan kredensial bersifat universal, yang berarti respons dapat digunakan kembali atau diteruskan. Respons tantangan harus dibangun minimal dengan informasi spesifik terkait target dan sebaiknya juga dengan beberapa informasi spesifik terkait saluran. Layanan kemudian dapat memberikan perlindungan yang diperluas untuk memastikan bahwa respons tantangan kredensial berisi informasi khusus layanan seperti Nama Prinsipal Layanan (SPN). Dengan informasi ini dalam pertukaran kredensial, layanan dapat melindungi dengan lebih baik penggunaan berbahaya dari respons tantangan kredensial yang mungkin telah digunakan secara tidak benar.
Desain perlindungan yang diperluas adalah peningkatan pada protokol autentikasi yang dirancang untuk mengurangi serangan relai autentikasi. Hal ini berkisar pada konsep saluran dan informasi pengikatan layanan.
Tujuan keseluruhannya adalah sebagai berikut:
Jika klien diperbarui untuk mendukung perlindungan yang diperluas, aplikasi harus menyediakan informasi pengikatan saluran dan pengikatan layanan ke semua protokol autentikasi yang didukung. Informasi pengikatan saluran hanya dapat diberikan jika ada saluran (TLS) yang akan diikat. Informasi pengikatan layanan harus selalu diberikan.
Server yang diperbarui yang dikonfigurasi dengan benar dapat memverifikasi saluran dan informasi pengikatan layanan ketika ada di token autentikasi klien dan menolak upaya autentikasi jika pengikatan saluran tidak cocok. Tergantung pada skenario penyebaran, server dapat memverifikasi pengikatan saluran, pengikatan layanan, atau keduanya.
Server yang diperbarui memiliki kemampuan untuk menerima atau menolak permintaan klien tingkat bawah yang tidak berisi informasi pengikatan saluran berdasarkan kebijakan.
Informasi yang digunakan oleh perlindungan yang diperluas terdiri dari satu atau kedua dari dua bagian berikut:
Token Pengikatan Saluran atau CBT.
Informasi Pengikatan Layanan berupa Nama Prinsipal Layanan atau SPN.
Informasi pengikatan Layanan adalah indikasi niat klien untuk mengautentikasi ke titik akhir layanan tertentu. Informasi ini dikomunikasikan dari klien ke server dengan properti berikut:
Nilai SPN harus tersedia untuk server yang melakukan autentikasi klien dalam bentuk teks yang jelas.
Nilai SPN bersifat publik.
SPN harus dilindungi secara kriptografis dalam perjalanan sehingga serangan man-in-the-middle tidak dapat memasukkan, menghapus, atau mengubah nilainya.
CBT adalah properti saluran aman luar (seperti TLS) yang digunakan untuk mengikat (mengikat) ke percakapan melalui saluran dalam yang diautentikasi klien. CBT harus memiliki properti berikut (juga ditentukan oleh IETF RFC 5056):
Ketika saluran luar ada, nilai CBT harus berupa properti yang mengidentifikasi saluran luar atau titik akhir server, yang secara independen tiba di sisi klien dan server dari percakapan.
Nilai CBT yang dikirim oleh klien tidak boleh berupa hal yang dapat dipengaruhi oleh penyerang.
Tidak ada jaminan yang dibuat tentang kerahasiaan nilai CBT. Namun, hal ini tidak berarti bahwa nilai pengikatan layanan serta informasi pengikatan saluran selalu dapat diperiksa oleh yang lain kecuali server yang melakukan autentikasi, karena protokol yang membawa CBT mungkin mengenkripsinya.
CBT harus dilindungi integritas kriptografis dalam perjalanan sehingga penyerang tidak dapat memasukkan, menghapus, atau mengubah nilainya.
Pengikatan saluran dilakukan oleh klien yang mentransfer SPN dan CBT ke server dengan cara yang bersifat anti perubahan. Server memvalidasi informasi pengikatan saluran sesuai dengan kebijakannya dan menolak upaya autentikasi yang menurutnya tidak menjadi target yang dimaksud. Dengan cara ini, kedua saluran menjadi terikat secara kriptografis.
Untuk menjaga kompatibilitas dengan klien dan aplikasi yang ada, server dapat dikonfigurasi untuk mengizinkan upaya autentikasi oleh klien yang belum mendukung perlindungan yang diperluas. Ini disebut sebagai konfigurasi "diperketat sebagian", berbeda dengan konfigurasi "diperketat sepenuhnya".
Beberapa komponen di namespace System.Net dan System.Net.Security melakukan autentikasi Windows terintegrasi atas nama aplikasi pemanggil. Bagian ini menjelaskan perubahan pada komponen System.Net untuk menambahkan perlindungan yang diperpanjang dalam penggunaan NTLM terintegrasi.
Perlindungan yang diperluas saat ini didukung pada Windows 7. Mekanisme disediakan sehingga aplikasi dapat menentukan apakah sistem operasi mendukung perlindungan yang diperluas.
Perubahan untuk Mendukung Perlindungan yang Diperluas
Proses autentikasi yang digunakan dengan autentikasi Windows terintegrasi, tergantung pada protokol autentikasi yang digunakan, sering kali menyertakan tantangan yang dikeluarkan oleh komputer tujuan dan dikirim kembali ke komputer klien. Perlindungan yang diperluas menambahkan fitur baru ke proses autentikasi ini
Namespace System.Security.Authentication.ExtendedProtection menyediakan dukungan untuk autentikasi menggunakan perlindungan yang diperluas untuk aplikasi. Kelas ChannelBinding dalam namespace ini mewakili pengikatan saluran. Kelas ExtendedProtectionPolicy dalam namespace ini mewakili kebijakan perlindungan yang diperluas yang digunakan oleh server untuk memvalidasi koneksi klien yang masuk. Anggota kelas lainnya digunakan dengan perlindungan yang diperluas.
Untuk aplikasi server, kelas-kelas ini meliputi:
ExtendedProtectionPolicy yang memiliki elemen berikut:
Properti OSSupportsExtendedProtection yang menunjukkan apakah sistem operasi mendukung autentikasi windows terintegrasi dengan perlindungan yang diperluas.
Nilai PolicyEnforcement yang menunjukkan kapan kebijakan perlindungan yang diperluas harus diterapkan.
Nilai ProtectionScenario yang menunjukkan skenario penyebaran. Hal ini memengaruhi bagaimana perlindungan diperluas diperiksa.
ServiceNameCollection opsional yang berisi daftar SPN kustom yang digunakan untuk mencocokkan dengan SPN yang disediakan oleh klien sebagai target autentikasi yang dimaksud.
ChannelBinding opsional yang berisi pengikatan saluran kustom yang digunakan untuk validasi. Skenario ini bukan kasus biasa
Namespace System.Security.Authentication.ExtendedProtection.Configuration menyediakan dukungan untuk konfigurasi autentikasi menggunakan perlindungan yang diperluas untuk aplikasi.
Sejumlah perubahan fitur dibuat untuk mendukung perlindungan yang diperluas di namespace System.Net yang ada. Perubahan tersebut antara lain sebagai berikut:
Kelas TransportContext baru ditambahkan ke namespace System.Net yang mewakili konteks transportasi.
Metode kelebihan beban EndGetRequestStream dan GetRequestStream baru di kelas HttpWebRequest yang memungkinkan pengambilan TransportContext untuk mendukung perlindungan yang diperluas untuk aplikasi klien.
Penambahan kelas HttpListener dan HttpListenerRequest untuk mendukung aplikasi server.
Perubahan fitur dibuat untuk mendukung perlindungan yang diperluas untuk aplikasi klien SMTP di namespace System.Net.Mail yang ada :
- Properti TargetName di kelas SmtpClient yang mewakili SPN yang akan digunakan untuk autentikasi saat menggunakan perlindungan yang diperluas untuk aplikasi klien SMTP.
Sejumlah perubahan fitur dibuat untuk mendukung perlindungan yang diperluas di namespace System.Net.Security yang ada. Perubahan tersebut antara lain sebagai berikut:
Metode kelebihan beban BeginAuthenticateAsClient dan AuthenticateAsClient baru di kelas NegotiateStream yang memungkinkan penerusan CBT guna mendukung perlindungan yang diperluas untuk aplikasi klien.
Metode kelebihan beban BeginAuthenticateAsServer dan AuthenticateAsServer baru di kelas NegotiateStream yang memungkinkan penerusan ExtendedProtectionPolicy guna mendukung perlindungan yang diperluas untuk aplikasi server.
Properti TransportContext baru di kelas SslStream guna mendukung perlindungan yang diperluas untuk aplikasi klien dan server.
Properti SmtpNetworkElement telah ditambahkan untuk mendukung konfigurasi perlindungan yang diperluas untuk klien SMTP di namespace System.Net.Security.
Perlindungan yang Diperluas untuk Aplikasi Klien
Dukungan perlindungan yang diperluas untuk sebagian besar aplikasi klien terjadi secara otomatis. Kelas HttpWebRequest dan SmtpClient mendukung perlindungan yang diperluas setiap kali versi dasar Windows mendukung perlindungan yang diperluas. Instans HttpWebRequest mengirimkan SPN yang dibuat dari Uri. Secara default, instans SmtpClient mengirimkan SPN yang dibuat dari nama host server email SMTP.
Untuk autentikasi kustom, aplikasi klien dapat menggunakan metode HttpWebRequest.EndGetRequestStream(IAsyncResult, TransportContext) atau HttpWebRequest.GetRequestStream(TransportContext) di kelas HttpWebRequest yang memungkinkan pengambilan TransportContext dan CBT menggunakan metode GetChannelBinding.
SPN yang akan digunakan untuk autentikasi Windows terintegrasi yang dikirim oleh instans HttpWebRequest ke layanan tertentu dapat diganti dengan mengatur properti CustomTargetNameDictionary.
Properti TargetName dapat digunakan untuk mengatur SPN kustom yang akan digunakan untuk autentikasi Windows terintegrasi pada koneksi SMTP.
Perlindungan Diperluas untuk Aplikasi Server
HttpListener secara otomatis menyediakan mekanisme untuk memvalidasi pengikatan layanan saat melakukan autentikasi HTTP.
Skenario yang paling aman adalah mengaktifkan perlindungan yang diperluas untuk awalan HTTPS://
. Dalam kasus ini, atur HttpListener.ExtendedProtectionPolicy ke ExtendedProtectionPolicy dengan PolicyEnforcement diatur ke WhenSupported atau Always, dan ProtectionScenario diatur ke TransportSelected Nilai WhenSupported menempatkan HttpListener dalam mode pengetatan sebagian, sedangkan Always sesuai dengan mode yang diperketat sepenuhnya.
Dalam konfigurasi ini ketika permintaan dibuat ke server melalui saluran aman luar, saluran luar dikueri untuk pengikatan saluran. Pengikatan saluran ini diteruskan ke panggilan SSPI autentikasi, yang memvalidasi bahwa pengikatan saluran dalam blob autentikasi cocok. Ada tiga kemungkinan hasil:
Sistem operasi yang mendasari server tidak mendukung perlindungan yang diperluas. Permintaan tidak akan diekspos ke aplikasi, dan respons yang tidak sah (401) akan dikembalikan ke klien. Pesan akan dicatat ke sumber jejak HttpListener yang menentukan alasan kegagalan.
Panggilan SSPI gagal menunjukkan bahwa klien menentukan pengikatan saluran yang tidak cocok dengan nilai yang diharapkan yang diambil dari saluran luar atau klien gagal menyediakan pengikatan saluran saat kebijakan perlindungan yang diperluas di server dikonfigurasi untuk Always. Dalam kedua kasus, permintaan tidak akan diekspos ke aplikasi, dan respons yang tidak sah (401) akan dikembalikan ke klien. Pesan akan dicatat ke sumber jejak HttpListener yang menentukan alasan kegagalan.
Klien menentukan pengikatan saluran yang benar atau diizinkan untuk terhubung tanpa menentukan pengikatan saluran karena kebijakan perlindungan yang diperluas di server dikonfigurasi dengan WhenSupported Permintaan dikembalikan ke aplikasi untuk diproses. Tidak ada pemeriksaan nama layanan yang dilakukan secara otomatis. Aplikasi dapat memilih untuk melakukan validasi nama layanannya sendiri menggunakan properti ServiceName, tetapi dalam keadaan ini, aplikasi tersebut redundan.
Jika aplikasi membuat panggilan SSPI sendiri untuk melakukan autentikasi berdasarkan blob yang diteruskan bolak-balik dalam isi permintaan HTTP dan ingin mendukung pengikatan saluran, aplikasi perlu mengambil pengikatan saluran yang diharapkan dari saluran aman luar menggunakan HttpListener agar dapat meneruskannya ke fungsi Win32 AcceptSecurityContext asli. Untuk melakukannya, gunakan properti TransportContext dan panggil metode GetChannelBinding untuk mengambil CBT. Hanya pengikatan titik akhir yang didukung. Jika ada Endpoint lain yang ditentukan, NotSupportedException akan ditampilkan. Jika sistem operasi yang mendasari mendukung pengikatan saluran, metode GetChannelBinding akan mengembalikan ChannelBindingSafeHandle yang membungkus penunjuk ke pengikatan saluran yang cocok untuk diteruskan ke fungsi AcceptSecurityContext sebagai anggota pvBuffer dari struktur SecBuffer yang diteruskan dalam parameter pInput
. Properti Size berisi panjang, dalam byte, dari pengikatan saluran. Jika sistem operasi yang mendasarinya tidak mendukung pengikatan saluran, fungsi akan mengembalikan null
.
Skenario lain yang mungkin adalah mengaktifkan perlindungan yang diperluas untuk awalan HTTP://
saat proksi tidak digunakan. Dalam kasus ini, atur HttpListener.ExtendedProtectionPolicy ke ExtendedProtectionPolicy dengan PolicyEnforcement diatur ke WhenSupported atau Always, dan ProtectionScenario diatur ke TransportSelected Nilai WhenSupported menempatkan HttpListener dalam mode pengetatan sebagian, sedangkan Always sesuai dengan mode yang diperketat sepenuhnya.
Daftar default nama layanan yang diizinkan dibuat berdasarkan awalan yang telah didaftarkan dengan HttpListener. Daftar bawaan ini dapat diperiksa melalui properti DefaultServiceNames. Jika daftar ini tidak lengkap, aplikasi dapat menentukan kumpulan nama layanan kustom di konstruktor untuk kelas ExtendedProtectionPolicy yang akan digunakan sebagai ganti daftar nama layanan default.
Dalam konfigurasi ini, ketika permintaan dibuat ke server tanpa autentikasi saluran aman luar berlangsung secara normal tanpa pemeriksaan pengikatan saluran. Jika autentikasi berhasil, konteks akan dikueri untuk nama layanan yang diberikan klien dan divalidasi berdasarkan daftar nama layanan yang dapat diterima. Ada empat kemungkinan hasil:
Sistem operasi yang mendasari server tidak mendukung perlindungan yang diperluas. Permintaan tidak akan diekspos ke aplikasi, dan respons yang tidak sah (401) akan dikembalikan ke klien. Pesan akan dicatat ke sumber jejak HttpListener yang menentukan alasan kegagalan.
Sistem operasi dasar klien tidak mendukung perlindungan yang diperluas. Dalam konfigurasi WhenSupported, upaya autentikasi akan berhasil dan permintaan akan dikembalikan ke aplikasi. Dalam konfigurasi Always, upaya autentikasi akan gagal. Permintaan tidak akan diekspos ke aplikasi, dan respons yang tidak sah (401) akan dikembalikan ke klien. Pesan akan dicatat ke sumber jejak HttpListener yang menentukan alasan kegagalan.
Sistem operasi yang mendasari klien mendukung perlindungan yang diperluas, tetapi aplikasi tidak menentukan pengikatan layanan. Permintaan tidak akan diekspos ke aplikasi, dan respons yang tidak sah (401) akan dikembalikan ke klien. Pesan akan dicatat ke sumber jejak HttpListener yang menentukan alasan kegagalan.
Klien menentukan pengikatan layanan. Pengikatan layanan dibandingkan dengan daftar pengikatan layanan yang diizinkan. Jika cocok, permintaan dikembalikan ke aplikasi. Jika tidak, permintaan tidak akan diekspos ke aplikasi, dan respons yang tidak sah (401) akan secara otomatis dikembalikan ke klien. Pesan akan dicatat ke sumber jejak HttpListener yang menentukan alasan kegagalan.
Jika pendekatan sederhana ini menggunakan daftar nama layanan yang dapat diterima yang diizinkan tidak mencukupi, aplikasi dapat memberikan validasi nama layanannya sendiri dengan mengkueri properti ServiceName. Dalam kasus 1 dan 2 di atas, properti akan mengembalikan null
. Dalam kasus 3, properti akan mengembalikan string kosong. Dalam kasus 4, nama layanan yang ditentukan oleh klien akan dikembalikan.
Fitur perlindungan yang diperluas ini juga dapat digunakan oleh aplikasi server untuk autentikasi dengan jenis permintaan lain dan ketika proksi tepercaya digunakan.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk