Unix a Internet 7. Webový server Obsah: WWW, webový server, URI (URL+URN) HTTP protokol (GET, POST) HTTPS, SNI přesměrování, virtuální servery dynamické stránky, skriptování, CGI Apache, reverzní proxy © Milan Keršláger http://www.pslib.cz/ke/slajdy 25. 11. 2014 http://creativecommons.org/licenses/by-nc-nd/3.0/
WWW server Tim Berners-Lee (1989) laboratoře CERN – návrh hypertextového systému 1990 – první klient a server klient WorldWideWeb, později nazván Nexus zobrazuje stránky používá tehdy nový HTTP protokol serverová část – CERN httpd odešle na požadavek klientovi data nejprve se lavinovitě rozšířil Gopher od roku 1995 již WWW
WWW World Wide Web dnes označení pro službu původně název prvního webového prohlížeče Nexus „celosvětová pavučina“ používá model klient-server klient – používán uživatelem server – dodává klientovi vyžádaná data dokumenty identifikovány pomocí URI komunikace protokolem HTTP metody HTTP protokolu: GET, POST, HEAD, ...
URI (1) Uniform Resource Identifier jednoznačná identifikace dokumentu v Internetu skládá se z URL a URN URL (Uniform Resource Locator) schéma a doménové jméno: http://www.seznam.cz foo://login:password@example.com:8042 URN (Uniform Resource Name) cesta a další parametry: /over/there/index.dtb?type=animal&name=n arwhal#nose
URI (2) schéma – definuje jméno, typ a další formu zbytku URI schéma://login:heslo@doména:port/path?query#anchor schéma – definuje jméno, typ a další formu zbytku URI login:heslo – umožňuje autentizaci typicky se nepoužívá (vynechává se) doména – doménové jméno port – číslo portu implicitně je http, tj. 80, https je 443, ftp je 21 atd. path – cesta k dokumentu adresáře, název souboru query – umožňuje předat stránce data (metoda GET) anchor – značka uvnitř stránky, kam se nastavit
HTTP Hypertext Transfer Protocol verze 0.9 (původní), 1.0 a 1.1 (aktuální RFC 2616) GET / HTTP/1.0 Host: www.seznam.cz za GET je URN cesta k souboru, název, parametry vždy alespoň lomítko (hlavní stránka) ukončení prázdným řádkem odpověď hlavička a vlastní data pro popis obsahu dat využívá MIME typy
Metody HTTP způsoby získání odpovědi GET běžné získání stránky, součástí jen hlavička parametry součástí URN (omezení max. délkou) POST součástí dotazu je i tělo, ve kterém mohou být data data označena MIME typem (jako odpovědi) HEAD jako GET, ale není odesláno tělo PUT, DELETE, TRACE – typicky nepodporováno
Nejnutnější komunikace GET / HTTP/1.0 Host: www.nekde.cz HTTP/1.1 200 OK Content-Type: text/html Obsah HTML stránky Dotaz klienta Odpověď serveru: hlavička tělo dokumentu Poznámka: horizontálním oddělovačem je prázdný řádek (Enter bez znaku)
Hlavička odpovědi každá položka má vlastní řádek některé definované položky HTTP/1.0 200 OK Content-Type Date Server Cache-Control uživatelské položky začínají na X-
Záznam HTTP přenosu telnet www.pslib.cz 80 Trying 10.200.0.18... Connected to www.pslib.cz. Escape character is '^]'. GET / HTTP/1.0 Host: www.pslib.cz HTTP/1.1 200 OK Date: Wed, 22 Sep 2010 11:46:10 GMT Server: Apache/2.2.3 (CentOS) X-Powered-By: PHP/5.1.6 Set-Cookie: PHPSESSID=g0ml14v2g4ss7sli2m69gsmhm4; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Connection: close Content-Type: text/html ...obsah HTML dokumentu (v prohlížeči „zobrazit zdrojový kód“)
HTTPS HTTP Secure zabezpečený HTTP přenos používá standardně port 443 vložena transparentní SSL/TLS mezivrstva šifrování/dešifrování je prováděno transparentně prohlížeč → HTTP → zašif. → přenos → dešif. → webový server z hlediska aplikace/serveru je komunikace stejná využití asymetrické šifry a elektronického podpisu protistrana může prokázat svoji identitu obvykle ji prokazuje server, ale může i klient přenos důvěry od certifikační autority na protistranu
Využití HTTPS SSL/TLS zajišťuje: privátnost odposlechnutá data není možné přečíst využíváme šifrování a obtížnosti kryptoanalýzy integritu s daty nebylo při přenosu manipulováno tj. lze detekovat změnu dat při přenosu autenticitu lze určit, od koho zpráva pochází využití principu přenosu důvěry
SSL/TLS SSL (Secure Sockets Layer) původní protokol (Netscape, v2.0 v roce 1995) verze 3.0 v roce 1996 odstraněny bezpečnostní problémy návrhu a impl. TLS (Transport Layer Security) TLS 1.0 (1999), RFC 2246 (vlastně SSL 3.1) útok BEAST (2005), exploit (2011) na šifru CBC TLS 1.1 (2006), RFC 4346 (vlastně SSL 3.2) řeší zranitelnost šifry CBC TLS 1.2 (2008), RFC 5246 (vlastně SSL 3.3) MD5-SHA1 nahrazeno → SHA256
Ruční použití SSL/TLS openssl s_client -ign_eof -crlf -connect www.pslib.cz:443 Trying 10.200.0.18... Connected to www.pslib.cz. Escape character is '^]'. GET / HTTP/1.0 Host: www.pslib.cz HTTP/1.1 200 OK Date: Wed, 22 Sep 2010 11:46:10 GMT Server: Apache/2.2.3 (CentOS) X-Powered-By: PHP/5.1.6 Set-Cookie: PHPSESSID=g0ml14v2g4ss7sli2m69gsmhm4; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Connection: close Content-Type: text/html ...obsah HTML dokumentu (v prohlížeči „zobrazit zdrojový kód“)
SNI Server Name Indication problém virtuálních serverů a HTTPS server se prokazuje certifikátem šifrování zahájeno ihned po navázání spojení certifikát obsahuje jméno serveru (www.seznam.cz) název serveru je však sdělen serveru později položka Host: v protokolu HTTP/1.0 SNI umožňuje sdělit jméno serveru dříve tj. ještě před výměnou certifikátů podpora ve všech prohlížečů, nyní i pro servery SNI je rozšíření TLS protokolu
Aliasy vlastnost webového serveru normálně URN odpovídá adresářům u serveru alias umožňuje mapovat URN na odlišná umístění skrývá interní adresářovou strukturu u serveru výhodné pro „hezká“ URN SEO optimalizace orientace uživatele (kategorie zboží) umožňuje udělat z URN parametr vyvolání zdání, že obsah jsou statické stránky omezuje riziko manipulace s parametry URN
Přesměrování server přenese klienta na jiné URI v hlavičce je klientovi předáno nové URI HTTP/1.1 301 Moved Permanently Location: http://www.example.org klient přepíše sám sobě adresu v adresním řádku „automatické přenesení na novou adresu“ různé důvody: změna adresy, změna URN struktury atd. též kódy 300, 302, 303, 307
Virtuální servery více webových serverů na 1 IP adrese potíž v tom, že v GET, POST je jen URN klient přeloží jméno na IP adresu a webový server netuší, z jakého to bylo jména řeší HTTP 1.0 → má v požadavku položku Host: webový server se tak dozví URL (doménové jméno) dnes jsou virtuální servery běžné proto nelze používat HTTP 0.9 každý virtuál má svoje vlastní nastavení jiný kořenový adresář, logy, aliasy atd.
Statické stránky nejjednodušší obsah webového serveru stránka je na disku v souboru server stránku beze změny pošle klientovi snadné dosažení vysokého výkonu omezením pouze rychlostí sítě a souborového systému pro snížení režie je podpora v jádře OS využití systémového volání sendfile() webserver jako jaderný modul (TUX web server) vynechání kopírování dat z page cache do userspace ale je to nebezpečné → lighttpd
Dynamické stránky stránka generována podle požadavku klienta podle aktuálního obsahu databáze titulní stránka internetových novin podle zadání klienta požadavek předán jako URN, parametr v GET či POST server musí spustit nějaký program předání parametrů programu skrze CGI rozhraní výstup programu odeslán klientovi dříve samostatné programy dnes skriptovací jazyky, servlety
Webový formulář vytvářen prvky HTML jazyka <FORM ACTION=“URI“ METHOD=GET> <INPUT TYPE=TEXT NAME=x> <INPUT TYPE=SUBMIT> </FORM> prohlížeč zobrazí vstupní pole a tlačítko odeslání pomocí Enter nebo kliku na tlačítko na serveru vyvolána stránka dle URL URN?x=vstup vstup z formuláře předán metodou GET serveru nestavová záležitost
CGI Common Gateway Interface předání dat od klienta k programu u serveru typicky z webového formuláře pomocí proměnných prostředí (metoda GET) jako standardní vstup (POST, PUT) program generuje výstup výstup je webová stránka odeslaná klientovi problém vzniku nového programu snadné přetížené webového serveru FastCGI → program běží trvale
Skriptování na serveru využití skriptovacího jazyka výpočet se odehraje na straně serveru nevyžaduje kompilaci do binární podoby interpret však zdržuje (prodleva při startu) pohodlné pro vývojáře většinu bezpečnostních děr způsobí vývojáři typicky nedostatečná kontrola vstupů oblíbené vkládání skriptu do HTML stránky PHP → multiplatformní ASP → Microsoft Windows
PHP PHP: Hypertext Preprocesor skriptovací jazyk pro webové stránky (1995) interpret dostupný jako: externí program (podobně jako Perl, Python, bash, …) modul do serveru syntaxe převzata z Perlu (podobné C, JavaScriptu) <html> <head><title>PHP Test</title></head> <body> <?php echo 'Hello World'; ?> </body> </html>
Skriptování u klienta program uvnitř prohlížeče kód přepraven do klienta ze serveru kód je součástí webové stránky JavaScript standardní součást webových prohlížečů AJAX → implementace asynchronní komunikace Java, Flash, Silverlight, … často bezpečnostní komplikace
Cookies klient (prohlížeč) ukládá informace od serveru při další návštěvě informaci serveru předá obchází se tím nestavovost HTTP protokolu server ví, kdo k němu (opět) přichází tj. klient se může „přihlásit“, zahájit „relaci“ cookies mají: omezenou platnost (pak je klient smaže) platnost omezenu na URI (již nelze bez omezení) využívají se pro „špehování“ volba „do not track“ → výsměch
AJAX
Apache nejrozšířenější webový server (viz Netcraft) původně 1993 v NCSA (Illinoiská univerzita) největším konkurentem je MS IIS Microsoft Internet Information Server ve znaku ptačí pero (indiánský symbol) další význam „a patchy server“ (záplatovaný server) open source software (Apache Software Foundation) vlastní OSS licence (Apache License 2.0) modulární struktura mod_ssl, mod_php, mod_python, …
Netcraft.com – market share
Netcraft.com – top milion share
Démon démon je proces běžící na pozadí bez kontaktu s uživatelem uzavřeny standardní proudy (stdin, stdout, stderr) používá se „double fork“ → rodičem se stane init zprávy do logu → syslog → /var/log/... správce počítače by měl sledovat (používá je i jádro) zajišťuje nějakou službu (ve Windows: services) terminálové přihlášení ze sítě: sshd sdílení souborů (NFS, Samba, …), WWW server, ... spouštění a zastavování démonů pomocí skriptů např.: /etc/init.d/httpd restart skripty používá při startu proces init
Logy od Apache záznam činnosti webového serveru klasický formát (nebo podle proxy) ukázka RHEL, CentOS, Fedora: /var/log/httpd/* loguje se přístup (hit) pro každý dotaz zvlášť logy chyb v separátním souboru další analýza logů rozlišení hitů podle návštěvníků analýzy návštěvnosti → ukázka též Google Analytics, Bing Webmaster... vlastní záznamy si vytvářejí vložením skriptu do stránky
Reverzní proxy cache na straně serveru (nginx, Squid, ...) drží často poptávané stránky v paměti důležité pro dynamický obsah reálně se dynamická stránka generuje jen občas problémy s aktuálností řešeny lépe, než cache v prohlížeči webový server i rev. cache spravuje jeden správce i jiná využití skrytí skutečného webového serveru rozložení zátěže mezi více webových serverů přidání SSL (seznam.cz), komprese obsahu apod.
MIME typy Internet media type (dříve MIME typy): součást MIME standardu (RFC 2822 z roku 2001) původně pro národní znaky a přílohy v e- mailech HTTP protokol používá MIME typy: image/jpeg, image/gif, image/png, … text/plain, text/html, … application/javascript, application/ogg application/octet-stream (univerzální „binární“ typ) application/x-tar, application/x-shockwave- flash audio/mpeg, audio/ogg, …