Bagikan melalui


Autentikasi Windows Terintegrasi dengan Perlindungan Yang Diperluas

Perbaikan telah dilakukan yang memengaruhi bagaimana autentikasi Windows terintegrasi ditangani oleh HttpWebRequest, HttpListener, SmtpClient, SslStream, NegotiateStream, dan kelas terkait dalam namespace System.Net dan namespace terkait lainnya. Dukungan ditambahkan untuk perlindungan yang diperluas untuk meningkatkan keamanan.

Perubahan ini dapat memengaruhi aplikasi yang menggunakan kelas ini untuk membuat permintaan web dan menerima respons di mana 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 di mana autentikasi Windows terintegrasi digunakan.

Perubahan untuk mendukung perlindungan yang diperluas hanya tersedia untuk aplikasi pada 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 menjadi universal, yang berarti dapat digunakan kembali atau diteruskan. Respons tantangan harus dibangun minimal dengan informasi spesifik target dan sebaiknya juga dengan beberapa informasi spesifik saluran. Layanan kemudian dapat memberikan perlindungan yang diperluas untuk memastikan bahwa respons tantangan kredensial berisi informasi spesifik layanan seperti Nama Prinsipal Layanan (SPN). Dengan informasi ini dalam pertukaran kredensial, layanan dapat melindungi dengan lebih baik dari penggunaan respons tantangan kredensial berbahaya yang mungkin telah digunakan secara tidak benar.

Desain perlindungan yang diperluas adalah peningkatan protokol autentikasi yang dirancang untuk mengurangi serangan relai autentikasi. Ini berkisar pada konsep saluran dan informasi pengikatan layanan.

Tujuan keseluruhan adalah sebagai berikut:

  1. Jika klien diperbarui untuk mendukung perlindungan yang diperluas, aplikasi harus menyediakan pengikatan saluran dan informasi pengikatan layanan ke semua protokol autentikasi yang didukung. Informasi pengikatan saluran hanya dapat disediakan ketika terdapat saluran (TLS) yang dapat diikatkan. Informasi pengikatan layanan harus selalu disediakan.

  2. Server yang diperbarui yang dikonfigurasi dengan benar dapat memverifikasi informasi pengikatan saluran dan layanan ketika ada dalam token autentikasi klien dan menolak upaya autentikasi jika pengikatan saluran tidak cocok. Bergantung pada skenario penyebaran, server dapat memverifikasi pengikatan saluran, pengikatan layanan, atau keduanya.

  3. 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 bagian berikut:

  1. Token Pengikatan Saluran atau CBT.

  2. Informasi Pengikatan Layanan dalam bentuk Nama Perwakilan Layanan atau SPN.

Informasi Pengikatan Layanan adalah indikasi niat klien untuk mengautentikasi ke titik akhir layanan tertentu. 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 saat transit sehingga serangan man-in-the-middle tidak dapat menyisipkan, menghapus, atau memodifikasi nilainya.

CBT adalah properti saluran aman eksternal (seperti TLS) yang digunakan untuk mengaitkan ke percakapan melalui saluran internal yang terautentikasi klien. CBT harus memiliki properti berikut (juga ditentukan oleh IETF RFC 5056):

  • Ketika saluran luar ada, nilai CBT harus menjadi properti yang mengidentifikasi saluran luar atau titik akhir server, yang ditentukan secara independen oleh kedua sisi klien dan server dalam percakapan.

  • Nilai CBT yang dikirim oleh klien tidak boleh menjadi sesuatu yang dapat dipengaruhi oleh penyerang.

  • Tidak ada jaminan yang dibuat tentang kerahasiaan nilai CBT. Namun, ini tidak berarti bahwa nilai informasi pengikatan layanan dan informasi pengikatan saluran selalu dapat diperiksa oleh pihak lain kecuali server yang melakukan autentikasi, karena protokol yang membawa CBT mungkin mengenkripsinya.

  • CBT harus dilindungi integritas kriptografis saat transit sehingga penyerang tidak dapat menyisipkan, menghapus, atau mengubah nilainya.

Pengikatan saluran dilakukan oleh klien yang mentransfer SPN dan CBT ke server dengan cara yang tidak dapat diubah. Server memvalidasi informasi pengikatan saluran sesuai dengan kebijakannya dan menolak upaya autentikasi yang dianggapnya bukan untuk dirinya sebagai sasaran yang dimaksud. Dengan cara ini, kedua saluran menjadi terikat secara kriptografis bersama-sama.

Untuk mempertahankan kompatibilitas dengan klien dan aplikasi yang ada, server dapat dikonfigurasi untuk memungkinkan upaya autentikasi oleh klien yang belum mendukung perlindungan yang diperluas. Ini disebut sebagai konfigurasi "sebagian diperkeras", berbeda dengan konfigurasi "sepenuhnya diperkeras".

Beberapa komponen dalam namespace System.Net dan System.Net.Security melakukan autentikasi Windows yang terintegrasi atas nama aplikasi yang memanggil. Bagian ini menjelaskan perubahan pada komponen System.Net untuk menambahkan perlindungan yang diperluas dalam penggunaan autentikasi Windows terintegrasi.

Perlindungan yang diperluas saat ini didukung pada Windows 7. Mekanisme disediakan sehingga aplikasi dapat menentukan apakah sistem operasi mendukung perlindungan yang diperpanjang.

Perubahan untuk Mendukung Perlindungan yang Ditingkatkan

Proses autentikasi yang digunakan dengan autentikasi Windows terintegrasi, tergantung pada protokol autentikasi yang digunakan, sering kali mencakup 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 kanal. Kelas ExtendedProtectionPolicy di namespace layanan ini mewakili kebijakan perlindungan yang diperluas yang digunakan oleh server untuk memvalidasi koneksi klien masuk. Anggota kelas lainnya digunakan dengan perlindungan yang diperluas.

Untuk aplikasi server, kelas-kelas ini mencakup yang berikut:

ExtendedProtectionPolicy yang memiliki elemen berikut:

  • Properti OSSupportsExtendedProtection yang menunjukkan apakah sistem operasi mendukung autentikasi windows terintegrasi dengan perlindungan yang diperluas.

  • PolicyEnforcement Nilai yang menunjukkan kapan kebijakan perlindungan yang diperluas harus diberlakukan.

  • ProtectionScenario Nilai yang menunjukkan skenario penyebaran. Ini memengaruhi bagaimana pemeriksaan perlindungan lanjutan dilakukan.

  • Opsional ServiceNameCollection yang berisi daftar SPN kustom yang digunakan untuk mencocokkan dengan SPN yang disediakan oleh klien sebagai target autentikasi yang dimaksudkan.

  • Opsional ChannelBinding yang berisi pengikatan saluran kustom untuk digunakan untuk validasi. Skenario ini bukan kasus umum

Namespace System.Security.Authentication.ExtendedProtection.Configuration menyediakan dukungan untuk konfigurasi autentikasi menggunakan perlindungan yang diperluas untuk aplikasi.

Sejumlah perubahan fitur dilakukan untuk mendukung perlindungan yang diperluas di namespace yang ada System.Net . Perubahan ini mencakup hal-hal berikut:

Perubahan fitur dilakukan untuk mendukung perlindungan yang diperluas untuk aplikasi klien SMTP di namespace yang ada System.Net.Mail :

  • Properti TargetName di SmtpClient kelas yang mewakili SPN yang akan digunakan untuk autentikasi saat menggunakan perlindungan yang diperluas untuk aplikasi klien SMTP.

Sejumlah perubahan fitur dilakukan untuk mendukung perlindungan yang diperluas di namespace yang ada System.Net.Security . Perubahan ini mencakup hal-hal berikut:

Properti SmtpNetworkElement 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 Windows yang mendasar mendukung perlindungan yang diperluas. Instans HttpWebRequest mengirimkan SPN yang dibangun dari Uri. Secara default, SmtpClient instans mengirim SPN yang dibangun 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 dengan menggunakan metode GetChannelBinding.

SPN yang dikirim oleh suatu instans untuk autentikasi Windows terintegrasi ke layanan tertentu dapat digantikan dengan mengatur properti HttpWebRequest.

Properti TargetName dapat digunakan untuk mengatur SPN kustom yang akan digunakan untuk autentikasi Windows terintegrasi untuk koneksi SMTP.

Perlindungan yang 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 HTTPS:// awalan. Dalam hal ini, atur HttpListener.ExtendedProtectionPolicy ke ExtendedProtectionPolicy dengan PolicyEnforcement diatur ke WhenSupported atau Always, dan ProtectionScenario diatur ke TransportSelected. Nilai WhenSupported memasukkan HttpListener ke dalam mode yang diperkuat sebagian, sementara Always sesuai dengan mode yang sepenuhnya diperkuat.

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 sesuai. Ada tiga kemungkinan hasil:

  1. Sistem operasi yang mendasar 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 HttpListener sumber pelacakan yang menentukan alasan kegagalan.

  2. 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 ketika 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 HttpListener sumber pelacakan yang menentukan alasan kegagalan.

  3. 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 ServiceName properti , tetapi dalam keadaan ini berlebihan.

Jika aplikasi melakukan 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 untuk meneruskannya ke fungsi Win32 AcceptSecurityContext asli. Untuk melakukan ini, gunakan properti TransportContext dan panggil metode GetChannelBinding untuk mengambil CBT. Hanya pengikatan titik akhir yang didukung. Jika ada hal lain Endpoint yang ditentukan, akan menghasilkan NotSupportedException. Jika sistem operasi yang mendasar 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 pengikatan saluran dalam byte. Jika sistem operasi yang mendasar tidak mendukung pengikatan saluran, fungsi akan mengembalikan null.

Skenario lain yang mungkin adalah mengaktifkan perlindungan yang diperluas untuk HTTP:// awalan ketika proksi tidak digunakan. Dalam hal ini, atur HttpListener.ExtendedProtectionPolicy ke ExtendedProtectionPolicy dengan PolicyEnforcement diatur ke WhenSupported atau Always, dan ProtectionScenario diatur ke TransportSelected. Nilai WhenSupported memasukkan HttpListener ke dalam mode yang diperkuat sebagian, sementara Always sesuai dengan mode yang sepenuhnya diperkuat.

Daftar default nama layanan yang diizinkan dibuat berdasarkan awalan yang telah didaftarkan dengan HttpListener. Daftar default ini dapat diperiksa melalui DefaultServiceNames properti . Jika daftar ini tidak komprehensif, aplikasi dapat menentukan kumpulan nama layanan kustom di konstruktor untuk ExtendedProtectionPolicy kelas yang akan digunakan alih-alih daftar nama layanan default.

Dalam konfigurasi ini, ketika permintaan dibuat ke server tanpa saluran aman luar, otentikasi berlangsung seperti biasa tanpa pemeriksaan pengikatan saluran. Jika autentikasi berhasil, konteks diambil untuk mencari nama layanan yang diberikan oleh klien dan divalidasi terhadap daftar nama layanan yang dapat diterima. Ada empat kemungkinan hasil:

  1. Sistem operasi yang mendasar 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 HttpListener sumber pelacakan yang menentukan alasan kegagalan.

  2. Sistem operasi yang mendasar klien tidak mendukung perlindungan yang diperpanjang. WhenSupported Dalam konfigurasi, upaya autentikasi akan berhasil dan permintaan akan dikembalikan ke aplikasi. Always Dalam konfigurasi, upaya autentikasi akan gagal. Permintaan tidak akan diekspos ke aplikasi, dan respons yang tidak sah (401) akan dikembalikan ke klien. Pesan akan dicatat ke HttpListener sumber pelacakan yang menentukan alasan kegagalan.

  3. Sistem operasi yang mendasar 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 HttpListener sumber pelacakan yang menentukan alasan kegagalan.

  4. Klien menentukan pengikatan layanan. Pengikatan layanan diperbandingkan 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 HttpListener sumber pelacakan yang menentukan alasan kegagalan.

Jika pendekatan sederhana ini menggunakan daftar nama layanan yang diizinkan tidak mencukupi, aplikasi dapat memberikan validasi nama layanannya sendiri dengan menanyakan properti ServiceName. Dalam kasus 1 dan 2 di atas, properti akan mengembalikan null. Dalam kasus 3, itu 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