1. Pendahuluan
Saat membuat aplikasi ASP.NET 2.0, pengembang biasanya menyimpan informasi konfigurasi sensitif di file Web.config. Contoh paling umum adalah string koneksi database, namun informasi sensitif lainnya yang disertakan dalam file Web.config mencakup informasi koneksi server SMTP dan data kredensial pengguna, dll. Meskipun ASP.NET dapat dikonfigurasi secara default untuk menolak semua permintaan HTTP untuk sumber daya file dengan ekstensi .config, namun jika peretas dapat mengakses sistem file server web Anda, informasi sensitif masih dapat dicuri. Misalnya, mungkin Anda secara tidak sengaja mengizinkan akses FTP anonim ke situs web Anda, sehingga memungkinkan peretas mengunduh file Web.config Anda melalui protokol FTP.
Untungnya, ASP.NET 2.0 membantu mengatasi masalah ini dengan memungkinkan Anda mengenkripsi bagian tertentu dari file Web.config, seperti bagian
Pada artikel ini, kita akan membahas cara mengenkripsi dan mendekripsi bagian pengaturan konfigurasi ini secara terprogram, dan memeriksa penggunaan program baris perintah aspnet_regiis.exe. Kami kemudian akan mengevaluasi opsi enkripsi yang disediakan oleh ASP.NET 2.0. Selain itu, kami membahas secara singkat cara mengenkripsi informasi konfigurasi di ASP.NET versi 1.x.
2. Premis
Sebelum kita mulai membahas cara mengenkripsi informasi konfigurasi ASP.NET 2.0, harap ingat hal-hal berikut:
1. Semua bentuk enkripsi mengandung semacam rahasia, dan rahasia ini digunakan saat mengenkripsi dan mendekripsi data. Algoritma enkripsi simetris menggunakan kunci yang sama ketika mengenkripsi dan mendekripsi pesan, sedangkan algoritma enkripsi asimetris menggunakan kunci yang berbeda untuk enkripsi dan dekripsi. Apapun teknologi yang digunakan, yang terpenting adalah seberapa aman kunci dekripsinya.
2. Teknologi enkripsi konfigurasi yang disediakan oleh ASP.NET 2.0 dirancang untuk mencegah peretas mengambil file konfigurasi Anda dengan cara tertentu. Idenya adalah jika ada file Web.config Anda di komputer peretas, maka dia tidak dapat memecahkan bagian yang dienkripsi. Namun, ketika halaman ASP.NET di server web meminta informasi dari file konfigurasi terenkripsi, data harus didekripsi sebelum dapat digunakan (dan ini terjadi tanpa Anda menulis kode apa pun). Oleh karena itu, jika seorang hacker dapat mengunggah halaman web ASP.NET ke sistem Anda yang menanyakan file konfigurasi dan menampilkan hasilnya, maka ia dapat melihat pengaturan terenkripsi sebagai teks biasa. (Untuk detailnya, lihat contoh halaman ASP.NET yang disediakan dalam artikel ini, yang menunjukkan cara mengenkripsi dan mendekripsi berbagai bagian file Web.config; seperti yang Anda lihat, halaman ASP.NET dapat mengakses (dan menampilkan) data terenkripsi (bentuk teks biasa)
3. Mengenkripsi dan mendekripsi informasi konfigurasi memerlukan biaya kinerja tertentu. Oleh karena itu, biasanya hanya mengenkripsi bagian konfigurasi yang berisi informasi sensitif. Misalnya, mungkin tidak perlu mengenkripsi bagian konfigurasi
3. Jenis informasi apa yang dapat dienkripsi?
Sebelum kita menganalisis cara mengenkripsi informasi konfigurasi ASP.NET 2.0, mari kita lihat terlebih dahulu informasi konfigurasi apa yang dapat dienkripsi. Menggunakan perpustakaan yang disediakan oleh .NET Framework 2.0, pengembang dapat mengenkripsi sebagian besar bagian konfigurasi di file Web.config atau machine.config. Bagian konfigurasi ini adalah elemen XML yang merupakan node turunan dari elemen
<?xml versi="1.0"?>
<konfigurasi xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<string koneksi>
<tambahkan nama="MembershipConnectionString" connectionString="connectionString"/>
</connectionStrings>
<kompilasi debug="benar"/>
<mode autentikasi="Formulir" />
Masing-masing bagian ini secara opsional dapat dienkripsi, baik secara terprogram atau melalui aspnet_regiis.exe (alat baris perintah). Saat dienkripsi, teks terenkripsi disimpan langsung di file konfigurasi. Misalnya, jika kami mengenkripsi bagian
<konfigurasi xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<Data Terenkripsi>
<Data Sandi>
<Nilai Sandi>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</Nilai Sandi>
</Data Sandi>
</Data Terenkripsi>
</connectionStrings>
<kompilasi debug="benar"/>
<mode autentikasi="Formulir" />
</system.web>
Selain itu, ada beberapa bagian konfigurasi yang tidak dapat Anda enkripsi menggunakan teknik ini:
· <processModel>
· <waktu proses>
· <mscorlib>
·<mulai>
· <system.runtime.remoting>
· <configProtectedData>
· <perakitan satelit>
· <Pengaturan Kriptografi>
· <PemetaanNama Kripto>
·
Untuk mengenkripsi bagian konfigurasi ini, Anda harus mengenkripsi nilai-nilai ini dan menyimpannya di registri. Ada alat baris perintah aspnet_setreg.exe yang dapat membantu Anda dalam proses ini; kita akan membahas alat ini nanti di artikel ini.
[Tip] Perbedaan antara Web.Config dan Machine.Config:
File Web.config menentukan pengaturan konfigurasi untuk aplikasi web tertentu dan terletak di direktori root aplikasi; sedangkan file machine.config menentukan semua pengaturan konfigurasi yang ada di server web. Pengaturan konfigurasi untuk situs di dan terletak di direktori $WINDOWSDIR$Microsoft.NetFrameworkVersionCONFIG.
4. Opsi enkripsi
Pengembang dapat menggunakan model penyedia ASP.NET 2.0 untuk melindungi informasi bagian konfigurasi, yang memungkinkan implementasi apa pun dicolokkan dengan mulus ke API. .NET Framework 2.0 menyediakan dua penyedia bawaan untuk melindungi informasi bagian konfigurasi:
· Penyedia Windows Data Protection API (DPAPI) (DataProtectionConfigurationProvider): Penyedia ini menggunakan teknologi kriptografi bawaan Windows untuk mengenkripsi dan mendekripsi bagian konfigurasi. Secara default, penyedia ini menggunakan kunci asli. Anda juga dapat menggunakan kunci pengguna, tetapi ini memerlukan sedikit penyesuaian.
· Penyedia konfigurasi yang dilindungi RSA (RSAProtectedConfigurationProvider): Menggunakan enkripsi kunci publik RSA untuk mengenkripsi dan mendekripsi bagian konfigurasi. Dengan menggunakan penyedia ini, Anda perlu membuat wadah kunci yang menyimpan kunci publik dan privat yang digunakan untuk mengenkripsi dan mendekripsi informasi konfigurasi. Anda dapat menggunakan RSA di peternakan multi-server dengan membuat kontainer kunci yang dapat diekspor.
Tentu saja, Anda juga dapat membuat penyedia pengaturan perlindungan Anda sendiri jika diperlukan.
Pada artikel ini, kami hanya membahas penggunaan kunci tingkat mesin menggunakan penyedia DPAPI. Sejauh ini, ini adalah metode paling sederhana karena tidak memerlukan pembuatan kunci atau wadah kunci apa pun. Kelemahannya, tentu saja, file konfigurasi terenkripsi hanya dapat digunakan di server web yang menerapkan enkripsi terlebih dahulu; terlebih lagi, penggunaan kunci mesin akan memungkinkan teks terenkripsi didekripsi oleh situs mana pun di server web.
5. Enkripsi bagian konfigurasi secara terprogram.
Kelas System.Configuration.SectionInformation mengabstraksi deskripsi bagian konfigurasi. Untuk mengenkripsi bagian konfigurasi, cukup gunakan metode ProtectSection(penyedia) dari kelas SectionInformation, dengan meneruskan nama penyedia yang ingin Anda gunakan untuk melakukan enkripsi. Untuk mengakses bagian konfigurasi tertentu dalam file Web.config aplikasi Anda, Anda dapat menggunakan kelas WebConfigurationManager (dalam namespace System.Web.Configuration) untuk mereferensikan file Web.config Anda, dan kemudian menggunakan GetSection-nya. Metode (sectionName) mengembalikan a Contoh ConfigurationSection. Terakhir, Anda bisa mendapatkan objek SectionInformation melalui properti SectionInformation dari instance ConfigurationSection.
Di bawah ini, kami mengilustrasikan masalahnya melalui contoh kode sederhana:
privatevoid ProtectSection(string sectionName, string provider)
{
Konfigurasi konfigurasi = WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath);
Bagian ConfigurationSection = config.GetSection(sectionName);
if (bagian != null &&!bagian.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(penyedia);
config.Simpan();
}
}
private void UnProtectSection(string nama bagian) {
Konfigurasi konfigurasi =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
Bagian ConfigurationSection = config.GetSection n(sectionName);
if (bagian != null && bagian.SectionInformation.IsProtected)
{
bagian.SectionInformation.UnprotectSection();
config.Simpan();
}
Anda dapat memanggil metode ProtectSection(sectionName, penyedia) ini dari halaman ASP.NET, parameter terkaitnya adalah nama bagian (seperti connectionStrings) dan penyedia (seperti DataProtectionConfigurationProvider), dan metode ini membuka file Web.config, dengan referensi Di bagian ini, metode ProtectSection(penyedia) dari objek SectionInformation dipanggil, dan akhirnya perubahan konfigurasi disimpan.
Di sisi lain, metode UnProtectSection(penyedia) mengimplementasikan dekripsi bagian konfigurasi tertentu. Di sini, hanya bagian yang akan didekripsi yang perlu diteruskan - kita tidak perlu mengganggu penyedia karena informasi tersebut sudah disimpan dalam tag yang menyertai bagian yang dienkripsi (yaitu, bagian
Ingatlah bahwa setelah data ini dienkripsi, ketika membacanya dari halaman ASP.NET (yaitu, membaca informasi string koneksi dari kontrol SqlDataSource atau secara terprogram melalui ConfigurationManager.ConnectionStrings[connStringName].ConnectionString) , ASP.NET akan secara otomatis mendekripsi data tersebut. string koneksi dan mengembalikan nilai teks biasa. Dengan kata lain, Anda tidak perlu mengubah kode sama sekali setelah menerapkan enkripsi. Cukup keren, bukan?
Dalam contoh situs web ASP.NET 2.0 yang diunduh dari artikel ini, Anda akan menemukan halaman contoh yang menampilkan file Web.config situs tersebut, yang memiliki TextBox multi-baris dan tombol kontrol Web yang sesuai untuk konfigurasi enkripsi berbagai bagian mengajukan. Contoh ini juga menggunakan metode ProtectSection() dan UnProtectSection() yang dibahas di atas.
6. Gunakan alat baris perintah aspnet_regiis.exe
Anda juga dapat menggunakan alat baris perintah aspnet_regiis.exe untuk mengenkripsi dan mendekripsi bagian konfigurasi file Web.config. Anda dapat menemukannya di "%WINDOWSDIR%Microsoft.Net Direktori Frameworkversion". alat. Untuk mengenkripsi bagian dalam file Web.config, Anda dapat menggunakan kunci mesin DPAPI di alat baris perintah ini sebagai berikut:
Bentuk umum mengenkripsi file Web.config untuk situs web tertentu:
aspnet_regiis.exe -pef sectionphysical_directory - penyedia prov
atau:
aspnet_regiis.exe -pe section -app virtual_directory -prov
Contoh spesifik penyedia yang mengenkripsi file Web.config dari situs web tertentu:
aspnet_regiis.exe -pef "connectionStrings" "C:InetpubwwwrootMySite" -prov " DataProtectionConfigurationProvider"
atau:
aspnet_regiis.exe -pe "connectionStrings" -app "/MySite" -prov "DataProtectionConfigurationProvider"
Bentuk umum mendekripsi file Web.config situs web tertentu:
aspnet_regiis.exe -pdf bagianphysical_directory
atau:
aspnet_regiis. exe -pd Bagian -app virtual_directory
Contoh spesifik mendekripsi file Web.config dari situs web tertentu:
aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
atau:
Anda juga dapat menentukan bahwa aspnet_regiis.exe dijalankan machine.config Enkripsi/dekripsi file.
[Kiat] Mengenkripsi pengaturan konfigurasi di ASP.NET versi 1.x.
Untuk melindungi pengaturan konfigurasi di ASP.NET versi 1.x, pengembang perlu mengenkripsi dan menyimpan pengaturan sensitif di registri server web dan menggunakan penyimpanan kunci "kuat" metode. Daripada menyimpan konten terenkripsi (seperti pada ASP.NET 2.0), file konfigurasi hanya berisi referensi ke kunci registri tempat nilai terenkripsi disimpan. Misalnya:
password="registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,password" />
Microsoft menyediakan alat baris perintah aspnet_setreg.exe kepada pengembang untuk mengenkripsi informasi konfigurasi sensitif dan memindahkannya ke pintu masuk registri yang "kuat". Sayangnya, alat ini hanya berfungsi pada pengaturan konfigurasi tertentu; sebaliknya, ASP.NET 2.0 mengizinkan bagian konfigurasi mana pun untuk dienkripsi.
Untuk informasi selengkapnya tentang penggunaan aspnet_setreg.exe dalam aplikasi ASP.NET 1.x, lihat KB#32990 di MSDN. Sayangnya, program baris perintah ini hanya dapat mengenkripsi bagian yang telah ditentukan sebelumnya dalam pengaturan konfigurasi dan tidak mengizinkan Anda mengenkripsi string koneksi database dan informasi sensitif lainnya yang Anda tambahkan sendiri.
7. Kesimpulan
Pada artikel ini, kita mempelajari cara menggunakan opsi enkripsi berbeda yang disediakan oleh ASP.NET 2.0 untuk melindungi informasi bagian konfigurasi. Kami juga membahas cara menggunakan teknik pemrograman dan aspnet_regiis.exe untuk mengenkripsi bagian konfigurasi di Web.config. . Melindungi pengaturan konfigurasi sensitif membantu memastikan bahwa situs Anda lebih sulit diretas - dengan mempersulit penemuan pengaturan konfigurasi sensitif. Saat ini, ASP.NET 2.0 sudah menyediakan teknologi enkripsi dan dekripsi yang relatif mudah, dan tidak ada alasan bagi pengembang untuk tidak menggunakan metode ini untuk melindungi pengaturan konfigurasi sensitif Anda.