Membangun Server IIS 7.0 Kustom

oleh Mike Volodarsky

Pengantar

IIS 6.0 dan versi sebelumnya menerapkan sebagian besar fungsionalitas server yang banyak digunakan di dalam server itu sendiri. Sebaliknya, mesin server web IIS 7.0 ke atas menyediakan arsitektur modular di atasnya hampir semua fitur server disediakan sebagai komponen yang dapat dicolokkan. Ini memungkinkan peningkatan yang luar biasa di seluruh papan, termasuk:

  • Kemampuan untuk mengontrol dengan tepat set fitur apa yang dimuat / digunakan di server, menghapus fitur yang tidak diperlukan untuk mengurangi area permukaan serangan / jejak memori server
  • Kemampuan untuk mengganti setiap fitur dengan implementasi pihak ketiga atau kustom
  • Kemampuan untuk mengkhembalikan server berdasarkan perannya dalam topologi server
  • Kontrol tingkat lanjut atas set fitur server, baik pada tingkat butir halus maupun yang dapat dilepaskan aplikasi

Komponen server ini, yang dikenal sebagai modul, dimuat selama inisialisasi proses pekerja kumpulan aplikasi dan menyediakan layanan pemrosesan permintaan di server. Setiap aplikasi IIS 7.0 ke atas adalah kombinasi layanan yang disediakan oleh modul yang diaktifkan untuk aplikasi, dan konten terkait yang digunakan oleh layanan ini. Server menyediakan dua peran utama yang dimainkan oleh modul:

  • Menyediakan layanan permintaan, seperti autentikasi atau penembolokan output (mirip dengan filter ISAPI di IIS 6.0)
  • Menyediakan penanganan permintaan, seperti penanganan file statis, CGI, atau pemrosesan halaman ASP.NET (mirip dengan ekstensi ISAPI di IIS 6.0)

Dengan mengaktifkan modul yang berbeda, server dapat dikonfigurasi untuk menyediakan layanan yang diperlukan oleh aplikasi di server.

Tugas yang diilustrasikan dalam artikel ini meliputi:

  • Meninjau konfigurasi server, default, dan kumpulan modul yang dimuat di server secara default
  • Menghapus semua modul untuk menghapus server ke konfigurasi minimalnya, dan memeriksa efek pada jejak
  • Membangun server kustom dengan menambahkan modul secara bertahap untuk mendukung skenario tertentu

Tinjau Konfigurasi Modul Default

Konfigurasi server utama terkandung dalam file applicationHost.config, yang terletak di direktori %windir%\system32\inetsrv\config\konfigurasi IIS . Kami melihat konfigurasi berikut yang terkandung dalam grup bagian <system.webServer> :

<globalModules> Bagian. Bagian tingkat server ini berisi daftar modul yang dimuat oleh proses pekerja server, dan DLL asli terkait yang mengimplementasikan fungsionalitasnya.

<modules> Bagian. Bagian tingkat aplikasi ini berisi daftar modul yang diaktifkan untuk aplikasi tertentu. Bagian ini berfungsi untuk memilih subset modul yang dimuat yang harus aktif dalam aplikasi, dan juga untuk memuat modul tingkat aplikasi tambahan.

<handlers> Bagian. Bagian tingkat URL ini berisi pemetaan handler yang digunakan server untuk memetakan permintaan masuk ke modul tertentu yang akan memprosesnya. Ini mirip dengan peta skrip IIS 6.0 atau ASP.NET, dan melayani pemetaan permintaan terpadu ke penangan jenis konten asli dan terkelola.

Deskripsi lengkap semua modul IIS tersedia di IIS 7.0 dan Gambaran Umum Modul Di Atas.

Membuat Pencadangan Konfigurasi

Pertama, kita mencadangkan konfigurasi server sehingga kita dapat memulihkannya jika perlu. Jalankan perintah berikut dari prompt perintah yang berjalan sebagai Administrator:

%windir%\system32\inetsrv\appcmd add backup initial

Kita kemudian dapat memulihkan konfigurasi server ke status awal dengan menjalankan:

%windir%\system32\inetsrv\appcmd restore backup initial

Memeriksa Daftar Default Modul

Navigasi ke bagian <system.webServer>/<globalModules> . Bagian ini, yang hanya dapat dikonfigurasi pada tingkat server, berisi modul yang dimuat oleh setiap proses pekerja server. Setiap entri mengonfigurasi modul dengan nama tertentu dan DLL yang mengimplementasikan fungsionalitas modul tersebut:

<globalModules>

    <!--several modules omitted -->

    <add name="BasicAuthenticationModule" image="…\authbas.dll" />

    <add name="WindowsAuthenticationModule" image="…\authsspi.dll" />

</globalModules>

Lihat nama berbagai modul dalam konfigurasi server default - kami melihat layanan yang familier disediakan sebagai bagian dari server di IIS 6.0:

Modul Autentikasi Windows, autentikasi permintaan NTLM

<add name="WindowsAuthenticationModule" image="…\authsspi.dll" />

Modul Penangan File Statis, melayani file statis

<add name="StaticFileModule" image="…\static.dll" />

Modul Kompresi Dinamis, kompresi respons

<add name="DynamicCompressionModule" image="…\compdyn.dll" />

Navigasi ke bagian <system.webServer>/<modules> . Bagian ini, yang dapat dikonfigurasi di tingkat server atau aplikasi, menentukan modul mana yang dimuat di <bagian globalModules> yang diaktifkan untuk aplikasi tertentu. Sebagian besar, kita melihat bahwa bagian ini mencantumkan nama modul yang kita lihat di bagian , mengaktifkannya secara default untuk semua aplikasi.

Catatan

Ada beberapa item tambahan di akhir daftar - ini adalah modul terkelola yang dikembangkan menggunakan model ekstensibilitas ASP.NET. Pelajari selengkapnya tentang membangun mode terkelola di panduan Kembangkan Modul Menggunakan .NET .

Navigasi ke bagian <system.webServer>/<handlers> . Bagian ini, yang dapat dikonfigurasi di server, aplikasi, atau tingkat URL, menentukan bagaimana permintaan ditangani. Modul biasanya berpartisipasi dalam setiap permintaan, sedangkan handler hanya mendapatkan permintaan untuk URL tertentu.

Contoh modul yang baik adalah modul kompresi. Modul kompresi melihat setiap respons dan mengompresinya jika diperlukan. Handler halaman ASP.NET adalah contoh yang baik dari handler. Ini hanya menerima permintaan yang dipetakan ke dalamnya, misalnya permintaan yang memiliki ekstensi .aspx. Daftar <handlers> menentukan pemetaan antara permintaan berdasarkan URL dan kata kerja, dan modul penanganan yang akan digunakan untuk memproses permintaan ini. Ada juga beberapa informasi tambahan yang digunakan untuk mengonfigurasi setiap pemetaan, yang bukan fokus dalam topik ini.

<handlers>
    <!-- certain details omitted -->
    <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" ... />
    <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" ... />
    <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST"  modules="IsapiModule" ... />
</handlers>

Pemeriksaan Jejak Server

  1. Buka Internet Explorer, dan buat permintaan ke server dengan menentukan URL berikut dan menekan Enter:

    http://localhost/iisstart.htm
    

    Ini memulai kumpulan aplikasi server, dan melayani dokumen iisstart.htm.

  2. Mulai Pengelola Tugas, dan buka tab Proses. Karena proses pekerja IIS berjalan di bawah akun pengguna yang berbeda, Anda harus memeriksa "Tampilkan proses untuk semua pengguna". Perhatikan ukuran proses pekerja server w3wp.exe.
    Cuplikan layar yang memperlihatkan Windows Task Manager. Tab proses dipilih.
    Gambar 1: Pengelola Tugas memperlihatkan Proses Pekerja IIS

  3. Sekarang jalankan baris perintah berikut:

    TASKLIST /fi "imagename eq w3wp.exe" /m
    

    Kami melihat bahwa lebih dari 90 DLL dimuat oleh proses pekerja. Sebagian besar terletak di direktori ...\intersrv\ - banyak dari mereka adalah DLL modul yang kita lihat di tugas pertama saat melihat <bagian globalModules> , dan beberapa lainnya yang mendukung kerangka kerja .NET dan runtime server itu sendiri.

Menghapus Server

Dalam tugas sebelumnya, kami memeriksa daftar default komponen yang dimuat oleh server, yang berisi lebih dari 35 modul yang menyediakan berbagai layanan mulai dari autentikasi hingga penyajian file statis. Masing-masing komponen yang dimuat di server berdampak pada jejak server, area permukaan serangannya, performa runtime, dan tentu saja, set fitur yang diaktifkan.

Sebelum kita membangun server kustom kita sendiri hanya dengan fungsionalitas yang diperlukan dalam tugas berikutnya, kita membangun server web yang cepat, kecil, dan aman dengan menghapus semua modul dan menjalankan server kosong.

Jika kita mengubah file applicationHost.config selama tugas sebelumnya, kita dapat memulihkannya ke status asli dengan menjalankan %windir%\system32\inetsrv\appcmd restore backup initial dari baris perintah.

Sekarang untuk menghapus server.

  1. Gunakan editor teks untuk membuka %windir%\system32\inetsrv\config\applicationHost.config.

  2. Navigasi ke bagian <system.webServer>/<globalModules> .

  3. Hapus semua entri dalam koleksi, sehingga hanya definisi bagian kosong yang tersisa:

    <globalModules> 
        <!—Remove Everything --> 
    </globalModules>
    
  4. Tempelkan item ke jendela notepad awal untuk digunakan nanti. Ulangi hal yang sama dengan bagian <system.webServer>/<modules> . Hapus semua entri di bawah bagian ini dan tempelkan ke notepad awal untuk digunakan nanti. Ini memastikan kami tidak mengaktifkan modul apa pun yang tidak lagi kami muat. Tempelkan item potong ini ke jendela notepad awal untuk digunakan nanti.

  5. Ulangi hal yang sama dengan bagian .<system.webServer>/<handlers> Hapus semua entri di bawah bagian ini, untuk memastikan kami tidak menentukan pemetaan handler apa pun dengan modul yang kami nonaktifkan. Tempelkan item ke notepad awal untuk digunakan nanti. Simpan file applicationHost.config untuk memengaruhi perubahan.

Memeriksa Jejak Server yang Dilucuti

Pada titik ini, kami siap untuk memuat server yang dilucuti - kami akan mengulangi langkah-langkah sebelumnya untuk memeriksa jejak baru server.

  1. Buka Internet Explorer, dan buat permintaan ke server dengan menentukan URL berikut dan menekan Enter:

    http://localhost/iisstart.htm
    

    Ini harus memulai kumpulan aplikasi server, dan mengembalikan kesalahan ke browser karena tidak ada handler yang terdaftar untuk melayani sumber daya yang Anda minta.

  2. Jalankan Pengelola Tugas, dan buka tab Proses. Perhatikan ukuran proses pekerja server w3wp.exe.

  3. Jalankan baris perintah berikut:

    TASKLIST /fi "imagename eq w3wp.exe" /m
    

    Amati bahwa jejak server telah berkurang menjadi sekitar 8Mb. Dalam jangka waktu server, jejak server kosong akan dikurangi lebih lanjut.

    Hanya 50 DLL yang dimuat, dibandingkan dengan 90 atau lebih - ini menunjukkan bahwa server tidak memuat DLL modul apa pun, yang secara langsung dan tidak langsung memperhitungkan perbedaan jumlah DLL. Tidak hanya layanan yang dinonaktifkan di server, tetapi juga tidak ada kode untuk fitur-fitur ini yang bahkan dimuat dalam proses. Setelah pengoptimalan, jumlah DLL server kosong akan jauh lebih rendah.

Dalam tugas berikutnya, kita akan membangun server kustom hanya dengan fitur yang kita inginkan.

Membangun Server Kustom

Dalam tugas sebelumnya, kami menghapus server ke konfigurasi minimal, hanya dengan mesin server inti yang berjalan dan tidak ada modul tambahan yang dimuat. Sekarang, kami membangun server kustom untuk digunakan sebagai server file web di jaringan perusahaan. Untuk melakukan ini, kami mengaktifkan server untuk menyediakan hanya layanan berikut:

  • Sajikan file statis
  • Melayani daftar direktori
  • Melindungi konten dengan autentikasi dasar dan aturan otorisasi berbasis URL

Aktifkan Server untuk Menyajikan File Statis

Untuk melakukan tugas ini, diasumsikan bahwa kita telah mengikuti tugas sebelumnya dan menghapus server dengan menghapus semua modul yang dijalankannya. Dalam keadaan ini, server selalu mengembalikan respons kesalahan 401 kosong ke semua permintaan, karena tidak ada modul yang dimuat untuk menyediakan segala jenis pemrosesan permintaan sama sekali.

  1. Gunakan editor teks untuk membuka %windir%\system32\inetsrv\config\applicationHost.config.

  2. Navigasi ke bagian <system.webServer>/<globalModules> . Tambahkan 2 baris dalam huruf tebal di bawah ini di dalam koleksi - salin dari pad awal yang digunakan sebelumnya untuk menyimpan item koleksi default. Ini memuat modul handler file statis, yang bertanggung jawab untuk melayani permintaan untuk file statis, dan modul autentikasi anonim, yang menghasilkan token autentikasi default untuk permintaan:

    <globalModules>
        <add name="StaticFileModule" image="%windir%\System32\inetsrv\static.dll" />
        <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" />
    </globalModules>
    
  3. Navigasi ke bagian <system.webServer>/<modules> . Aktifkan handler file statis dan mode autentikasi anonim dengan menambahkan baris dalam huruf tebal di bawah ini:

    <modules>
    
        <add name="AnonymousAuthenticationModule" />
    
        <add name="StaticFileModule" />
    
    </modules>
    
  4. Navigasi ke bagian <system.webServer>/<handlers> . Petakan handler file statis ke semua permintaan file dengan menambahkan baris dalam huruf tebal di bawah ini:

    <handlers>
        <add name="StaticFile" path="*" verb="GET,HEAD"  modules="StaticFileModule" resourceType="Either" requireAccess="Read"/>
    </handlers>
    
  5. Simpan file applicationHost.config.

  6. Buka Internet Explorer, dan buat permintaan ke URL berikut:

    http://localhost/iisstart.htm
    

    Ini melayani dokumen yang diminta. Kami telah berhasil mengaktifkan kemampuan penyajian file statis di server.

  7. Selanjutnya, minta daftar direktori dengan membuat permintaan ke URL berikut:

    http://localhost
    

    Kami mendapatkan respons kosong karena tidak ada handler yang saat ini dimuat, diaktifkan, dan dipetakan untuk memproses daftar direktori--respons kosong dikirim (200 OK). Dalam tugas berikutnya, kita akan menambahkan handler.

Aktifkan Server untuk Menyediakan Daftar Direktori

Untuk melakukan tugas ini, diasumsikan bahwa kami telah melakukan tugas sebelumnya, menghapus server menjadi apa-apa, dan menambahkan kemampuan penyajian file.

  1. Gunakan editor teks untuk membuka %windir%\system32\inetsrv\config\applicationHost.config.

  2. Seperti sebelumnya, tambahkan konfigurasi di bawah ini untuk mengaktifkan modul penjelajahan direktori, dan petakan untuk melayani permintaan direktori (konfigurasi kumulatif akan terlihat persis seperti yang ditentukan di bawah ini setelah langkah ini, membangun di atas langkah sebelumnya):

    <globalModules>
        <add name="AnonymousAuthenticationModule" image="%windir%\system32\inetsrv\authanon.dll" />
        <add name="StaticFileModule" image="%windir%\system32\inetsrv\static.dll" />
        <add name="DirectoryListingModule" image="%windir%\System32\inetsrv\dirlist.dll" />
    </globalModules>
    
    <modules>
        <add name="AnonymousAuthenticationModule" />
        <add name="StaticFileModule" />
        <add name="DirectoryListingModule" />
    </modules>
    
    <handlers>
        <add name="StaticFile" path="*" verb="GET,HEAD" modules="StaticFileModule,DirectoryListingModule"  resourceType="Either" requireAccess="Read" />
    </handlers>
    

    Pada titik ini, kami telah mengaktifkan fitur daftar direktori di server. Namun, fitur ini memaparkan konfigurasi tambahan karena alasan keamanan yang mengontrol apakah daftar direktori diizinkan atau tidak. Konfigurasi ini ditentukan di bagian <system.webServer>/<directoryBrowse> .

  3. Ubah entri ke <direktoriBrowse enabled="true" />

  4. Simpan file applicationHost.config.

  5. Buka Internet Explorer, dan ulangi permintaan ke direktori dengan meminta URL berikut:

http://localhost

Ini melayani daftar direktori yang diminta. Kami telah berhasil mengaktifkan kemampuan daftar direktori di server.

Selanjutnya, kami menambahkan layanan autentikasi dan otorisasi untuk melindungi konten di server dari akses yang tidak sah.

Melindungi Sumber Daya dengan Otorisasi URL

Untuk melakukan tugas ini, diasumsikan bahwa kita telah mengikuti tugas sebelumnya, menghapus server menjadi apa-apa, dan menambahkan kemampuan penyajian file dan daftar direktori.

  1. Gunakan editor teks untuk membuka %windir%\system32\inetsrv\config\applicationHost.config.

  2. Kali ini, kami menambahkan dua modul:

    • Modul autentikasi dasar, yang mendukung skema autentikasi dasar melalui http1.1 terhadap kredensial Windows server
    • Modul otorisasi URL, yang mendukung kontrol akses berbasis aturan pengguna dan peran
  3. Untuk menambahkan modul ini, tambahkan entri beban modul ke <bagian system.webServer>/<globalModules> , lalu aktifkan modul di <bagian system.webServer>/<modules> , seperti yang kami lakukan sebelumnya untuk penangan file statis dan browser direktori.

    Catatan

    Kali ini kita tidak perlu menambahkan apa pun ke <bagian system.webServer>/<handlers> , karena modul ini tidak menyediakan penanganan permintaan - mereka hanya menyediakan layanan permintaan untuk semua permintaan. Konfigurasi akhir Anda setelah menambahkan item di bawah ini dalam huruf tebal akan terlihat seperti ini:

    <globalModules>
        <add name="AnonymousAuthenticationModule" image="%windir%\system32\inetsrv\authanon.dll" /> 
        <add name="StaticFileModule" image="%windir%\system32\inetsrv\static.dll" /> 
        <add name="DirectoryListingModule" image="%windir%\system32\inetsrv\dirlist.dll" /> 
        <add name="UrlAuthorizationModule" image="%windir%\System32\inetsrv\urlauthz.dll" />      
        <add name="BasicAuthenticationModule" image="%windir%\System32\inetsrv\authbas.dll" /> 
    </globalModules> 
    
    <modules> 
        <add name="AnonymousAuthenticationModule" /> 
        <add name="StaticFileModule" /> 
        <add name="DirectoryListingModule" /> 
        <add name="BasicAuthenticationModule" /> 
        <add name="UrlAuthorizationModule" /> 
    </modules>
    

    Untuk menggunakan fitur tambahan, kita perlu mengonfigurasinya.

  4. Aktifkan layanan Autentikasi Dasar. Navigasikan <ke elemen basicAuthentication> , dan atur atribut yang diaktifkan ke true:

    <basicAuthentication enabled="true" />
    
  5. Nonaktifkan autentikasi anonim. Navigasikan <ke elemen anonimAuthentication> , dan atur atribut yang diaktifkan ke false:

    <anonymousAuthentication enabled="false" userName="IUSR" />
    

    Ini menonaktifkan autentikasi anonim, dan mengharuskan modul autentikasi dasar berhasil mengautentikasi pengguna sebelum akses akan diberikan.

  6. Simpan file applicationHost.config.

  7. Buka Internet Explorer, dan ulangi permintaan ke direktori dengan meminta URL berikut:

    http://localhost
    

    Ini meminta daftar direktori. Karena browser belum mengautentikasi kami, modul otorisasi URL menolak permintaan. Modul autentikasi dasar mencegat penolakan, dan memicu tantangan autentikasi dasar kembali ke browser, menyebabkan browser menampilkan dialog masuk autentikasi dasar.

  8. Masuk dengan kredensial yang tidak valid. Permintaan ditolak, dengan permintaan yang meminta kredensial lagi.

  9. Masuk dengan akun Administrator yang Anda gunakan untuk masuk ke komputer. Daftar direktori ditampilkan, menunjukkan bahwa Anda telah berhasil menambahkan kemampuan autentikasi dan otorisasi ke server.

Ringkasan

Artikel ini membahas sifat komponen server, memeriksa fitur IIS yang disediakan, dan menjelaskan cara membangun server web kustom hanya dengan layanan yang mungkin diperlukan pengguna.

Sebelum menggunakan server lagi, urungkan perubahan pada konfigurasi server yang dilakukan sebagai bagian dari panduan ini. Jika Anda membuat cadangan sebelumnya, pulihkan dengan menjalankan %windir%\system32\inetsrv\appcmd restore backup initial dari baris perintah.

Lihat tautan berikut untuk informasi lebih lanjut:

  • Untuk mempelajari selengkapnya tentang Arsitektur IIS Core, lihat bagian IIS 7.0 dan Above Core Web Server di IIS.NET.
  • Untuk mempelajari selengkapnya tentang modul IIS, lihat Gambaran Umum Modul IIS 7.0 dan Di Atas.
  • Untuk mempelajari selengkapnya tentang membangun modul untuk memperluas atau mengganti fungsionalitas IIS, lihat Mengembangkan Modul Menggunakan .NET dan Mengembangkan Modul Native (C/C++).