Transcript Uwaga

PRZEGLĄD INNYCH PROTOKOŁÓW WARSTWY ZASTOSOWAŃ
1. Telnet
Telnet jest prostym protokołem, stanowiącym prawie bezpośrednią „obudowę” protokołu TCP. Służy
do transmisji ciągu znaków od klienta do serwera i w drugą stronę. Nie stosuje szyfrowania.
Zasadniczo został zaprojektowany do otwierania zdalnej sesji pracy w trybie tekstowym na systemie
unixowym (w takim przypadku klient komunikuje się z serwerem usługi Telnet przez port TCP 23).
Serwer Telnet uruchamia proces interpretera poleceń, który następnie przeprowadza uwierzytelnienie
użytkownika (login shell) i, w przypadku pomyślnym, umożliwia mu wydawanie poleceń. Polecenie
exit kończy sesję pracy z interpreterem i powoduje automatycznie zakończenie połączenia TCP.
Klient Telnet może być wykorzystywany również do komunikowania się (przez inne porty TCP)
z serwerami innych usług (nie stosującymi szyfrowania). W takim przypadku polecenie uruchomienia
klienta musi jako argument otrzymać nie tylko adres/nazwę internetową komputera docelowego, ale
również numer portu TCP (23 jest domyślny).
W niektórych przypadkach po zakończeniu wymiany komunikatów klienta z serwerem połączenie
TCP może pozostać nie zerwane (czyli znaki wypisywane przez użytkownika w wierszu poleceń
w dalszym ciągu będą wysyłane przez klienta Telnet). Kombinacja kluczy ctrl-] służy do przełączenia
klienta z trybu przekazywania znaków do hosta odległego w tryb przyjmowania poleceń (lokalnych),
co umożliwia poprawne zakończenie jego działania.
2. SSH (Secure SHell)
Protokół ten jest funkcjonalnym równoważnikiem protokołu Telnet, ale stosującym dodatkowo
szyfrowanie (w związku z tym nie nadaje się do komunikacji z serwerami usług nie stosującymi
szyfrowania). Standardowym portem nasłuchu serwera SSH jest port TCP 22.
Protokół SSH wykorzystuje szyfrowanie z kluczem asymetrycznym. Oznacza to, że zarówno klient,
jak i serwer, w chwili nawiązania pierwszego połączenia ze sobą, generują parę kluczy: publiczny
i prywatny. Klucz publiczny jest przesyłany przeciwnej stronie procesu komunikacji i jest stosowany
do szyfrowania informacji, zaś klucz prywatny jest pozostawiany na miejscu i służy do deszyfrowania.
Uwaga
Klucz publiczny i prywatny muszą być generowane łącznie  jest praktycznie niemożliwe obliczyć
jeden z nich na podstawie drugiego. Idea szyfrowania z kluczem asymetrycznym bazuje na istnieniu
funkcji, dla których bardzo trudno jest obliczyć funkcję odwrotną (tak zwanych funkcji
jednokierunkowych). Typowym przykładem takiej funkcji jest iloczyn dwóch bardzo dużych liczb
pierwszych (stucyfrowych lub dłuższych) – rozkład takiego iloczynu na czynniki pierwsze jest
praktycznie niemożliwy dla współczesnych komputerów.
Pary kluczy wygenerowane przy pierwszym komunikowaniu się danej pary hostów są przechowywane
przez nie (w odpowiednich plikach) i używane w ich kolejnych połączeniach. W przypadku
reinstalacji/rekonfiguracji serwera SSH klient próbujący skomunikować się z nim przy użyciu
dotychczasowego klucza nie osiągnie celu i może wyświetlać komunikaty dla użytkownika
o podejrzeniu podszywania się obcego hosta pod serwer. W takim przypadku należy usunąć
zawartość pliku z kluczami po stronie klienta (i wymusić w ten sposób wygenerowanie nowych
par kluczy).
3. FTP (File Transfer Protocol)
Protokół FTP służy do przesyłania plików pomiędzy komputerem, na którym działa klient,
a komputerem, na którym działa serwer (w obu kierunkach). W pewnej części (nawiązywanie
połączenia) jest oparty na protokole Telnet. Serwer wykorzystuje do nasłuchu i przyjmowania
poleceń od klienta port TCP 21. W przypadku, gdy nie jest wykorzystywana usługa anonimowego
FTP (anonymous FTP), serwer przeprowadza uwierzytelnianie klienta (przyjmuje login i hasło).
Protokół FTP nie zapewnia szyfrowania (ani poleceń, ani treści plików).
Przesyłanie zawartości plików odbywa się przy użyciu innego portu TCP po stronie serwera, niż 21.
Możliwe są dwa tryby inicjowania transferu: aktywny i pasywny. W przypadku aktywnego FTP
(metoda starsza, mniej bezpieczna) serwer używa portu TCP 20 do otwarcia drugiego połączenia
z portem po stronie klienta. W przypadku pasywnego FTP (metoda nowsza, bezpieczniejsza) serwer
pobiera od systemu operacyjnego i przekazuje klientowi numer portu doraźnego TCP (powyżej 1023),
a następnie klient nawiązuje połączenie z tym portem.
Samo przesyłanie zawartości plików również może odbywać się w dwóch trybach: binarnym lub
tekstowym (ASCII). W trybie binarnym plik jest przenoszony bez zmiany (w przeciwieństwie do
protokołów pocztowych FTP nie ma z tym problemów, gdyż został od razu zaprojektowany pod
kątem obsługi bajtów 8-bitowych). W trybie tekstowym (służącym do przenoszenia plików
tekstowych) konwersji mogą podlegać znaki sterujące w tekście (znaki zmiany linii, znaki tabulacji)
tak, aby plik mógł być prawidłowo interpretowany pod docelowym systemem operacyjnym (różnicę
pomiędzy trybem binarnym a tekstowym łatwo można zaobserwować przenosząc pliki tekstowe
między systemami Windows i Linux).
Współczesne klienty FTP zazwyczaj dysponują graficznym łączem użytkownika, które wyświetla
dwa panele: obraz katalogu bieżącego po stronie serwera i obraz katalogu bieżącego po stronie
klienta, i pozwala łatwo kopiować pliki z jednego panelu do drugiego (w szczególności współczesne
przeglądarki internetowe również pozwalają na użycie protokołu FTP). Takie klienty na ogół
rozpoznają typ pliku (tekstowy czy binarny) automatycznie i stosują właściwy tryb transmisji.
Najprostsze klienty FTP posiadają jedynie tekstowy interfejs użytkownika. Oferują one kolekcję
poleceń, które po podaniu przez użytkownika są w dość prosty sposób (ale nie „1-1”) tłumaczone na
komendy protokołu.
Linuksowy program ftp może być uruchomiony bez argumentów w linii poleceń, lub z argumentem
będącym adresem IP lub nazwą internetową hosta docelowego: ftp nazwa_hosta . Jego podstawowe
polecenia to:
open nazwa_hosta
inicjuje połączenie z serwerem (co zwykle wiąże się z uwierzytelnieniem
użytkownika)
ascii
ustawia tryb transmisji na tekstowy (ASCII)
binary
ustawia tryb transmisji na binarny
ls
wyświetla zawartość katalogu bieżącego po stronie serwera
cd nazwa_katalogu
zmienia katalog bieżący po stronie serwera
get nazwa_pliku
kopiuje plik z katalogu bieżącego po stronie serwera do
katalogu bieżącego po stronie klienta
kopiuje plik z katalogu bieżącego po stronie klienta do
put nazwa_pliku
katalogu bieżącego po stronie serwera
kończy sesję pracy i rozwiązuje połączenie TCP
quit
Polecenia ls i cd nie posiadają pełnych funkcjonalności analogicznych poleceń bash’a.
Uwaga
W przypadku kopiowania plików przez FTP należy zwracać uwagę na prawa dostępu do
powstających kopii i w razie potrzeby od razu je zmieniać.
4. SCP (Secure CoPy)
Protokół SCP jest funkcjonalnym odpowiednikiem FTP stosującym szyfrowanie. W pewnej części
(nawiązywanie połączenia, szyfrowanie) jest oparty na protokole SSH. Linuksowe polecenie scp ma
następującą składnię:
scp użytkownik1@host1:plik1 użytkownik2@host2:plik2
i po podaniu automatycznie powoduje żądanie uwierzytelnienia użytkownika.
5. HTTP (HyperText Transfer Protocol)
Protokół HTTP jest jednym z najpowszechniej używanych protokołów. Służy do przesyłania od
klienta do serwera żądań dostarczenia zawartości plików opisujących strony domowe (czasem też do
dostarczenia przez klienta pewnych danych, takich jak hasła, dane wpisane do formularza czy
zawartości plików cookie), a od serwera do klienta – plików ze stronami domowymi (lub
komunikatów o ich niedostępności). Standardowym portem nasłuchu serwera jest port TCP 80.
Protokół HTTP nie zawiera mechanizmów szyfrowania i, aby zapewnić tajność przesyłanych danych,
musi współpracować z protokołami pomocniczymi (na przykład TLS lub SSL).
Typową postacią klienta HTTP jest przeglądarka internetowa (zaopatrzona w graficzne łącze
użytkownika i umiejąca obsługiwać również niektóre inne protokoły). Istnieją również bardzo proste
klienty, mogące tylko wyświetlać otrzymane zawartości plików we wzbogaconym trybie tekstowym.
Prawdopodobnie najbardziej obecnie rozpowszechnionym na świecie serwerem HTTP jest
linuksowy serwer Apache.
Zasadniczo dostęp do serwera HTTP nie wymaga uwierzytelnienia – HTTP służy do „publikowania”
plików, podobnie, jak, w starszej formie, anonimowy FTP. Publikowane pliki są umieszczane
w katalogu o standardowej nazwie public_html i mają przyporządkowane identyfikatory unikalne
w skali całego Internetu (URL – Uniform Resource Locator).
Pojęcie URL ma szersze znaczenie, niż tylko w odniesieniu do HTTP. Ogólna postać URL jest
następująca:
protokół : // host : port / ścieżka / plik
protokół – zwykle http lub ftp, ale mogą też być inne
host – nazwa lub adres internetowy hosta
port – numer portu TCP
ścieżka / plik – bezwzględna nazwa ścieżkowa pliku (może zawierać znak zastępczy ~)
Niektóre z wyżej wymienionych składowych mogą być pominięte w zapisie (są wtedy uwzględniane
wartości domyślne):
protokół – w przeglądarkach internetowych domyślny jest http;
port – przyjmowany jest standardowy port nasłuchu dla danego protokołu;
plik – w przypadku protokołu http domyślny jest index.html, zaś jeśli nie jest dostępny, wyświetlana jest
zawartość katalogu public_html (jeśli prawa dostępu pozwalają na to).
Serwer HTTP z założenia powinien działać bardzo szybko (żeby być w stanie wydajnie obsłużyć jak
największą liczbę klientów), w związku z tym z własnej inicjatywy zrywa połączenie TCP z klientem,
kiedy tylko przekaże mu żądany plik.
Strony domowe udostępniane przez sewer HTTP mogą być statyczne (umieszczone w pliku w stałej
postaci) lub dynamiczne (tworzone na bieżąco na podstawie nie tylko zawartości pliku, ale również
innych danych, np. danych wpisanych przez użytkownika do formularza lub wybranych myszą,
zapisanych w pliku cookie, historii wizyt użytkownika pamiętanej po stronie serwera, bieżącej pory
dnia, adresu IP, spod którego klient zgłosił się, itp.).
Dane przesyłane od klienta do serwera mają postać pojedynczego łańcucha znaków alfanumerycznych,
w którym znaki sterujące są pozamieniane na zwykłe znaki (lub ich sekwencje), na przykład spacje
są zamieniane na +, separatory pól w formularzu na &, a znaki +, & czy % na dwucyfrowe kody
szesnastkowe poprzedzone znakiem %.
Dane mogą być przekazywane do serwera metodą GET (przeznaczoną dla krótkich danych, mniej
bezpieczną, dane są uwidocznione w pasku adresowym przeglądarki) lub metodą POST (dowolne
dane, bezpieczniejsza, dane nie są uwidocznione). Po stronie serwera dane są uzyskiwane ze zmiennej
środowiska QUERY_STRING w przypadku metody GET, zaś z wejścia standardowego w przypadku
metody POST.
Do przetwarzania danych po stronie serwera i generowania dynamicznych stron domowych zostało
zaprojektowanych wiele różnych technologii. Do klasycznych należą:
- SSI (Server-Side Includes) – najstarsza, najmniej bezpieczna, obecnie już nie używana;
- CGI (Common Gateway Interface) – najbardziej uniwersalna (umożliwia użycie dowolnego języka
programowania), średnio bezpieczna, obecnie dość rzadko używana;
- PHP (różne interpretacje skrótu) – szeroko rozpowszechniona, może być wykorzystywana zarówno
jako CGI, jak i (częściej) jako moduł serwera, umożliwia tworzenie wstawek w plikach HTML.