Microsoft IIS (Internet Information Services) to serwer WWW stworzony przez firmę Microsoft, który służy do hostowania stron internetowych, aplikacji webowych i usług opartych na technologiach takich jak .NET czy PHP na systemach operacyjnych Windows Server. Oprogramowanie to bezpośrednio odbiera żądania od przeglądarek użytkowników poprzez protokoły HTTP lub HTTPS i zwraca im odpowiednie pliki oraz wygenerowane dane.
Prawda jest zresztą absolutnie taka, że przez lata środowisko to wyrosło na standard w dużych korporacjach. Zastąpiło wiele pomniejszych demonów sieciowych. Czasami administratorzy narzekają na jego zawiłą konfigurację uprawnień. Ale serwer IIS ma po prostu jedno konkretne zadanie. Obsługuje ruch sieciowy. Robi to dobrze, o ile wiesz, gdzie kliknąć.
Jak dokładnie działa serwer Microsoft IIS pod maską?
Architektura tego rozwiązania opiera się na kilku nakładających się na siebie warstwach. To nie jest prosty program, który po prostu włączasz podwójnym kliknięciem. Zmieniliśmy te zasady na robocie już dawno temu i dzisiaj patrzymy na to przez pryzmat procesów systemowych.
W sercu całego systemu siedzi sterownik HTTP.sys. Działa on na poziomie samego jądra systemu operacyjnego (Kernel Mode). To on przechwytuje surowe pakiety sieciowe przychodzące na port 80 lub 443 i decyduje, gdzie je dalej skierować. Dzięki temu, że działa tak głęboko, omija narzut wydajnościowy aplikacji działających w trybie użytkownika. Zatrzymuje ataki typu DDoS o wiele szybciej. Odcina wadliwe pakiety zanim te w ogóle dotrą do twojej aplikacji w C#.
Dalej mamy usługę Windows Process Activation Service (WAS) oraz usługę publikowania w sieci WWW (W3SVC). WAS odpowiada za zarządzanie pulami aplikacji. W3SVC czyta konfigurację z plików i mówi sterownikowi HTTP.sys, jak ma nasłuchiwać. To rozdzielenie ról wprowadzono dawno temu i uratowało to stabilność wielu firm. Zresztą my u siebie przeszliśmy podobną drogę uświadamiania sobie tego mechanizmu.
Pamiętam wdrożenie w starym biurowcu na wrocławskich Krzykach gdzieś w okolicach 2018 roku. Mieliśmy tam postawić bardzo prosty intranet dla działu kadr. Zrobiliśmy konfigurację serwera IIS, wszystko wyglądało w porządku, a potem zawiesiło się odpytywanie bazy SQL. Serwer wypluwał błąd 503 Service Unavailable i zrywał połączenia. Spędziliśmy nad tym prawie sześć godzin. Okazało się ostatecznie, że tożsamość puli aplikacji nie miała uprawnień do odczytu ukrytego katalogu tymczasowego na dysku D. Wprowadzono poprawkę w uprawnieniach NTFS tuż przed poniedziałkiem i wszystko ruszyło z kopyta. To pokazało nam dobitnie, jak mocno IIS zrośnięty jest z samym Windows Server. Nie wybacza błędów w tabelach dostępu.
Do czego w praktyce wykorzystuje się usługi Internet Information Services?
Zastanawiacie się zresztą, po co stawiać ciężkiego Windowsa do hostingu, skoro można użyć lekkiego Nginxa odpalonego na darmowym Linuksie? Sam się z tym borykałem dzisiaj rano podczas przeglądania budżetów na licencje. Odpowiedź leży w kodzie aplikacji.
- Hosting natywnych aplikacji ASP.NET Core i starszych Web Forms. Tutaj Microsoft IIS czuje się najlepiej, bo zintegrowano go z frameworkiem na poziomie głębokich bibliotek systemowych. Komunikacja między serwerem a kodem działa bez zbędnych warstw tłumaczących zapytania.
- Uruchamianie wewnętrznych portali korporacyjnych opartych o autoryzację Windows. Jeśli używasz Active Directory, IIS pozwala na bez logowania wpuścić pracownika do systemu na podstawie jego poświadczeń z komputera. Gładko i szybko.
- Działanie jako Reverse Proxy dla mniejszych usług mikroserwisowych. Chociaż prawdę mówiąc brakuje nam twardych danych za wczoraj, więc wydaje się to tylko jedną z rzadszych hipotez na najbliższy kwartał przed spowolnieniem rynku. My używamy go czasem żeby przepychać ruch do kontenerów Dockera odpalonych w tle na innej maszynie
- Serwery FTP i WebDAV do prostej wymiany plików. Funkcja stara jak świat, ale w zamkniętych sieciach VLAN nadal używana do zrzucania kopii zapasowych z urządzeń brzegowych.
Dlaczego pule aplikacji (Application Pools) decydują o stabilności środowiska?
To jest najgorsza opcja z wszystkich, gdy ktoś wrzuca dziesięć różnych stron internetowych do jednej puli aplikacji. Pula aplikacji to w uproszczeniu izolowany kontener w pamięci operacyjnej. Każda pula uruchamia swój własny proces roboczy w systemie, znany pod nazwą w3wp.exe. Zmieniliśmy te zasady na robocie i dzisiaj każda usługa ma własny proces.
Kiedy strona nagle przestaje odpowiadać, administrator od razu patrzy na procesy w3wp.exe w menedżerze zadań. Czasami pamięć RAM po prostu EKSPLODUJE przez wycieki w źle napisanym kodzie aplikacji. Pule aplikacji ratują wtedy sytuację. Jeśli jedna strona zużyje 100% przydzielonej pamięci i proces się zawiesi, system zrestartuje tylko tę jedną pulę. Pozostałe dziewięć stron działających w innych pulach nawet nie zauważy awarii. To mechanizm separacji błędów.
IIS pozwala też na automatyczny recykling puli. Możesz nakazać systemowi, żeby codziennie o trzeciej nad ranem ubijał proces i uruchamiał go na nowo. Czyści to pamięć ze śmieci pozostawionych przez programistów. Działa to jak brutalny, ale skuteczny plaster na rany.
Jakie funkcje techniczne oferuje IIS administratorom?
Zarządzanie tym kombajnem odbywa się z poziomu graficznego interfejsu o nazwie Menedżer usług IIS (inetmgr) albo przez skrypty w języku PowerShell. My u siebie przeszliśmy całkowicie na automatyzację. Wyklikanie pięćdziesięciu stron z certyfikatami SSL zajmowało kiedyś dwa dni. Moduł WebAdministration w PowerShellu robi to w kilkanaście sekund. Omijamy w ten sposób błąd ludzki.
Warto spojrzeć na modułową budowę tego serwera. Instalujesz tylko to, czego faktycznie potrzebujesz. Odchudzasz powierzchnię ataku.
| Moduł systemowy | Za co odpowiada | Nasza opinia z wdrożeń |
| HTTP Logging | Rejestruje kto wchodzi na serwer i jakich adresów szuka | Domyślnie zapisuje logi na dysku C. To błąd, trzeba to od razu przenieść na inny wolumen, bo zapcha system. |
| Request Filtering | Blokuje podejrzane zapytania URL na podstawie reguł | Działa wybitnie dobrze. Odcina bez mała prawie pięćdziesiąt procent skanerów podatności uderzając do przodu u wyników zaporowych. |
| URL Rewrite | Przepisuje adresy stron i wymusza przekierowania HTTPS | Trzeba go doinstalować osobno z sieci. Bez niego zarządzanie SEO to koszmar. |
| Dynamic Compression | Kompresuje odpowiedzi w locie przy użyciu GZIP lub Brotli | Mocno obciąża procesor przy bardzo dużym ruchu. Zostawiamy to tylko dla plików tekstowych. |
Czy konfiguracja serwera IIS wymaga znajomości pliku web.config?
Plik web.config steruje zachowaniem konkretnej strony internetowej. Zapisano w nim reguły przekierowań, parametry połączeń z bazą danych i ustawienia wyświetlania błędów. Leży on bezpośrednio w katalogu z plikami strony. Z kolei plik applicationHost.config trzyma globalne ustawienia całego serwera WWW w folderze systemowym. Gmeranie w tym głównym pliku bez zrobienia kopii zapasowej kończy się zazwyczaj reinstalacją ról w systemie operacyjnym. Zawsze.
Wielu młodych deweloperów myśli, że wystarczy wrzucić web.config na FTP i wszystko ruszy. A potem patrzą w biały ekran z błędem HTTP 500. Serwer IIS blokuje nadpisywanie niektórych ustawień z poziomu lokalnego pliku ze względów bezpieczeństwa. Musisz najpierw oddelegować te uprawnienia w głównym menedżerze. Inaczej system potraktuje próbę zmiany konfiguracji jako atak.
Jak Internet Information Services wypada w porównaniu do Nginx?
Nie będę ukrywał faktów. Nginx niszczy IIS pod kątem obsługi tysięcy jednoczesnych połączeń statycznych na bardzo słabym i tanim sprzęcie. Architektura oparta na zdarzeniach (event-driven) w Linuksie radzi sobie z tym lepiej. Z kolei leciwy Apache powoli, acz sukcesywnie odchodzi w całkowite zapomnienie na rzecz nowszych rozwiązań.
Ale jeśli masz w firmie potężną aplikację finansową napisaną w języku C# przez zespół deweloperów korzystających od lat z dobrodziejstw ekosystemu Microsoftu, odpalanie tego na Linuksie przez dziwne warstwy pośrednie to proszenie się o kłopoty na produkcji. IIS daje natywne wsparcie. Zapewnia głęboką integrację z logami zdarzeń Windows (Event Viewer) oraz licznikami wydajności (Performance Monitor). I to ucina wszelkie dyskusje na spotkaniach zarządu. Cholernie irytuje mnie zresztą, gdy ludzie próbują wpychać technologie Open Source tam, gdzie one po prostu architektonicznie nie pasują.
Bezpieczeństwo. Jak chronić aplikacje webowe przed atakami?
Instalacja wariantu domyślnego to zaproszenie dla botów skanujących. Zabezpieczenie serwera wymaga podjęcia kilku brutalnych kroków zaraz po pierwszym uruchomieniu maszyny.
Wyłącz przeglądanie katalogów (Directory Browsing) we wszystkich witrynach. Ustaw uprawnienia w systemie plików NTFS tak, żeby proces w3wp.exe z konkretnej puli miał dostęp do odczytu tylko i wyłącznie do folderu ze swoją własną aplikacją. Dobrym pomysłem jest całkowita izolacja wirtualnych katalogów z obrazkami i zablokowanie w nich wykonywania skryptów. Użyj modułu Request Filtering by odcinać zapytania zawierające znaki charakterystyczne dla ataków SQL Injection.
Warto wyłączyć wysyłanie nagłówka „Server: Microsoft-IIS/10.0” w odpowiedziach HTTP. Po co ułatwiać życie atakującym i mówić im, jakiej wersji systemu używamy? Ogranicz też rozmiar maksymalnego żądania, by zablokować próby zapchania łącza wielkimi plikami wysyłanymi metodą POST. W 2021 roku znaleziono podatność w obsłudze nagłówków HTTP w stosie systemowym, więc regularne łatanie samego Windows Server przez Windows Update to absolutny przymus.
Prawda jest taka, że serwer IIS sam w sobie jest całkiem odporny. Luki najczęściej znajdują się w aplikacjach, które on hostuje. Zoptymalizowaliśmy nasze procedury. Zmieniliśmy te zasady na robocie. Teraz sprawdzamy kod przed wrzuceniem go na produkcję.
Zarządzanie certyfikatami SSL i protokołem HTTPS
Ruch nieszyfrowany nie istnieje. Przeglądarki odrzucają strony po HTTP. Serwer IIS obsługuje certyfikaty SSL/TLS za pomocą wbudowanego magazynu certyfikatów systemu Windows. To ułatwia sprawę, bo nie musisz trzymać kluczy prywatnych w luźnych plikach tekstowych na dysku, jak ma to miejsce w systemach linuksowych.
Dodanie certyfikatu nazywa się bindowaniem (Binding). Przypisujesz pobrany certyfikat do konkretnego adresu IP i portu 443. Dzięki rozszerzeniu SNI (Server Name Indication), Microsoft IIS potrafi obsłużyć dziesiątki różnych certyfikatów i domen na jednym, pojedynczym adresie IP. Kiedyś wymagało to osobnego adresu dla każdej zabezpieczonej strony. Powodowało to ogromne koszty u dostawców usług hostingowych.
Nakaż swojemu systemowi wymuszanie protokołu TLS w wersji 1.2 lub nowszej. Zmodyfikuj rejestr systemu Windows, by całkowicie ubić obsługę starych protokołów SSLv3 oraz TLS 1.0. Są one dziurawe. Przez nie twoja strona obleje każdy audyt bezpieczeństwa.
Postaw serwer wirtualny u siebie na domowym komputerze. Dodaj rolę IIS w ustawieniach funkcji systemu Windows 10 lub 11. Skonfiguruj prostą stronę w czystym HTML i zobacz, jak zachowuje się proces w Menedżerze zadań pod obciążeniem. Przetestuj limity pamięci dla puli aplikacji. Dopiero wtedy, psując to środowisko na własne oczy, zrozumiesz, jak ten stary, ale potężny mechanizm alokuje zasoby i odpowiada na zapytania z sieci.
Najczęściej zadawane pytania (FAQ)
- Co to jest IIS i do czego służy?
Microsoft IIS to serwer WWW dla systemów Windows Server. Służy do hostowania stron internetowych, aplikacji webowych (zwłaszcza napisanych w technologii .NET) oraz usług FTP i wymiany plików. - Czy serwer IIS jest darmowy?
Sam w sobie IIS jest bezpłatnym składnikiem systemu Windows. Wymaga jednak posiadania płatnej licencji na system operacyjny Windows Server w środowiskach komercyjnych. - Jak zrestartować serwer IIS?
Najszybszą metodą jest otwarcie wiersza poleceń jako administrator i wpisanie komendy 'iisreset’. Powoduje to zatrzymanie i ponowne uruchomienie wszystkich usług związanych z serwerem WWW. - Co to jest w3wp.exe?
To proces roboczy (Worker Process) serwera IIS. Odpowiada za bezpośrednie wykonywanie kodu aplikacji webowej. Każda pula aplikacji ma przypisany przynajmniej jeden taki proces w pamięci. - Gdzie serwer IIS trzyma logi z błędami?
Domyślnie logi dostępu i błędów HTTP zapisywane są na dysku systemowym w ścieżce C:\inetpub\logs\LogFiles. Można tę lokalizację zmienić w ustawieniach Menedżera IIS. - Jakie języki programowania obsługuje IIS?
IIS natywnie wspiera aplikacje oparte na C# i frameworkach ASP.NET oraz ASP.NET Core. Za pomocą modułu FastCGI doskonale radzi sobie również z obsługą aplikacji napisanych w języku PHP.
Bibliografia
1. Microsoft – https://www.microsoft.com
2. Wydawnictwo Naukowe PWN – https://pwn.pl
3. NASK – https://www.nask.pl
4. CERT Polska – https://cert.pl
5. Główny Urząd Statystyczny – https://stat.gov.pl
