Internet Technology

Portal wiedzy o informatyce
-------------------------------------------------------------------------------------   
                                                     ####
                                      ###           ####        
                                     #####         ####             #####
($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ####### $$$$$ ####  $$$$$$$$  #####  $$$$$$$)
($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ #### #### $$$ #### ## $$$$$  #####  $$$$$$$$$)
($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ #### $ #### $ #### #### $$  #####  $$$$$$$$$$$)
($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ #### $$$ #### #### $ ####  #####  $$$$$$$$$$$$$)
($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ #### $$$$$ ####### $$$ ########  $$$$$$$$$$$$$$$)
                               ####         #####       #####
                              ####           ###         ##

-------------------------------------------------------------------------------------
                
                        ####    #### ####      #### ###########  
                        #  #    #  # #  #  ##  #  # #         #  
                        #  #    #  # #  # #### #  # #  ########
                        #  #    #  # #  ###  ###  # #  #
                        #  ######  # #            # #  ####    
                        #  HACKER  # #   WANABE   # # FAQ #    Version 3.0
                        #  ######  # ##   ####   ## #  ####          2002
                        #  #    #  #  ## ##  ## ##  #  #      
                        ####    ####   ###    ###   ####    


------------------------------------------------------------------------------------

  
                       [... HeLL ain't bad place to be ...]
                                    AC/DC





Spis tresci:
1. Wstep
2. Ogolne pojecia
  2.1 Co to jest adres IP?
  2.2 Co to jest adres domenowy?
  2.3 Jak sprawdzic swoje IP?
  2.4 Jak zamienic adres IP na domenowy i na odwrot?
  2.5 Jak sprawdzic IP rozmowcy z GG?
  2.6 Jak sprawdzic IP osoby wysylajacej e-mail lub post?
  2.7 Jak zmienic swoje IP?
  2.8 Jak wyslac anonimowego e-maila?
  2.9 Jak dziala firewall?
  2.10 Co to jest maskarada (NAT) ?
  2.11 Dlaczego uzywanie trojanow to nie hacking?
  2.12 Jak sprawdzic trase pakietu?
  2.13 Na czym polega sniffing?
  2.14 Jak wykryc sniffer?
  2.15 Co to jest spoofing?
  2.16 Co to jest "unchecked buffer" i "buffer overflow"?
  2.17 Co to jest "kompromitacja" ("compromise") serwera?
  2.18 Co to jest IDS?
  2.19 Co to sa logi?
  2.20 Co to jest skanowanie portow?
  2.21 Na czym polega atak "man in the middle"?
  2.22 Na czym polega atak DoS oraz DDoS?
  2.23 Na czym polega atak typu "brute force"?
  2.24 Jak zlamac haslo konta w Windows 95/98/Me?
  2.25 Co to jest backdoor?
  2.26 Co to jest flooding?
  2.27 Na czym polega audyt?
  2.28 Co to jest DMZ?
  2.29 Co to jest DES, 3DES i AES?
  2.30 Co to jest MD5?
  2.31 Jakie powinno byc dobre haslo?
  2.32 Co to jest SSH?
  2.33 Co to jest tunelowanie portow?  
3. Linux
  3.1 Bezpieczenstwo w Slackware
  3.2 Demony w systemie Linux
    3.2.1  Deficja Demona
    3.2.2  Linux daemon
    3.2.3  Przykladowe demony
    3.2.4  Pozostale demony
    3.2.5 Koniec
  3.3 Pliki .htaccess dla uwierzytelniania HTTP
  3.4 FILTROWANIE PAKIETOW dla maskowania - IP Firewalling
  3.5 Linux - komendy - wersja rozszezona  
  3.6 Master Boot Record - MBR
  3.7 Narzedzia Linuxowe do rozpoznawania sieci
  3.8 Powiadamianie o logowaniach do systemu via sms
  3.9 gzip - kompresor metoda Lempela-Ziva
4. Bazy danych
  4.1 Bezpieczenstwo baz danych
  4.2 Krotkie formy: Prosta autoryzacja PHP+MySQL
  4.3 MySQL - nieoczekiwane dane wejsciowe i ochrona zapytan SQL
5. Programowanie
  5.1 Bash - podstawy programowania
  5.2 Przepelnianie bufora
  5.3 Wywolanie fork() a bezpieczenstwo
    5.3.1 Wstep
    5.3.2 Wywolanie fork()
    5.3.3 Race condition
    5.3.4 Zagrozenia zalezne od wywolania
    5.3.5 Local DoS with fork()
    5.3.6 Wnioski
    5.3.7 Podsumowanie (slowo koncowe ;)
  5.4 Programowanie sieciowe w Linuxie
    5.4.1 PROLOG
    5.4.2 GNIAZDA
    5.4.3 WIAZANIE ADRESOW Z GNIAZDEM
    5.4.4 POLACZENIE Z UTWORZONYM GNIAZDEM
    5.4.5 INTERAKCJA POMIEDZY SERWEREM A KLIENTEM
    5.4.6 EPILOG
  5.5 Skrypt do sprawdzania serwerow Proxy
  5.6 Jezyk WML czyli interek w komorkach
  5.7 Kryptografia - wstep do tematu
6. DOS
  6.1 Komendy DOSowskie
  6.2 Pliki wsadowe
    6.2.1 Programowanie plikow wsadowych ( *.bat )
    6.2.2 Omowienie podstawowych polecen
    6.2.3 Pierwszy program, omowienie dzialania
7. Protokoly
  7.1 SLIP
8. Sieci
  8.1 Routery
9. Przydatne sztuczki
  9.1 Telnet i fakemail
10. Literatura
11. Linki




---------------------------------------------------------------------------------------

1.  Wstep

Witam wszystkich po dosc dlugiej przerwie. No coz takie zycie, ze nie ma czasu na to zeby
robic kilkanascie rzeczy naraz :) A w dodatku czekalem na wszystkie teksty i na razie sie
nie doczekalem, wiec pojawia sie jak cos w numerze 4 :) A w numerze co nowego to sami widzicie
w spisie tresci. Moze nie duzo tego ale sami widzicie - zycie jest ciezkie i czasami zapaowac
nad nim jest trudno :)
Nie przeciagajac dalej wstepu zapraszam do lektury...

CZaR|Ny

---------------------------------------------------------------------------------------

2. Ogolne pojecia by Grzegorz Niemirowski



2.1 Co to jest adres IP?

Adres IP to 32-bitowa liczba identyfikujaca komputer w sieci. Zapisuje sie
ja w postaci dziesietnej, rozdzielajac kazdy bajt kropka. Adres IP nie
moze byc dowolny, poniewaz niektore adresy sa zarezerwowane. Takim adresem
jest np. 127.0.0.1, ktory oznacza lokalny komputer. Czesc adresow jest
wykorzystywana w sieciach lokalnych, sluza one do identyfikowania maszyn
tylko w danej sieci. Sa to tzw. nieroutowalne adresy IP. Naleza one do
klas 10.0.0.0, 172.16.0.0-172.31.0.0 i 192.168.0.1 Dodatkowe adresy moga
byc przypisane do interfejsow sieciowych komputera. Np. z modemem moze byc
powiazany adres 213.78.43.135, a z karta sieciowa 192.168.0.5. Adres IP
moze byc przypisany statycznie w ustawieniach systemu operacyjnego, badz
przyznawany dynamicznie z serwera za pomoca protokolu DHCP. Adresy IP moga
tez sluzyc do adresowania sieci.

2.2 Co to jest adres domenowy?

Adres IP jest niewygodny do zapamietywania i poslugiwania sie nim przez
ludzi. Dlatego powstal DNS - system nazw domenowych. Nie ma jakiegos
sposobu przeliczania adresu IP na adres domenowy albo na odwrot. Czasami
tylko spotyka sie sytuacje, ze czesc adresu IP jest zawarta w adresie
domenowym. Taka sytuacja wystepuje np. w adresach nadawanych przez tpsa
podczas polaczenia modemowego. Adesy te sa ze soba skojarzone w bazach
danych serwerow DNS. Aby komputer polaczyl sie z drugim komputerem,
potrzebny jest adres IP. Dlatego gdy znany jest tylko adres domenowy,
wysylane jest zapytanie do serwera DNS o odpowiadajacy adres IP. Np. po
wpisaniu adresu serwera WWW do przegladarki, komputer laczy sie na porcie
53 z serwerm DNS, pobiera adres IP i dopiero laczy sie z serwerm WWW. Gdy
nastepnym razem wpiszemy ten sam adres, komputer nie bedzie juz sie laczyc
z serwerm DNS, tylko pobierze adres IP z pamieci podrecznej (DNS cache).
Adresy IP mozna na stale skojarzyc z adresem domenowym. W systemach
WinNT/2k/XP dokonujemy tego w pliku Windows\system32\drivers\etc\hosts, w
Windows 9x/Me w Windows\hosts, a pod Linuksem w pliku /etc/hosts.

2.3 Jak sprawdzic swoje IP?

W systemie Windows sluzy do tego polecenie ipconfig. Niektore Windowsy
maja tez okienkowy program winipcfg.exe. W systemie Linux do sprawdzenia
IP mozemy uzyc programu /sbin/ifconfig. Mozna tez wejsc na jakas strone,
ktora pokazuje IP, np. www.grzegorz.net

2.4 Jak zamienic adres IP na domenowy i na odwrot?

Mozna np. poleceniem ping. Jesli mamy IP, wywolujemy ping z parametrem -a
przed adresem IP, np. ping -a 192.168.4.23 Gdy mamy adres domenowy,
podajemy po prostu sam adres: ping -a onet.pl Do dyspozycji jest tez
program nslookup. Komputer moze miec kilka adresow domenowych. Mozemy np.
zamienic adres domenowy na IP, IP na domenowy i uzyskamy inny adres
domenowy niz na poczatku. Jednak kolejna zamiana adresu na IP da to samo
IP. Pod Linuksem mamy komende host.

2.5 Jak sprawdzic IP rozmowcy z GG?

Sprawdzenie IP rozmowcy z GG jest mozliwe dzieki temu, ze serwer wysyla do
nas IP naszego rozmowcy, abysmy mogli wyslac mu plik. Wysylane pliki nie
ida przez serwer GG, dlatego nasz komputer musi sam sie polaczyc z
komputerem rozmowcy i potrzebne mu jest IP. Poniewaz wysylanie do nas IP
jest zwiazane z przesylaniem plikow, nie zawsze je otrzymamy. Nie uzyskamy
go, gdy dana osoba nie ma nas w kontaktach, nie korzysta z polaczen
bezposrednich (p2p) albo jest za NAT-em. Gdy mamy szczescie, mozemy
przechwycic pakiet z adresem. Mozna to zrobic snifferem. Wygodniej jest
jednak skorystac z gotowego programu, np. PowerGG ze strony
www.powergg.prv.pl

2.6 Jak sprawdzic IP osoby wysylajacej e-mail lub post?

Nalezy zajrzec do naglowkow wiadomosci. W OE sluzy do tego kombinacja
klawiszy Ctrl+F3. W mailu szukamy tam ostatniego naglowka Received, a w
poscie naglowka NNTP-PostingHost lub X-Trace. Bedzie tam adres IP albo domenowy
nadawcy, w prypadku X-Trace tylko IP.

2.7 Jak zmienic swoje IP?

Wchodzimy w opcje IP i zmieniamy :) Nalezy jednak wiedziec, jakie to moze
miec konsekwencje, mozemy odciac sie od sieci. Przeciez reszta urzadzen
sieciowych (routery, switche) nie bedzie wiedziec o naszej zmianie.
Dotyczy to szczegolnie urzadzen naszego ISP w sieci rozleglej. Zeby byc
widocznym pod innym IP, mozemy skorzystac tez z serwera proxy.

2.8 Jak wyslac anonimowego e-maila?

Nalezy znalezc serwer SMTP open-relay, ktory pozwoli wyslac e-mail z
dowolnym adresem nadawcy, oraz jednoczesnie nie dopisze naszego adresu IP.
Serwer taki jest dosyc strudno znalezc.

2.9 Jak dziala firewall?

Firewall przepuszcza lub odrzuca pakietu na podstawie zdefiniowanych
regul, takich jak protokol, adres nadawcy, adres odbiorcy, port zrodlowy,
port docelowy, czas itp. Sluzy do ochrony sieci. Np. niektore uslugi,
takie jak np. udostepnianie folderow powinny byc dostepne tylko z sieci
lokalnej. Mozna za jego pmoca ograniczyc wykorzystanie przez uzytkownikow
sieci niektorych programow. Chroni tez przed trojanami. Firewall moze byc
programowy lub sprzetowy.

2.10 Co to jest maskarada (NAT) ?

Jest to tlumaczenie adresow komputerow w sieci lokalnej na adres
publiczny. Z maskarady korzysta sie, gdy jeden komputer udostepnia
polaczenie internetowe innym komputerom z LAN-u. Gdy dostajemy od naszego
ISP pule adresow, mozemy je nadac naszym komputerow, ale gdy mamy tylko
jeden, potrzebny jest NAT. Gdy komputer z LAN-u chce polaczyc sie z
komputerem w Internecie, laczy sie z komputerem-bramka. Bramka w
przesylanym pakiecie zmienia adres nadawcy z adresu komputera na swoj. Tym
samym wysyla pakiet komputeraz z LAN-u jako swoj. Bramka zapamietuje to, i
gdy przyjdzie pakiet z serwera, przesyla go do odpowiedniego komputera w
LAN-ie. Komputery w LAN-ie maja dostep do Internetu, jednak do nich
dostepu z zewnatrz nie ma. Programy pod Windows przeprowadzajace
translacje adresow to WinRoute, WinGate, ISA Server oraz Internet
Connection Sharing (ICS), ktory wbudowany jest w Win98Se/Me/2k/XP. Bramka
moze byc takze router.

2.11 Dlaczego uzywanie trojanow to nie hacking?

Poniewaz nie wymaga prawie zadnej wiedzy i najczesciej sluzy do wyrzycia
sie na kumplach.

2.12 Jak sprawdzic trase pakietu?

W Windows jest polecenie tracert, w Linuksie traceroute.

2.13 Na czym polega sniffing?

Polega na przechwytywaniu pakietow, nawet tych, ktore nie sa adresowane do
komputera, na ktorym dziala sniffer. Sniffer jest programem, ktory zmienia
tryb pracy wybranego interfejsu sieciowego na "promiscuous" (doslownie
"rozwiazly :) ). Dzieki temu moze przechwytywac i analizowac wszelkie
pakiety docierajace do danego interfejsu sieciowego. Mozliwe jest to
dzieki temu, ze w wielu sieciach pakiet dociera do wielu komputerow. Kazdy
z nich porownuje docelowy adres IP w pakiecie ze swoim i jesli sa takie
same, analizuje go. Sniffing mozna wiec wykorzystac do podsluchu i np.
przechwycenia hasla i innych danych. Sniffery sa tez nazywane
analizatorami sieciowymi, poniewaz sa niezastapionym narzedziem
administracyjnym przy zarzadzaniu i usuwaniu problemow z siecia. Sniffing
jest mocno utrudniony w sieciach przelaczanych, poniewaz do nas dochodza
zazwyczaj tylko "nasze" pakiety. Stosujac jednak rozne techniki, mozna
zmusic switche i inne urzadzenia sieciowe do zmiany trasy pakietow i
skierowac je do nas. Aby korzystac ze snifferow pod Windows, potrzebne sa
biblioteki WinPcap. Popularne sniffery dla Windows to: Ethereal, WinDump,
daSniff, iRis. Pod Linuksa np. tcpdump.

2.14 Jak wykryc sniffer?

Pod Windows mozna uzyc progamu PromiscDetect do sprawdzenia, czy ktoryc z
interfejsow sieciowych nie pracuje w trybie promiscuous, co moze swiadczyc
o istnieniu sniffera. Uzywajac programu L0pht AntiSniff mozna wykryc
sniffer w sieci. Sam sniffer pracuje biernie, ale moze umozliwic innym
programom czynnosci, ktorych nie moglbyby wykonac bez sniffera. Dlatego
jest pewna mozliwosc wykrycia go.

2.15 Co to jest spoofing?

Jest to inaczej podszywanie. Polega na falszowaniu adresu IP nadawcy w
pakietach, ew. adresow MAC lub tez certyfikatow.

2.16 Co to jest "unchecked buffer" i "buffer overflow"?

Unchecked buffer jest to blad w programie polegajacy na zarezerwowaniu
zbyt malej ilosci pamieci dla nadchodzacych danych. Moze zostac
wykorzystany do przeprowadzenia ataku buffer overflow, czyli przepelnienia
bufora. Wysylamy zbyt duza ilosc danych, dodajac kod maszynowy, ktory
wykona jakas czynnosc, np. da nam dostep do shella. Program odbierajac
dane "pojdzie w kosmos" i zostanie wykonany wyslany przez nas kod
maszynowy. Odbedzie sie to z uprawnieniami konta, na ktorym dziala proces
odbierajacy dane. Mozemy w ten sposob uzyskac prawa roota (UNIX) lub LOCAL
SYSTEM (WinNT). Dlatego daemony/uslugi nie powinny pracowac ze zbyt
wysokimi prawami.

2.17 Co to jest "kompromitacja" ("compromise") serwera?

Jest to wlamanie, przelamanie zabezpieczen systemu.

2.18 Co to jest IDS?

IDS to skrot od Intrusion Detection System. Jest to program analizujacy
ruch sieciowy i wykrywajacy ataki na podstawie bazy sygnatur atakow.
Sygnatury to dane identyfikujace dane ataki. Jest to bardzo podobne do
sygnatur wirusow w programach antywirusowych.

2.19 Co to sa logi?

Sa to pliki, w ktorych sa zapisywane zdarzenia zachodzace w systemie.
Dzieki nim mozna wykryc bledy w konfiguracji, ataki oraz nadzorowac
wykorzystanie komputera. Skasowanie logow jest jedna z pierwszych
czynnosci wykonywanych przez wlamywacza w celu pozostania niewykrytym.
Czesto logi sa skladowane na wydzielonej maszynie, np. przez proces
syslogd.

2.20 Co to jest skanowanie portow?

W najprostrzym przypadku sa to proby polaczenia sie na kolejne porty na
danym komputerze w celu sprawdzenia, jakie uslugi sa na nim aktywne.
Dzieki temu wiemy co mozna wykorzystac do wlamania. Bardziej zaawansowane
skanowanie polega na automatycznym przeprowadzaniu atakow na otwartych
portach. Sprawdzanie, ktore porty sa otwarte moze sie odbywac w rozny
sposob, aby ukryc fakt skanowania przed adminem, np. half-open scan,
stealth scan. Skanowanie half-open scan to np. SYN scan, a stealth scan to
SYN|ACK scan, FIN scan, NULL scan, XMAS scan, YMAS scan i ACK scan. Mozna
tez skanowac porty w przypadkowej kolejnosci, lub tez bardzo wolno, aby
nie wzbudzic podejrzen. Mozna tez przeprowadzic decoy scan, czyli
wysylanie mnostwa pakietow ze sfalszowanym IP nadawcy, a miedzy nimi nasze
pakiety skanujace, tak aby admin nie wiedzial kto skanuje.
Najpopularniejszy skaner to nmap, dostepny pod Windows i Linuksa.

2.21 Na czym polega atak "man in the middle"?

Polega on na tym, ze nasz komputer posredniczy w transmisji miedzy dwoma
innymi komputerami. Mozna dzieki temu przejac sesje.

2.22 Na czym polega atak DoS oraz DDoS?

Dos to "Denial od Service". Oznacza odmowe uslugi dla osob uprawnionych.
Mozna np. nawiazac z serwerem tak wiele polaczen, ze nie bedzie mogl
pracowac normalnie. Taki atak trudno przeprowadzic z jednego miejsca.
Dlatego czesto uzywa sie DDoS - Distributed Denial of Service. Atak
nastepuje z wielu miejsc na raz. Ale skad wziac tysiac komputerow?
Wykorzysje sie do tego np. robaki, ktore daja nam kontole nad wieloma
komputerami i pozwalaja na przeprowadzenie DDoS.

2.23 Na czym polega atak typu "brute force"?

Atak ten najczesciej jest przeprowadzany na hasla. Gdy mamy zaszyfrowane
haslo szyfrem jednostronnym, towrzymy wszystkie mozliwe kombinacje znakow
z jakiegos przedzialu, szyfrujemy je i porownujemy z zaszyfrowanym haslem.
Sposob ten jest w 100% skuteczny, jednak bardzo czasochlonny. Poza tym,
jesli w ten sposob chcemy zlamac haslo do serwera np. POP3 lub telnetu, po
kilku nieudanych probach polaczenie moze zostac zerwane, lub tez konto
zostanie zablokowane (jest to tez pewien rodzaj ataku DoS).

2.24 Jak zlamac haslo konta w Windows 95/98/Me?

A po co lamac? Przeciez i tak mozna wejsc.

A jak zlamac haslo do udostepnionych zasobow w Windows 95/98/Me?

O ile nie zainstalowano poprawki Q273991, mozna uzyc programu PQwak2 lub
R3x.

A jesli zastosowano?

Pozostaje brute-force lub wykorzystanie null-session i bledow w
konfiguracji.

A co z haslami do udostepnionych zasobow w WinNT/2k/XP

jak wyzej

Jak zlamac haslo konta WinNT/2k/XP?

Uruchomic Linuksa, wziac plik SAM i rozkodowac. Potrwa to w zaleznosci od
uzytego algorytmu szyfrujacego.

A pod Linuksem?

Jak wyzej, tylko zamiast Linuksa uruchamiamy Windows. No dobra, nie musi
byc Windows... W poprzednim punkcje nie musi byc Linuks :) Chodzi o
uruchominie drugiego systemu, zeby moc skopiowac plik z haslami.

2.25 Co to jest backdoor?

Jest to furtka pozostawiona w systemie przez wlamywacza, aby nastepnym
razem miec latwy dostep.

2.26 Co to jest flooding?

Jest to "zalewanie" duza iloscia pakietow w krotkim czasie. Mozna dzieki
niemu zawiesic zdalny komputer, albo tez uzywajac klawiatury i funkcji
Kopiuj-Wklej, denerwowac ludzi na czatach :)

2.27 Na czym polega audyt?

Jest to proces sprawdzenia bezpieczenstwa danego systemu
teleinformatycznego pod katem bezpieczenstwa. Jest wykonywawany przez
zewnetrzne, wyspecjalizowane firmy. Polega na przeprowadzeniu testow
penetracyjnych sieci i symulacji dzialan wlamywacza.

2.28 Co to jest DMZ?

DMZ to skrot od "DeMilitarized Zone" czyli "Streda Zdemilitaryzowana".
Jest to wydzielona czesc sieci, o obnizonym bezpieczenstwie, w ktorej
dzialaja maszyny udostepniajace uslugi publiczne, np. WWW. Maszyny na
ktorych sa logi systemowe, backup itp. sa poza ta strefa, moga tez byc
dodatkowo w strefie o podwyzszonym bezpieczenstwie.

2.29 Co to jest DES, 3DES i AES?

Sa to algorytmy kryptograficzne wykorzystywane do szyfrowania m.in. hasel.

2.30 Co to jest MD5?

Jest to jednostronny skrot kryptograficzny, pozwalajacy sprawdzic
integralnosc danych. Jest tez wykorzystywany przy uwierzytelnianiu. Przy
ustawianiu hasla tworzony jest jego skrot (hash) i zapisywany w bazie
hasel. Podczas uwierzytelniania haslo uzytkownika rowniez jest kodowane i
porownywane z hashem przechowywanym w bazie. hashe nie sa rozkodowywane,
jest to z reszta niewykonalne, haslo mozna zlamac tylko metoda brute
force, kodujac po kolei wszystkie mozliwe kombinacje i porownujac je z
hashem.

2.31 Jakie powinno byc dobre haslo?

Male i duze litery, cyfry, rozne znaki dostepne z klawiatury, co najmniej
8 znakow. Nie moze to byc zadne slowo ani skrot. Tym bardziej data urodzin
itp. Jesli jest to mozliwe, mozna korzystac ze znakow niedrukowalnych.
Przyklad: Y(s:_]%^dN3$u)c

2.32 Co to jest SSH?

SSH to protokol kryptograficzny, obecnie wykorzystywany w wersji 2.
Pozwala na zdalna prace na serwerze, analogicznie jak telnet, ale znacznie
bezpieczniej. Umozliwia tez tunelowanie porow (port forwarding). Programy
do SSH sa bardzo dobrze rozwiniete na platformie uniksowej. Pod Windows
jest gorzej. Na Windows zostalo przeniesione OpenSSH, jednak jest z nim
troche problemow. Nie korzysta automatycznie z kont systemowych, klient
czasami nie chce sie uruchomic, polecenie whoami pokazuje local system, sa
klopoty z powloka. OpenSSH jest darmowe. Mozemy skorzystac z komeryjnego
programu VShell firmy VanDyke, serwer ten nie ma takich problemow, jednak
nie chce z nim dzialac PuTTY, popularny klient SSH. Cala nadzieja wiec w
OpenSSH, moze zostanie niedlugo dostosowane do Windowsa. Opisane tu
serwery SSH mozna zainstalowac tylko pod WinNT/2k/XP.

2.33 Co to jest tunelowanie portow?

Jest to bardzo ciekawa funkcja udostepniana przez SSH. Podczas normalnej
sesj moga byc przesylane dodatkowe dane, oczywiscie w postaci
zaszyfrowanej. Mozemy dzieki temy zrobic bezpieczny kanal transmisyjny,
zabezpieczajac sie przed podsluchem. Dzieki tunelowaniu portow mozemy tez
np. postawic serwer WWW na komputerze, ktory jest za NAT-em. Tam gdzie
jest serwer WWW, odpalamy klienta SSH, a tam gdzie bramka, serwer SSH.
Oczywiscie ustawiamy forwardowanie portow. Sewer SSH otworzy na bramce
port 80. Dane przychodzace na port 80 na komputer-bramke zostana
zaszyfrowane, przeslane do klienta, ktory jes odszyfruje i wysle do
serwera WWW. Jest to lokalne forwardowanie portow. Przy zdalnym
forwardowaniu, to klient otwiera dany port. Np. program pocztowy laczy sie
z lokalna maszyna na porcie 110 otwartym przez klienta SSH. Serwer SSH
laczy sie na port 110 serwera pocztowego. W ten sposob mozna zrobic
bezpieczne odbieranie poczty. Analogicznie mozna zrobic z portem 25 aby
bezpiecznie wysylac.

-----------------------------------------------------------------------------------

3. Linux

3.1 Bezpieczenstwo w Slackware by CZaR|Ny

Co nalezy zrobic aby troche poprawic bezpieczenstwo Slackware? Zacznijmy od podstawowych
spraw. Pierwsza to taka zeby sie zdecydowac czy to ma byc stacja robocza czy serwer, bo jesli
serwer to niestety ale Xy (czyli gnome i KDE) odpadaja, bo po pierwsze przez nei maszyna staje
sie wolniejsza, a do tego sa troche dziurawe i raczej zmniejszaja bezpieczenstwo systemu.
Druga sprawa to firewall oparty na regolach czyli ipchains (to dla jader 2.2.xx) albo iptables
(to dla nowszych jader z serii 2.4.xx), ale jak zajac sie iptablesami nie bede opisywal, bo to
znajdziecie w poprzednich numerach HWF.
No a na sam koniec konieczna wrecz sprawa jest sledzenie bugtrackow zeby wiedziec jakie dziury
zostaly wykryte ostatnimi czasami i czy sa juz na nie laty, bo jesli tak to nalezy sie w nie
zaopatrzyc i wkompilowac w jaderko.
No to takie 3 sprawy najwazniejsze na sam poczatek, a teraz zajmiemy sie dalej tematem, czyli
ktore pliczki nas interesuja i nalezy je lekko zmodyfikowac, aby nasz Linuks nie byl zbyt latwym
kaskiem dla ludzi z zewnatrz. No to przygotujcie sie do zabezpieczania systemu ;)
Zaczynamy zabawe.

Pierwsza sprawa to szybszy dostep do logow systemowych, ktore mozemy wyswietlac na 12 konsoli, a
to w tym celu, zeby za kazdym razem jak musimy cos sprawdzic nie dokopywac sie do pliczku, ktory
znajduje sie w katalogu /var/log/messages. No to teraz trzeba znalezc pliczek syslog.conf, a wiec
wchodzimy do katalogu /etc i szukamy tam tego pliczku. No jak znalezlismy go w tej sciezce:
/etc/syslog.conf
to edytujemy go w pico lub jakims innym edytorku - moze byc nawet w MC (czyt. Midnight Commander -
czyli cos w rodzaju Windowsowskiego Norton Commandera), edytujemy pliczek wciskajac F4 i na samym
koncu pliczku dopisujemy taka linijke:

*.* /dev/tty12

Zapisujemy zmiany i na sam koniec wykonujemy polecenie:

killall -HUP syslogd

No a teraz wystarczy wcisnac alt+F12 i oto widac nasze logi wyswietlone na 12 konsoli :)

Dobra - logi juz sa, wiec teraz dalej. Standardowo mamy odpalone 6 konsolek (a tak naprawde to 7,
tylko ta ostatnia jest przeznaczona na srodowisko graficzne, czyli Xy). Nam jednak przydaloby sie
tych konsolek wiecej bo czasami to bardzo pomaga w pracy - wiec uruchomimy sobie konsolki od 8 do
11, a 12 konsole zostawiamy z wiadomych przyczyn i nic dla niej nei zmieniamy. Szukamy i edytujemy
w tym celu pliczek: /etc/inittab i szukamy wpisow odnoszacych sie do konsoli i zaraz po nich
dodajemy nastepujace wpisy:

c8:1235:respawn:/sbin/agetty 38400 tty8 linux
c9:1235:respawn:/sbin/agetty 38400 tty9 linux
c10:1235:respawn:/sbin/agetty 38400 tty10 linux
c11:1235:respawn:/sbin/agetty 38400 tty11 linux

No i zapisujemy pliczek, ale to jeszcze nie wszytko bo musimy jeszcze edytowac pliczek: /etc/securetty
i dokonac w nim paru wpisow po to zeby root mogl sie takze zalogowac na nowo uruchomione konsole.
Wiec w pliczku securetty dopisujemy:

tty8
tty9
tty10
tty11

No i juz mamy wszystko zrobione. Teraz tylko nalezy zrestartowac init'a komenda:

killall -HUP init

No i dzieki temu mamy teraz w systemie o 4 konsole wiecej co powinno ulatwic prace.


Kolejna sprawa to edycja pliczkow host.deny i host.allow znajdujacych sie w katalogu /etc i
dopisanie w nich ponizszych linijek:
w pliku host.deny wpisujemy

ALL:ALL@ALL, PARANOID

co nie pozwoli nikomu niepowolanemu z zewnatrz zalogowac sie do nas na maszyne. A w pliczku host.allow
wpisujemy regole:

ALL:xxx.xxx.xxx.xxx

gdzie xxx.xxx.xxx.xxx to jest numer IP komputera, ktory moze sie zalogowac na nasza maszyne. Mozemy w nim
tez udostepniac uslugi, ale wiecej info w manualach.

No i to juz prawie koniec podstawowoego zabezpieczenia systemu. Jeszcze zostaja 2 rzeczy do zrobienia.
No wiec tak, teraz nalezy edytowac plik inetd.conf ktory jest w katalogu /etc i tam mamy takie opcje jak:

         echo
         time
         ftp
         telnet
         comsat
         ntalk
         pop3
         imap2
         finger

no i tak dalej. Sa one odhaszowane i teraz nalezy sie zastanowic nad tym co nam bedzie potrzebne, bo jesli
nic to zahaszujemy wszystko. BTW hasz to jest ten znaczek # to tak dla tych, ktorzy nie wiedza. No i tak -
na pewno przydaloby sie zachaszowac echo, time, telnet, comsta, ntalk, imap2, swat bo nie sa zbyt potrzebne
w naszym systemie a na pewno dzieki nim nasz Linuks nie jest zbyt bezpieczny. Wiec zabieramy sie za haszowanie
- na sam poczatek najlepiej wszystkie odchaszowane uslugi - potem jak cos bedzie sie instalowac w przyszlosci
np. serwer FTP, czy poczte to wtedy mozna odhaszowac to co jest nam potrzebne, a na razie wypadaloby sie zabrac
za to, bo nasz system jest wtedy za bardzo otwarty na swiat, a ludzi czekajacych na takie serwery nie brakuje.
Na koniec oczywiscie trzeba wykonac polecenie:

killall -HUP inetd

Dobra jak juz zahaszowalismy wszystko to wypadaloby sie zabrac za ostatnia rzecz - suidy. Sciaganie suidow to
bardzo przydatna sprawa jesli chodzi o bezpieczenstwo - zabezpiecza to serwer (czy stacje robocza) przed userami,
ktorzy moga dzieki tamu przejac uprawnienia super usera na naszym systemie - a potem to chyba nie trzeba mowic
co sie moze dziac :)
Wiec najpierw nalezy utowrzyc pliczki do ktorych zostanie zapisana lista pliczkow. Wiec wydajemy polecenie:

find / -perm +4000 >> 4000 ; find / -perm +6000 >> 6000

i czekamy. Za chwilke powinnismy miec 2 pliczki 4000 i 6000 z lista plikow z suidami.
Wygladaja one mniej wiecej tak:

/usr/bin/at
/usr/bin/newgrp
/usr/bin/ssh
/usr/bin/rlogin

i tak dalej. Teraz przydaloby sie zastanowic z ktorych pliczkow posciagac suidy. Na pewno
trzeba sie pozbyc suidow z wiekszosci, ale nie nalezy sciagac SUIDa z nastepujacych programow:

/bin/login
/bin/su
/usr/bin/passwd
/usr/bin/procmail

No i teraz na koniec wystarczy nadajemy pliczka prawa:

chmod 777 4000
chmod 777 6000

I zostaje nam juz tylko ich odpalenie:

./4000
./6000

No i juz mamy w miare bezpieczny system. I to juz powinno byc koniec podstawowego zabezpieczania, ale
jak mamy serwer to zostaje jeszcze jedna wazna sprawa - mamy kilku uzytkownikow, ktorzy korzystaja z naszego
serwera, ale zeby w tym przypadku zwiekszyc bezpieczenstwo i zmniejszyc mozliwosc zlamania hasla nalezy w pliku
/etc/login.defs i szukamy linijki PASS_MIN_LEN. Jesli nie ma na koncu zadnej wartosci to samemu trzeba ustwic
minimalna dlugosc hasla - najlepiej ustawic minimalna dlugosc haselka na 8 znakow.
A wiec na samym koncu tej linii wpisujemy to co mamy wpisac i bedzie ona po modyfikacji wygladac tak:

PASS_MIN_LEN 8

Zapisujemy pliczek i juz mozemy byc czesciowo pewni ze nasz system jest bezpieczniejszy i byle kto sie nam nie wlamie
na maszyne, ale jakby ktos chcial to i tak to zrobi :)

No to na razie tyle jesli chodzi o zabezpieczanie - milej zabawy i pamietajcie NIE ZNACIE DNIA ANI GODZINY, wiec lepiej
sie zabezpieczyc wczesniej niz pozniej rwac wlosy z glowy, ze nie mozemy sie zalogowac na ROOTa ;)




3.2 Demony w systemie Linux by rafal[eR]

  3.2.1  Deficja Demona

Otwieramy slownik wyrazow obcych i czytamy:
W mitologii greckiej: duch zly albo dobry <jakby moglo byc inaczej;>  wywierajacy
wplyw na losy czlowieka; przen. czlowiek niezwykly, wykazujacy w czyms niesamowita
energie, sile, talent itp. O taka krotka notke mozemy ujrzec w wydawnictwach PWN =]
czym tak naprawde jest demon w systemie Linux postaram sie odpowiedziec w ponizszym faq.

  3.2.2  Linux daemon

Demon to program dzialajacy w tle, ktory ma za zadanie wykonywac pewne zadania
zwiazane z funkcjonowaniem systemu. Zazwyczaj zadania te polegaja na obsludze innych
programow ktore te z kolei prosza o dostarczenie pewnych informacji zawartych w systemie,
badz tez nawiazanie lacznosci miedzy oddzielnymi segmentami tej samej sieci (talkd sluzacy
do porozumiewania sie uzytkownikow w systemie) lub tez do nawiazania polaczenia pomiedzy
oddzielnymi maszynami (telnetd). Zazwyczaj pliki konfiguracyjne demonow znajdujemy w
katalogu /etc pliki takie odpowiednio skonfigurowane moga przyspozyc duzo problemow
potencjalnemu wlamywaczowi, takim przykladem moze moze byc plik syslog.conf jezeli ma
ustawione przenoszenie logow na maszyne polaczona portem RS-232 to potencjalny haker wdepnal
w ladna soczysta kupe. Poniewaz maszyna taka nie posiada adresu IP co wiaze sie z duzymi
problemami =]. Obecnie znaczna czesc dystrybucji Linuxa konfiguruje swoje demony podczas
instalcji ma to oczywiste wady i zalety, zalety sa takie ze osoba nie obeznana w demonologii
ma szanse zainstalowac system, wady natomiast sa takie ze konfiguracja taka czesto jest nie
wystarczajaca dla zapewnienia odpowiedniego bezpieczenstwa systemu i staje sie latwym
potencjalnym celem (patrz telnetd). Demony sa zazwyczaj uruchamiane automatycznie poprzez:
    
    - skrypt rc.d inicjuje demona podczas startu systemu
    - init inicjuje demona podczas startu systemu
    - demona wywoluje inetd
    
inetd to taki fajny demon monitorujacy okreslone porty, nasluchujacy na ewentualne zadania
dostepu do uslug sieciowych. Jezeli chcemy aby demon pelnil kontrole na inetd do pliku
/etc/inetd.conf dodajemy linie o formacie:

usluga      typ_gniazda      protokol     czas       uzytkownik    program     argument

usluga - definicja pliku /etc/services
typ_gniazda - parametr: seqpacket, dgram, stream, raw, rdm,
protokol - srodowisko jakiego uzywa program: tcp, udp, definicje z pliku /etc/services
czas - zmienna: wait lub nowait
uzytkownik - nazwa uzytkownika na ktorego koncia dziala demon
program - sciezka do pliku ktory powinien zostac uruchomiony
argumenty - argumenty inicjowanego programu

  3.2.3  Przykladowe demony.

ftpd - serwer protokolu FTP zwykle wywolywany przez inetd. Ktory posluguje sie demonem
tcpd. W celu inicjacji ftpd  do pliku /etc/inetd.conf dodajemy nastepujaca sciezke:
#
ftp    stream  tcp     nowait  root    /usr/sbin/tcpd in.ftpd -l -i -a
#
Parametry:
-l Rejestruje informacje o kazdej sesji ftp w dzienniku systemowym
-i Rejestruje wszystkie otrzymane pliki
-a Wlacza korzystanie z pliku konfiguracyjnego ftpaccess

lpd - demon zwykle wywolywany przez skrypt rc.d zajmuje sie usluga buforowania
konketnych plikow i samym ich drukowaniem. Proces pierwszy w kolejnosci oczekuje
tylko na zadanie, otrzymane zadanie rozwidla sie i tworzy procesy potomne.

named - internetowy serwer nazw domenowych. Ma za zadanie przeksztalcac nazwy hostow na
adresy IP. Plik konfiguracyjny /etc/named.conf

pppd - demon protokolu ppp

klogd - demon rejestrujacy komunikaty jadra. Inicjowany przez init widoczny jako proces

fingerd - zwraca informacje o okreslonym uzytkowniku lub systemie. Domon zwykle wywolywany
przez inetd ktory posluguje sie demonem tcpd w celu kontrolowania dostepu do uslug
i rejestrowania komunikatow. Linia pliku /etc/inetd.conf z ta usluga wyglada tak:
#
finger stream  tcp     nowait  nobody  /usr/sbin/tcpd  in.fingerd -u
#
Parametry:
-u Odrzuca wszystkie zadania w postaci "finger @host"
-l rejestruje zadania dostepu

syslogd - program syslogd umozliwia rejestrowanie zdarzen i przechwytywanie komunikatow
jadra. Rejestrowanie moze sie odbywac lokalnie badz zdalnie. syslogd inicjowany jest
podczas startu systemu przez jeden ze skryptow rc.d.
Parametry:
-d Tryb diagnostyczny
-f plik_konfiguracyjny Okresla nazwe alternatywnego pliku konfiguracyjnego
-l lista_hostow Definiuje hosty, ktore powinny byc oznaczone w dzienniku tylko
    nazwa hosta, a nie pelna nazwa domenowa.
-n nie przenosi sie automatycznie w tlo
-p gniazdo Okresla inne gniazdo domeny Unixowej niz /dev/log
-v wyswietla informacje o wersji i konczy dzialanie

  3.2.4  Pozostale demony

erd - obsluguje zadanie finger
gated - obsluguje trasowanie sieci
gdc - steruje programem gated
rexecd - zdalne wykonywanie polecen
rlogin - zdalne sterowanie
tftpd - obsluguje zadania protokolu tftp
talkd - komunikacja miedzy dwoma uzytkownikami
mounted - demon montowania NFS
imapd - dostep do zdalnej poczty
rcmd - zdalne wykonywanie polecen
rshd - zdalne wykonywanie polecen
rwhod - obsluguje polecenie rwho / ruptime
yppaswdd - zmienia haslo

  3.2.5 Koniec

Mam nadzieje ze ten tekst choc w malym stopniu przyblizy wam zagadnienie demonologii.



3.3 Pliki .htaccess dla uwierzytelniania HTTP by CZaR|Ny

Zajmiemy sie tu opisem ograniczenia dostepu do pewnych katalogow WWW, do ktorych
dostep bedzie mial tylko wlasciciel. Do konfiguracji serwera aby zastosowac pliki
.htaccess, nalezy uzyc dyrektyw AllowOverride i AccessFileName.
Przyklad konfiguracji uwierzytelniania HTTP. Ponizsze dyrektywy powinny zostac
umieszczone w httpd.conf, dzieki czemu pliki .htaccess beda dzialaly. Dyrektywa
AllowOverride steruje opcjami, ktore .htaccess moze ignorowac.

AllowOverride AuthConfig

Aby okreslic, ze plik o nazwie .htaccess zarzadza dostepem do plikow, nalezy uzyc
dyrektywy AccessFileName:

AccessFileName .htaccess

Jesli stosowany jest .htaccess, plik ten nigdy nie powinien byc serwowany przez serwer,
dlatego ze zawiera pewne info na temat konfiguracji serwera. Dlatego trzeba skonfigurowac
serwer poprzez uzycie dyrektywy Files, aby nikomu nie dostarczal pliku .htaccess

<Files .htaccess>
Order allow,deny
Deny from all
</Files>

Aby zapobiec innym uzytkownikom na to zeby mogli dowiedziec sie gdzie znajduje sie plik
z haslami do HTTP nalezy utworzyc nowy plik hasel HTTP

htpasswd -c htpasswd.private ziomal

Gdzie ziomal to bedzie Twoj login

Uzytkownikow dodaje sie w nastepujacy sposob:

htpasswd htpasswd.private ktos  

Bezpieczne zastosowanie plikow httpd.conf do uwierzytelniania HTTP

Do pliku httpd.confdodajemy cos takiego:

<Directory /usr/local/apache/htdocs/my_private_dir>
AuthType        Basic
AuthName        "My Directory"
AuthUserFile    /usr/local/apache/misc/my_private_dir.htpasswd
Require         valid-user
</directory>

Gdy tylko bedziemy chcieli przegladnac URL http://localhost/my_private_dir/ to zostaniemy
poproszenie o login i haslo. Opis ten dziala i pod systemami z rodziny Unixow jak i pod
Windowsami, na ktorych mamy postawione serwery WWW.
Przydaje sie to w wielu przypadkach, kiedy robimy jakis projekt i chcemy miec do niego
dostep, a nie chcemy aby ktos nam go przegladal. Ogolnie bardzo przydatna sprawa.



3.4 FILTROWANIE PAKIETOW dla maskowania - IP Firewalling by Fastman00

Tekst jest dla tych, dla ktorych manual i help to nie wszystko :) Wiec od poczatku:

FILTROWANIE PAKIETOW dla maskowania - IP Firewalling

Filtrowanie pakietow pozwala na zabezpieczenie systemu przed niepowolanym dostepem z sieci, poprzez wlasnie filtrowanie
pakietow :) Ip firewalling wykorzystuje w tym celu trzy podstawowe reguly:

a) regula wejsciowa (filtrowanie pakietow przychodzacych; parametr -I)
b) regula wyjsciowa (filtrowanie pakietow wychodzacych; parametr -O)
c) regula przekazywania (filtrwanie pakietow przekazywanych dalej; parametr -F)
Bardzo dobrze jest to omowione w NET-3 HOWTO:
"Reguly filtrowania pakietow przychodzacych dotycza pakietow otrzymanych przez urzadzenie sieciowe. Reguly filtrowania
pakietow wychodzacych, dotycza pakietow tuz przed wyslaniem przez urzadzenie sieciowe. Reguly filtrowania pakietow
przesylanych dotycza pakietow, ktore zostaly przez nasz komputer odebrane, lecz nie jest on ich ostatecznym adresatem,
tzn. pakiety, ktore beda poddane trasowaniu"

Zaczynamy!

#ipfwadm -I -f
#ipfwadm -O -f
#ipfwadm -F -f
Powyzsze polecenia usuwaja wszystkie reguly w danej kategorii. Jak zapewne zauwazyliscie opcja "-f" sluzy do usuwania :)

Idziemy dalej
#ipfwadm -I -p deny
#ipfwadm -O -p deny
#ipfwadm -F -p deny

"-p" sluzy do ustawiania DOMYSLNEJ polityki firewall'u (czyli zgodnie z zasada: "co nie jest wyraznie zezwolone, jest
zabronione"). Sa dostepne 3 opcje:
a) accept (odbierz, wysli lub przeslij pakiet)
b) reject (nie zewala na odbior, wyslanie lub przeslanie pakietu, wysyla komunikat bledu do hosta, ktory wyslal pakiet)
c) deny (nie pozwala na odebranie, wyslanie lub przeslanie pakietu)
Jednak ten tekst nie bedzie o zaawansowanych metodach budowania firewall'i, a jedynie uzyskaniu maskowania, wiec przejde
do konkterow:
Mamy np. taka sytuacje:
                                              +--------+
                                        /---- | komp 1 |
      SDI/PPP/cokolwiek +-------+      /      +--------+
NET <-----------------> | Linux | <----
                        +-------+      \      +--------+
                                        \-----| komp 2 |
                                              +--------+
I chcemy zeby komp 1 i 2 takze mialy dostep do internetu, wystarczy wpisac
#ipfwadm -F -p deny
#ipfwadm -F -a m -S xxx.xxx.xxx.xxx/y -D 0.0.0.0/0

xxx.xxx.xxx.xxx - adres twojej sieci
y - Maska           | x  | Podsiec
    ------------------------------
    255.0.0.0       | 8  | Klasa A
    255.255.0.0     | 16 | Klasa B
    255.255.255.0   | 24 | Klasa C
    255.255.255.255 | 32 | P-t-P

czyli jesli twoja podsiec jest klasy C to analogicznie:
#ipfwadm -F -p deny
#ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0

I juz masz maskowanie ! :)

Jesli chcialbys maskowanie tylko dla konkretnego komputera to:
#ipfwadm -F -p deny
#ipfwadm -F -a m -S adres.kom.dla.maskwoania/y -D 0.0.0.0/0
czyli np.
#ipfwadm -F -p deny
#ipfwadm -F -a m -S 192.168.0.123/24 -D 0.0.0.0/0

Teraz krotki opis uzytych opcji:
"-a" - dodanie reguly
"m"  - maskowanie pakietu
"-S adres/maska port" - zrodlo pakietu (w naszym przypadku jest to siec lokalna, albo konkretny komputer)
"-D adres/maska port" - adres docelowy (w naszym przypadku dokoadkolwiek)

polecenie:
#ipfwadm -F -a m -S 0.0.0.0/0 22 -D 192.168.0.123/24 666
czyli wszystko z neta do naszego sarwera na porcie 22 bedzie szlo do kompa 192.168.0.123 na port 666 :)

Dodam jesz tylko, ze wypadalo by wlaczyc takie moduly jak:
ip_masq_ftp
ip_masq_irc
ip_masq_co.tam.chcesz.maskowac :)
w taki sposob:
#modprobe ip_masq_ftp

jesli chcesz zobaczyc co mozesz maskowac, to zajzyj na strone:
http://ipmasq.cjb.net/

Standardowo (czyli bez zadnych modulow) maskowane jest:
http, pop, smtp, telnet, archie, usenet, vrml, gopher, wais, ssh i moze jeszcz pare innych rzeczy, ale te najwazniejsze
zostaly wymienione :)

To narazie koniec. Wiece moze w przyszlosci.



3.5 Linux - komendy - wersja rozszezona by CZaR|Ny

W pierwszym faq zajelismy sie omowieniem kilku podstawowych komend Linuksa (opial je qrack), ale jednak
trzeba zglebic nieco temat i powtorzyc to co juz zrobilismy wtedy oraz dodac kolejna porcje
komend. Na pewno takie kompendium przyda sie wielu z was, ktorzy juz cos zaczeli dlubac
przy systemach Linuksowych, ale jeszcze sa w tym zieloni i potrzebuja wiedziec wiecej.
Dlatego zabieramy sie za kontynuacje tematu. No to zaczynamy. Najpierw powtorka z rozrywki
a potem juz zaczynamy z nowymi rzeczami. A wiec - wszyscy gotowi? Mozna zaczynac? Wiec
zaczynamy nasza nauke juz :)

Pamietajcie, ze prawdziwa nauka polecen Linuksa nie zaczyna sie pod Xami tylko na powloce.
Wiec na samym poczatku zamiast wydawac komende 'startx', ktora uruchamia KDE nalezy zalogowac
sie na powloce i poswiecic troche czasu na nauke polecen oraz ich skladni.

Logowanie
Do tego aby sie zalogowac mozemy wydac polecenie 'login' i podac nazwe uzytkownika a potem
jego haslo. System moze czasem nie zezwolic na logowanie na konto uzytkownika root i wtedy
nalezy po zalogowaniu sie na zwyklego uzytkownika wydac polecenie 'su' oraz podac haslo roota.
Komenda 'su' mozna zalogowac sie na konto kazdego uzytkownika byle tylko znac jesgo haslo.
Wylogowujemy sie z powloki dajac komende 'exit' lub 'logout' i trzeba pamietac o tym za kazdym
razem kiedy konczymy prace na danej powloce.

Zakonczenie pracy systemu
Tutaj tez jest kilka polecen, ktore wypadaloby znac. Jesli konczy sie prace mozna wydac polecenie
'halt' lub 'poweroff'. Kiedy mamy ochote zrestartowac system wtedy wydaje sie komende 'reboot',
a jesli zamierzamy zamknac system z dodatkowymi opcjami wybieramy komende 'shutdown'. Skladnia
polecenia shootdown moze wygladac nastepujaco:
shutdown -h 30  powoduje zatrzymanie pracy systemu po 30 sekundach, natomiast polecenie
shutdown -r now spowoduje natychmiastowy restart systemu.
Niestety aby zatrzymac system trzeba byc zalogowanym jako superuser czyli root. Inaczej mozna sie
sie tak bawic w nieskonczonosc, a system sie nie zatrzyma ;)

Na poczatku nauki warto zapamietac tez inne polecenia np.: ./plik co spowoduje uruchomienie pliku
wykonywalnego. Czest przydaje sie podczas instalacji lub uruchamiania wlasnych skryptow: ./install
albo ./mojplik.
CTRL+Z spowoduje zatrzymanie wykonywania tak uruchomionego pliku.

Na poczatku trzeba sie nauczyc, jesli chcemy sobie skorzystac z plyty cd lub dyskietki to zeby
moc przegladac dane z tych urzadzen to nalezy je podmontowac. W tym celu uzywamy polecenia 'mount'
mount /dev/cdrom  spowoduje podmontowanie napedu CDROM
mount /dev/floppy  podmontuje nam naped dyskietek
A jak tylko cchemy odmontowac dane urzadzenie to do tego sluzy polecenie 'umount', ktore wyglada tak:
umount /dev/cdrom  odmontowujacy urzadzenie cdrom. Tak samo mozna odmontowac stacje dyskietek czy dysk
twardy itd. Nauczycie sie tego z czasem ;)

Przegladanie zawartosci katalogow
To juz bylo opisane w 1 numerze HWF, ale tak dla przypomnienia. Polecenie 'ls' powoduje wylistowanie
zawartosci bierzacego katalogu. Mozna uzywac z opcjami i tak np.:
ls -a  - powoduje wyswietlenie wszystkich plikow i katalogow lacznie z plikami ukrytymi
ls -c  - sortuje wg dat utworzenia
ls -t  - powoduje wyswietlenie plikow wg. czasu ich modyfikacji
ls -l  - wyswietla dane szczegolowe o plikach i katalogah,
ls -S  - sortuje pliki wg. rozmiaru

Jesli chcemy wylistowac tylko katalogi to w tym celu mozna uzyc polecen: 'dir', 'tree', 'vdir'.

Czasami trzeba utworzyc plik lub katalog. Do tego sluzy polecenie 'mkdir' lub inaczej 'md' i nazwa
katalogu a do plikow 'touch' i nazwa pliku. Do zmainy uprawnien ogladania danych plikow i katalogow
przez innych uzytkownikow sluza polecenia: 'chmod' i 'chown'. O tych poleceniach mozecie sie wiecej
dowiedziec uzywajac polecenie 'man chmod' lub 'man chown'.

Jak w systemie uzyskac pomoc
Do tego sluzy kilka polecen:
info - pomoc na temat danego polecenia,
man - czyli wywolanie manuala dotyczacego danego polecenia,
whatis - wybieranie stron podrecznika zawierajacych slowo kluczowe,

Ulatwienia wykonywania zadan
Mozna tworzyc wlasne aliasy dla dlugich polecen. Sluzy do tego polecenie 'alias', a zeby sie go pozbyc
wydaje sie polecenie 'unalias'. Poleceniem 'type' mozna uzyskac informacje o typie polecenia.

Operacje na plikach i katalogach
Tutaj nalezy pamietac kilka polecen i tak:
cd - zmiana katalogu
chmod - zmiana uprawnien do plikow i katalogow
chown - zmiana wlasciciela pliku lub grupy
cp - sluzy do kopiowania plikow i katalogow
ls - listowanie plikow i katalogow
mkdir (md) - tworzenie katalogow
mv - przenoszenie lub zmiana nazwy
rm - usowanie plikow
rmdir - usowanie katalogow
pwd - czyli wyswietlenie sciezki do bierzacego katalogu
touch - tworzenie pustego pliku

Czasami istenieje potrzeba znalezienia plikow. Do dyspozycji sa polecenia:
find  - znajdowanie plikow wg. nazwy, rozmiaru itd,
locate - w utworzonym wczesniej spisie,
whereis - w katalogach.

Do przetwarzania informacji tekstowych sluza polecenia:
cat - wyswietlanie plikow tekstowych
cut - wycinanie fragmentow wierszy z plikow tekstowych
dd - kopiowanie z konwersja danych tekstowych
diff - sluzy do porownywania zawartosci plikow textowych
grep - znajduje ciag znakow
less - sluzy do przegladania zawartosci plikow ekran po ekranie od konca
more - to samo co less ale przeglada pliki od poczatku
sed - edyscja strumieniowa tekstu
sort - sortuje wiersze w plikach tekstowych

Z wiersza polecen mozna takze archiwizowac i kompresowac pliki. Sluza do tego polecenia 'compress',
ktory jest programem sluzacym do kompresji plikow. Jego odwrotnoscia jest 'uncompress'.
'gzip' oraz 'gunzip' sluzy do tworzenia archiwum oraz jego rozpakowywania. 'tar' tworzy archiwum
zlozone z wielu katalogow.

Moza tez zarzadzac uzytkownikami i procesami. Na poczatek zarzadzanie uzytkownikami:
chsh - zmiana powloki,
groups - wyswietlanie informacji o przynaleznosci uzytkownika do grup,
id - wyswietlenie identyfikatora uzytkownika,
passwd - zmiana hasla uzytkownika,
su - przejecie uprawnien roota, lub zalogowanie sie na konto innego uzytkownika,
To sa te polecenia, ktore wypadaloby znac do zarzadzania uzytkownikami i grupami uzytkownikow.
Teraz zajmiemy sie poleceniami sluzacymi do zarzadzania procesami:
bg - uruchomienie w tle przerwanego wczesniej procesu
fg - uruchamianie przerwanego procesu na pierwszym planie
free - wyswietlanie informacji o wolnej i zajetej pamieci
halt - zatrzymanie pracy systemu
shutdown - zatrzymanie procesu
reboot - zatrzymanie i ponowne uruchomienie procesu (mozna tez uzyc kombinacji klawiszy CTRL+ALT+DEL)
kill - zabicie procesu
ldd - wyswietlenie nazw bibliotek potrzebnych do uruchomienia danego programu
nice - uruchominienie procesu z okreslonym priorytetem
ps - lista dzialajacych w tle procesow
printenv - wyswietlenie zmiennych srodowiska
top - lista procesow najbardziej zajmujacych pamiec
uname - informacje o systemie

Zarzadzanie systemem plikow:
fdisk - zarzadzanie partycjami (sluzy do podzialu dysku na partycje)
cfdisk - to samo co wyzej, ale bardziej zalecany dla mniej zaawansowanych uzytkownikow
mount i umount - montowanie i odmontowywanie urzadzen
fdformat - niskopoziomowe formatowanie dyskietek
fsck - sprawdzanie i ewentualna naprawa systemu plikow - cos podobnego do scan diska pod windowsem,

Inne przydatne komendy to:
dmesg - odtwarza komunikaty startowe
./plik - uruchomienie pliku wykonywalnego

No i to tyle jesli chodzi o polecenia dla dopiero zaczynajacych przygode z Linuksem uzytkownikow.
Jesli chodzi o pozostale to pozostaja manuale i samodzielna nauka, a to co tutaj zostalo opisane na
sam dobry poczatek powinno Wam wystarczyc do tego zeby samodzielnie moc sie poruszac po powloce.
Jak juz opanujecie polecenia to wtedy mozecie przeniesc sie na okienka do czego sluzy polecenie
'startx', ktore uruchamia srodowisko KDE.


3.6  Master Boot Record - MBR by rafal[eR]

Pierwszy sektor dysku twardego (cylinder 0, glowica 0, sektor 0)
jest nazywany glownym rekordem rozruchowym. Jest to obszar
przechowujacy 512 bajtow waznych informacji dotyczacych dysku,
takich jak tablica partycji i maly fragment kodu, ktory BIOS
naszego PC laduje i wykonuje w czasie uruchamiania komputera.

Maly program w MBR odczytuje tablice partcji, rozpoznaje, ktora
z partycji jest aktywna (atrybut partycji przyznawany zazwyczaj
podczas instalcji systemu), odczytuje pierwszy sektor partycji
aktywnej - sektor rozruchowy (boot sector) i uruchamia program
ktory jest zapisany w tym sektorze. Program w sektorze
rozruchowym partycji zwykle laduje ten system operacyjny,
ktory jest zainstalowany na tej partycji.

Jesli na dysku twardym jest zainstalowany Linux Loader (LILO)
program LILO rezyduje w MBR  dysku twardego lub w sektorze
rozruchowym tej partycji, na ktorej rezyduje katalog glowny
Linuxa czyli " / "


3.7 Narzedzia Linuxowe do rozpoznawania sieci by CZaR|Ny

Wielu z Was rozpoczynajacych nauke na nowym systemie operacyjnym zastanwia sie nieraz nad
tym jak obslugiwac poszczegolne narzedzia dostarczane przez producentow. Nieraz jest tak,
ze trzeba sie ostro nameczyc samemu, zanim dojdzie sie do sedna sprawy. Wiec tak: narzedzia
omowione w tym tekscie to nic innego jak nmap, nslookup, traceroute i ping. Na razie tyle
powinno wystarczyc. Jesli cos wyda sie wam dziwne i niezrozumiale lub chcielibyscie sie
dowiedziec wiecej to zapraszam do poczytania manuali :)
Wlasciwie po co opisuje te narzedzia? A po to zebyscie mogli samodzielnie rozpoznawac siec
i znali droge przebiegu pakietow jaka przebywa pakiet od nas do komputera ofiary, a takze
wiedzieli na jakim systemie operacyjnym pracuje dany komputer oraz jakie ma DNSy - zwykly i
zapasowy oraz w jakim czasie pakiet przebywa droge. Te informacje sa niezbedne jeli chcemy
przeprowadzic atak na jakas maszyne. Powiem tyle - sa one niezbedne, a ze pod Windowsem
raczej nie mamy takich mozliwwosci, dlatego opisuje tutaj narzedzia Linuxowe. Mam nadzieje,
ze to co napisze ponizej przyblizy Wam znajomosc tych narzedzi. Jednak zeby je zrozumiec w
100% to trzeba sie nimi pobawic samodzielnie i samemu starac sie rozpoznawac siec. Nie jest
to takie hop siup jak sie niektorym moze wydawac, ale jak nauczycie sie nimi poslugiwac to
macie przed soba otwarta droge do przeprowadzania atakow, ale tego akurat nie bede opisywal,
to jest to do czego sami musicie dojsc i nikt Wam tego na talerzu nie poda - ja moge podac
tylko wskazowki, a do reszty musicie dojsc sami - jak kazdy z nas, ktory spedzil duzo czasu
przed maszyna i poznawal jej tajniki probujac samemu dojsc do tego z czym to sie je ;)
Dobra zaczynamy:

-= ping =-

To takie male i dosc uzyteczne narzedzie, dzieki ktoremu mozna sie dowiedziec jaki dana maszyna
ma ades IP i w jakim czasie pakiet przebywa droge pomiedzy naszym komputerem a maszyna ktora
pingujemy.
Ping wysyla pakiet informacji zadajacy odeslania go od wysylajacego. Pomaga on badac istnienie
polaczenia pomiedzy komputerami, droge pomiedzy nimi, czas potrzebny na przejscie pakietu oraz
sprawdza czy drugi komputer pracuje w danym momencie w sieci. Naduzywanie pinga powoduje
ograniczenie przepustowosci sieci.
Program ten przydaje sie do:
- okreslenia stanu sieci i okreslonych hostow,
- sledzenia i usowania problemow sprzetowych,
- testowania, mierzenia i zarzadzania siecia,
- badania sieci.

Postac polecenie ping wyglada nastepujaco:

ping [nazwa_hosta albo adres_IP]

Jezeli po wyslaniu pakietu dostajemy odpowiedz na echo to znaczy ze host do ktorego wyslalismy
pakiet pracuje i jest podlaczony do sieci.Kazde wcho zawiera naglowek zgodny z ICMP, po ktorym
nastepuje timeval structure i bity wypelniajace pakiet. Ping wysyla pakiety przez caly czas i
zeby zakonczyc jego dzialanie nalezy uzyc kombinacji klawiszy ctrl+c.
Ping wysyla 1 pakiet na sekunde i potem wyswietla jedna linie dla kazdej otrzymanej odpowiedzi.
Oblicza czas przejscia pakietow od naszego komputera do komputera docelowego i spowrotem. Oblicza
tez ilosc pakietow zgubionych a po zakonczeniu wyswietla krotkie podumowanie, w ktorym mamy  
wszystkie interesujace nas informacje.

Przykladowy ping wyglada tak:

bash-2.05a# ping www.bielsko.tpsa.pl
PING zt.bielsko.tpsa.pl (194.204.147.10): 56 octets data
64 octets from 194.204.147.10: icmp_seq=0 ttl=123 time=39.7 ms
64 octets from 194.204.147.10: icmp_seq=1 ttl=123 time=40.0 ms
64 octets from 194.204.147.10: icmp_seq=2 ttl=123 time=40.0 ms
64 octets from 194.204.147.10: icmp_seq=3 ttl=123 time=40.0 ms
64 octets from 194.204.147.10: icmp_seq=4 ttl=123 time=40.0 ms
64 octets from 194.204.147.10: icmp_seq=5 ttl=123 time=40.0 ms

--- 194.204.147.10 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 39.7/40.0 ms

Dzieki temu wiemy, ze ping wysyla paczke 64-bitowa na adres 194.204.147.10 czyli po prostu
na host TPSA :)  Wyslal 6 pakietow i czas ich wyslania i odpowiedzi z maszyny po 2 stronie
wynosi tutaj srednio 40 ms. Wartosc TTL (time to live) pakietu IP reprezentuje tutaj maksymalna liczbe
routerow IP, ktora pakiet moze minac zanim zostanie odrzucony. W tej sytuacji mozna stwierdzic, ze kazdy
router zwiekszy wartosc TTL o jeden. Wiec w tym przypadku moze to byc 123 routery zanim pakiet zostanie
odrzucony.
Narzedzie ping mozna uzywac z kilkoma opcjami jak np.: -c, -d, -f, -i, -l, -n, -p, -q, -R, -r, -s, -v, ale
nie bede ich tutaj omawial. Zeby dowiedziec sie wiecej o tych opcjach zajrzyjcie do manula: man ping i
poczytajcie sobie.


-= traceroute =-

Narzedzie to drukuje trase, jaka przebiegaja pakiety miedzy naszym komputerem a sprawdzanym przez nas hostem.
Program ten probuje sledzic trase pakietow IP, ktora taki pakiet przebylby do interesujacego nas hosta poprzez
odpalanie probki UDP z malymi wartosciami TTL, a nastepnie oczekuje na odpowiedz ICMP od gatewaya. Probki ttl sa
zwiekszane o jeden az do momentu dopoki nie trafimy na odpowiedz ICMP "port unreachable" co oznacza jedna rzecz:
albo trafilismy na naszego hosta, albo po prostu doszlismy do maximum TTL (w traceroute jest to 30 przerzutow),
ale wartosc ta moze byc zmieniana flaga -m. Dla kazdego TTL wysylane sa 3 probki. Efektem tego jest wypisanie
linii pokazujacej TTL, adres bramki oraz czas przebycia kazdej z probek z roznych gatewayow. Jesli nie bylo
odpowiedzi w ciagu 3 sekund to dla probki drukowane jest '*'.
A oto jak wyglada przykladowe badanie sieci za pomoca traceroute:

bash-2.05a# traceroute www.bielsko.tpsa.pl
traceroute to zt.bielsko.tpsa.pl (194.204.147.10), 30 hops max, 38 byte packets
1  80.50.216.158 (80.50.216.158)  19.660 ms  19.687 ms  19.776 ms
2  80.50.216.157 (80.50.216.157)  29.824 ms  30.272 ms  29.784 ms
3  do.kat-ar4.z.kat-r1.tpnet.pl (213.25.5.212)  31.895 ms  30.156 ms  29.798 ms
4  do.kat-ar1.z.kat-r1.tpnet.pl (213.25.5.194)  31.927 ms  39.780 ms  30.085 ms
5  194.204.176.202 (194.204.176.202)  39.383 ms  39.926 ms  30.480 ms
6  zt.bielsko.tpsa.pl (194.204.147.10)  49.472 ms  39.946 ms  30.462 ms
bash-2.05a#

Znowu ta TPSA :))) Ale co ja moge na to poradzic ;)
Co do opcji Traceroute to ma mniej wiecej takie: -m, -n, -p, -q, -r, -s, -t, -u, -v i -w. Ale zeby sie dowiedziec
co oznaczaja to zapraszam do przestudiowania manuala: man traceroute - w koncu sami tez musicie wykazac jakas chec
nauki i samodzielnego myslenia (przy okazji pouczycie sie angielskiego ;))


-= nslookup =-

Chyba juz przez wielu zapomniane narzedzie, ale jednak bardzo przydatne. Nslookup czyli inaczej Name Service Lookup jest
przydatne w codziennej pracy. Jego dzialanie jest przyblizone do dzialania programu DIG. Nslookup sluzy do wyszukiwania
informacji o wezlach sieci w serwerach DNS. Wsrod informacji zwracanych przez program znajduja sie informacje
wrazliwe ale udostepnione publicznie.
Dzieki tamu programowi mozliwe jest pozyskanie informacji o wskazanej domenie. Dzieki informacja zwracanym przez
program latwo mozna przeprowadzac ataki na dane serwery. Mozna na przyklad przeprowadzac ataki przeciazeniowe na serwery.
To jednak zostawmy na razie tym ktorzy sie na tym znaja i potrafia sie ukryc na tyle, zeby nie zostac od razu znalezionym :)

A tak wyglada przykladowe dzialanie programu nslookup:

bash-2.05a# nslookup www.bielsko.tpsa.pl
Note:  nslookup is deprecated and may be removed from future releases.
Consider using the `dig' or `host' programs instead.  Run nslookup with
the `-sil[ent]' option to prevent this message from appearing.
Server:         194.204.159.1
Address:        194.204.159.1#53

www.bielsko.tpsa.pl     canonical name = zt.bielsko.tpsa.pl.
Name:   zt.bielsko.tpsa.pl
Address: 194.204.147.10

bash-2.05a#

Achhhhh znowu ta TPSA! :)) Chyba dzisiaj maja pecha. ALe akurat nie mialem zadnego innego pomyslu, a ten serwer wydal mi
sie odpowiedni na to zeby Wam pokazac pewne rzeczy.
Jesli chcecie sie dowiedziec wiecej o nslookup to znowu zapraszam do studiowania manuali. Ewentualnie zostaje Wam
www.google.com.pl i szukanie informacji o tym narzedziu.


-= nmap =-

To juz ostatnie narzedzie omawiane w tym artykule. Czym jest nmap? Network Mapper Jest to skaner portow. Przewaznie
jesli chcemy kogos zaatakowac musimy zrobic male rozeznanie w terenie, zeby wiedziec ktoredy mozna wejsc. Ale
oprocz tego, ze naszym celem jest sprawdzenie udostepnionych uslug, to musimy tez wiedziec i miec pewnosc, ze dana
usluga jest podatna na atak. Nmap pozwala nam zrobic maly wywiad poprzez sondowanie portow otwartych na danej maszynie.
Nmap pozwala na skanowanie portow z wykorzystaniem wielu zaawansowanych funkcji. Funkcje te obejmuja skanowanie
portow z z roznymi ustawieniami flag naglowkow protokolu TCP i analize przeslanych do nas odpowiedzi.
Glownym zadaniem nmapa jest identyfikacja udostepnionych uslug wskazanego wezla. Program identyfikuje uslugi oraz
identyfikuje jaki system operacyjny jest zainstalowany na danej maszynie.

A oto jak wyglada efekt sprawdzenia danej maszyny narzedziem nmap:

bash-2.05a# nmap -sS -O www.bielsko.tpsa.pl

Starting nmap V. 2.54BETA34 ( www.insecure.org/nmap/ )
Interesting ports on zt.bielsko.tpsa.pl (194.204.147.10):
(The 1551 ports scanned but not shown below are in state: closed)
Port       State       Service
25/tcp     open        smtp
80/tcp     open        http
106/tcp    open        pop3pw
110/tcp    open        pop-3
135/tcp    open        loc-srv
Remote operating system guess: Windows NT4 / Win95 / Win98

Nmap run completed -- 1 IP address (1 host up) scanned in 15 seconds
bash-2.05a#

No coz znowu TPSA :)) Zreszta co tam ;)
Jak widac mamy tutaj otwarte 5 portow i jak dobrze pomyslec to zawsze znajdzie sie jakis skrypcik, lub sploicik na dana
usluge. Jak widac program wykryl nam system Windows NT. A wiec jak dobrze pomyslec to juz mamy wszystkie potrzebne
informacje do przeprowadzenia ataku :) Teraz zreszta jak cos wystarczy sie troche poduczyc z systemow operacyjnych -
jak dobrze pojdzie to zajme sie tym w 4 numerze tak powierzchownie, ale podam przydatne linki, dla tych co chca poznawac
systemy operacyjne, zeby mieli droge do popisu w przyszlosci.


No i dotarlismy do konca opisu narzedzi. Mam nadzieje, ze opisy sie Wam przydaly. A w celu dalszej nauki zapraszam do
przestudiowania manuali i pogrzebania po sieci - traficie cos na pewno  :)
Reszte narzedzi postaram sie opisac w nastepnym numerze...


3.8 Powiadamianie o logowaniach do systemu via sms by rafal[eR]

Ponizszy faq opisuje w jaki sposob zwiekszyc kontrole nad tym co
dzieje sie na naszym serwerze, zacznijmy moze od zainstalowania
programu do wysylania sms-ow ze strony http://ceti.pl/~miki/komputery/sms.html
sciagamy co trzeba, kompilujemy, nastepnie "sms" przenosimy do katalogu /bin

Zapomnialem dodac na wstepie ze jest to faq skierowany dla administratorow
ktorzy odcieli na swoim serwerze dostep dla wszystkich hostow poprzez regule ALL:ALL
w pliku /etc/hosts.deny jezeli niewiesz o co chodzi odsylam do mojego
faq nt. "Slackware" po adresem http://nevillon.pac.pl/hackerwanabe/teksty/slack.txt
teraz do pliku /etc/hosts.allow dopisujemy:
#
# Dostep dla uzytkownika "login"
#
ALL:XX.XX.XX.XX : spawn /bin/sms XXXXXXXXX "`date` uzytkownik login zalogowal sie do systemu "
#
Przy czym XX.XX.XX.XX to adres ip naszego usera ktory ma dostep do systemu natomiast
XXXXXXXXX to numer naszego telefonu komorkowego na ktory zostanie wyslany sms poprzedzony
funkcja `date` czyli aktualna godzina na serwerze.

Bajer jest bardzo przydatny kiedy nie mamy za duzo userow, przy wiekszym serwerze
zdecydowanie odradzam ;] Od tak fajna zabawka kiedy wyjezdzamy na wakacje ;]
Mozliwe sa tez kombinacje z dodaniem linii /bin/sms XXXXXXXXX "Server reboot `date`"
do pliku /etc/rc.d/rc.local Zostaniemy wtedy poinformowani gdy serwer zostanie
zrebootowany. Mozna tez nad powyzsza linia nadac delay dla zadania poprzez
"sleep 2" dla wiekszej pewnosci ze sms zostanie doreczony.

To by bylo na tyle Greet dla PiTeR|76 za Copyright :]
Jezeli macie jakies pytania lub sugestie mail me p00cket@o2.pl



3.9 gzip - kompresor metoda Lempela-Ziva by rafal[eR]

Jest to narzedzie GNU sluzace do kompresji i dekompresji plikow metoda "zip"
Dla podniesienia jego wagi powiem ze wszystkie dystrubucje Linuxa sa nim
pierwotnie spakowane. Uruchomienie pliku z nazwa jakiegos pliku jako argumentem
powoduje zredukowanie jego rozmiaru wedlug algorytmu Lempel-Ziva i zapisanie
wyniku w postaci "plik.gz". Ten sam program sluzy do dekompresji plikow z
rozszerzeniem *.gz a odbywa sie to za pomoca gzip -d plik.gz

Oto skladnia polecenia "gzip":
gzip [ -cdfhlLnrtvV19 ] [ -S .xxx ] [ plik ... ]

-c zapisuje wyjscie na standardowe wyjscie
-d dekompresuje plik
-f wymusza kompresje lub dekompresje, nawet jezeli plik ma wiele laczy
    lub jezeli laczy sie to z nadpisaniem istniejacego pliku
-h wyswietla ekran pomocy
-l wyswietla liste rozmiarow przed, i po kompresji
-L wyswietla licencje gzip i konczy dzialanie
-n powstrzymuje gzip od zapisywania oryginalnej nazwy w pliku skompresowanym
-N przywraca pierwotna nazwe pliku po dekompresji
-q wylacza wyswietlanie wszelkich ostrzezen
-r wlacza rekurencyjne przegladanie podkatalogow i powoduje uwzglednienie
    wszystkich zapisanych w nich plikow
-S .xxx nakazuje korzystanie z sufixu .xxx zamiast .gz
-t testuje integralnosc skompresowanego pliku
-v wyswietla nazwe i procent kompresji kazdego pliku
-V wyswietla numer wersji
-1 najszybsza metoda kompresji (nawet kosztem stopnia kompresji)
-9 najwolniejsza metoda kompresji (najwyzszy stopien kompresji)



------------------------------------------------------------------------------------

4. Bazy Danych

4.1 Bezpieczenstwo baz danych by CZaR|Ny

W tym artykule postaram sie przedstawic kilka zagadnien, a mianowicie:
- zagrozenia baz danych,
- zabezpieczenia baz danych,
- szyfrowanie oraz algorytmy wykorzystywane przy szyfrowaniu,
- oraz czym jest audyt.

Nie bedzie tutaj zadnych przykladow tylko czysta teoria. Zebyscie mieli ogolne pojecie o
tym na jakie zagrozenia sa narazone bazy danych oraz jak sie przed nimi zabezpieczyc. W
koncu przedstawie kilka algorytmow szyfrowania danych w bazach danych no i na samym koncu
wytlumacze co to jest ten 'audyt'. W sumie mialem taki temat na referat z zaawansowanych
technik baz danych w szkolce i zostal przyjety dosc dobrze, wiec moze wam sie tez do czegos
przyda. Zapraszam wiec do lektury czysto teoretycznej, ale takiej dzieki ktorej zrozumiecie
po co tyle krzyku w swiecie baz danych.
No to zaczynamy.
Bezpieczenstwo baz danych jest w dzisiejszych czasach traktowane jako jedno z priorytetowych
zagadanien przy planowaniu nowych systemow bazodanowych jak i przy modyfikowaniu juz istniejacych.
Zapotrzebowanie na bezpieczne bazy danych nie ogranicza sie juz tylko do zastosowan militarnych
ale spotykane sa juz bardzo czesto w dziedzinach tj. banki, sadownictwo, administracja, sluzba
zdrowia itd. przy projektowaniu nowych baz danych nalezy sobie zadac kilka pytan, ktore pomoga
nam okreslic, w jakim stopniu konieczne bedzie zastosowanie mechanizmow bezpieczenstwa w nowo
powstalym systemie. Glownymi pytaniami stawianymi przy okreslaniu zabezpieczen sa: czy mamy
wrazliwe na ingerencje dane? oraz kto powinien miec dostep do poufnych danych? Kto nie powinien
miec dostepu i jakie moga byc tego konsekwencje? A nastepnie nalezy upewnic sie ze dane sa
bezpieczne bez koniecznosci przerabiania juz istenijacych aplikacji.

Zagrozenia baz danych.
Jak wiadomo w kazdym systemie operacyjnym istnieje mozliwosc utracenia waznych danych. Czestym
pytaniem jakie sobie zadajemy to jak sie przed tym uchronic? Isteniej wiele sposobow utraty danych
oraz wiele sposobow na ich odzyskanie. Opisze tutaj najczestsze i najbardziej prawdopodobne
zagrozenia baz danych.
Zagrozenia:
Pierwsze to czynniki wplywajace na utrate lub niespojnosc danych. Wyrozniamy tutaj:
- blad dzialania transakcji aktualizujacej obiekty - czesc danych zostala zapisana a czesc nie
  i stad sie bierze niespojnosc,
- blad pracy systemu operacyjnego - powoduje zaklocenia w przebiegu transakcji,
- spadek napiecia - powoduje zawieszanie wszelkich transakcji i utrate zawartosci pamieci glownej
  a co za tym idzie utrate danych,
- blad sprzetowy - na przyklad awaria dysku - w tym przypadku czesc lub calosc informacji skladowanych
  jest tracona - czasami bezpowrotnie,
- bledy powstale w bazie ze wzgledu na uruchamianie blednych transakcji - powoduje to zapisanie
  do bazy niepoprawnej lub niespojnej informacji.
Drugimi czynnikami sa inne powazne zagrozenia:
- zbyt latwe do odgadniecia haslo uzytkownika,
- niewlasciwe uprawnienia do bazy dla niewlasciwych osob - zbyt duze prawa dostepu moga nieraz doprowadzic
  do zniszczenia przez niepowolane osoby waznych danych,
- dostep nieuprawnionych osob do maszyny na ktorej sa przechowywane wazne dane z bazy - istnieje mozliwosc
  np. skopiowania danych i wyslania danych do konkurencyjnej firmy,
- brak prywatnosci danych - inni uzytkownicy moga przegladac dane, ktore sa przeznaczone dla konkretnej
  osoby,
- brak dziennika transakcji - po awarii sprzetu nie mozna przywrocic dokonywanych przed awaria transakcji,
- pominiecie faktu potrzeby tworzenia kopii zapasowych - w razie awrii sprzetu, w tym wypadku dysku
  twardego, czesc lub calosc danych jest bezpowrotnie tracona.
- blokowanie wpisywania znakow specjalnych do bazy - moze to sprzyjac powstawaniu wpisow w postaci
  skryptow wykonywalnych w bazie danych, a co za tym idzie zniszczenie bazy danych.
Nie sa to wszystkie zagrozenia - istnieje ich o wiele wiecej, ale podalem tutaj te najistotniejsze.

Zabezpieczenia.
Przy projektowaniu bazy danych nalezy szczegolna uwage poswiecic zabezpieczenia, metoda uwierzytelniania
a takze dlugoscia i zlozonoscia hasel dostepu.
Zasady projektowania zabezpieczen. Istenieja 3 glowne kryteria zabezpieczen danych przed ich nieupowaznionym
ujawnieniem, zmiana lub tez zniszczeniem:
- bezpieczenstwo danych - ochrona danych srodkami bezpieczenstwa przed przypadkowym lub umyslnym
  zniszczeniem, ujawnieniem, modyfikacja,
- poufnosc - dane udostepniane sa tym, ktorzy maja odpowiednio wymagane uprawnienia,
- tajnosc - dane musza byc przechowywane i udostepniane z zachowaniem pewnego stopnia tajnosci.
Zasady projektowania:
1. Domniemana odmowa udzielenia dostepu - gdy uzytkownik ma brak dostepu i chce go uzyskac to mozna
   go zmusic do uzasadnienia potrzeby uzyskania dostepu przed udzieleniem mu go,
2. Jawny projekt zabezpieczenia - ukazanie slabych punktow projektu w czasie planowania ulatwi wprowadzenie
   poprawek przed wdrozeniem go. Jesli projekt jest dobry to mozna go opublikowac poza parametrami
   zabezpieczajacymi (klucz, itp),
3. Akceptowalnosc - system zabezpieczen ma byc taki, aby nie draznil uzytkownika. System musi byc prosty,
   naturalny i latwy w obsludze dla uzytkownika,
4. Calkowite posredniczenie - zabezpieczenie powinno byc takie aby zawsze kontrolowany byl dostep kazdego
   uzytkownika do Bazy Danych,
5. Najmniejsze uprzywilejowanie - system powinien kazdemu uzytkownikowi przydzielac przywileje ale poczynajac
   od najmniejszych,
6. Ekonomicznosc mechanizmu - prostota mechanizmu spelniajaca oczekiwania wobec systemu,
7. Rozdzielanie przywilejow - im wiecej jest zabezpieczen niezaleznych od siebie tym lepiej,
8. Najmniejszy wspolny mechanizm - taki mechanizm reprezentuje potencjalna sciezke przeplywu informacji
   miedzy uzytkownikami, dlatego wielodostepnosc musi byc minimalna.
Metody uwierzytelniania.
Identyfikator to niepowtarzalna nazwa lub numer nadany obiektowi. Uwierzytelnianie to sprawdzenie, czy osoba lub
obiekt jest tym, za kogo sie podaje; procedura upowazniania bada, czy osoba ta lub obiekt ma prawo do chronionego
zasobu. Wszystko to jest brane pod uwage w celu podjecia decyzji o udzieleniu dostepu. Identyfikator podaje tylko
niepotwierdzona tozsamosc. Numery identyfikacyjne powinne w miare mozliwosci uzywac cyfr kontrolnych lub stosowac
inne metody samokontroli, by zminimalizowac szanse blednej identyfikacji. Identyfikatory sa niezbedne dla rozliczen
i upowazniania, ale nie moga byc uzywane bez dodatkowego uwierzytelniania, jesli jest potrzebny w systemie stopien
bezpieczenstwa. Uwierzytelnienie zwykle jest dokonywane jednorazowo, ale w instalacjach o duzym stopniu bezpieczenstwa
moze byc wymagana okresowa lub stala weryfikacja. Dla uwierzytelniania tozsamosci uzytkownikow komputery uzywaja
hasel lub innych metod dialogowych. Z punktu widzenia uzytkownika znacznie wazniejsze sa czynniki takie jak: liczba
znakow do wprowadzenia, wysilek umyslowy i sposob postepowania w wypadku popelnienia bledu przy wpisywaniu.
Haslo to ciag znakow wprowadzonych przez uzytkownika i sprawdzanych przez komputer. Hasla moga byc wykorzystywane
niezaleznie od uzytkownika dla ochrony zbiorow, rekordow, pol w rekordach itp.
Wyroznia sie metody uwierzytelniania:
1. Podanie hasla:
- metoda prostych hasel - uzytkownik wprowadza haslo, ktore moze sam sobie wybrac, przy czym nie moze to byc haslo
  zbyt oczywiste
- wybrane znaki - komputer moze zadac od uzytkownika podania pewnych znakow. Numery znakow moga byc wyliczane na
  podstawie transformacji zegara wewnetrznego lub generatora
- hasla jednorazowe - uzytkownik ma liste N hasel, ta sama liste pamieta komputer. Po uzyciu danego hasla uzytkownik
  skresla je z listy. Wada jest taka, ze uzytkownik musi pamietac lub miec przy sobie cala liste i znac aktualne
  haslo oraz w przypadku bledow w transmisji uzytkownik nie wie ktore haslo ma podac
2. Metoda pytan i odpowiedzi - system ma zbior odpowiedzi i zbior pytan dostarczonych przez uzytkownika. System
   zadaje pytania, uzytkownik odpowiada:
  wariant I: zadawanie losowo wybranych pytan
  wariant II: jest zbior pytan systemu, ale oprocz tego sa zbiory pytan kazdego uzytkownika
  wariant III: prawo uzytkownika do zmiany pytan w swoim zbiorze
  Metoda ta zajmuje duzo pamieci, ale jest komunikatywna
3. Uwierzytelnienie tozsamosci komputera - po uwierzytelnieniu uzytkownik komputera ma podac swoje haslo, ktore wczesniej
   wprowadzil uzytkownik
4. Procedura przywitania - wykonanie przez uzytkownika poprawnie jakiegos algorytmu. Metoda ta ma wyzszy stopien
   bezpieczenstwa, brak jej jawnosci ale jest czasochlonna i zmudna dla uzytkownika
5. Procedury uzytkownika - dostarczenie przez uzytkownika procedur, ktore sa wykonywane przed wejsciem do systemu. Po
   zakonczeniu danej procedury system wywoluje wlasna kontrole bezpieczenstwa
6. Fizyczne metody uwierzytelniania - inne metody uwierzytelniania niz programowe sprawdzaja czy uzytkownik posiada jakis
   przedmiot lub czy charakteryzuje sie jakas cecha fizyczna np. odciski palcow, karty magnetyczne, zamki z kluczami itp
Dzialania w wyniku odmowy udzielenia dostepu - dziennik systemu i zwloka czasowa przy zle wprowadzonej odpowiedzi, oraz
ilosc prob wejscia do systemu.
Ogolne ostrzezenia dotyczace hasel i ich uzywania:
Hasla nie powinny nigdy byc przechowywane w jawnej postaci,
Hasla nie powinny byc drukowane na drukarkach,
Powinny byc czesto zmieniane,
Uzytkownikowi nie wolno podawac nowego hasla po zakonczeniu sesji,
Haslo na kartach sterujacych zadania wsadowego - stosowac programy kolejkowe szyfrujace.
Hasla
Hasla nie powinny byc ani zbyt latwe ani zbyt trudne i nie powinny nastreczac problemow uzytkownikowi. Nazlezy sie
spodziewac, ze im dluzsze haslo tym bezpieczniejszy system, poniewaz wraz z wydluzaniem sie hasla rosnie wysilek i czas
potrzebny na to by je zlamac. Przy dluzszych haslach skladajacych sie z cyfr, oraz malych i duzych liter przwidywalny
czas na zlamanie hasla rosnie.

Szyfrowanie.
Ponizej znajda sie opisy metod szyfrowania danych oraz transmisji danych w bazach danych. Naleza tutaj:
- Szyfry symetryczne i asymetryczne
- Szyfry blokowe i strumieniowe
- Techniki szyfrowania danych
- Szyfrowanie - metody tradycyjne
- Szyfr Andersona
- Algorytm DES
- Algorytm Elgamala
- Algorytm RSA

Szyfry symetryczne i asymetryczne
Uznajac dostepnosc klucza szyfrujacego jako kryterium nalezy wyroznic dwa typy systemow kryptograficznych: symetryczny i
asymetryczny.
System symetryczny (jednokluczowy, prywatny) np. DES oparty jest na wspolnym tajnym kluczu, sluzacym zarowno do
szyfrowania jak i do deszyfrowania.

Algorytmy sa symetryczne jesli klucze a takie same dk(ek(m))= m. Klucz szyfrujacy wyznacza sie z klucza szyfrujacego.
Cala sprawa polega na utajnieniu klucza. Algorytmy te nazywane sa tez: algorytmami z pojedynczym kluczem lub z
tajnym kluczem. Wymagaja uzgodnienia miedzy adresatami wiadomosci.
Jesli obie strony wykorzystujace systemy jednokluczowe sa jednakowo godne zaufania wowczas we wzajemnej komunikacji
moga zapewnic sobie poufnosc jak i autentycznosc. Nie zapewniaja niezaprzeczalnosci.

System asymetryczny (dwukluczowy, publiczny) np. RSA:
klucz szyfrujacy jest inny niz deszyfrujacy
klucz deszyfrujacy nie jest wyznaczony na podstawie klucza szyfrujacego
kazdy kto ma dostep do klucza publicznego moze zaszyfrowac wiadomosc, natomiast odszyfrowac moze tylko osoba posiadajaca
odpowiedni klucz deszyfrujacy
Dokonuje sie oddzielnych przeksztalcen dla zachowania poufnosci a oddzielnie dla zachowania autentycznosci.

Algorytmy sa asymetryczne jezeli sa rozne klucze:

dk2(ek1(m)) = m
ek1 (m) = c
dk2(c)= m
oraz k1<>k2 (sa rozne)

Algorytmy te mozna podzielic na strumieniowe (jednostka podlegajaca przeksztalceniu to bit) i blokowe (grupa bitow).
  

Szyfry blokowe i strumieniowe
Jesli m oznacza wiadomosc tekstowa, podlegajaca szyfrowaniu, szyfr blokowy dzieli tekst m na n blokow (paczek znakow)
m1,m2,...mn, ktore sa po kolei szyfrowane przy uzyciu tego samego klucza K. Mozna to zapisac w nastepujacy sposob:

ek(m) = ek(m1) * ek(m2) * ... * ek(mn)

W szyfrach strumieniowych tekst m jest dzielony na n znakow lub bitow m1,m2,...mn a nastepnie kazdy i - ty element
jest szyfrowany kluczem ki nalezacym do strumienia kluczy:

K = k1,k2,...
ek(m) = ek1(m1) * ek2(m2) * ...

Szyfr strumieniowy jest szyfrem okresowym, jezeli strumien klucza powtarza sie po d znakach, w przeciwnym wypadku jest
szyfrem nieokresowym.

Szyfry strumieniowe dzielimy na:
- synchronizujacy,
- samosynchronizujace.
Synchronizujacy szyfr strumieniowy charakteryzuje sietym, ze strumien klucza jest generowany niezaleznie od strumienia
wiadomosci ( koniecznosc synchronizacji generatorow kluczy przez nadawce i odbiorce).
W szyfrach samosynchronizujacych sie kazdy znak klucza zalezy od pewnej stalej n wczesniej zaszyfrowanych znakow.
  
  


Techniki szyfrowania danych
Tryb elektronicznej ksiazki kodowej ECB reprezentuje najprostsza technike szyfrowania blokowego. Po wstepnym
podzieleniu tekstu jawnego na bloki, kazdy blok szyfrowany jest w blok szyfrogramu. Polaczone po szyfrowaniu bloki
tworza wynikowy kryptogram. Zaleta jest mozliwosc niezaleznego szyfrowania kazdego z blokow tzn. mozna najpierw
zaszyfrowac kilka srodkowych, potem koncowe, a na koncu poczatkowe bloki tekstu jawnego.
Tryb wiazania blokow zaszyfrowanych CBC. Kazdy blok tekstu jawnego jest przed szyfrowaniem laczony operacja XOR z
poprzednim blokiem szyfrogramu. Wykorzystano w tym trybie mechanizm sprzezenia zwrotnego tzn. blok wyjsciowy jest
wykorzystywany do modyfikacji kolejnego bloku wejsciowego. Poczatkowa wartosc rejestru sprzezenia zwrotnego I[0]
(wektor poczatkowy) jest inicjowana przez uzytkownika i powinna byc losowa. Podczas deszyfrowania blok szyfrogramu
jest odszyfrowany i zapamietany w rejestrze sprzezenia zwrotnego, Ktory swoja wartosc bedzie sumowal modulo 2 z
kolejnym odszyfrowanym blokiem.
Tryb sprzezenia zwrotnego zaszyfrowanego tekstu CFB. Umozliwia szyfrowanie danych w jednostkach mniejszych niz rozmiar
pobranego bloku tekstu jawnego. Najpierw rejestr przesuwajacy sprzezenia zwrotnego (LFSR) inicjowany jest wartoscia
poczatkowa I[0] , podobnie jak w CBC. Dla trybu n - bitowego, n najstarszych bitow rejestru przesuwajacego zostaje
zaszyfrowanych kluczem K. Wynik szyfrowania c[i-1] jest sumowany modulo 2 z n bitami tekstu jawnego. Rezultat tej operacji
C jest umieszczany na n najmlodszych bitach rejestru przesuwajacego, ktorego neguja wczesniej pobrane bity. Jednoczesnie
blok ten jest blokiem wynikowego szyfrogramu. Dla kolejnej iteracji pobiera sie nowe n - bitow, ktore po zaszyfrowaniu
beda sumowane modulo 2 z kolejnym blokiem tekstu jawnego. Po obu stronach szyfrowania i deszyfrowania, algorytm blokowy
stosuje sie w trybie szyfrujacym. Trym CFB jest przykladem samosynchronizujacego sie szyfru strumieniowego.
Tryb sprzezenia zwrotnego blokow wyjsciowych OFM jest podobny do trybu CFB z ta roznica, ze zamiast wyniku operacji
XOR na najmlodszej pozycji rejestru przesuwajacego kierowany jest c[i-1] , tzn. wynik szyfrowania kluczem K bloku
najstarszych bitow rejestru. Tryb ten nosi nazwe czasem trybu wewnetrznego sprzezenia zwrotnego, poniewaz sprzezenie
zwrotne nie zalezy od blokow tekstu jawnego, lecz jedynie od wartosci rejestru przesuwanego. Tryb ten jest przykladem
samosynchronizujacego sie szyfru strumieniowego. Wektory poczatkowe I[0] powinny byc rozne dla kazdej wiadomosci
podczas wykorzystywania tego samego klucza.
  
  
Szyfrowanie - metody tradycyjne
Szyfrowanie jest to kodowanie danych za pomoca klucza dokonane dla ukrycia informacji. Jest to przeksztalcenie takie,
aby osoby nieupowaznione nie mogly go odczytac. Ponizej przedstawiam kilka tradycyjnych metod takiego ukrywania informacji.

szyfrowanie podstawieniowe -
monoalfabetyczne - kazdemu symbolowi ai z alfabetu A tekstu otwartego odpowiada ustalony symbol hi tekstu zaszyfrowanego
szyfr Cezara - szyfruje symbol wedlug wzoru: P(P) = (B(P)+2) mod 27
* zamienianie znaku na liczbe - kazda litera w tekscie jest mnozona przez pewna liczbe, po czym dodawana do innej
liczby: C=(aP+s) mod K
a - czynnik dziesiatkowania
s - czynnik przesuniecia
P - znak do szyfrowania
C - znak po zaszyfrowaniu
K - liczba znakow alfabetu

polialfabetyczne - proste podstawienia polialfabetyczne sekwencyjne i cykliczne zmienia uzywane alfabety. W podstawieniu
u-alfabetycznym znak m1 tekstu otwartego jest zmieniany przez znak alfabetu B1, znak m2 przez znak z alfabetu B2, znak
mu przez znak z alfabetu Bu, znak mu+1 znowu przez znak alfabetu B1 itd.

Znak wejsciowy: m1 m2 m3 m4 ...
Alfabet podstawienia: B1 B2 B3 B4 ...

Podstawienie polialfabetyczne ukrywa czestosc wystepowania znakow zrodlowego jezyka L, poniewaz poszczegolne elementy
alfabetu A moga byc przeksztalcone w kilka roznych znakow alfabetu B tekstu zaszyfrowanego.

Szyfr homofoniczny jest polialfabetycznym szyfrem podstawieniowym, dajacym bardzo rozne czestosci wystapienia
zaszyfrowanych znakow, co utrudnia zlamanie go za pomoca analizy czestosci. Charakteryzuja sie one duza liczba
szyfrowych reprezentacji najczesciej wystepujacych znakow, podczas gdy znaki rzadziej wystepujace maja tylko jeden
lub dwa odpowiedniki. Mozna na przyklad uzyc nastepujacego szyfru Homofonicznego:

Znaki tekstu otwartego: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Zaszyfrowane znaki: fNQ.GmD,AeL|R(CxIzV-WshuKt
* b+{ p) o y / ?j=
: i$^ rg < > '~
] ^ %

wieloznakowe - jednoczesnie szyfruje pare znakow.

przestawieniowe - zmienia sie polozenie znakow tekstu otwartego wd. Np dlugosci grupy znakow Mozna zgodnie z jakas
regula, przestawiac znaki tekstu otwartego.

zlozone - tekst otwarty podlega przeksztalceniu przez jeden szyfr potem nastepny i jeszcze inny. Nalezy uwazac aby nie
dostac po kilku takich szyfrowaniach znowu tego samego tekstu otwartego.
  
  
Szyfr Andersona
Anderson opracowal metode szyfrowania zbiorow o dostepie bezposrednim (swobodnym).
W algorytmie generowane sa 2 tablice z hasla badz nazwy uzytkownika. Kazda o dlugosci pierwiastka kwadratowego z
dlugosci zbioru wyrazonego w rekordach. Tablice te zawieraja wartosci T0 i C. Adres logiczny rekordu lub jego numer
jest przeksztalcony w dwie liczby, ktore wybieraja z posrod tych wartosci niepowtarzalne T0 i C, dla kazdego rekordu,
co zapewnia niepowtarzalny ciag kluczy dla wszystkich rekordow. Mozna odczytac dane z jednego rekordu ale nie z
wszystkich., poniewaz zostaly zaszyfrowane innymi ciagami kluczy. Szyfrowanie i deszyfrowanie przebiega dla kazdego
rekordu tak samo jak dla zbiorow sekwencyjnych.
  
  


Algorytm DES
DES jest symetrycznym algorytmem szyfrujacym. Oznacza to, ze ten sam klucz jest uzywany zarowno do szyfrowania, jak i
deszyfrowania. Za pomoca tego algorytmu szyfruje sie bloki zlozone z 64 bitow (8 bajtow). Klucze skladaja sie rowniez z
64 bitow, przy czym 8 bitow to bity parzystosci. Tak wiec w istocie w trakcie wyboru klucza mozna okreslic jedynie 56
bitow, reszta jest generowana automatycznie.
Szyfrowanie i deszyfrowanie za pomoca DES-a sklada sie z 16 rund. W trakcie kazdej rundy dokonywane sa te same obliczenia,
ale na wynikach obliczen z poprzedniej rundy i specjalnym podkluczu generowanym z 64-bitowego klucza. Dodatkowo, przed
pierwsza runda oraz po ostatniej rundzie bity sa permutowane w okreslony sposob.
Dla uzyskania podkluczy uzywanych podczas poszczegolnych rund usuwamy najpierw 8 bitow parzystosci zawartych w kluczu.
Nastepnie z pozostalych 56 bitow tworzonych jest 16 podkluczy, kazdy skladajacy sie z 48 bitow. Tak utworzony i-ty klucz
(Ki)bedzie uzywany w i-tej rundzie. Kazdy podklucz sklada sie z gory okreslonych bitow oryginalnego klucza - dla kazdego
podklucza sa to inne bity i ustawione w innej kolejnosci. Sposob tworzenia podkluczy jest jawny i zostal opublikowany
wraz z opisem DES-a.
Permutacje szyfrowanego tekstu (wykonywane na poczatku i koncu algorytmu) nie maja zadnego celu kryptograficznego.
Zastosowane sa one do tego by spowolnic implementacje software'owa (przy zastosowaniu sprzetowego szyfrowania wykonanie
permutacji praktycznie "nic nie kosztuje").
Dane wejsciowe rundy i+1 skladaja sie z dwoch ciagow 32-bitowych: Li (pierwszych 32 bitow bedacych wynikiem rundy i)
oraz Ri (pozostale 32 bity uzyskane w rundzie i). W rundzie i+1 zachodza nastepujace zwiazki pomiedzy danymi wejsciowymi
a wynikami:

Li+1 = Ri
Ri+1 = Li XOR f(Ri, Ki+1)

gdzie f jest funkcja, ktora posiada zasadnicze znaczenie dla szyfrowania. Sposob obliczania wartosci tej funkcji
jest najbardziej skomplikowana czescia algorytmu. Obliczanie dokonuje sie w nastepujacy sposob:
1. Poprzez tzw. Permutacje z rozszerzeniem otrzymuje sie ciag zlozony z 48 bitow. Bity te, to 32 bity Ri kopiowane
   na 48 pozycji, niektore z nich dwukrotnie.
2. Na otrzymanych 48 bitach jest dokonywana operacja XOR z odpowiadajacymi im bitami podklucza Ki+1.
3. Otrzymane 48 bitow dzielone jest na 8 grup po 6 bitow. Kazda grupa poddawana jest dzialaniu tzw. S-boksu. S-boks
   uzywany przez i-ta grupe nazywany jest Si.
4. Otrzymane 32 bity sa na koniec permutowane w ustalony sposob.

Deszyfrowanie kryptogramow algorytmem DES nie polega jak mogloby sie wydawac na wykonaniu obliczen w przeciwnym
kierunku. Wynika to z tego, ze dla nie ma mozliwosci obliczenia funkcji odwrotnej dla S-boksow (Jednemu wynikowi
otrzymanemu przez S-boks, odpowiada wiele potencjalnych danych wejsciowych). Na szczescie pomaga tu nastepujacy wybieg:
z rownosci wykorzystywanych do szyfrowania wynika iz:

Ri-1 = Li
Li-1 = Ri XOR f(Ri-1,Ki) = Ri XOR f(Li, Ki)

Jesli wiec znamy Li, Ri oraz podklucz Ki, to na podstawie powyzszych rownosci mozemy obliczyc Li-1 i Ri-1. Tak wiec
nie musimy wcale obliczac funkcji odwrotnej do funkcji obliczanych przez S-boksy. Podczas deszyfrowania dokonywane
sa te same czynnosci co przy szyfrowaniu. Zmianie ulega tylko kolejnosc w jakiej uzywane sa podklucze wygenerowane z
klucza glownego (zamiast K1, K2, ..., K15, K16 jest K16, K15, ..., K2, K1).
Szczegolowy opis algorytmu DES zostal celowo opublikowany. Chodzilo o przekonanie potencjalnych uzytkownikow, ze
bezpieczenstwo metody nie tkwi w tajnosci jej budowy, ale w konstrukcji odpornej na kryptoanalize. Jest to szczegolnie
istotne, kazda metoda bowiem, ktorej szczegoly nie zostaly ujawnione, moze zawierac w sobie tzw. "ukryte drzwi", czyli
miejsce w algorytmie, ktore moze byc wykorzystane przez przeciwnika znajacego szczegoly algorytmu na zdobycie informacji
niedostepnych w zwyklym trybie. DES jest o wiele szybszy, gdy jest zaimplementowany jako hardware, a nie jako software.
Algorytm zostal celowo tak zaprojektowany, aby zniechecic do implementacji sotfware'owych, uwazanych za bardziej podatne
na atak (latwiej jest wlamac sie do systemu i niepostrzezenie wymienic software, niz dokonac fizycznego wlamania, by
wymienic hardware). Uklady realizujace DES sa bardzo szybkie (na przyklad 1 GB/s); dla porownania dobry software moze
miec predkosc tysiace razy nizsza. DES zostal w USA uznany za standard dla celow niemilitarnych. Zostal wstepnie
zaprojektowany w osrodku badawczym IBM w Yorktown Heights a nastepnie zmodyfikowany przez NSA (National Security Agency
- Narodowa Agencja Bezpieczenstwa), rzadowy organ w USA zajmujacy sie problemami bezpieczenstwa narodowego. Wywolalo
to wiele podejrzen, ze NSA zna "ukryte drzwi" umozliwiajace lamanie szyfrow generowanych za pomoca DES-a. Poniewaz w
miedzyczasie DES stal sie standardem w zastosowaniach komercyjnych na calym swiecie, dawaloby to USA olbrzymie korzysci
w zakresie militarnym i gospodarczym. W odniesieniu do DES-a nie zostaly opublikowane zadne prace dajace tej metodzie
solidne podstawy matematyczne. Jednakze ponad 20 lat badan akademickich potwierdza, ze konstrukcja algorytmu DES jest
bardzo wyrafinowana. Jakkolwiek w zakresie kryptoanalizy DES-a osiagnieto duze postepy, nie zagrozily one znaczaco
stosowaniu tej metody w praktyce. Z kolei, uproszczone wersje DES-a moga byc zlamane znaczaco mniejszym kosztem.
Interesujace jest to, ze dotychczasowe proby ulepszen DES-a nie doprowadzily do znaczacych postepow i DES nie doczekal
sie nowej wersji.
  
  
Algorytm Elgamala
Logarytmy dyskretne
Potegowanie modularne jest jedna z funkcji jednokierunkowych czesto wykorzystywanych w kryptografii:

Problemem odwrotnym do modularnego potegowania jest wyznaczanie dyskretne liczby.
Np.


Nie wszystkie logarytmy dyskretne daja sie obliczyc - jedyne wazne rozwiazanie to liczby calkowite. Nie ma rozwiazania


Algorytm szyfrowania
Algorytm Elgamala moze byc uzywany do szyfrowania i do podpisow cyfrowych - trudnosc obliczenia logarytmow
dyskretnych to skuteczne zabezpieczenie.
Aby wygenerowac pare kluczy, najpierw wybieramy liczbe pierwsza p oraz liczby losowe q i x takie, ze q < p i x < p.
Nastepnie obliczamy:


Klucz jawny stanowia: y, q, p
q, p moga byc wykorzystywane przez grupy uzytkownikow, kluczem prywatnym jest x.
W celu zaszyfrowania wiadomosci M wybieramy losowo liczbe K, gdzie K jest wzglednie pierwsze z p-1. Obliczamy:


Para liczb a i b - szyfrogram. Szyfrogram jest 2 razy dluzszy od tekstu jawnego.
Odszyfrowanie a i b - obliczamy:

  
Algorytm RSA
Szyfr ten nalezy do szyfrow wykladniczych. Stanowia one nieco bardziej skomplikowany (w stosunku do DES'a), lecz
przez to bezpieczniejszy, rodzaj szyfrow. Opieraja sie na wykonywaniu potegowania w ciele skonczonym.
Nazwa szyfr RSA pochodzi od nazwisk autorow: Rivest, Shamir, Adleman. Algorytm RSA jest algorytmem szyfrowania
w systemie z kluczem publicznym. Generuje on losowo bardzo duza liczbe pierwsza - klucz publiczny. Klucz ten
sluzy do utworzenia innej bardzo duzej liczby pierwszej ( klucza prywatnego) za pomoca kilku funkcji matematycznych.
cztery cechy opracowanego algorytmu:

1. Odszyfrowanie zaszyfrowanej formy wiadomosci prowadzi do uzyskania wiadomosci oryginalnej.
   D(E(M.)) = M gdzie
   D - operacja odszyfrowania
   E - operacja szyfrowania
   M - rzeczywista wiadomosc
2. E i D sa dosyc latwe do obliczenia
3. publiczne podanie E nie ujawnia zadnego prostego sposobu obliczenia D. Dlatego tylko uzytkownik znajacy wartosc
   D moze odszyfrowac wiadomosc zaszyfrowana za pomoca E.
4. Odszyfrowanie informacji M, a nastepnie zaszyfrowanie jej daje w wyniku M , czyli odwrocenie poprzednio podanej
  funkcji jest operacja prawdziwa
  E(D(M)) = M

Funkcja spelniajaca warunki 1-3 zwana funkcja zapadnia dzialajaca w jedna strone, poniewaz mozna ja latwo obliczyc
w jedna strone, ale nie w druga. Nazwa nawiazuje rowniez do tego, ze mozna latwo obliczyc funkcje odwrotne, jesli
zna sie pewna prywatna informacje (klucz).
Opis algorytmu RSA:
E - klucz szyfrowania
N - pewna stala, okreslajaca limit dlugosci szyfrowanego bloku (czyli jak wiele bajtow danych moze zawierac pojedynczy
szyfrowany blok).

1. Program wdrazajacy algorytm RSA przeksztalca wiadomosc tekstowa w liczbe calkowita z przedzialu od 0 do n-1. Metoda
   uzywana do konwertowania na liczbe zalezy od konkretnego programu. Duze wiadomosci, ktore nie moga byc reprezentowane
   przez liczbe mniejsza od n-1 sa dzielone przez program na kilka blokow, z ktorych kazdy jest okreslony przez osobna
   liczbe calkowita mniejsza od n-1.
2. Program szyfruje wiadomosc podnoszac kazda liczbe calkowita do potegi E-tej (czyli blok E). Nastepnie program
   wykonuje dzialanie modulo na powstalej wartosci, dzielac ja przez M. i zapisujac reszte jako szyfrowana wiadomosc.
   Wiadomosc ma teraz postac zaszyfrowanego dokumentu tekstowego C.
3. Aby odszyfrowac wiadomosc C, jej odbiorca podnosi ja do potegi D, a nastepnie wynik dzieli modulo n. Powstaje
   seria wartosci, reprezentujaca bloki w odszyfrowanym pliku, ktore program konwertuje z powrotem na tekst za pomoca
   tej samej metody, co uzyta poprzednio do konwersji tekstu.
Ta metoda szyfrowania jest uwazana za jedna z najlepszych.

Audyt
Na sam koniec przedstawie co to jest ten 'audyt'. Co on oznacza, czym to sie je i do czego jest potrzebny. Przedstawie
definicje oraz kroto opisze o co chodzi.
Audyt - dokonanie niezaleznego przegladu i oceny dzialania systemu w celu przetestowania adekwatnosci srodkow nadzoru
systemu, upewnienia sie, czy system dziala zgodnie z ustalona polityka certyfikacji i wynikajacymi z niej procedurami
operacyjnymi oraz w celu wykrycia przeklaman zabezpieczen i zalecenia wskazanych zmian w srodkach nadzorowania, polityce
certyfikacji oraz procedurach.
Zabezpieczenie systemu informacyjnego jest sprawa zlozona. Do dobrego zabezpieczenia niezbedne jest odpowiednie
zdefiniowanie wystepujacych zjawisk i problemow.
Audyt systemu zabezpieczenia
Pojecie audytu jest definiowane w literaturze (i stosowane w praktyce) w dwojaki sposob. Zgodnie z pierwsza definicja,
audyt oznacza przeglad rejestrow (sekwencji rekordow) zawierajacych informacje o zdarzeniach w systemie operacyjnym,
aplikacjach oraz dzialaniach uzytkownikow. Rejestry te zapewniaja systemowi rozliczalnosc. Nalezy podkreslic, ze audyt
rejestrow systemowych to takze podstawowe zrodlo informacji przy wykrywaniu incydentow i rekonstrukcji zdarzen.
Wedlug drugiej definicji, audyt jest pojeciem szerszym i obejmuje przeglad dokumentacji i analize mechanizmow zabezpieczen
w obszarze zarzadzania, eksploatacji i techniki. Audyt jest wtedy elementem procesu szacowania poziomu zabezpieczenia
systemu informacyjnego.

Celem audytu jest zapewnienie rozliczalnosci w systemie informacyjnym.
W systemie informacyjnym powinny byc prowadzone rejestry zdarzen: poziomu systemowego, aplikacji i uzytkownikow. W
niektorych systemach moga byc dodatkowo wdrozone mechanizmy zapewniajace monitorowanie znakow wprowadzanych z klawiatury.
Rejestr powinien zawierac informacje wystarczajaca do okreslenia, jakiego rodzaju zdarzenie wystapilo, kiedy i kto je
spowodowal.

Rejestr zdarzen systemowych
Rejestry zdarzen systemowych sa zwykle wykorzystywane do monitorowania oraz korygowania parametrow jakosciowych systemu
operacyjnego. Rejestr zdarzen systemowych powinien zapisywac m.in.:

kazda probe dostepu do aktywow systemu informacyjnego (zakonczona sukcesem lub nie),
identyfikator uzytkownika,
date i czas proby dostepu,
date i czas wyrejestrowania sie uzytkownika,
wykorzystywane aktywa oraz funkcje (aplikacje programowe), ktore zostaly wywolane po zarejestrowaniu sie uzytkownika,
date i czas zawieszenia i ponownego restartu systemu informacyjnego.
Rejestry systemowe powinny umozliwiac monitorowanie zmian plikow konfiguracyjnych systemu.

Rejestry zdarzen z poziomu aplikacji programowych
Rejestry te umozliwiaja zapis dzialan uzytkownikow w aplikacji, w szczegolnosci dotyczacych zadania zawarcia transakcji
(rekord zawierajacy identyfikacje stron transakcji, typ zadanej transakcji, informacje o przerwaniu transakcji i
ewentualnej przyczynie przerwania).

Rejestr dzialan uzytkownikow
Powinien rejestrowac wszystkie polecenia inicjowane bezposrednio przez uzytkownika, wszystkie proby uwierzytelnienia
oraz dostep do aktywow systemu.

Zasady utrzymywania i ochrony rejestrow zdarzen
W celu zapewnienia integralnosci plikow rejestrow zdarzen powinny byc wdrozone mechanizmy kryptograficzne, np. podpis
cyfrowy. Powinny istniec silne mechanizmy kontroli dostepu do tych plikow oraz ich poufnosci, a takze mozliwosc wykrycia
i udokumentowania prob modyfikacji rejestrow zdarzen.

Audyt rejestrow powinien byc przeprowadzany w nastepujacych przypadkach:
- zgodnie z harmonogramem przegladu rejestrow zdarzen,
- wykrycia naruszenia zabezpieczenia systemu informacyjnego,
- jako element analizy uzytkowania systemow w czasie rzeczywistym lub prawie rzeczywistym.
Zapisy rejestrow zdarzen powinny byc przechowywane przez okres okreslony na podstawie parametrow technicznych systemu,
wymagan w zakresie przechowywania informacji wrazliwej oraz praktyki biznesowej. Nalezy zapewnic odpowiednie warunki
oraz srodki techniczne przechowywania kopii archiwalnych rejestrow zdarzen.

Synchronizacja zegarow
Odpowiednia dokladnosc rejestrow zdarzen (ktorych zapisy moga sluzyc jako dowody w postepowaniu w przypadku wykrycia
naruszenia zabezpieczenia) powinno zapewnic wlasciwe ustawienie zegarow komputerow. Jesli urzadzenia i systemy maja
mozliwosc korzystania z czasu rzeczywistego, to powinny byc ustawione zgodnie z ustalonym standardem (np. GMT lub czas
lokalny). Powinny istniec procedury korygowania uplywnosci tych zegarow.

Zabezpieczenie baz danych
Wymagania zabezpieczenia baz danych oraz programow zarzadzania powinny uwzgledniac szereg dodatkowych elementow
wynikajacych ze specyfiki tych struktur informacyjnych.

Strukture bazy danych nalezy zabezpieczyc przed skutkami bledow i awarii, np. zanikiem zasilania, zniszczeniem glownych
plikow indeksujacych. Za integralnosc calej bazy odpowiedzialna jest aplikacja programowa zarzadzania baza danych. Poza
standardowymi procedurami zabezpieczenia integralnosci, ktore zapewnia system operacyjny (kontrola dostepu do plikow oraz
testy integralnosci dla wszystkich danych przy operacji odczytu i zapisu na portach urzadzen peryferyjnych), program
zarzadzajacy powinien wprowadzac dodatkowe zabezpieczenia. Naleza do nich:
regularne archiwizowanie bazy danych,
implementacja dwufazowej modyfikacji elementow bazy danych,
wprowadzenie nadmiarowosci i weryfikacja spojnosci bazy danych (np. przy uzyciu kodow detekcji i korekcji bledow lub
pol dublujacych), li>wprowadzenie do programow zarzadzania jednostek odpowiedzialnych za integralnosc struktury (tzw.
monitorow), ktore powinny sprawdzac:
- poprawnosc wprowadzanych danych,
- stan bazy danych,
- integralnosc elementu bazy danych.
Dane wymagajace ochrony powinny byc jednoznacznie zidentyfikowane i wskazane. Dla poszczegolnych elementow moze istniec
wiele posrednich stopni poufnosci (ziarnistosc poufnosci), ktore nalezy zidentyfikowac. Przykladowo, elementy bazy
rozpatrywane niezaleznie nie musza byc poufne. Dopiero ich polaczenie tworzy informacje, ktora nalezy chronic.

Dane poufne powinny byc zabezpieczone przed ujawnieniem zarowno bezposrednim, jak i posrednim; szczegolnie chodzi o
mechanizmy zabezpieczajace przed ujawnieniem poufnych danych w wyniku wnioskowania na podstawie odpowiedzi na poprawnie
skonstruowane zapytanie o parametry jawne.

Dla zapewnienia poufnosci danych powinny byc stosowane takze inne mechanizmy zabezpieczenia w postaci: podzialu bazy na
niezalezne od siebie czesci, szyfrowania wybranych pol lub rekordow, etykiet poufnosci i kryptograficznych sum kontrolnych
(zapewniajacych ponadto integralnosc danych), monitora odniesienia (trusted front-end) oraz mechanizmow kontroli dostepu.
Zastosowanie poszczegolnych mechanizmow zalezy od indywidualnych wymagan dla konkretnej bazy danych.

Jesli nie zostal wdrozony mechanizm jednokrotnego uwierzytelnienia (single sign-on), to program zarzadzajacy baza danych
powinien zawierac wlasny, niezalezny od systemu operacyjnego mechanizm identyfikacji i uwierzytelnienia. Procedura
identyfikacji i uwierzytelnienia umozliwia poprawne przydzielenie praw dostepu do bazy (autoryzacje).

Formulujac zasady dostepu do bazy, administrator powinien uwzgledniac nastepujace czynniki:
prawa dostepu do elementow bazy powinny byc zwiazane z funkcjami poszczegolnych uzytkownikow, ponadto powinna obowiazywac
zasada minimalnych przywilejow (tzn. nie udzielac praw dostepu szerszych niz wynikaloby to z dzialania, ktore uzytkownik
musi w bazie wykonac); powinny istniec inne dodatkowe ograniczenia praw dostepu, np.:
- czasowe - zezwolenie na dostep tylko w okreslonych dniach lub porach dnia,
- umiejscowione - z wyznaczonych systemow, stacji roboczych lub terminali, uwzgledniajac stan systemu (pozwolenie tylko
w trakcie procedur wyjscia z sytuacji awaryjnej lub katastrofalnej),
- warunkowe;
wybor sposobu realizacji zezwolen na dostep: list kontroli dostepu, schematu posiadanych uprawnien, etykietowania
aktywow i uzytkownikow zalezy od indywidualnych wymagan na zabezpieczenie bazy danych.
Decyzja o zezwoleniu na dostep powinna byc podejmowana przez program zarzadzajacy baza na podstawie nastepujacych
przeslanek:
dostepnosc danych - powinna istniec mozliwosc tymczasowego zablokowania prawa dostepu np. w chwili aktualizowania
elementow bazy,
potwierdzenie autentycznosci - na podstawie danych uwierzytelniajacych uzytkownika, np. w postaci tokena uwierzytelnienia.
Program zarzadzajacy baza danych powinien umozliwiac tworzenie rejestrow zawierajacych kazda probe dostepu oraz zapis
zrealizowanych dzialan, tak aby istniala mozliwosc odtworzenia zaktualizowanych elementow bazy jednoznacznego przypisania
poszczegolnych dzialan zidentyfikowanym uzytkownikom.

Poprawnosc wewnetrznego przetwarzania
Poprawnie wprowadzone dane moga ulec zniszczeniu lub znieksztalceniu na skutek wewnetrznych bledow przetwarzania. Aplikacje
programowe powinny miec mechanizmy wykrywania takich uszkodzen. Konkretne mechanizmy zaleza od rodzaju aplikacji
programowej oraz natury przetwarzanych danych. Do przykladowych mechanizmow naleza:
mechanizmy sesyjne lub wsadowe, uzgadniajace bilanse plikow danych po uaktualnieniu zawartosci,
mechanizmy sumy kontrolnej oraz skrotu (hash).

Zabezpieczenia plikow systemowych aplikacji
Implementacja aplikacji programowej na platformie systemu operacyjnego powinna podlegac kontroli, tak aby zminimalizowac
ryzyko uszkodzenia systemu operacyjnego. Wspoldzialanie aplikacji programowych z systemem powinny zabezpieczac nastepujace
mechanizmy:
uaktualnianie bibliotek powinno byc przeprowadzone wylacznie przez uprawnionego uzytkownika,
jesli jest to mozliwe, do systemu operacyjnego powinny byc dolaczone pliki w kodzie wykonawczym,
kody wykonawcze nie powinny byc dolaczane do systemu, jesli nie przeszly pomyslnie testow, a odpowiednie biblioteki
programow zrodlowych nie zostaly uaktualnione,
wszystkie zmiany w bibliotekach oprogramowania operacyjnego powinny byc rejestrowane,
powinny byc zapisane na kopie zapasowe poprzednich wersji oprogramowania.

Zabezpieczanie danych testowych
Testy aplikacji programowych powinny byc przeprowadzane na testowych bazach danych. Nalezy unikac wykorzystywania do celow
testowych eksploatowanych aktualnie baz danych. Przy wykorzystaniu danych testowych nalezy przestrzegac nastepujacych
wytycznych:
procedury kontroli dostepu stosowane w aplikacjach systemowych powinny obowiazywac takze w aplikacjach testowych,
kazde kopiowanie rzeczywistych danych do systemow testowych powinno wymagac upowaznienia i byc wlasciwie udokumentowane,
dane rzeczywiste powinny zostac usuniete z systemow testowych natychmiast po tym, jak przestana byc potrzebne.

Zarzadzanie zmianami
Proces wprowadzania zmian powinien byc kontrolowany, tak aby zminimalizowac ryzyko uszkodzenia systemu informacyjnego, a
szczegolnie jego zabezpieczen. Programisci dokonujacy zmian powinni miec dostep do systemu w zakresie niezbednym do
wykonania zmian. Zarzadzanie zmianami w systemie operacyjnym i aplikacjach programowych powinno obejmowac: procedury
przyjmowania i dokonywania zmian oraz przeglad systemu operacyjnego i aplikacji programowych.
Procedura przyjmowania i dokonywania zmian powinna sie skladac z nastepujacych etapow:
a) uzgodnienie propozycji zmian oraz udokumentowanie uzgodnien miedzy wszystkimi upowaznionymi uzytkownikami,
administratorami, projektantami i wykonawcami,
b) analiza wplywu proponowanych zmian na dzialanie mechanizmow zabezpieczen oraz przeprowadzenie testow integralnosci
systemu zabezpieczenia,
c) zidentyfikowanie wszystkich aktywow systemu informacyjnego, w ktorych nalezy dokonac stosownych zmian,
d) zatwierdzenie proponowanych zmian przez upowaznione osoby,
e) uaktualnienie dokumentacji systemu, zapisanie kopii archiwalnych poprzednich wersji.

Informacje o wykrywanych slabosciach i bledach w systemach i aplikacjach programowych powinny byc na biezaco sledzone.
Po zainstalowaniu korekty systemu lub jego nowej wersji nalezy przeprowadzic analize ewentualnego wplywu zmian na poziom
zabezpieczenia systemu informacyjnego. Sledzenie zmian powinno byc obowiazkiem administratorow systemu informacyjnego.

W przypadku przeprowadzenia planowanych zmian nalezy wczesniej powiadomic uzytkownikow o mozliwosci przerwy w
funkcjonowaniu lub wplywie zmian na uzytkowanie systemu informacyjnego.

No o to by bylo na tyle jesli chodzi o temat zabezpieczania baz danych w teorii. Na pewno tekst ten przyda sie wielu osoba
planujacych miec w przyszlosci do czynienia z bazami danych oraz ich zabezpieczaniem. Wiecej informacji mozecie uzyskac w
necie. Sa tam tez dokladniejsze opisy algorytmow szyfrowania wraz z przedstawionymi juz gotowymi zrorami jak tego dokonac.
Nalezy jednak poswiecic nieco czasu na ich odnalezienie. W nastepnym artku postaram sie opisac pare rzeczy, ktore wplywaja
na dzialanie systemow baz danych. Zapraszam do dalszej lektury i pozdrawiam.



4.2 Krotkie formy: Prosta autoryzacja PHP+MySQL by ASSmodeus

  4.2.1 Przedmowa

Pomysl na ten tekst zrodzil sie po obejrzeniu jednego z zadan na NGSEC'u.
Trzeba bylo uzyskac dostep do zasobow przez podanie odpowiedniej nazwy
uzytkownika i hasla w formularzu. Dane uzytkownikow zapisane byly w bazie
MySQLowej. Sama autoryzacja przeprowadzana byla w skrypcie PHP.
Sprawa dosyc prosta, bo wszystkie dane zapisane byly w bazie czystym tekstem.
Ktos sie zapyta, po co w ogole o czyms takim pisac?
A ile jest serwisow tak beznadziejnie zabezpieczonych?
Wbrew pozorom sporo :-)

  4.2.2 Wstep

Co trzeba wiedziec?
Trzeba wiedziec, ze wlasnie z takim systemem autoryzacji mamy do czynienia :-)
Chociaz mozna probowac "na pale" ;-)
Jak zazwyczaj przebiega autoryzacja w takich systemach, Ci co nie wiedza,
dowiedza sie z tego dokumentu. Oczywiscie wspomne tez jak takie biedne
zabezpieczenia obejsc :-)
Bede podawal przyklady dla MySQL'a. Dla innych systemow bazodanowych, skladnia
polecenia SELECT moze sie nieznacznie roznic.

  4.2.3 Podstawy

Dane z tablic w MySQLu wyciaga sie poleceniem SELECT.
Trzeba pamietac, ze nazwa uzytkownika najczesciej zapisywana jest w polu 'user'
lub 'login', a haslo w 'password' badz 'pass'.
Dla naszych potrzeb przyjmijmy, ze wiemy, iz sa to pola 'user' i 'password';
Stad, jesli chcielibysmy sprawdzic czy w tabeli znajduje sie uzytkownik 'lamer'
z haslem '3133+', wpisujemy:

SELECT * FROM TAB_OF_USERS WHERE user='lamer' AND password='3133+';

Jesli TAKI uzytkownik z TAKIM haslem istnieje do zwroci nam przynajmniej
jeden wiersz z danymi.
No dobra, ale jak to nam sie przyda skoro mamy przed soba tylko formularz
z dwoma INPUTBOX'ami?
Musimy sprawdzic jak sie nazywaja te INPUTBOX'y. Zebysmy wiedzieli w jakich
zmiennych sa przekazywane interesujace nas wartosci.
Przyjmijmy dla podrzeb tego tekstu, ze w wyswietlonym zrodle strony ukazaly
sie naszym oczom takie wpisy:

<INPUT TYPE="text" NAME="login">
<BR>
<INPUT TYPE="password" NAME="pass">

Oczywiscie troszke upraszczam, ale idea jest mam nadzieje czytelna.
Mamy wiec juz nazwy zmiennych, w ktorych przesylane sa wprowadzone przez nas
dane.

  4.2.4 Konkrety

Teraz przydaloby sie wiedziec jak autoryzuje nas skrypt PHP.
Najczesciej wyglada to tak:

<?

//Podpiecie do bazy

$sql="SELECT * FROM $table_name WHERE user='$login' AND password='$pass'";
$result=@mysql_query($sql, $connection) or die("Bledne zapytanie");
$num=mysql_numrows($result);

if ($num != 0)
{
  //Udalo sie
}
else
{
  //spadaj lamo
}

?>

Teraz kilka slow wyjasnienia:
Zmienne w PHP porzedza sie znakiem $;
I tak w pierwszej linii tworzymy zmienna $sql z trescia naszego pytania
o uzytkownika. W miejsce zmiennych $table_name, $login, $pass wstawiane
sa przechowywane w nich wartosci. Nas oczywiscie interesuja 2 ostatnie :-)
W drugim wierszu wysylamy pytanie do bazy. W trzecim sprawdzamy ile wierszy
z danymi dostalismy w wyniku zapytania. 'IF' juz jest chyba zrozumialy :-)

No dobra i co dalej?
Pamietajmy, ze tak naprawde jedyne co mozemy zrobic z poziomu formularza na
stronie jest wprowadzanie odpowiednich danych do zmiennych $login i $pass.
Ale co by bylo jakbysmy wpisali do $login zamiast nazwy usera taki ciag:

' OR user!='

A do $pass:

' OR password!='

He?
Powstanie nam pytanie do bazy nastepujacej postaci:

SELECT * FROM TAB_OF_USERS WHERE user='' OR user!=''
AND password='' OR password!='';

Swita powoli? :-)
Po takim pytaniu baza wypisze nam wszystkie wiersze gdzie nazwa usera jest
pusta lub nie jest pusta i haslo jest puste badz nie jest :-)
A to znaczy ze wypisze wszystkie wiersze w tabeli :-)

Jesli tabela nie jest pusta to wierszy tych bedzie wiecej niz ZERO :-)
Wystarczy teraz wrocic do naszego 'IFa' zeby zrozumiec, ze juz jestesmy
autoryzowani.

  4.2.5 Podsumowanie

W sumie nie ciezko bylo na to wpasc samemu, ale z dosswiadczenia wiem,
ze czasem trzeba malego bodzca, zeby zobaczyc to co sie ma tuz pod nosem :-)
Jeszcze jedna ciekawostka na koniec.
Spotkalem sie z systemem, ktory po autoryzacji ustawial w cookies zmienna
$valid=1. Przy kazdej zmianie podstrony sprawdzal czy ta zmienna jest ustawiona
i ma wartosc 1. Jesli tak to sprawdzal w cookies nazwe usera i wyswietlal
strone zgodna z jego uprawnieniami.
O ile ciezko przewidziec jaka nazwe wymysli sobie Webmaster dla takiej zmiennej
$valid (zawsze moze sie przeciez inaczej nazywac), o tyle nazwe swojego usera
latwo w ciasteczkach namierzyc. Chyba nie musze mowic co sie stanie, gdy bedac
autoryzowanym uzytkownikiem zmienimy w plikach cookies swoj login na login
kogos innego np. admina :-)


4.3 MySQL - nieoczekiwane dane wejsciowe i ochrona zapytan SQL

Wiele osob wczesniej sie pytalo co ma wspolnego SQL z hackingiem? Czy wogole mozliwe jest
uszkodzenie bazy danych i po co tamten artykul zostal stworzony (patrz faq v2). Otoz
najpierw trzeba bylo nauczyc was jak tworzyc wlasne bazy danych oraz jak zarzadac wlasnymi
bazami danych. Teraz pokaze kilka technik jak mozna chronic zapytania SQL aby nasze bazy
danych mogly byc bezpieczniejsze oraz jak mozna troche zamieszac w bazach danych wykorzystujac
zapytania tego jezyka.
Mam nadzieje, ze dla tych osob, ktore jakis czas temu teraz sprawa nabierze zupelnie nowych
kolorow i sie co nieco rozjasni po co powstal pierwszy artykul na temat baz danych.
No to zaczynamy :)
Usiadzcie sobie wygodnie i przechodzimy do sedna sprawy.

JAk to w zyciu bywa na to co robimy musimy zwrocic szczegolna uwage. Bazy danych sa bardzo
podatne na ataki i jesli sie ich odpowiednio nie zabezpeiczy to pojawiaja sie klopoty. Aby
wykonac pewne zapytania baz danych nie bedac jej wlascicielem wystarczy do zapytan wstawic
odpowiednie polecenia, ktore zostana wykonane przez baze. Na przyklad mozemy sobie teraz
wyobrazic cos takiego jak aplikacja wyszukujaca w tabeli wiersz o wskazanej przez uzytkownika
wartosci jednego z pol. Zapytanie moze wygladac w przyblizeniu tak:

SELECT * FROM nazwa_tabeli WHERE a=$jakies_dane

W zapytaniu tym zostaje wstawiona wartosc przekazana przez uzytkownika i przekazana do bazy.
A teraz atakujacy moze przekazac nastepujacy ciag:

1; SELECT * FROM nazwa_tabeli WHERE b=4

Po wstawieniu do zapytania aplikacja przesle do bazy danych takie cus:

SELECT * FROM nazwa_tabeli WHERE a=1; SELECT * FROM nazwa_tabeli WHERE b=4

Moze to spowodowac (ale nie musi) wykonanie przez baze 2 osobnych zapytan. Najpierw pytania
zamierzonego a potem tego dodatkowego. A czemu nie musi go wykonac? A no temu, ze kazda baza
wykonuje dodatkowe polecenia w inny sposob i w niektorych dodatkowe polecenia sa po prostu
niedozwolone, albo wymagane sa dodatkowe znaki miedzy zapytaniami.

No i w takim przypadku jak ten powyzej sposob zwrocenia wyniku zalezy od mechanizmu zarzadzania
baza danych. Niektore bazy moga zwrocic dwa rozlaczne zbiory wynikow, inne zwroca tylko jeden zbior
dotyczacy pierwszego zapytania, a niektore zwroca to o co nam chodzilo.
Majac takie zapytanie:

SELECT * FROM nazwa_tabeli WHERE a=$jakies_dane AND c=3

mozna poinformaowac baze danych, aby ignorowal reszte polecenia. Jelsi polaczymy w ciag pytanie z
poprzedniego przykladu to pytanie wynikowe bedzie postaci:

SELECT * FROM nazwa_tabeli WHERE a=1; SELECT * FROM nazwa_tabeli WHERE b=4 AND c=3

Efektem jest dodanie do drugiego zapytania ciagu AND c=3, co moze nie odpowiadac zamierzenia atakujacego.
Trzeba w tym celu dodac znak komentarza do ciagu. Znak ten jest rozny dla roznych serwerow
baz danych. W bazach MySQL funkcje znaku komentarza spelnia znak #. Tak wiec aby pytanie
ma postac:

1; SELECT * FROM nazwa_tabeli WHERE b=4 #

i ostatecznie zapytanie bedzie mialo postac:

SELECT * FROM nazwa_tabeli WHERE a=1; SELECT * FROM nazwa_tabeli WHERE b=4 # AND c=3

i w efekcie fragment AND c=3 zostanie zignorowany.

Co jednak zrobic jesli nie znamy nazw baz danych i tabel oraz kolumn - to jest utrudnienie dla atakujacego
ale nic nie jest stracone. Rozne bazy danych oferuja rozne sposoby pzoyskania informacji o liscie zainstalowanych
w bazie tabel. W MS SQL jest mozliwe zapytanie do obiektu zawierajacego liste wszystkich obiektow zarejestrowanych
w bazie, z nazwami tabel i procedur wlacznie. Mamy tu do czynienia z sysobjects, do ktorego dajemy zapytanie:
SELECT * FROM sysobject.

O reszcie zapytan i wyciaganiu z baz danych loginu i hasla do konkretnego zasobu napisal juz ASSmodeus.

No dobra, ale pewnie sie teraz zastanawiacie jak sie przed tym chronic i jak chronic zapytania SQL. Jednym ze
sposobow jest cytowanie, ktore polega na zagwarantowaniu, ze przesylanie do bazy zapytania nie zawieraja nieprawidlowych
zestawow znakow. Perl zawiera caly szereg gotowych funkcji do cytowania.
W takim oto przykladzie:

sub quotedata {
            my $incoming=shift;
            $incoming=~s/['"]/''/g;
            return "'$incoming'";
               }

widac, ze wszystkie dane przekazane do bazy sa przekazywane przez funkcje, ktora zastepuje wszystkie wystapienia dowolnego
ze znakow cudzyslowia dwoma znakami pojedynczego cudzyslowu. Nastepnei ciag ten jest ujmowany w pojedyncze znaki znaki
cudzyslowu i jest zwracany w takiej postaci. Tak zdefiniowana funkcje mozna wykorzystac w aplikacji w nastepujacy sposob:

$quoted_data = quote_data($data);
$sql_query = "SELECT * FROM nazwa_tabeli WHERE column = $quoted_data";

W ten oto sposob mozna poczuc sie bezpieczniej. Ale nie gwarantuje to bezwzglednego bezpieczenstwa.

Na sam koniec cos o MySQLu i oferowanym przez ta baze danych zabezpieczen.
Baza danych MySQL posiada mozliwosc odczytywania danych z plikow i zapisywania w nich wynikow przy uzyciu skladni zapytan:

SELECT * INTO FILE "/plik/wynikow.db" FROM tabela

Mozna to ograniczyc poprzez odebranie wszystkim uzytkownikom bazy danych uprawnien do manipulacji plikami.
No i to wszystko co powinniscie wiedziec. Artykul ten powstal na podstawie ksiazki: Hack Proofing Your Network, ktora polecam
wszystkim tym, ktorzy chca poszerzac swoje wiadomosci - ksiazka jest naprawde dobra, choc na pierwszy rzut oka wydaje sie
bezuzyteczna to jednak po dokladniejszym przestudiowaniu mozna dowiedziec sie sporo ciekawych rzeczy ;) Po prostu warta swojej
ceny.


------------------------------------------------------------------------------------------
5. Programowanie


5.1 Bash - podstawy programowania by rafal[eR]

Powloka, inaczej interpretator polecen. Jezeli pracowales kiedy kolwiek w DOSie
to twoje polecenia wykonywala powloka zwana command.com Bash jest jedna z
najczesciej uzywanych powlok w systemie Linux totez praca z nia powinna byc
mila i przyjemna a jezeli ma byc mila to powinna byc dosyc prosta, do tego sluza
skrypty powloki ktore automatyzuja niektore czynnosci ktore przykladowy adminstrator
systemu wykonuje. Na poczatek przeanalizujmy prosty przyklad skryptu:

#!/bin/sh
echo "Ten skrypt nosi nazwe: $0"
echo Argument 1: $1
echo Argument 2: $2

Pierwszy wiersz nakazuje Linuxowi, by uruchomil program /bin/sh ktory przetworzy
nastepne linijki skryptu. Nazwa /bin/sh jest laczem symbolicznym do /bin/bash
bedacego wlasciwym programem Bash. Zapisz plik jako tescik. Nadaj mu parametry
chmod +x tescik przez co uczynisz go wykonywalnym. Piszemy ./tescik  Wynik:

[19:15][r00t@misecure:~/home/r00t]$ ./tescik
Ten skrypt nosi nazwe: ./tescik
Argument 1:
Argument 2:

Nazwa pliku skryptu pojawila si ejako wzgledna w stosunku do katalogu biezacego,
rezprezentowanego tu przez kropke. Skrypt nie wyswietlil zadnego argumentu, poniewaz
owych argumentow nie posiada. Sprobujemy teraz utworzyc owe argumenty :)

[19:25][r00t@misecure:~/home/r00t]$ ./tescik "Zeby wyswielic caly argument
umieszczany go w cudzyslow" albo-piszemy-lacznie

Ten skrypt nosi nazwe: ./tescik
Argument 1: Zeby wyswielic caly argument umieszczany go w cudzyslow
Argument 2: albo-piszemy-lacznie

Jak widac, caly lancuch powloka traktuje jako jeden argument, gdy brak cudzyslowu
powloka uznaje spacje za separatory argumentow wiersza polecen.
Zmienne w Bashu definiuje sie tak samo jak zmienne srodowiska. Zatem zmienna mozna
zdefiniowac nastepujaco:
licznik=13
Aby uzyc wartosci zmiennej poprzedz nazwe zmiennej znakiem $ na przyklad $PATH
reprezentuje wartosc zmiennej o nazwie "licznik", mozna wiec posluzyc sie poleceniem:
echo $licznik
Bash ma kilka zmiennych specjalnych zapewniajacych dostep do argumentow wiersza polecen
W skrypcie powloki zmienna $0 owoluje sie do nazwy skryptu. Zmienne $1, $2 itd. odwoluja
sie do argumentow wiersza polecen. Mozna sie rowniez zwrocic do uzytkownika o podanie
danych i uzyc polecenia "read" do odczytania tych danych i umieszczenia w zmiennej:

#!/bin/sh
echo "Identyfikator Systemu"
echo -n "Podaj identyfikator: "
read identyfikator
echo "Twoj identyfikator to: $identyfikator"
  
Opcja -n w poleceniu "echo" wylacza automatycznie dodawanie nowego wiersza na koncu
wyswietlanego tekstu. Efekt takiego skryptu to:

[19:43][r00t@misecure:~/home/r00t]$ ./tescik
Identyfikator Systemu
Podaj identyfikator: r00t
Twoj identyfikator to: r00t

W skryptach powloki Bash, funkcje sterujace takie jak: if, case, for i while
na podstawie stanu zakonczenia polecenia decyduja o tym, co dalej robic. Kazde
wykonane polecenie zwraca stan zakonczenia, wartosc liczbowa wskazuje czy polecenie
zakonczylo sie sukcesem. Przyjeto ze stan zakonczenia rowny jest 0.

Mozna napisac skrypt, ktory zanim dany plik zostanie otwarty w edytorze vi utworzy
jego kopie zapasowa w nastepujacy sposob:
  
#!/bin/sh
if cp "$1" "#$1"
then
    vi "$1"
else
echo "Utworzenie kopii zapasowej bylo niemozliwe"
fi

Bash zawiera  polecenie "test", pozwalajace obliczyc dowolne wyrazenie i uzyc
wartosci wyrazenia jako stanu zakonczenia polecenia. Przypuscmy ze potrzebny jest
skrypt, ktory przechodzi do edycji wtedy gdy plik istnieje. Wykorzystujac "test"
piszemy nastepujacy skrypt:

#!/bin/sh
if test -f "$1"
then
vi "$1"
else
echo "Nie ma takiego pliku"
fi

W krotszej formie polecenia "test" pomija sie wyraz test, opcje polecenia zas
umieszcza sie w nawiasie kwadratowym. Korzystajac z tego zapisu, wczesniejszy
skrypt mozna zapisac nastepujaco:

#!/bin/sh
if [ -f "$1" ]
then
vi "$1"
else
echo "Nie ma takiego pliku"
fi

Inna konstrukcja jest petla "for" Nastepny skrypt dodaje kolejne liczby od
jednego do dziesieciu:

#!/bin/sh
suma=0
for i in 1 2 3 4 5 6 7 8 9 10
do
suma=`expr $suma + $i`
done
echo "Suma = $suma"

Przyklad ten stanowi ilustracje uzycia polecenia "expr" do obliczenia wyrazenia
Natomiast wynik:

[20:28][r00t@misecure:~/home/r00t]$ ./tescik
Suma = 55
       
Bash ma ponad 50 funkcji wbudowanych i duzo miejsca, zabralo by tu opisanie
wszystkich po kolei zatem po przedstawieniu ogolnego zarysu powstawania
skryptow powloki zachem do lektury "man bash" :)


5.2 Przepelnianie bufora by CZaR|Ny

Przepelnianie bufora jest to atak polegajacy na przeslaniu wiekszej ilosci danych niz spodziewa
sie aplikacja, ktora jest nieprzystosowana do obslugi nadmiarowych danych. Do pisania tego typu
aplikacji wykorzystujacych przepelnianie bufora najlepiej skorzystac z jezykow C/C++. Jezyki te
nieprawidlowo obsluguja nadmiarowe dane.

Ponizej przedstawie kod programu, ktorego glownym celem jest niekontrolowane przepelnienie
bufora. A wiec, jak macie ochote to odpalcie sobie jakis kompilator C i wklejcie to zrodelko,
skompilujcie i uruchomcie. Na razie program dziala tylko na Windowsach - ja go testowalem na
win98se i po 20 minutach juz z winda sie nic nie dalo zrobic, ale na kazdym kopie to bedzie roznie
dzialalo, wiec ten program ma tylko pokazac jak dziala mechanizm przepelniania bufora.

Oto to zrodelko - jak chcecie sie pobawic to sobie testujcie, ale nie ponosze za to zadnej odpowiedzialnosci.
Poza tym nie jest to zaden super-hiper chaX00rski program - tylko program ilustrujacy mechanizm przepelniania
bufora.

---------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#define ARGH 01001101

int bof()
{

char buffer[8];
strcpy(buffer, "ABCDEFGHIJKLMNOPQRSTUWXYZ");
return 1;
}
int main(int argc, char **argv)
{
int i;
int j;
int licznik;
  for (i=0; i<4; i++)
     {
     licznik++;
     printf("%d\n", licznik);
       for (j=0; j<4; j++)
            {
             licznik--;
             printf("%d\n", licznik);
            }      
     printf("%n!!!!\n", ARGH);
     }
bof();
printf("DON'T DO IT!!!!\n");
return 1;
}

----------------------------------------------------------------------

Nie jest to dobry sposob na przeprowadzenie ataku, no chyba ze na sobie :) Demonstruje on
tylko jeden z bledow programistycznych oraz jego wplyw na stabilnosc programu.
Wywolujemy tutaj funkce bof(), w ktorej nastepuje proba skopiowania ciagu 'ABCDEFGHIJKLMNOPQRSTUWXYZ'
do bufora, ktory moze poiescic najwyzej 8 znakow danych. No i nastepuje przepelnienie bufora.
Funkcja printf() nigdy nie wyswietli komunikatu "DON'T DO IT" poniewaz nastapi modyfikacja adresu
powrotnego funkcji bof().
No i w ten sposob widac jak czasem nieswiadomie napisane przez nas programy dzialaja zupelnie inaczej
niz oczekiwalismy i do tego potafia zwiesic nam system.
Dlatego jak juz bierzecie sie za programowanie to pamietajcie - robcie to powoli, ale z glowa, a Wasz
program bedzie zawsze dzialal zgodnie z tym co sobie zalozyliscie.


5.3 Wywolanie fork() a bezpieczenstwo by veth0n

5.3.1. Wstep
========
Kazdy kto kiedykolwiek programowal w systemach unix-owych z pewnoscia zna ta
funkcje. Dlatego nie bede sie rozwodzil nad opisywaniem jej dzialania. Mowiac
(piszac) krotko jej wywolanie powoduje rozmnozenie procesu, czyli utworzenie
identycznego (prawie) procesu potomnego. Po wiecej szczegolow odsylam do
podrecznika man (fork(2) i innych stron z sekcji SEE ALSO manuala). Jednak czesc
programistow nie wie, ze ta bardzo pozyteczna funkcja, oprocz zalet ma tez
wady. O tym wlasnie bedzie ten tekst, kilka mysli na temat funkcji fork() a
bezpieczenstwa systemu. Mam nadzieje, ze komus sie to przyda i pomoze.
Zycze milej lektury...

5.3.2. Wywolanie fork()
===================
Prototyp funkcji fork():

pid_t fork(void);

Jak widac funkcja po wywolaniu wykonuje swoje zadanie - rozmnaza proces a
nastepnie zwraca dwie (!) wartosci typu pid_t. Sa to (w przypadku powodzenia): 0
do procesu podrzednego i wartosc dodatnia do procesu nadrzednego. Dlatego w
wielu programach czesto znajdujemy nastepujacy kod:

...
pid_t child_pid;
...
if((child_pid = fork()) < 0) {
...
/* obsluga bledow */
return -1;
}
else if(child_pid == 0) {
...
/* kod wykonywany przez proces potomny */
...
}
else {
...
/* kod wykonywany przez proces nadrzedny (czesto wywolania funkcji wait(),
           waitpid(), itp.) */
...
}

Widac, ze wartosc zwrocona przez fork jest sprawdzana 3 razy. Dlaczego? Pierwsza
instukcja warunkowa to sprawdzenie, czy wywolanie fork() wogole sie powiodlo,
kolejne to juz miejsce na kod dla procesu podrzednego i nadrzednego. Takie
sprawdzenie od razu informuje, w ktorym procesie jestesmy i pozwala na
wykonywanie w nim przeznaczonego kodu (zamknietego w bloku instrukcji
warunkowej). Tak zakodowane wywolanie funkcji fork() z uzyciem jednej z funkcji
wait() w procesie nadrzednym jest absolutnie prawidlowe i jezeli programista
pamieta o zagrozeniu typu race condition (stan wyscigu) takze bezpieczne.
W wielu programach wywolanie fork() sprowadza sie jednak do:

...
fork();
...

Czy jest to wywolanie prawidlowe? Tak, ale pod pewnymi warunkami... O ile w
poprzednim przykladzie uwaga programisty powinna skupic sie na niewywolaniu
innego bledu w sztuce programowania, bo zapis wywolania fork() w instrukcji
if-else jest jak najbardziej bezpieczny, o tyle w tym wypadku programista ma o
wiele wiecej na glowie. Oprocz wyzej wymienionych zagrozen przy takim wywolaniu
pojawiaja sie zupelnie nowe (o czym w nastepnych punktach).

5.3.3. Race condition
=================
Niezaleznie od sposobu wywolania funkcji fork() zagrozenie bledem typu race
condition wystepuje zawsze (i to nie tylko przy uzywaniu fork()). Oto
przykladowy (bardzo obrazowy) kod:

...
pid_t child_pid;
int licznik;
...
if((child_pid = fork()) < 0) {
...
/* obsluga bledow */
return -1;
}
else if(child_pid == 0) {
...
++licznik;
...
}
else {
...
--licznik;
...
}

Poniewaz funkcja fork() nie gwarantuje zatrzymania procesu nadrzednego, dopoki
nie wykona sie proces podrzedny (chyba, ze uzywamy funkcji z grupy wait()), jej
dzialanie jest asynchroniczne, pojawia sie tu zagrozenie typu race condition. W
tym przypadku oba procesy operuja na tych samych danych, a to, ktory w jakiej
kolejnosci przeprowadzi na nich zaprogramowane zadania jest praktycznie
przypadkowe. Nie wiadomo, ktory kod wykona sie najpierw, czy dla procesu
potomnego, czy nadrzednego. Tego rodzaju bledy sa trudne do wysledzenia, gdyz
program moze dzialac prawidlowo i mozemy otrzymywac poprawne wyniki. Nalezy
pamietac, ze wywolanie funkcji fork() powoduje asynchroniczne dzialanie procesu
nadrzednego i procesow potomnych. Pomocna w tym wypadku moze byc funkcja
vfork(2).

5.3.4. Zagrozenia zalezne od wywolania
==================================
Jak juz pisalem wywolanie:

...
fork();
...

moze byc zrodlem wielu niebezpieczenstw... Jezeli w kodzie programu w pewnym
momencie pojawi sie wywolanie jak wyzej to utworzony proces potomny bedzie wraz
z nadrzednym wykonywal nastepna instrukcje, nastepna i kolejna, itd. Co zatem,
jesli nieuwazny programista umiesci jeszcze jedno wywolanie fork() kilka
instrukcji dalej? Nie rozmnozy sie tylko proces podrzedny, ale i nadrzedny. W
rezultacie otrzymamy 4 procesy (1 nadrzedny, 3  potomne). Co, jesli programista
jeszcze raz wywola fork()? Bedziemy mieli 8 procesow (a 3 wywolania fork()).
Ogolnie ilosc procesow (nadrzednego z potomnymi) mozna latwo obliczyc jako
odpowiednie wyrazy ciagu rekurencyjnego:

a(1) = 2
a(n + 1) = 2a(n)

Zatem 1 wywolanie daje 2 procesy, 2 - 4, 3 - 8, 4 - 16, 5 - 32, 6 - 64, itd.
Jezeli system jest obciazony a programista nieuwazny to moze sobie sam
zafundowac atak DoS. Dla przykladu, uruchom nastepujacy program:

/* fork.c */

#include<unistd.h>

main(void)
{
fork();
fork();
fork();
fork();
fork();
fork();
sleep(20);
return 0;
}

/* EOF */

skompiluj poleceniem:

gcc fork.c -o a

uruchom:

./a

i szybko (masz mniej niz 20 sekund) wykonaj polecenie:

ps | grep \.\/a | wc -l

Powinienes otrzymac 64. Zatem ten maly programik stworzyl nam 63
procesy...dobrze ze nie jest skomplikowany i nie wykonuje obliczen naukowych ;)
(A wlasnie fork() wykorzystuje sie, zeby szybciej otrzymac rezultaty, przez
wykonywanie obliczen przez kilka (?) procesow potomnych.)

5.3.5. Local DoS with fork()
========================

/* local_dos_with_fork.c /*

#include<unistd.h>

main(void)
{
while(1)
fork();
return 0;
}

/* EOF */

$gcc local_dos_with_fork.c
$./a.out

U mnie na FreeBSD 4.5 z X-ami i tylko jednym zalogowanym uzytkownikiem system
zatrzymal sie w mgnieniu oka i pozostal tylko reset... Co sie stalo???
Ten malutki programik utworzyl tyle procesow, ze procesor musial rzucic wszystko
i tworzyc tylko te procesy. Zapchala sie tabela procesow jadra i wogole wszystko
sie zapchalo, popsulo i wszystko diabli wzieli. Ale po restarcie bylo O.K.

5.3.6. Wnioski
==========
fork() to bardzo pozyteczne wywolanie i wogole niezbedne, ale nalezy go uzywac z
rozwaga, bo oprocz korzysci moze przyniesc takze klopoty.

5.3.7.Podsumowanie (slowo koncowe ;)
===================================
Skonczyly mi sie pomysly jak mi cos przyjdzie do glowy to zrobie update...

To bylby juz chyba koniec.



5.4 Programowanie sieciowe w Linuxie by Szczelba

  5.4.1 PROLOG

Artykul ten, jak sama nazwa wskazuje, bedzie o programowaniu uslug
sieciowych. Zajmiemy sie glownie gniazdami bo od tego trzeba zaczac.
Bedzie to tylko streszczenie najwaznejszych informacji dotyczacych
opisywanego zadagnienia, poniewaz caly temat jest bardzo obszerny
A wiec bez dlugiego lania wody - zaczynamy!


  5.4.2 GNIAZDA

Na poczatku trzeba wiedziec co to jest GNIAZDO.
Pelni ono role podobna do aparatu telefonicznego.
Zalozmy, ze chcemy gdzies zadzwonic. Podnosimy wiec sluchawke,
wykrecamy numer i czekamy az ktos odbierze z drugiej strony.
Jesli sie doczekamy, mozemy zaczac rozmawiac (czyt. przekazywac informacje).
Podobnie jest z gniazdami. Gniazdo mozemy porownac do aparatu telefonicznego
- mozemy przez nie nadawac i odbierac informacje. Do utworzenia
polaczenia potrzebne sa dwa gniazda (nie mozna informacji wysylac w kosmos :]).
Do utworzenia gniazda sluzy funkcja socket(). Prototyp tej funkcji wyglada tak:

----------CUT-HERE-------------------
#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
----------CUT-HERE-------------------

Istnieje duzo mozliwosci wyboru roznych argumentow funkcji, ale zajmiemy
sie tylko wybranymi.
Pierwszy argument nie stwarza duzo problemow. Mamy do wyboru makra:
PF_LOCAL lub PF_INET. Pierwsze odnosi sie do gniazd lokalnych a drugie
do internetowych.
Drugi argument informuje, w jaki sposob gniazdo bedzie komunikowac sie
z programem. Najczesciej korzysta sie z typu SOCK_STREAM.
Za trzeci argument zwykle podaje sie 0 ("zero") i w ten sposob program
sam dobierze sobie odpowiedni protokol do podanych wczesniej parametrow
Przyklad:

----------CUT-HERE-------------------
#include <sys/types.h>
#include <sys/socket.h>

main() {

int s;                               /* definiujemy deskryptor */

s = socket(PF_INET, SOCK_STREAM, 0);
if ( s == -1 ) {                     /* sprawdzamy czy nie ma bledu */
perror("socket");
exit(EXIT_FAILURE);
}

close(s);      /* zamykamy gniazdo */
}
----------CUT-HERE-------------------


  5.4.3 WIAZANIE ADRESOW Z GNIAZDEM

Po utworzeniu gniazda nalezy powiazac z nim adres, aby mozna bylo
sie w jakis sposob do niego odwolac. Sluzy do tego funkcja bind().
Jej prototyp:

----------CUT-HERE-------------------
#include <sys/types.h>
#include <sys/socket.h>

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
----------CUT-HERE-------------------

Argument:
1. Jest to deskryptor pliku gniazda sockfd, zwrocony przez wczesniejsze
odwolanie do funkcji socket() (w naszym przypadku zmienna 's').
2. Adres my_addr, ktory ma zostac przypisany gniazdu.
3. Dlugosc adresu my_addr.

Ogolna struktura adresu gniazda wyglada tak:

struct sockaddr {
sa_family_t  sa_family;     /* rodzina adresow */
char         sa_data[14];   /* dane adresu */
};

Struktura adresow lokalnych (PF_LOCAL) nosi nazwe sockaddr_un, zas adresow
internetowych (PF_INET) sockaddr_in. Zajmiemy sie glownie tym drugim
przypadkiem. Zobaczmy wiec jak wyglada jego struktura:

struct sockaddr_in {
sa_family_t     sin_family;   /* rodzina adresow */
uint16_t        sin_port;     /* numer portu */
struct in_addr  sin_addr;     /* adres internetowy */
unsigned char   sin_zero[8];  /* bajty dopelniajace */
};

struct in_addr {
uint32_t        s_addr;       /* adres internetowy */
};

Moze to wygladac troche skomplikowanie, ale tak na prawde takie nie jest ;).
Czyli tak: sin_family oznacza rodzine adresow - do wyboru PF_INET i PF_LOCAL -
wiadomo o co chodzi, sin_port to port na ktorym gniazdo bedzie nasluchiwac,
sin_addr to adres internetowy gniazda, a sin_zero nie trzeba sie przejmowac
bo nie jest obecnie wkorzystywane.
Popatrzcie teraz na obszerniejszy przyklad kodu tworzacego gniazdo
i przypisujacego mu adres.

----------CUT-HERE-------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>

main() {

int s, z, dl;
struct sockaddr_in adr_inet;

/* tworzymy gniazdo */
s = socket(PF_INET, SOCK_STREAM, 0);
if ( s == -1 ) {
  perror("socket");
  exit(EXIT_FAILURE); }

/* tworzymy adres PF_INET */
memset(&adr_inet, 0, sizeof adr_inet);

adr_inet.sin_family = PF_INET;     /* rodzina adresow internetowych PF_INET */
adr_inet.sin_port = htons(9000);   /* port 9000, htons - translacja numeru
       portu */
      
adr_inet.sin_addr.s_addr = inet_addr("127.0.0.23");  /* przetlumaczenie adresu
         internetowego */
dl = sizeof adr_inet;              /* wyznaczenie dlugosci adresu */

/* wiazemy adres z gniazdem */
z = bind(s, (struct sockaddr *)&adr_inet, dl);
if ( z == -1 ) {
  perror("bind");
  exit(EXIT_FAILURE); }
  
close(s);                          /* zamykamy gniazdo */
return 0;
}
----------CUT-HERE-------------------


  5.4.4 POLACZENIE Z UTWORZONYM GNIAZDEM

Po utworzeniu gniazda i przypisaniu mu adresu i numeru portu nalezy
powiedziec gniazdu, ze ma oczekiwac na polaczenia i ew. akceptowac je.
Sluza do tego funkcje listen() i accept().

----------CUT-HERE-------------------
#include <sys/socket.h>

int listen(int s, int backlog);
----------CUT-HERE-------------------

Gdzie:
s - gniazdo, na ktorym ma nasluchiwac
backlog - liczba, ktora definiuje ile polaczen moze oczekiwac w kolejce

----------CUT-HERE-------------------
#include <sys/types.h>
#include <sys/socket.h>

int accept(int s, struct sockaddr *addr, int *addrlen);
----------CUT-HERE-------------------

Gdzie:
s - gniazdo, odbierajace dane
addr - wskaznik do struktury adresu gniazda, ktore odbierac bedzie
       adres gniazda klienta
addrlen - wskaznik do maksymalnej dlugosci bufora addr

Do polaczenia z nasluchujacym gniazdem sluzy funkcja connect().

---------CUT-HERE-------------------
#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, struct sockaddr_in *serv_addr, int addrlen);
----------CUT-HERE-------------------

Funkcji tej uzywa sie oczywiscie w programie klienta, a funkcji listen()
i accept() w programie serwera.
Dobra, to popatrzcie teraz na kod serwera, ktory tworzy gniazdo,
przypisuje mu adres, a nastepnie czeka na polaczenie.

----------CUT-HERE-------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>

main() {

int s, z, dl, c;
struct sockaddr_in adr_serw;
struct sockaddr_in adr_klnt;

s = socket(PF_INET, SOCK_STREAM, 0);
if ( s == -1 ) {
  perror("socket");
  exit(EXIT_FAILURE); }

memset(&adr_serw, 0, sizeof adr_serw);
adr_serw.sin_family = PF_INET;
adr_serw.sin_port = htons(9000);
adr_serw.sin_addr.s_addr = inet_addr("127.0.0.23");  /* Dlaczego 127.0.0.23 ?
A czemu nie ? :) */
dl = sizeof adr_serw;

z = bind(s, (struct sockaddr *)&adr_serw, dl);
if ( z == -1 ) {
  perror("bind");
  exit(EXIT_FAILURE); }

z = listen(s, 10); /* wlaczamy nasluchiwanie */
if ( z == -1 ) {
  perror("listen");
  exit(EXIT_FAILURE); }

for (;;) { /* rozpoczynamy petle serwera */
  dl = sizeof adr_klnt;
  c = accept(s, (struct sockaddr *)&adr_klnt, &dl); /* akceptujemy polaczenie */
  if ( c == -1 ) {
   perror("accept");
   exit(EXIT_FAILURE); }
  
  /* tu teraz powinien wystapic jakis fragment kodu dotyczacy interakcji
     pomiedzy serwerem a klientem (narazie opuszczamy) */

  close(c);    /* zamkniecie polaczenia */
}

/* Tu nigdy nie docieramy */
return 0;
}  
----------CUT-HERE-------------------

A teraz klient:

----------CUT-HERE-------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/inh>

main() {

int s, z, dl, c;
struct sockaddr_in adr_serw;
struct sockaddr_in adr_klnt;

s = socket(PF_INET, SOCK_STREAM, 0);
if ( s == -1 ) {
  perror("socket");
  exit(EXIT_FAILURE); }

memset(&adr_serw, 0, sizeof adr_serw);
adr_serw.sin_family = PF_INET;
adr_serw.sin_port = htons(9000);
adr_serw.sin_addr.s_addr = inet_addr("127.0.0.23");  
dl = sizeof adr_serw;

z = connect(s, &adr_serw, dl); /* laczymy sie z serwerem */
if ( z == -1 ) {
  perror("connect");
  exit(EXIT_FAILURE); }

  /* tu teraz powinien wystapic jakis fragment kodu dotyczacy interakcji
     pomiedzy serwerem a klientem (narazie opuszczamy) */

close(s);
return 0;
}
----------CUT-HERE-------------------


  5.4.5 INTERAKCJA POMIEDZY SERWEREM A KLIENTEM

To teraz cos o wspomnianej wczesniej interakcji. Chodzi o przesylanie
informacji, a konkretnie prostego tekstu. Uzywamy tu funkcji read()
i write().

----------CUT-HERE-------------------
#include <stdio.h>

int write(int connectionfd, char buf, int bufsize);
----------CUT-HERE-------------------

----------CUT-HERE-------------------
#include <stdio.h>

int read(int connectionfd, char *buf, int bufsize);
----------CUT-HERE-------------------

Gdzie:
1. connectionfd - deskryptor zaakceptowanego polaczenia
2. *buf - wskaznik do bufora przechowujacego przesylane dane
3. bufsize - rozmiar bufora


Ponizej w calosci przedstawiam kod serwera i klienta.

Serwer:
----------CUT-HERE-------------------
/* serwer.c - by Szczelba */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>

blad(const char *cojest) {             /* funkcja raportujaca bledy */
perror(cojest);
exit(EXIT_FAILURE);
}

main() {

int s, z, dl, c;
struct sockaddr_in adr_serw;
struct sockaddr_in adr_klnt;
char buf[] = "To jest nowe gniazdo mojej produkcji !\n";  /* tekst przeslany
      do klienta */

s = socket(PF_INET, SOCK_STREAM, 0);
if ( s == -1 )
  blad("socket");

memset(&adr_serw, 0, sizeof adr_serw);
adr_serw.sin_family = PF_INET;
adr_serw.sin_port = htons(9000);
adr_serw.sin_addr.s_addr = inet_addr("127.0.0.23");
dl = sizeof adr_serw;

z = bind(s, (struct sockaddr *)&adr_serw, dl);
if ( z == -1 )
  blad("bind");

z = listen(s, 10);
if ( z == -1 )
  blad("listen");

for (;;) {
  dl = sizeof adr_klnt;
  c = accept(s, (struct sockaddr_in *)&adr_klnt, &dl);
  if ( c == -1 )
   blad("accept");
  
  z = write(c, buf, sizeof buf);
  if ( z == -1 )
   blad("write");
  
  close(c);
}

return 0;
}
----------CUT-HERE-------------------  

Klient:
----------CUT-HERE-------------------
/* klient.c - by Szczelba */
#include <stdio.h>
#include <stdlib.h>
#include <unistdh>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socketh>
#include <netinet/in.h>

blad(const char *cojest) {
perror(cojest);
exit(EXIT_FAILURE);
}

main() {

int s, z, dl, c;
struct sockaddr_in adr_serw;
struct sockaddr_in adr_klnt;
char buf2[128];                 /* bufor odbierajacy dane */

s = socket(PF_INET, SOCK_STREAM, 0);
if ( s == -1 )
  blad("socket");

memset(&adr_serw, 0, sizeof adr_serw);
adr_serw.sin_family = PF_INET;
adr_serw.sin_port = htons(9000);
adr_serw.sin_addr.s_addr = inet_addr("127.0.0.23");
dl = sizeof adr_serw;

z = connect(s, &adr_serw, dl);
if ( z == -1 )
  blad("connect");

z = read(s, &buf2, sizeof buf2-1);
if ( z == -1 )
  blad("read");

printf("Otrzymano: %s\n", buf2);

close(s);
return 0;
}
----------CUT-HERE-------------------

Uzycie:
Na jednej konsoli odpalamy program serwera (najlepiej w tle)
   #./serw &
a na drugiej klienta:
  #./klient
i otrzymujemy wynik.
Oczywiscie dane mozna przesylac w obie strony, zarowno od serwera jak i
do niego.  
Do polaczenia z serwerem mozemy rowniez uzywac zwyklego telneta:
#telnet 127.0.0.23 9000
i otrzymamy to samo co po uzyciu programu klient.c.


  5.4.6 EPILOG
To narazie tyle wiadomosci o gniazdach. Jak wszystko potoczy sie dobrze
( przygotowania do matury :/ ) to moze bedzie i druga czesc.
3mcie sie!


5.5 Skrypt do sprawdzania serwerow Proxy by CZaR|Ny

Powinniscie juz wiedziec co to jest proxy i jak go uzywac. Jesli nie wiecie co to takiego ten
serwer proxy to tak slowem wstepu: jest to nic innego jak komputer z bardzo duzym dyskiem twardym,
ktory sledzi przeplywajace przez niego dane i zapisuje je na dysku. Kiedy pojawia sie ktos kto
chcialby sciagnac jakis plik, ktory byl juz sciagany przez kogos innego to dostaje on kopie zapasowa
pliczku, a dzieje sie tak dlatego, bo plik przy sciaganiu przez serwer proxy zapisuje sciagany plik
na swoim dysku - pomyslowe, no nie? ;) Istotne jest to, ze serwery proxy maskuja adresy komputerow,
ktore sie z nimi polaczyly. I to wlasnie jest dla nas najwazniejsze. Tylko, ze musimy wybierac serwery
proxy z odleglych krajow, tak zebysmy nie zostali namierzeni. To tyle jesli chodzi o teorie.
jak wiadomo nie wszystkie serwery proxy sa anonimowe, a nam przeciez chodzi nieraz o to zeby sie dobrze
ukryc. No dobra, polaczylismy sie z serwerem ale nie mamy 100% pewnosci, ze jestesmy dobrze ukryci i co
w takim wypadku? Trzeba przetestowac dany serwerek, zeby miec ta pewnosc, ze jestesmy ukryci - co prawda
nigdy nie mozna miec na 100% pewnosci, ze jestesmy tak zamaskowani, ze po prostu nie do wykrycia. To
jest prawde mowiac bledne podejscie do sprawy, bo niestety wszystko zawsze zostaje w logach i jakby ktos
bardzo chcial nas namierzyc to jest to tylko kwestia czasu, ale komu by sie chcialo tak prawde mowiac ;)
No wiec chcemy sprawdzic czy jestesmy widoczni, czy serwer proxy zamaskowal nasze IP - w tym momencie
jesli nie znamy adresow stronek, ktore wyciagnelyby nasze IP i pokazaly czy jestesmy anonimowi to
jestesmy w kropce. Trzeba sie po prostu albo nameczyc, zeby cos takiego znalezc, albo napisac wlasny
skrypcik i wrzucic go na swoje konto i uzywac kiedy tylko bedziemy chcieli to sprawdzic.
No dobra? Ale jak takie cos napisac? Przeciez to jest trudne! I znowu blad w mysleniu - ten skrypt
jest tak prosty do napisania, ze to jest po prostu dla wszystkich zielonych w PHP tak proste i oczywiste
ze chyba bardziej nie moglo byc.
Wiec otwieramy notatnik pod Windowsem NotePad lub WordPad a pod Linuxem lub Unixem albo Pico albo Vi i
wpisujemy tam cos takiego:

------------------- Tnij stad ------------------

<?php
$adresip = getenv(REMOTE_ADDR);
$host = gethostbyaddr($REMOTE_ADDR);
echo ("IP: $adresip<br><br>");
echo ("Host: $host<br><br>");
?>

----------------- Tnij dotad --------------------


Teraz maly opis tego skryptu:
$adresip i $host sa to zmiennne w tym skrypcie i to one pobieraja z funkcji dane i wyswietlaja te dane.
$adresip = getenv(REMOTE_ADDR) - zmienna adresip pobiera z funkcji getenv dane o IP komputera laczacego sie.
$host = gethostbyaddr($REMOTE_ADDR) - zmienna host pobiera z funkcji gethostbyaddr nazwe hosta laczacego sie
                                      z serwerem na ktorym jest skrypt.
Funkcja echo sluzy oczywiscie do tego aby zmienne $adresip i $host zostaly wyswietlone na stronie, czyli
na przyklad jesli nie laczymy sie przez PROXY, lub adres ten nie jest anonimowy to powinnismy wtedy zobaczyc
cos takiego:

       przypuscmy ze Twoj adres IP to: 80.234.12.142, a host to: 80-234-12-142.HOST.PL

to wynik dzialania skryptu bedzie nastepujacy:

          IP: 80.234.12.142
          HOST:  80-234-12-142.HOST.PL

i wtedy mozemy powiedziec, ze albo nie uzywamy serwera proxy, lub ten serwer proxy nie jest anonimowy i wtedy
musimy poszukac jakiegos, ktory da nam ta anonimowosc. Gdy trafimy na taki to np. wynik dzialania skryptu moze
byc nastepujacy:

          IP: 66.45.213.80
          HOST: 66.45.213.80

czyli mozemy powiedziec, ze nasz serwer proxy zamaskowal nasze IP, czyli daje nam to jakas gwarancje anonimowosci.
Na sam koniec podam jeszcze pare adresow z serwerami proxy, tak zebyscie mogli sie troche pobawic - kto wie, moze
sie kiedys do czegos przydadza ;)

http://tools.rosinstrument.com/proxy/
http://www.multiproxy.org/anon_proxy.htm

Bardziej zaawansowane testery proxy mozecie znalezc pod tymi adresami jakby co:

http://www.multiproxy.org/env_check.htm

No i tyle na razie powinno Wam wystarczyc. Zycze milej zabawy i nie dajcie sie zlapac jakby co ;)


5.6 Jezyk WML czyli interek w komorkach by CZaR|Ny

Tak ostatnio pisalem kilka rzeczy w WMLu z zastosowaniem PHP i baz danych. Razem z moim dobrym
ziomalem siedzielismy ostatnio i pisalismy stronki dla komorek. Zastosowalismy w WMLu kod PHP i
polaczylismy to wszystko z baza danych PostgreSQL. Efekt bardzo fajny, ale roboty naprawde duzo.
Nie myslcie ze bede tutaj opisywal ten projekt - za dobrze by Wam chyba bylo :) Ale zajme sie
troche jezykiem WML i jego laczenia ze skryptami PHP. Super sprawa :) Ale do rzeczy - co chce
wogole napisac w tym artku? No wlasnie sie zastanawiam, bo calego kursu nie chce mi sie pisac
bo sa dostepne na sieci dziesiatki kursow, ale nie opisuja wszystkiego. Niektore zawieraja
informacje na temat jak polaczyc kod WML z kodem PHP i jak wykonywac proste skrypty. No wlasnie
czasami trzeba zrobic cos w tym kierunku a tu kupa... nie ma nic i samemu sie trzeba meczyc.
Skad ja znam ten bol... Pol roku temu robilem projekt na bazy danych wlasnie dla telefonow
komorkowych i meczylem sie dosc dlugo zanim doszedlem do tego jak sie przesyla dane w WMLu i jak
sie laczy z baza danych. No ale teraz juz wiem i chcialbym opisac pare rzeczy. A co dokladniej?
Wiec tak:
Ogolnie co to jest WML i z czego sie sklada,
Jak wyglada naglowek PHP w WMLu,
Prosty skrypt wyswietlajacy aktualna date,
Przesylanie zmiennych miedzy plikami na podstawie formularza,
Formularz z logowaniem sie do bazy,
Formularz przesylajacy dane i zapisujacy je do pliku na serwerze.

No to zaczynamy. Pewnie sie zastanawiacie co nam bedzie potrzebne? No to trzeba sie zaopatrzyc w
kilka rzeczy: jakis notatnik kolorujacy skladnie - moze byc np. EditPlus 2.11, emulator komorki -
np. YOURWAP, ktory jest do sciagniecia ze strony http://www.yourwap.com/marketing/en/6/6_5/6_5.php
oraz troche wolnego czasu i cierpliwosc :)

No to na dobry poczatek co to jest WAP - troche historii, standardow, opisu TCP/IP w WAPie, troche
o bramkach WAP, o jego mozliwosciach, a potem o jezyku WML i o grafice w WMLu.

WAP - troche historii.

Historia technologii WAP zaczela sie w 1999 roku podczas targow CeBIT w Hanowerze. Spotkali sie
tam przedstawiciele trzech najwiekszych producentow telefonow komorkowych: Nokia, Motorola i Ericsson.
Podczas konferencji podpisali ze soba umowe dotyczaca nowego i rewolucyjnego dla telefonii komorkowej
rozwiazania, dzieki ktoremu internet stal sie dostepny takze w telefonach komorkowych. Technologia ta
zostala nazwana WAP.
Oczywiscie juz wczesniej istnialy rozwiazania, pozwalajace na polaczenie sie z internetem bez uzycia
kabla. Mowa tu o Nokia Communicator czy notebooki wyposazone w karty PCMCIA. Biorac pod uwage ich
koszt produkcji oraz specyfikacje tych urzadzen ten sposob komunikowania sie z internetem byl dostepny
tylko dla nielicznej grupy odbiorcow. Podpisanie tej umowy jednak stalo sie punktem zwrotnym w rozwoju
technologii telekomunikacyjnych. Opracowanie wspolnej strategii i wprowadzenie standardow protokolow
transmisyjnych umozliwilo korzystanie z zasobow internetu  bezposrednio z telefonow komorkowych. Dane
staly sie dostepne szerokiej rzeszy abonentow telefonii komorkowej. Nokia, Motorola i Ericsson polaczyly
sie w Forum WAP, ktory obecnie jest zwiazkiem okolo 175 firm, ktore przyczynily sie do opracowania
standardu. Forum WAP jest instytucja otwarta, co oznacza, ze w jej szeregi moze wstapic kazde
przedsiebiorstwo z branzy telekomunikacyjnej.
Protokol WAP okresla sposob dostepu do informacji z cyfrowych telefonow komorkowych oraz innych urzadzen
bezprzewodowych, wykorzystujacych infrastrukture sieci GSM do przesylania danych. Okreslenie standardow
protokolu umozliwilo wspoldzialanie urzadzen roznych producentow, dostarczanych na potrzeby abonentow
wszystkich cyfrowych sieci telefonii bezprzewodowej, jak rowniez uzytkownikow pagerow i innych sieci
transmisyjnych. Istnieje rowniez wiele programow emulujacych przegladarki WAP wbudowane w telefony
komorkowe. Aplikacje te umozliwiaja przegladanie stron napisanych na potrzeby WAP na komputerach klasy PC,
podlaczonych do internetu poprzez siec TCP/IP.
Pierwsza, pelna specyfikacja WAP pojawila sie po 10 miesiacach od podpisania umowy na targach CeBIT.  
Poszczegolne czesci skladajace sie na strukture WAP takie jak protokoly, jezyki i aplikacje powstaly na
bazie istniejacych i sprawdzonych juz w praktyce rozwiazan. Protokoly TCP/IP i HTTP oraz jezyk HTML  
zostaly zaadaptowane lub zmienione. Niektore technologie i aplikacje zaczerpnieto z podobnych systemow
rozwijanych dotychczas samodzielnie poprzez dostawcow sprzetu telekomunikacyjnego, czyli miedzy innymi
z opracowanych przez Nokie - TTL oraz SmartMessaging, oraz stworzonych przez Unwired Planet - HDML i HDTP.


Standardy

WAP to nie jest jeden standard, lecz wiele standardow okreslajacych sposob kodowania, szyfrowania oraz
przesylania danych. Rozwiazania uzytkowane na potrzeby WAP maja swoje odpowiedniki w znanych internetowych
protokolach, sposobach kodowania a takze w jezykach programowania. Tak wiec jezyk WML to odpowiednik HTML,
WMLS jest odpowiednikiem jezyka JavaScript, natomiast odpowiednikiem SSL jest WTLS, a protokol HTTP jest
tutaj zastapiony WSP/WTP, ktory zapewnia uslugi z przydzielaniem numerow IP, czy tlumaczeniem nazw  internetowych
na adresy IP.
WAP ma byc dostepny uzytkownikowi niezaleznie od typu urzadzenia (telefon, organizer) i producenta. Aby
taka funkcjonalnosc byla mozliwa, niezbedne jest korzystanie ze standardowego jezyka programowania stron
WAP tak jak w przypadku stron WWW. W tym celu powstal jezyk WML.


TCP/IP w WAP

Urzadzenie WAP podczas komunikacji posluguje sie uproszczonym protokolem TCP/IP, ktory w pewnym stopniu ogranicza
mozliwosc transmisji. Kiedy uzytkownik probuje skorzystac z przegladarki WAP zaimplementowanej w telefonie komorkowym,
nawiazywane jest polaczenie z wczesniej ustalonym dostawca uslug (najczesciej jest to operator sieci komorkowej) i
zestawia polaczenie zgodne z protokolem PPP. Telefon podobnie jak komputer stacjonarny musi podczas sesji polaczenia
z internetem otrzymac numer IP. Podobnie jak w przypadku komputerow stacjonarnych uzytkownik musi wpisac do przegladarki
adres wywolywanej strony, ktory jest tlumaczony przez specjalny serwer DNS na specjalny adres docelowy IP komputera
na ktorym jest strona. Mozliwosci te mozna takze wykorzystac w odniesieniu do sieci intranet.  Przedsiebiorstwa moga
uruchomic uslugi WAP dla swoich pracownikow poprzez bezposrednia lacznosc z siecia korporacyjna.


Bramki WAP

Usluga, odrozniajaca serwisy i serwery WAP od WWW, jest koniecznosc stosowania bramki WAP (WAP gateway) pomiedzy
serwerem udostepniajacym strony napisane w jezyku WML a telefonem. Przesylanie danych miedzy telefonem a serwerem
udostepniajacym serwisy WAP odbywa sie wieloetapowo. Najpierw uzytkownik telefonu decyduje, ktora strona WAP ma
byc zaladowana do telefonu. W zwiazku z tym wpisuje on odpowiedni adres
badz wybiera go z listy adresow dostepnych w pamieci telefonu. Adres WAP jest tlumaczony na adres IP poprzez
serwer DNS. Telefon wysyla zapytanie do bramki WAP zgodnie z protokolem WAP. Bramka WAP na podstawie otrzymanego
zapytania tworzy tradycyjne zapytanie HTTP, ktore wysyla do serwera WWW. Zapytanie otrzymane przez serwer jest
wykonywane po uprzednim rozpoznaniu naglowkow ewentualnej autentyfikacji uzytkownika badz bramki WAP. W koncowej
fazie serwer przesyla dane wraz z naglowkiem HTTP do bramki WAP. Bramka WAP sprawdza otrzymany naglowek HTTP oraz
zawartosc zestawu WML i przetwarza je do odpowiedniej postaci binarnej. Nastepnie dane w postaci zgodnej z
protokolem WAP sa wysylane do adresata. Adresat otrzymuje odpowiedz - zostaje ona zinterpretowana przez terminal
WAP, w wyniku czego na ekranie zostaje wyswietlona pierwsza karta z otrzymanego zestawu.


Mozliwosci WAP

WAP umozliwia dostep do wielu informacji i uslug internetowych. Komunikacja glosowa, ktora jest podstawowa forma
wykorzystania telefonu komorkowego, moze byc wzbogacona o informacje tekstowe, przewijanie listy oczekujacych
wiadomosci glosowych, listow elektronicznych, faksow lub wiadomosci tekstowych. Telefony obslugujace WAP moga
sluzyc jako osobiste notatniki o zaawansowanych mozliwosciach, oferujac wiele roznych funkcji, takich jak budzenie,
przypominanie czy interaktywny dziennik. WAP umozliwia sprawdzanie notowan gieldowych w czasie rzeczywistym, w
postaci przewijajacej sie linii, a nie tylko wiadomosci tekstowych. Ustawienia osobiste zapewniaja odbior wylacznie
informacji interesujacych uzytkownika, takich jak wiadomosci o osiagnieciu gornego lub dolnego limitu ceny akcji.
Mobilna bankowosc WAP umozliwia przeprowadzanie przez telefon wszystkich transakcji bankowych, takich jak przelewy
pieniezne, dokonywanie oplat czy aktualizacja salda. Oparcie technologii WAP na jezyku WML, ktory jest modyfikacja
jezyka XML, moze w przyszlosci zaowocowac wprowadzaniem nowych serwisow i urzadzen dostepnych dla uzytkownikow
telefonii komorkowej. Rozwoj urzadzen telekomunikacyjnych i opracowywanie telefonii cyfrowej trzeciej generacji z
szybka transmisja danych moga spowodowac, ze dostep do Internetu za pomoca telefonu komorkowego bedzie rownie
atrakcyjny, jak dzisiaj oferowana komunikacja przewodowa.


Jezyk WML

W odroznieniu od dokumentow HTML, ktory okresla ksztalt pojedynczej strony WWW, podstawowym elementem strukturalnym
serwisow WAP jest karta WML. Dokumenty WML okresla sie jako talie lub deki (deck). W sklad pojedynczego dokumentu
WML wchodzi zestaw kart (deck of cards), z ktorych kazda okresla to, co pojawi sie na wyswietlaczu telefonu, a
takze zawiera mechanizmy umozliwiajace przemieszczanie sie pomiedzy kartami danej strony i wywolanie innych stron.
Mikroprzegladarka (microbrowser) - tak okresla sie oprogramowanie interpretujace jezyk WML w telefonie komorkowym -
pobiera w calosci pojedynczy dokument WML. Przegladanie roznych stron, stanowiacych czesc jednego dokumentu WML,
nie wymaga "doczytywania" dodatkowych danych z sieci. Ze wzgledu na to, ze urzadzenia WAP maja bardzo mala pamiec,
istnieja ograniczenia co do wielkosci plikow WML, jakie dane urzadzenie jest w stanie przyjac. Teoretycznie caly
serwis WAP moze byc zapisany w pojedynczym pliku WML, jednak nie powinien przekraczac pojemnosci pamieci telefonow.
Na jakosc przegladania obszernych dokumentow wplywa tez przepustowosc sieci.
Karty, oprocz tekstu, moga zawierac nieskomplikowana grafike, odnosniki, elementy formularzy, takie jak pola do
wprowadzania danych czy listy opcji. Mozna rowniez tworzyc proste tabele do porzadkowania danych, a z komorki wyslac
do skryptu na serwerze dane wprowadzone z klawiatury. Pozwala to na interakcje z aplikacja "po drugiej stronie".
Elementy jezyka WML wykorzystuje sie glownie do stworzenia szaty graficznej i obslugi podstawowych zdarzen. Do
wykonywania bardziej skomplikowanych zadan stworzono jezyk skryptowy WMLScript. Przeprowadzenie operacji, ktorych
nie da sie wykonac przy uzyciu tych dwoch jezykow, nalezy zlecic aplikacjom dzialajacym na serwerze. Moga to byc
praktycznie wszystkie tego typu technologie - PHP, ASP, CGI i inne.
Obecnie opracowano kolejna specyfikacje WAP 1.2, ktora rozszerza mozliwosci dotychczas oferowane o funkcje obslugi
kolorowych wyswietlaczy telefonow komorkowych, cyfrowych certyfikatow, lepsza obsluge grafiki na wyswietlaczach
telefonow oraz mozliwosc transmisji plikow.


Grafika w dokumentach WAP

Specyfikacja WAP dopuszcza implementowanie grafiki w specjalnym formacie WBMP (Wireless BMP). Format WBMP nie
posiada wsparcia dla animacji, tak jak format GIF, istnieje jednak mozliwosc tworzenia animacji przy uzyciu
specjalnego polecenia jezyka WML. W dotychczas stosowanej wersji WAP 1.1 WBMP to w uproszczeniu jednobitowa
wersja formatu BMP, czyli mozliwe do uzyskania sa tylko dwa kolory - czarny i kolor tla wyswietlacza. Przed
umieszczeniem grafiki na stronie napisanej w jezyku WML kazdy obrazek musi byc przetworzony do tego specjalnego
formatu. Dwa kolory to nie jedyne ograniczenie WBMP. Dodatkowym problemem jest rowniez jego rozdzielczosc.
Standardowo rysunki przesylane do telefonow komorkowych nie powinny byc wieksze niz 150 x 150 pikseli, jednak
rozne telefony maja odmienne rozmiary wyswietlaczy. Ponadto istnieje kwestia wielkosci pojedynczego obrazka,
dotyczaca limitu pamieci telefonu.


Przyszlosc WAP

Jak na razie WAP nie odniosl tak wielkiego sukcesu jak sie spodziewano na poczatku, a spowodowane jest
to prostota serwisow, uboga szata graficzna, ktora nie przekonuje uzytkownikow do korzystania z tej technologii.
Ale w najblizszym czasie przy dzisiejszym rozwoju technologii nalezy sie spodziewac coraz wiekszym zainteresowaniem
technologia WAP. Jak siegnac pamiecia wstecz i popatrzyc na rozwoj komputerow stacjonarnych i dostarczanego z
nimi oprogramowania a takze pamietajac, ze pierwsze przegladarki HTML dla komputerow klasy PC byly ubogie w funkcje
i zapewnialy ich znacznie mniej niz obecne wersje. Dlatego bardzo prawdopodobne jest to, ze nastepne wersje WAP
zgodnie z prognozami zyskaja na atrakcyjnosci, a co za tym idzie zdobeda kolejne rzesze uzytkownikow.



No dobra to juz teraz wiecie co to takiego jest WAP i jak wyglada jezyk WML. Dla tych co znaja dobrze HTMLa
nie powienien sprawiac zadnej trudnosci. Teraz czas zabrac sie za dalsza czesc, czyli tworzenie programow,
ktore beda zawiraly w sobie kod PHP, a nastepnie nauczycie sie jak sie komunikowac z baza danych i pobierac
z nich dane, a nastepnie  wyswietlac je na kartach telefonow komorkowych.

Wiec teraz zebyscie mieli co robic - zaczynamy zabawe :)

Naglowek PHP w WMLu.

Ogolnie kazda strona napisana w WMLu posiada naglowek informujacy o tym, ze wlasnie piszemy
aplikacje przeznaczona dla telefonow komorkowych. Standardowo naglowek w czystym WMLu wyglada
nastepujaco:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">

a teraz zeby mozna bylo zamiescic kod PHP w dokumencie trzeba troszke ten naglowek przerobic.
Powienien wygladac nastepujaco:

<?php  
// send wml headers
header("Content-type: text/vnd.wap.wml");  
echo "<?xml version=\"1.0\"?>";  
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""  
   . " \"http://www.wapforum.org/DTD/wml_1.1.xml\">";
?>


no i teraz juz WML wie, ze zostal zaimplementowany kod PHP. Czyli teraz mozemy sie zabrac za
pisanie naszych programow laczac WML i PHP i wszystko powinno ladnie dzialac. No chyba, ze sie
gdzies pomylimy, albo czegos zapomnimy - wtedy nie ma prawa dzialac :)


No dobra - juz wiemy jak ma wygladac naglowek wiec trzeba to zaczac wykorzystywac w dalszej pracy.
Teraz zabieramy sie za nasz pierwszy skrypt. Bedzie on wyswietlal na karcie aktualna date.

Otwieramy sobie jakis notatnik (jak wspominalem wczesniej moze to byc EditPlus 2.11 albo Notepad, albo
pico - niewazne, chodzi tylko o to zeby dalo sie wpisac kod) i zabieramy sie za pisanie kodu naszego
programu. Skrypt php zawarty w pliku powinien wygladac nastepujaco:

<?php  

    $the_date = date("M d Y");
    print $the_date;
?>

Jak widac zmiennej the_date przypisalismy funkce date, ktora ma wypisywac date w taki sposob:
Miesiac dzien Rok. A nastepnie funkcja print ma nam wyswietlic wartosc zmiennej $the_date na ekranie
przegladarki.

Caly kod programu wyglada zatem nastepujaco:

------------------------ cut ------------------------------------

<?php  
// send wml headers
header("Content-type: text/vnd.wap.wml");  
echo "<?xml version=\"1.0\"?>";  
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""  
   . " \"http://www.wapforum.org/DTD/wml_1.1.xml\">";
?>

<wml>
<card id="card1" title="Data">
<p align="center"><b>Dzisiaj jest:</b><br/>
<?php  

    $the_date = date("M d Y");
    print $the_date;
?>
</p>
</card>
</wml>

----------------------- cut --------------------------------------


Zapiszcie sobie zrodelko jako data.php - nie moze byc rozszezenia wml poniewaz wtedy plik
nie wykona kodu php. Uruchomcie sobie emulator i wpiszcie adres do pliku i uruchomcie go.
No i juz po uruchomieniu skryptu na telefonie komorkowym albo na emulatorze telefonu
pojaiw sie wynik dzialania w postaci np.

Dzisiaj jest:
Apr 14 2003

Dziala i robi to co chcemy zeby robilo. No dobra teraz czas zrobic juz cos trudniejszego, czyli
zabrac sie za przesylanie zmiennych miedzy plikami. Chcemy sobie utworzyc jakis skrypt, ktory
bedzie pelnil role formularza i drugi skrypt, ktory bedzie od niego pobieral wartosci zmiennych
i wyswietlal je na ekranie.
No to zabieramy sie do roboty. Przypuscmy, ze bedziemy przesylac jedna zmienna, np. swoja ksywke
i po zaakceptowaniu bedzie sie ona wyswietlala na kolejnej karcie.
A wiec tak: najpierw trzeba utworzyc formularz, a potem plik wynikowy. No to otworzcie sobie notatniki
i wpiszcie ponizszy kod:

----------------- cut -------------------------------------------------

<?php  
// send wml headers
header("Content-type: text/vnd.wap.wml");  
echo "<?xml version=\"1.0\"?>";  
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""  
   . " \"http://www.wapforum.org/DTD/wml_1.1.xml\">";
if ($ksywa=="ksywa")
?>

<wml>
<card id="card1" title="Ksywa">
<do type="accept" label="Dalej">
<go href="http://localhost/wap/ksywa2.php?ksywa=$(ksywa)"/>
</do>

<p align="center">
<br/>Ksywa:<input type="text" size="10" name="ksywa"/>
  </p>


</card>
</wml>

------------------------ cut ------------------------------------------

i zapiszcie sobie jako ksywa1.php. Juz polowe zadania mamy za soba. Teraz trzeba utworzyc plik
ksywa2.php, ktorego zadaniem bedzie pobieranie zmiennej ksywa i wyswietlanie jaj na karcie.
Zrodlo jest nastepujace:


------------------------- cut -----------------------------------------

<?php
// send wml headers
header("Content-type: text/vnd.wap.wml");
echo "<?xml version=\"1.0\"?>";
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""
. " \"http://www.wapforum.org/DTD/wml_1.1.xml\">";
if($ksywa=="$ksywa") {
?>  

<wml>
<card id="card1" title="Ksywa - powitanie">
<p align="center">
<do type="accept" label="Powrot">
<go href="http://localhost/wap/ksywa1.php"/>
</do>
Witaj<br/>
<b>
<?php

echo $ksywa;
}

?>
</b>
</p>
</card>
</wml>

---------------------- cut -------------------------------------------

Zapiszcie sobie to jako ksywa2.php i uruchomcie skrypt. Najpierw powinien sie pokazac formularz
pytajacy o ksywe. Po podaniu jej i wcisnieciu opcji dalej powinien sie wykonac skrypt ksywa2.php.
Przykladowo do formularza wpisujemy 'Albercik' i wciskamy opcje dalej i po wcisnieciu opcji w pliku
ksywa2.php wynikiem dzialania powinno byc wyswietlenie komunikatu:

                                     Witaj
                                    Albercik

No to juz wiemy jak przesylac zmienne miedzy plikami wiec teraz czas na cos trudniejszego.
Czas na to aby stworzyc jakas baze danych - pocwiczcie najpierw na MySQLu i utworzcie baze danych
'wap' i korzystajac z niej utworzcie w niej tabele 'przyklad' w ktorej bedzie sie znajdowac : 'id,
ksywa, haslo', czyli tworzymy przyklad dzieki ktoremu bedziemy sie mogli zalogowac podajac ksywe i
haslo, dzieki czemu tylko my bedziemy miec dostep do naszej bazy danych - co tam sobie umiescicie w dalszej
czesci skryptu zalezy tylko od Was, ale do tabeli 'przyklad' musiacie dodac minimum 1 rekord z wlasna
ksywka i haslem :)
Wiec tworzymy nasza tabele oczywiscie na bazie danych MySQLa. Baza danych ma miec nazwe 'wap' a tabela
nazwe 'przyklad'. Wiec tak jak leci wykonujemy:

create database wap;

use wap;

create table przyklad(
id int(11) not null auto_increment,
ksywa varchar(50),
haslo varchar(50),
primary key (id)
);

i juz mamy utworzona tabele. Teraz musimy do niej wpisac przynajmniej jeden rekord zawierajacy nasza ksywe i
haslo. Uzywamy polecenia:

insert into przyklad (id,ksywa,haslo) values ('1','albercik','mojehaslo');

i juz mamy rekord w bazie danych. Nasz login do bazy to: albercik, a nasze haslo to: mojehaslo. Oczywiscie tutaj
mozecie sobie wpisac zamiast tej ksywy i hasla wlasne ksywki i wlasne haselka.
No to tworzymy pierwszy plik, ktory bedzie sie nazywal logowanie.php. Powinien wygladac mniej wiecej
tak:

---------------------------- cut --------------------------------------

<?php  
// send wml headers
header("Content-type: text/vnd.wap.wml");  
echo "<?xml version=\"1.0\"?>";  
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""  
   . " \"http://www.wapforum.org/DTD/wml_1.1.xml\">";
if ($ksywa=="" and haslo=="")
?>

<wml>
<card id="card1" title="Logowanie">
<do type="accept" label="Wracaj">
<go href="http://localhost/bazy-projekt/wap/pow_wml.php"/></do>
<do type="accept" label="Loguj">
<go href="http://localhost/wap/login.php?ksywa=$(ksywa)&amp;haslo=$(haslo)"/></do>

<p align="center">
<br/>Ksywa:<input type="text" size="10" name="ksywa"/>
<br/>Haslo:<input type="password" size="10" name="haslo"/>
  </p>


</card>
</wml>

-------------------------- cut -----------------------------------------

No to juz mamy pierszy plik dzieki ktoremu mozemy sie zalogowac podajac ksywke i haslo. Ale
teraz trzeba utworzyc drugi plik, ktory bedzie sie laczyl z baza danych i wyciagal z niej nasze
dane. No to tworzymy plik login.php. Powinien wygladac tak:


------------------------- cut ------------------------------------------

<?php
// send wml headers
header("Content-type: text/vnd.wap.wml");
echo "<?xml version=\"1.0\"?>";
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""
. " \"http://www.wapforum.org/DTD/wml_1.1.xml\">";

?>  

<wml>
<card id="card1" title="Baza">
<p align="center">
<do type="accept" label="Powrot">
<go href="http://localhost/wap/logowanie.php"/></do>

<?php
$connect = mysql_connect("localhost", "httpd","");
mysql_select_db("wap",$connect);
$result = mysql_query("SELECT ksywa,haslo FROM przyklad where ksywa='".$ksywa."' and haslo='".$haslo."'",$connect);
$rk = mysql_fetch_row($result);

if($rk[1]!="")
printf("Zalogowany:<br/>\n <b>%s </b><br/>\n", mysql_result($result,0,"ksywa"));
        
else
printf("Przykro mi!<br/>Podales niepoprawne dane!<br/>\n");

?>

</p>
</card>
</wml>

------------------------------- cut --------------------------------------

Teraz wystarczy odpalic skrypt logowanie.php i wpisac do niego nasza ksywke i haselko. Jesli na przyklad
podamy jako ksywe 'zenek' i haslo 'tojazenon' to efekt dzialania ksryptu powinien byc nastepujacy:

                              Przykro mi!
                          Podales niepoprawne
                                 dane!

No i wszystko jasne, bo nie ma w bazie takiegto uzytkownika ani takiego hasla. Ale jesli podamy login 'albercik' i
haslo 'mojehaslo' to powinien sie zalogowac do bazy i wynik powinien byc nastepujacy:

                               Zalogowany:
                                albercik


Proste no nie? Z wypsiywaniem danych na karcie jest podobnie tylko trzeba utworzyc petle for tak, zeby wypisywala wszystkie
dane z bazy na karte. O tym napisze moze w kolejnym numerze.
A teraz czas na nasz ostatni przyklad. Bedzie to formularz pobierajacy np. ksywe i wyswietlajacy ja na nastepnej karcie, a
do tego zapisujacy dane do jakiegos pliku na serwerze. Przydatna sprawa jesli czasami chcemy wiedziec kto i co przesyla
z naszej strony WAP :)
No to otworzmy notatnik i wpiszmy tam takie zrodelko. Nazwijmy je np. form.php

--------------------------------- cut ------------------------------------

<?php  
// send wml headers
header("Content-type: text/vnd.wap.wml");  
echo "<?xml version=\"1.0\"?>";  
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""  
   . " \"http://www.wapforum.org/DTD/wml_1.1.xml\">";
if ($ksywa=="ksywa")
?>

<wml>
<card id="card1" title="Logowanie">
<do type="accept" label="Ksywa">
<go href="http://localhost/wap/wynik.php?ksywa=$(ksywa)"/>
</do>

<p align="center">
<br/>Ksywa:<input type="text" size="10" name="ksywa"/>
  </p>


</card>
</wml>

------------------------------- cut ---------------------------------------

No jak widac wpisujemy do pliku swoja ksywe przykladowo i przesylamy poprzez zmienna do kolejnego pliku, gdzie
ma sie pojawic nasza ksywa i zostac dodatkowo dopisana do jakiegos pliku textowego znajdujacego sie na serwerze.
No to robimy drugi pliczek wynik.php

----------------------------- cut -----------------------------------------

<?php
// send wml headers
header("Content-type: text/vnd.wap.wml");
echo "<?xml version=\"1.0\"?>";
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""
. " \"http://www.wapforum.org/DTD/wml_1.1.xml\">";
if($ksywa="$ksywa") {
?>  

<wml>
<card id="card1" title="Lista">
<p align="center">
<do type="accept" label="Powrot">
<go href="http://localhost/wap/form.php"/></do>
<?php
$F=fopen('plik.log','a+');
fwrite($F,$ksywa."\n");
fclose($F);
}
echo "Witaj $ksywa";
?>



</p>
</card>
</wml>

-------------------------- cut ------------------------------------------------

Jak widac w zrodelku po przeslaniu zmiennej ksywa tworzony jest plik o nazwie plik.log jesli jeszcze nie ma go na
serwerze i do niego zostaje zapisana zmienna ksywa, a na karcie pojawia sie komunikat powitalny.

No i jak na razie dotarlismy do konca. Jak sie wam tekst spodoba to postaram sie kontynuowac temat w nastepnym numerze.
A poki co milej zabawy w tworzeniu wlasnych dynamicznych stron dla telefonow komorkowych :))



5.7 Kryptografia - wstep do tematu by CZaR|Ny

Ten tekst jest poki co wprowadzeniem wiec nie oczekujcie za duzo. Ale powoli czas zaczac zglebiac temat kryptografii.
W tym tekscie postaram sie wyjasnic co to jest kryptografia i do czego jest potrzebna oraz
opisze kilka kluczy. Ale o tym dalszej czesci textu. Wiec na sam poczatek zacznijmy sobie od
wyjasnienia co to jest - Ci z Was ktorzy to juz wiedza moga ominac ten fragment, a pozostalych
zapraszam do calej lektury.

Kryptografia - nazwa wywodzi sie od greckiego slowa 'kruptos' co oznacza nic innego jak 'ukryty'.
Celem kryptografii jest wiec ukrywanie informacji w ten sposob aby mogl ja poznac jedynie uprawniony
odbiorca. Ukrywanie tutaj nosi miano szyfrowania, a jej ujawnianie miano deszyfrowania. W tym celu
wykorzystywany jest szyfr. Przed zaszyfrowaniem informacja nosi nazwe tekstu jawnego a po zakodowaniu
nosi nazwe szyfrogramu. Zakodaowana wiadomosc transportowana jest od nadawcy w celu unikniecia podejrzenia
inforamcji przez innych uzytkownikow a trafiajac do odbiorcy jest ona deszyfrowana przy pomocy odpowiedniego
klucza do postaci tekstu jawnego.  

Ponizej w skrocie postaram sie omowic kilka kluczy kryptograficznych: DES, AES i RSA.

~:*>= DES =<*:~

Data Encryption Standard jest jednym z najstarszych i chyba najbardziej znanych algorytmow. Bazuje on w duzej
mierze na algorytmie Lucyfer. DES wykorzystuje 64-bitowy klucz, z czego 56 bitow to faktyczny klucz a pozostale
8 bitow to bity parzystosci. DES operuje na 64-bitiwych blokach danych. Na podstawie klucza generowane jest
16 osobnych 48-bitowych podkluczy, po jednym na kazda runde algorytmu.
kazda runda sklada sie z fazy podstawienia, w ktorej dane sa zastepowane fragmentami klucza, oraz z fazy premutacji,
w ktorej jest zamieniana kolejnisc bitow danych. Bezpieczenstwo tego algorytmu polega na tym, ze operacja podstawienia
jest nieliniowa, wiec otrzymany szyfrogram nie posiada zadnych cech charakterystycznych tekstu jawnego. Operacje
permutacji zwiekszaja bezpieczenstwo o poziom wyzej, mieszajac juz czesciowo wymieszany komunikat.
Klucz ten jednak ze wzgledu na 56-bitowa dlugosc klucza ni ejest zbyt bezpieczny w dzisiejszych czasach.


                  Diagram faz szyfrowania algorytmu DES

            
                            Tekst jawny
                                |   56 bitow danych wejsciowych
                               \|/  8 bitow kontroli parzystosci
                         Permutacja wstepna
                                |
                                |<----------------------------------------------
                                |                                             /|\
                  --------------------------------                             |
                  |                              |                             |
                 \|/                            \|/   48 bitow                 |
                 XOR                          Modul F <------ Podklucz rundy   |
                  |                              |                 N Kn        |
                 \|/     Powtorzenie N rund     \|/                            |
                  ------------------------------------------------------------->                      
                                |
                                |
                               \|/
                        Permutacja koncowa
                                |
                                |  56 bitow danych wyjsciowych
                               \|/
                            szyfrogram



~:*>= AES =<*:~

Advanced Encryption Standard jest nastepca DESa. Obsluguje on klucze o dlugosci 128, 192 i 256 bitow. Wykorzystywane
sa tutaj rundy iteracyjne. Dane sa przetwarzane w blokach 128-bitowych dzielonych na cztery grupy po 4 bajty kazda.
Liczba rund zalezy od dlugosci klucza: dla kluczy 128-bitowych wykonywanych jest 9 rund, dal kluczy 192-bitowych
wykonywanych jest juz 11 rund, a dla kluczy 256-bitowych tych rund juz jest 13. Kazda runda sklada sie z kroku
podstawiania poprzedzonego krokiem krokiem pseudopermutacji, w ktorej bity sa wymieniane pomiedzy grupami. Potem kazda
grupa jest mnozona macierzowo, a wynik mnozenia jest dodawany do podklucza rundy.
AES jest stosunkowo szybszy od algorytmu 3-DES.



~:*>= RSA =<*:~

RSA bazuje na mnozeniu i faktoryzacji duzych liczb calkowitych. Nie jest na tyle szybki aby szyfrowac nim duze ilosci
danych. Korzysta on z kluczy o wiekszych rozmiarach. Klucz jest przewaznie ciagiem 1024 lub 2048-bitowym ciagiem.
W algorytmie RSA zastosowano tzw. arytmetyke modularna zwana takze arytmetyka zegarowa. Jest stosowany do szyfrowania
oraz do podpisow cyfrowych.


Na razie tyle o kryptografi - o wiecej informacji odsylam do google. Ale nie znaczy to, ze w przyszlosci nie zajmiemy
sie tym tematem. Ale poki co na sam wstep to powinno Wam wystarczyc ;)



-----------------------------------------------------------------------------------------------

6. DOS

6.1 Komendy DOSowskie by CZaR|Ny

Kazdy kto pracuje pod systemem gdzie znajduje sie DOS powinien znac kilka
komend DOSowskich aby moc sie sprawniej poruszac po systemie. Nieraz taka znajomosc
komend jest przydatna a nieraz po prostu niezbedna. Ale co zrobic jesli sie tych
komend nie zna, lub zna sie je pobieznie i trzeba cos zrobic, ale nie ma jak?? Co
wtedy? Trzeba sie po prostu nauczyc kilku komend i nauczyc sie nimi poslugiwac.
Wiec zaczynamy. Ponizej zajme sie podstawowymi komendami wraz z ich opisem oraz
wynikiem dzialania. Komendy zostana opisane alfabetycznie, tak zebym sam nie zapomnial
co juz opisalem a co nie ;)

No to po kolei:

attrib
polecenie to wyswietla lub zmienia atrybuty wybranych plikow. Polecenie to
sluzy do ustawiania i wylaczania atrybutow, ktore sa 'tylko do odczytu' oraz
'do archiwizacji'. Mozliwe jest uzywanie symboli globalnych typu '*' oraz '?'
do oznaczania grupy plikow. Specyfikator /s powoduje, ze attrib bedzie sie
zaglebial rekursywnie w podkatalogi sciezki dostepu.


break
Polecenie to ustawia kontrole nacisniecia skrotu klawiszowego ctrl+c. Wlaczenie tej
funkcji powoduje, ze nacisniecie ctrl+c wykona przerwanie pracy programu rowniez
podczas innych operacji systemu.


chcp
Polecenie to wyswietla i ustawia biezaca strone kodowa uzywana przez command.com


chdir (cd)
Polecenie zmienia biezacy katalog na inny.


chkdsk
Jest to program, ktorego glownym zadaniem jest sprawdzenie dyskow w poszukiwaniu bledow.


copy
Poleceniem tym mozna kopiowac pliki z jednego miejsca na dysku do drugiego lub dolaczac pliki
do juz istniejacych .


date
Sluzy do przechowywania i modyfikowania przechowywanej w pamieci CMOS daty.


dir
Sluzy do wyswietlania zawartosci katalogow, podkatalogow itd. Nie wyswietla nazw plikow i katalogow
posiadajacych atrybuty HIDDEN czyli ukrytych.


diskcopy
Pozwala na kopiowanie danych z dyskietki zrodlowej na dyskietke wynikowa.


exit
Polecenie to sluzy do zamykania interpretera polecen.


fdisk
To chyba powinno Wam byc znane ;] Jest to program do podzialu na partycje i konfiguracji dysku stalego.


find
Polecenie to sluzy do poszukiwania okreslonego przez uzytkownika ciagu znakow we wskazanym pliku badz
plikach.


format
Chyba najbardziej ulubione polecenie wszyctkich tych, ktorzy na codzien uzywaja Windowsa :) Sluzy do
przygotowywania dyskietek oraz (a nawet przede wszystkim) do usowania Windowsa z partycji C:\


label
Sluzy do nadawania dyskowi nazwy, a moze takze ja usunac - nazwa moze miec max 11 znakow.


mkdir (md)
Sluzy do tworzenia katalogow oraz podkatalogow.


more
Sluzy do wyswietlania zawartosci plikow po stronie.


rename (ren)
Sluzy do zmieniania nazw  plikow np. ren plik1.txt plik2.txt spowoduje zmiane nazwy pliku plik1.txt na
plik2.txt


rmdir (rd)
Polecenie to powoduje usuniecie katalogu o ile jest to katalog pusty, czyli katalog zawierajacy
podkatalogi nie zostanie usuniety.


sort
Jest to filtr sluzacy do dokonywania operacji sortowania zawartosci pliku lub danych pochodzacych z innego
polecenia DOS.


time
Polecenie to pokazuje biezaca godzine wraz z mozliwoscia jej zmiany.


type
Jest stosowane do plikow zawierajacych informacje tekstowa. Wyswietla informacje zawarte w zbiorach.


ver
Polecenie to podaje numer zainstalowanej wersji oprogramowania.


vol
Polecenie to zwraca nazwe woluminu w okreslonej stacji dyskow oraz podaje jego numer seryjny.


xcopy
Sluzy do kopiowania wiekszego zbioru plikow z jednej sciezki dostepu do drugiej.


No i na tym na razie zakonczymy omawianie komend DOSowskich - do reszty musicie juz sobie sami dojsc -
w koncu nauka trwa cale zycie :) Jak cos bedzie niejasne to zapraszam na www.google.com.pl w celu odszukania
odpowiedzi ;)


6.2 Pliki wsadowe by daNTe

  6.2.1 Programowanie plikow wsadowych ( *.bat )

Pliki wsadowe sa to pliki z rozszerzeniem .bat. Z ich pomoca w prosty sposob mozna zautomatyzowac
najczesciej wykonywane czynnosci jak kopiowanie, kasowanie, tworzenie pliku lub katalogu. Na wtepie
omowimy sobie podstawowe komendy i ich zastosowanie.

  6.2.2 Omowienie podstawowych polecen

ECHO - komenda echo kontroluje wyswietlanie tekstu na ekranie. Dzieki niej mozna wyswietlic lub ukryc tekst.
     ECHO OFF - polecenia nie beda pokazane, a jedynie wyniki ich dzialalnosci.
     ECHO ON - wyswietla komende i jej wynik.
     ECHO tekst - wyswietli na ekranie napis 'tekst'.

REM - Za tymi literami bedziemy wstawiac tekst komentarza.

PAUSE - Dzieki tej komendzie bedziemy wstanie zatrzymac dzialanie programu do czasu nacisniecia dowolnego klawisza.
     PAUSE Nacisniej dowolny klawisz - spowoduje wyswietlenie napisu i czekanie na dowolny klawisz.
     PAUSE>NUL - Polecenie zatrzyma program i nie wyswietli zadnego napisu.

CALL - Dzieki temu poleceniu mozemy wywolac inny plik wsadowy.
     CALL c:\plik_wsadowy.bat - polecenie wywola plik z podanej sciezki.
GOTO - Polecenie wykonuje skok do etykiety oznaczonej przez postawienie ":" ( dwukropka ) przed nia.

EXIST - polecenie sprawdza czy w podanej sciezce znajduje sie plik podany jako argument wyszukiwania.

IF - Funkcja 'jezeli'. Jezeli spelniony zostanie warunek wtedy wykonaj pozostala czesc np.:
     IF EXIST c:\plik_wsadowy.bat GOTO koniec - jezeli istnieje plik w podenej sciezce przejdz na koniec

FOR - Petla odpowiedzialna za wykonywanie danej komendy do spelnienia warunku.
     FOR %%zmienna IN (c:\*.txt) DO PRINT %%zmienna - polecenie wydrukuje wszystkie pliki z podaje sciezki. Aby
podac zmienna mozna uzyc kazdego znaku z wyjatkiem cyfr.
     FOR %%z IN (/%system32%) DO DEL *.dll - polecenie z miejsce / (slash ) wstawi nazwe dysku, na ktorym
umieszczono katalog system32, a nastepnie usunie z niego wszystkie pliki *.dll.

FIND - Find jest polecenie, dzieki ktoremu mozemy wyszukac pliki, ktore zawieraja jakis tekst.
     FIND "tekst" plik_w_ktorym_szukamy.rozszerzenie
Polecenie find zwraca do zmienne errorlevel wartosci takie jak:
     0 - tekst znaleziony
     1 - tekstu nie ma w pliku
     2 - nie mozna wyszukac tekstu, bo nie ma pliku

CHOICE - Polecenie pozwala dac uzytkownikowi wybor jaka opcje z listy wybrac.
     CHOICE /C:TN Wybierz klawisz /N /S /T:N,10 - polecenie pozwoli wybrac jedna z dwoch opcji.
     /C:TN - dostepne do wyboru sa klawisze T i N
     /N - program NIE wyswietli wiadomosci, ze trzeba nacisnac T lub N
     /S - program zaczyna sprawdzac wielkosc liter, czyli t nie znaczy tyle samo co T
     /T:N,10 - po 10 sekuda opcja zostanie automatycznie wybrana. W tym przypadku bedzie to N.

ERRORLEVEL - czasem polecenie generuje wartosc ERRORLEVEL, a pozniej na jej podstawie podejmowana jest decyzja co
zrobic dalej. ERRORLEVEL moze przyjmowac wartosci od 0-255. Korzystajac z tego polecenia nalezy sprawac od najwyzszej
dostepnej wartosci.
     IF ERRORLEVEL 2 GOTO plik - Jezeli wyjdzie 2 to idz do plik
     IF ERRORLEVEL 1 GOTO koniec - Jezeli wyjdzie 1 idz do koniec

SET zmien = 123 - przypisanie zmiennej 'zmien' wartosci 123
     ECHO Wartosc: %zmien% - dzieki temu poleceniu mozemy sprawdzic czy zmienna ma dobrze przypisana wartosc.

SHIFT - Polecenie zmienia wartosc parametru pliku wsadowego. Troche trudno to wyjasnic bez przykladu, wiec w pozniejszej
czesci zwroce na to uwage.

COPY - Chyba nie trzeba tlumaczyc?

DEL - Tego chyba tez nie trzeba

TYPE - Polecenie odpowiedzialne za wysiwetlenie pliku na ekranie.
     TYPE plik.rozszerzenie - Wyswietli plik
     TYPE > drugi_plik.rozszerzenie - Zalozy plik i skopiuje do niego zawartosc pierwszego
     TYPE >> drugi_plik.rozszerzenie - Dopisze sie na koncu pliku

  6.2.3 Pierwszy program, omowienie dzialania  

Wreszcie cala czesc opisowa mamy za soba. Dobrze by bylo, abys nauczyl sie tych komend na pamiec, gdyz beda
Ci potrzebne, aby napisac swoj program.
Dobra, nieprzeciagam. Przejdzmy teraz do tej ciekawszej czesci jaka jest samo pisanie programu. Wszystkie nalezy pisac
w notatniku lub programie, ktory daje latwe mozliwosci zachowania pliku z nadaniem mu wlasnego rozszerzenia. Zaczynamy ...

Pierwszy programik zrobi nastepujace rzeczy:
- sprawdzi czy istnieje plik.
- jesli tak to utworzy katalog na dyskietce i skopiuje tam plik.
- jesli nie to zakonczy dzialanie.

@echo off
if exist c:\plik.txt goto kopiuj
if not exist c:\plik.txt goto koniec
:kopiuj
md a:\katalog
copy c:\plik.txt a:\katalog\plik.txt
:koniec

I po klopocie. Pierwszy program za nami ;) Zazwyczaj taki type programu jest raczej nie potrzebny, ale to byl tylko wstep,
aby troche sie rozruszac. Teraz przystapimy do napisania innego programiku, ktory bedzie troche bardziej zlozony. A wiec
do dziela.

Drugi programik bedzie mial za zadanie:
- sprawdzi czy do pliku byl juz dopisany fragment, ktory chcemy dopisac ( w wypadku podwojnego uruchomienie plik nie
bedzie dodatkowo powiekszany ).
- jesli tak to zaoknczy dzialanie.
- jesli nie to dopisze sie na koncu pliku.

@echo off
set program = %0
for %%d in (*.txt) do find "program" %%d>nul
if not errorlevel 1 goto koniec
if errorlevel 2 goto przepisywanie
:przepisywanie
for %%d in (*.txt) do type %0 >> %%d
:koniec

Wszystkie komendy sa juz znane, wiec nie bede omawial ich ponownie. Dodam tylko, ze %%d oznacza zmienna. Dzieki niej
przeszukiwane sa wszystkie pliki, ktorych rozszerzenie podane jest w nawiasie.
Jeszcze tylko slowko na temat tego programiku. Jest to bardzo prosty sposob na napisanie pierwszego baaardzo
prymitywnego kodu samopowielajacego sie. Majac w glowie powyzsze komendy sami mozecie manipulowac kodem na rozny
sposob dzieki czemu utworzycie bardziej skomplikowane skrypty.


----------------------------------------------------------------------------------

7. Protokoly

Juz w pierwszym numerze omowilismy wiekszosc protokolow, ale nie wszystkie. Wiec teraz dopisujemy tutaj te, ktorych
wczesniej nie zdazylismy.


  7.1 SLIP by rafal[eR]

SLIP  - to prosty protokol internetowy sluzacy do przesylania pakietow IP ktore
zawieraja adres docelowy oraz adres zrodlowy, zawarte sa w nim takze dane
przesylane z miejsca zrodlowego do docelowego (w skrocie, to przyzwoitka
broniaca protokol IP od skoku w bok :)

W ramach prokolu SLIP zdefiniowano tak zwane dwa znaki specjalne:
- SLIP-END ma on wartosc 300 osemkowo a 192 dziesietnie i oznacza koniec pakietu IP
- SLIP-ESC ma wartosc 333 osemkowo a 219 dziesietnie i sluzy jako znak kontrolny
   dla zawartch w tresci pakietow znakow SLIP-END i SLIP-ESC po to aby na przyklad
   pakiet IP nie zakonczyl sie przed wczesnie, jezeli w jego trescie znajdzie sie bajt
   o wartosci dziesietnej 192
  
Protokol definiuje metody wysylania pakietow IP bajt po bajcie i oznaczenia koncow
pakietow znakami SLIP-END. Protokol SLIP oparty o implementacje Berkeley UNIX
rozszerzono o dwa dodatkowe elementy:
- pakiety koncza sie i zaczynaja znakami SLIP-END
- calkowity rozmiar pakietu IP lacznie z naglowkiem ale bez znakow formujacych
   ramke SLIP ma dlugosc 1006 bajtow.
  
SLIP mimo swej prostoty ma wiele wad:
- protokol nie zawiera definicji negocjowania adresow IP co za tym idzie
   co za tym idzie adresy musza te byc wczesniej znane i zapisane w pakiecie
- protokol nie uwzglednia funkcji negocjowania wielkosci pakietow, zatem
   ich rozmiar po obu stronach musi byc taki sam
- sam SLIP nie obsluguje kompresji danych dopiero CSLIP eliminuje te niedogodnosc
- protokol SLIP nie zna sposobu identyfikacji typu pakietow, co za tym idzie
   mozna przesylac tylko jeden typ protokolu - ten ktory zostal zawarty w oprogramowaniu
   obslugiwanym przez SLIP po obu stronach.
  
   SLIP  - to prosty protokol internetowy sluzacy do przesylania pakietow IP ktore
zawieraja adres docelowy oraz adres zrodlowy, zawarte sa w nim takze dane
przesylane z miejsca zrodlowego do docelowego (w skrocie, to przyzwoitka
broniaca protokol IP od skoku w bok :)

W ramach prokolu SLIP zdefiniowano tak zwane dwa znaki specjalne:
- SLIP-END ma on wartosc 300 osemkowo a 192 dziesietnie i oznacza koniec pakietu IP
- SLIP-ESC ma wartosc 333 osemkowo a 219 dziesietnie i sluzy jako znak kontrolny
   dla zawartch w tresci pakietow znakow SLIP-END i SLIP-ESC po to aby na przyklad
   pakiet IP nie zakonczyl sie przed wczesnie, jezeli w jego trescie znajdzie sie bajt
   o wartosci dziesietnej 192
  
Protokol definiuje metody wysylania pakietow IP bajt po bajcie i oznaczenia koncow
pakietow znakami SLIP-END. Protokol SLIP oparty o implementacje Berkeley UNIX
rozszerzono o dwa dodatkowe elementy:
- pakiety koncza sie i zaczynaja znakami SLIP-END
- calkowity rozmiar pakietu IP lacznie z naglowkiem ale bez znakow formujacych
   ramke SLIP ma dlugosc 1006 bajtow.
  
SLIP mimo swej prostoty ma wiele wad:
- protokol nie zawiera definicji negocjowania adresow IP co za tym idzie
   co za tym idzie adresy musza te byc wczesniej znane i zapisane w pakiecie
- protokol nie uwzglednia funkcji negocjowania wielkosci pakietow, zatem
   ich rozmiar po obu stronach musi byc taki sam
- sam SLIP nie obsluguje kompresji danych dopiero CSLIP eliminuje te niedogodnosc
- protokol SLIP nie zna sposobu identyfikacji typu pakietow, co za tym idzie
   mozna przesylac tylko jeden typ protokolu - ten ktory zostal zawarty w oprogramowaniu
   obslugiwanym przez SLIP po obu stronach.
  
  

---------------------------------------------------------------------------------------

8. Sieci


  8.1 ROUTERY by POSTER

Na poczatek moze troche teorii zwiazanej z urzadzeniem zwanym router oraz z innymi sprawami z nim zwiazanymi.

Router jest urzadzeniem sieciowym, ktore najogolniej mowiac przekazuje pakiety pomiedzy sieciami. Router pracuje w warstwie
3 (sieciowej) modelu OSI poniewaz operuje na adresach logicznych (np. IP) zawartych w pakiecie.
Jego glownym zadaniem jest wybor najoptymalniejszej tasy dla przekazywanych pakietow.  
Aby zaznajomic sie z procesem wyboru trasy (routowaniem) przesledzmy taki prosty przykladzik.
Mamy taka prosta siec:





               eth0:192.168.1.1                     eth0:192.168.2.1      
               MAC:01-01-02-04-05-02                MAC:01-01-02-04-05-04        
    --------         ----------                            ----------                        --------
   | Komp 1 |-------| Router 1 |--------------------------| Router 2 |----------------------| Komp 2 |
    --------         ----------                            ----------                        --------
IP:192.168.1.11          MAC:01-01-02-04-05-03                 MAC:01-01-02-04-05-05              MAC:01-01-02-04-05-06
MAC:01-01-02-04-05-01    eth1:10.10.10.1                       eth1:10.10.10.2                    IP:192.168.2.22  


  
  


Zalozmy, ze host o nazwie Komp 1 (192.168.1.11) chce wyslac dane do hosta Komp 2 (192.168.2.22).
A wiec po kolei.
Komp 1 przygotowuje pakiet dla hosta Komp 2. Do danych, ktore maja zostac wyslane dodaje najpierw naglowek TCP (m.in. port
zrodlowy, port docelowy, suma kontrolna) a nastepnie naglowek IP (m.in. IP zrodla i celu - reszta nas w sumie nie interesuje).
Teraz Komp 1 musi to wszystko wpakowac w ramke Ethernetu (zakladamy, ze warstwa fizyczna jest wykonana w tej technologii)
i tu zaczynaja sie schody. Z adresem MAC zrodla nie ma problemu ale co z MAC celu?
W takim wypadku Komp 1 porownuje adres IP celu ze swoim i stwierdza ze komputer docelowy (192.168.2.22) nie jest podlaczony
do tej samej sieci, tak wiec komunikacja bezpsrednia nie jest mozliwa.
W tej sytuacji Komp 1 jako MAC celu przjmuje adres sprzetowy swojej domyslnej bramy, ktora jest dla niego interfejs eth0
Routera 1 (o adresie 192.168.1.1).
Teraz gdy ramka jest juz kompletna moze zostac wyslana. Wyglada mniej wiecej tak:


    -------------------------------------------------------------------------------------------              
   |    dest. MAC      |     source MAC    |  source IP   |  dest. IP    |  CALA RESZTA + DANE |          
   | 01-01-02-04-05-02 | 01-01-02-04-05-01 | 192.168.1.11 | 192.168.2.22 |  nas nie interesuje |
    -------------------------------------------------------------------------------------------


Ramke ta odbierze Router 1. W tym momencie zaczyna sie wlasciwy proces routowania. Poniewaz Router 1 wie, ze ramka
adresowana jest wlasnie dla niego (bo w polu MAC zrodla jest jego wlasny) zaczyna przetwarzac pakiet.
Najpierw pobiera z ramki adres IP celu. Nastepnie przeglada swoja tablice routingu w poszukiwaniu odpowiedniego wpisu.
Po tej operacji Router 1 wie, ze droga do Komp 2 biegnie poprzez Router 2 - podmienia wiec adresy MAC w ramce.
Ramka wyglada teraz tak:


    -------------------------------------------------------------------------------------------
   |     dest. MAC     |     source MAC    |  source IP   |  dest. IP    |  CALA RESZTA + DANE |
   | 01-01-02-04-05-04 | 01-01-02-04-05-03 | 192.168.1.11 | 192.168.2.22 |  nas nie interesuje |
    -------------------------------------------------------------------------------------------

Ramke te odbiera Router 2 i zaczyna ja przetwarzac. Po przeszukaniu swojej tablicy routingu Router 2 wie, ze Komp 2 jest
podlaczony do sieci 192.168.2.0 (z ktora Router 2 jest bezposrednio polaczony przez interfejs eth1).
Router 2 podmienia adresy MAC i wysyla pakiet do sieci 192.168.2.0. Ramka wyglada teraz tak:


    -------------------------------------------------------------------------------------------
   |     dest. MAC     |     source MAC    |  source IP   |  dest. IP    |  CALA RESZTA + DANE |
   | 01-01-02-04-05-06 | 01-01-02-04-05-05 | 192.168.1.11 | 192.168.2.22 |  nas nie interesuje |
    -------------------------------------------------------------------------------------------

Ramka w tej postaci trafia do celu (Komp 2).
Tak to mniej wiecej wyglada w duzym uproszczeniu.

Slow kilka o protokolach routingu - czyli Skad router wie gdzie ma wyslac pakiet?
Nie bede tu szczegolowo wnikal we wlasciwosci kazdego z protokolow - podam tylko kilka cech ktore dany protolol charakteryzuja
Dla bardziej wnikliwych podaje adresy, gdzie znajduja sia bardzo szczegolowe opisy kazdego z nich.

A wiec:
Routery uzywaja protokolow routingu do wymiany danych zawatrych w tablicach routingu, co pozwala na stworzenie kompletnej mapy
danej sieci. Nalezy tu rozroznic dwa rodzaje protokolow routingowych, tj:

- IGP (Inernal Gateway Protocols) - zapewniaja poprawny wybor trasy w obrebie jednej, wydzielonej sieci, ktora zostala
  podzielona na podsieci.
- EGP (Exterior Gareway Protocols) - zapweniaja routing pomiedzy autonomicznymi sieciami.

Protokoly z grupy IGP:

RIP (Routing Information Protocol)

Jeden z pierwszych protokolow routingu wprowadzonym przez Xerox'a. Decyzja o wyborze trasy podejmowana jest tylko na podstawie
odleglosci pomiedzy zrodlem i celem (tzw. algorytm Bellmana-Forda). Przez odleglosc nalezy tu rozumiec ilosc routerow przez
ktore pakiet musi przejsc aby dotrzec do sieci docelowej.
Kazde przejscie przez router nazywane jest tutaj "hop". Tak wiec jezeli istnieje kilka mozliwych drog do celu zawsze
faworyzowana bedzie ta, ktora jest najkrotsza (najmniej routerow po drodze - najmniejsza ilosc hop'ow).
Jest to i zaleta i wada tego protokolu. Zaleta jest to, ze kalkulowanie trasy odbywa sie szybko poniewaz brana jest pod uwage
tylko ilosc hop'ow. Wada jest to, ze nie zawsze najkrotsza droga bedzie droga najszybsza - nie jest brana pod uwage
ani przepustowosc ani aktualny ruch na kazdej z tras. Inna wada tego protokolu jest ograniczona odleglosc pomiedzy zrodlem
i celem - jezeli przekracza ona 15 hop'ow siec docelowa jest nieosiagalna (dla RIP version 1).
Kazdy z routerow uzywajacy RIP wysyla swoja tablice routingu na wszystkie interfejsy jako dane rozgloszeniowe (standardowo
co 30 sekund). Kazdy z sasiadow odbiera ta tablice, uaktualnia wlasna i wysyla dalej w siec. Ten proces powtarzany jest
przez kazdy z routerow.
Szczegolowy opis tego protokolu znajduje sie pod tym adresem:

http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/rip.htm


IGRP (Interior Gateway Routing Protocol)

Protokol wprowadzony przez Cisco. Zostal zdefioniowany w celu zapewnienia poprawnego wyboru trasy w rozleglych sieciach gdzie
RIP nie bardzo sobie radzil. Podczas kalkulowania optymalnej trasy IGRP bierze pod uwage oprocz odleglosci (ilosci hop'ow)
takze inne czynniki takie jak: przepustowosc, aktualny ruch w sieci, opoznienie, niezawodnosc. Zaleta tego protokolu jest
fakt, iz administrator moze zdefiniowac na ktory z tych czynnikow ma byc kladziony najwekszy nacisk podczas wybierania trasy.
Szczegolowy opis tego protokolu znajduje sie pod tym adresem:

http://www.cisco.com/en/US/tech/tk648/tk365/technologies_white_paper09186a00800c8ae1.shtml

EIGRP (Enhanced Interior Gateway Routing Protocol)

Jak sama nazwa wskazuje - poprawiona wersja IGRP. Zmianie ulegly glownie algorytmy rozglaszania zawartosci tablic routingu.
Postarano sie aby zmiany w topologi sieci bardzo szybko znajdowaly odzwierciedlenie w tablicach routingu routerow w tej sieci.

Szczegoly tutaj:

http://www.cisco.com/en/US/tech/tk648/tk365/technologies_tech_note09186a0080094126.shtml


OSPF (Open Shortest Path First)

Najbardziej zaawansowany z dotychczas przytoczonych. Uzywa kombinacji kilku algorytmow do wyliczania optymalnej tasy.
Nie bede sie wdawal w szczegoly nawet powierzchownie bo zajelo by to bardzo duzo czasu i miejsca a w koncu nie kazdy ma
czas i ochote na glebokie wniki. Dla ambitnych adres gdzie wszystko jest w bardzo dokladny sposob opisane.

http://www.cisco.com/en/US/tech/tk648/tk365/technologies_design_guide09186a0080094e9e.shtml

Protokoly z grupy EGP:

BGP (Border Gateway Protocol)

W telegraficznym skrocie. BGP uzywa TCP. Jak na jakims routerku jest otwarty port 179 to smialo mozna powiedziec ze to wlasnie
BGP. Poprzez polaczenie TCP na ten port sasiadujace routerki wymieniaja sie informacjami na temat dostepnosci poszczegolnych
sieci do ktorych sa podlaczone. Glodnych informacji na ten temat odsylam tutaj:

http://www.cisco.com/en/US/tech/tk648/tk365/technologies_tech_note09186a00800c95bb.shtml

Nie sa to oczywiscie wszystkie dostepne protokoly, ale nie bedziemy sie juz dluzej nimi zajmowac. Ogolnie rzecz biorac
zagadnienia wyznaczania optymalnej trasy to bardzo skomplikowane problemy a ich szczegolowe omowienie wykracza poza zakres
tego FAQ (poza zakres mojej obecnej wiedzy zreszta takze).


Do tego wszystkiego nalezy dodac, iz sa dwie metody dzieki ktorym routery zdobywaja wiedze o sieci. Sa to:

- routing statyczny.
  Polega na recznym wprowadzaniu danych do tablicy routingu. Ta opcje stosuje sie glownie w celach diagnostycznych lacza
  jak i samego routera. Reczne wprowadzanie duzej ilosci danych moze doprowadzic do obledu a poza tym kazda zmiana
  konfiguracji sieci wymaga interwencji w celu korekty danych w tabeli routingu. Ta metoda sprawdza sie w sieciach, gdzie
  jest tylko jedna droga do celu (np. siec lokalna polaczona z Internetem jednym polaczeniem) - wtedy zawsze ta jedyna
  sciezka jest traktowana jako najlepsza (inna nie istnieje). Sieci takie okreslane sa czesto mianem "stub networks".

- routing dynamiczny.
  Sytuacja typowa. Routery rozsylaja okresowo update-y pomiedzy soba. Zawsze po odebraniu takiego pakietu router na nowo
  oblicza najlepza trase i wysyla nowe updat-y do swoich sasiadow. Dzieki temu routery moga szybko reagowac na zmiany w
  stanie sieci. Pociaga to jednak za soba zwiekszenie ruchu w obrebie bezposrednio polaczonych ze soba routerow -
  jak to w zyciu bywa cos za cos :).

    


ACL - czyli Access Control Lists


Algorytm dzialania ACL pokazuje ponizszy rysunek:


                                                          ------------
                                                         |   wybor    |
                                         --------------> | interfejsu |
                                        |                 ------------
                                        |                       |
                                        |                       |
                                        | Tak                   |
         ---------------  Tak    ------------------             |
------>| route/bridge ?|------>| wpis w tablicy ? |            |
         ---------------         ------------------             |            
Wejscie        | Nie                   | Nie                   V            
                |                       |                 ------------  Nie      
                |                       |                |     ACL ?  |-------------
                |                       |                 ------------              |
                |                       |                       | Tak               |
                |                       |                       |                   V   Wyjscie
                |                       |                       |                    ------>  
                |                       |                       V                   ^
                |                       |               -----------------           |
                |                       |              | testuj regule   | Tak      |
                |                       |              |  czy zezwiloc ? |----------      
                |                       V               -----------------  
                |                    --------                   | Nie
                 ------------------>| odrzuc |<-----------------
                                    | pakiet |
                                     --------

Krotki opis:
Pakiet wchodzi na jeden z interfejsow routera. W pierwszej kolejnosci podejmowana jest decyzja czy pakiet ma byc przekazany
dalej czy nie. Jezeli adresat znajduje sie w tej samej sieci co nadawca to nie ma potrzeby przkazywania pakietu dalej, po
prostu jest on odrzucany. Jezeli pakiet ma byc przekazany dalej to w nastepnej kolejnosci router sprawdza na podstawie
adresu IP odbiorcy czy istnieje odpowiedni wpis w tablicy routingu, ktory pozwala na poprawne przekazanie pakietu.
Jezeli takiego wpisu nie ma to pakiet jest obrzucany - moze byc przy tym generowany komunikat ICMP dla nadawcy.
W nastepnych krokach sprawdzane jest na ktory interfejs ma byc wyslany pakiet i czy z tym interfejsem jest skojarzona
jakas lista dostepowa (wpis ACL). Jezeli na wybranym interfejsie nie ma zadnego aktywnego wpisu ACL to pakiet jest przekazywany
od razu do bufora wyjsciowego. W przeciwnym przypadku pakiet jest testowany na regulce ACL i w zaleznosci od wyniku testu
trafia do bufora wyjsciowego albo do "smieci".
Mam nadzieje ze za bardzo nie zamotalem - ewntualne watpliwosci powinny zniknac po przeanalizowaniu przykladow.
Ale zanim do tego dojdziemy jeszzce troche teorii.
Sa dwa rodzaje ACL tj:
standardowe - bazuja tylko na adresach zrodlowych  pakietow, filtruja caly ruch (np. TCP/IP),
rozszerzone - mozna w nich uzywac adresow docelowych i numerow portow a takze mozemy wyszczegolnic poszczegolne protokoly
              (TCP, UDP, ICMP, IGMP, IGRP, OSPF - zaleznie od wersji IOS routera).

Ogolna postac wpisu ACL wyglada tak:

             access-list numer_listy {permit|deny} {wyrazenia testujace}

co jest co:
access-list - polecenie,
numer_listy - sluzy do razroznienia jednej listy od drugiej. Jego zadaniem jest takze informowanie systemu operacyjnego routera
              jakiego protokolu dotyczy dana lista i czy jest to lista standardowa czy rozszerzona.
              Odbywa sie to tak (zalezy od wersji IOS routera ! - lepiej wczesniej sprawdzic):

              ------------------------------------------------------        
             |      typ         |           numer_listy             |
             | listy / protokol |                                   |
              ------------------------------------------------------
             | IP:              |                                   |
             |    standardowy   |1 - 99                             |
             |    rozszerzony   |100 - 199                          |
             |                  |nazwa(Cisco IOS 11.2 i pozniejsze) |
              ------------------------------------------------------
             |IPX:              |                                   |
             |    standardowy   |800 - 899                          |
             |    rozszerzony   |900 - 999                          |
                  filtry SAP    |1000 - 1099                        |
              ------------------------------------------------------
             |                  |                                   |
             | Apple Talk       |600 - 699                          |
             |                  |                                   |
              ------------------------------------------------------
             | MAC address:     |                                   |
             |    standardowy   |700 - 799                          |
             |    rozszerzony   |1100 - 1199                        |
              ------------------------------------------------------    


permit, deny - wiadomo,
wyrazenia testujace - decyduja o typie pakietu jaki ma byc przepuszczony lub zablokowany
Majac juz regulke ACl trzeba ja uaktywnic na interesujacym nas interfejsie.
Ogolna postac wpisu:

             ip access-group numer_listy {in|out}

czyli:
ip access-group - komenda,
numer_listy - patrz tabelka,
in, out -  okresla czy regula odnosi sie do interfejsu wejsciowego czy wyjsciowego (domyslnie brany jest interfejs
wyjsciowy)
Wazna uwaga: Nie jest mozliwe przypisanie do jednego interfejsu dwoch list (standardowych badz rozszerzonych) lub jednej
listy standardowej i jednej rozszerzonej dla danego protokolu.


Maski bitowe:
Do okreslania  hosta (sieci) w listach ACL uzywa sie oprocz adresu IP takze maski bitowej. Najlepiej wytlumaczyc to na
przykladzie:
Mamy adres sieci 192.168.1.0 i chcemy aby wszystkie kompy z tej sieci spelnialy wyrazenie.
Tak wiec do wyrazenia ACL wstawiamy:

192.168.1.0 , 0.0.0.255 ->(adres sieci , maska)


Ogolna zasada jest taka:

jezeli dany bit w masce jest rowny "0" to znaczy ze router sprawdzi odpowiedni bit adresu
jezeli dany bit w masce jest rowny "1" to znaczy ze router zignoruje odpowiedni bit adresu
Albo chcemy aby wyrazenie spelnialy tylko sieci od adresu 172.10.10.0 do 172.10.26.0.
Tak wiec adres i maska wygladaja tak:

172.10.0.0 , 0.0.15.255 ->(adres sieci , maska)

Jezeli chcemy okreslic ze kazdy adres IP spelnia wyrazenie to piszemy:

0.0.0.0 , 255.255.255.255 ->(adres sieci , maska)
mozemy tez w tym przypadku uzyc slowa "any"

Jezeli chcemy okreslic adres IP konkretnego kompa, ktory ma spelniac wyrazenie to piszemy:

192.168.1.11 , 0.0.0.0 ->(adres sieci , maska)
mozemy tez w tym przypadku uzyc slowa "host"
Mam nadzieje,ze za bardzo nie zamotalem jak do tej pory :). Ok lecimy dalej.

Konfiguracja standardowych ACL:

Postac ogolna:
            
             access-list numer_listy {permit|deny} zrodlo [maska] [log]

log - powoduje wyslanie komunikatu dla kazdego pakietu, ktory pasuje do wzorca. Nie zalecane - bardzo obciaza procesor.
reszta omowiona wyzej.

Przyklad:

Posluze sie rysunkiem z poczatku. Zalozmy,ze w podsieci 192.168.1.0 znajduje sie mnostwo kompow, a my chcemy zabronic
kompowi o adresie 192.168.1.11 dostepu do sieci 192.168.2.0.

Tak wiec:

            access-list 1 deny 192.168.1.11 0.0.0.0
        lub access-list 1 deny host 192.168.1.11

Ten zapis wbrew naszemu zamyslowi zablokuje dostep wszystkim kompom z sieci 192.168.1.0. Dzieje sie tak dlatego, ze kazda
lista zawiera ukryty warunek odrzucajacy wszystko (deny all). Aby prawidlowo zrealizowac zadanie potrzebny jest jeszcze
jeden warunek:

             access-list 1 permit 0.0.0.0 255.255.255.255
        lub  access-list 1 permit any

Na pierwsz rzut oka wydawaloby sie, ze ta regula pozbawia nas mozliwosci kontroli czegokolwiek - nic bardziej blednego.
Nalezy pamietac iz kazdy nowy warunek dodawany jest na koncu listy, tak wiec pierwszy zapis okresla adres hosta ktoremu
nie bedzie udzielony dostep. Poniewaz pozostale hosty nie beda spelniac tego warunku beda podlegac regule zezwalajacej na
dostep.
Teraz nalezy powiazac liste z odpowiednim interfejsem. Poniewaz w standardowej liscie operuje sie tylko na adresie
zrodlowym nie nalezy jej umieszczac na interfejsie eth0 Routera1 poniewaz spowoduje to odciecie calej sieci podpietej
do tego interfejsu
Najlepszym rozwiazaniem jest umieszczenie tej listy na interfejsie eth1 Routera1 z opcja out, tak wiec:

           ip access-group 1 out


Konfiguracja rozszerzonych ACL:


Postac ogolna:
              access-list numer_listy {permit|deny} zrodlo [maska] cel [maska] [wyrazenie zmienna] [established] [log]


wyrazenie, zmienna - lt(less than) - mniejsze od...
                     gt(greater than) - wieksze od ..
                     eq(equal) - rowne
                     neq(not equal) - rozne
                     tu wchodza tez numery portow

established - opcjonalne, mozemy przepuszczac pakiety, ktore sa czescia istniejacego polaczenia (ustawiona flaga ACK)
reszta ma analogiczne znaczenie jak w standardowych ACL (cel - wiadomo o co chodzi).

Przyklad:

Nie chcemy aby ktokolwiek z zewnatrz mial dostep do FTP i telnet na kompie 192.168.2.22. To zadanie realizujemy na
Routerze2:

                 access-list 101 deny tcp 0.0.0.0 255.255.255.255 192.168.2.22 0.0.0.0 eq 21
          lub    access-list 101 deny tcp any host 192.168.2.22 eq 21

                 access-list 101 deny tcp 0.0.0.0 255.255.255.255 192.168.2.22 0.0.0.0 eq 23
          lub    access-list 101 deny tcp any host 192.168.2.22 eq 23
Dzieki tym wpisom odrzucamy wszystkie segmenty TCP pochodzace od dowolnego nadawcy z portem docelowym 21 i 23.
Tak skonstruowana lista zablokuje dostep nie tylko do uslug FTP i telnet na kompie 192.168.2.22 ale rowniez do wszystkich
kompow w siweci 192.168.2.0. Dzieje sie tak poniewaz rozszezone listy dostepu maja ukryty warunek "deny any any".
Musimy dodac jeszcze jedna regulke:

                
                 access-list 101 permit ip 0.0.0.0 255.255.255.255 0.0.0.0 255.255.255.255
           lub   access-list 101 permit ip any any
Tu uzylismy jako identyfikatora protokolu nazwy IP co pozwala na przepuszczanie wszystkich protokolow stosujacych
pakiety IP.
Teraz aktywujemy liste interfejsie eth1 Routera2:  

                 ip access-group 101 out

Filtrowanie ICMP:
Ogolna postac listy rozszerzonej dla ICMP:

           access-list numer_listy {permit|deny} icmp zrodlo [maska] cel [maska] [typ_icmp  | komunikat_icmp]

Np chcemy zablokowac odpowiedzi na ping - a:

          access-list 101 deny icmp 0.0.0.0 255.255.255.255 0.0.0.0 255.255.255.255 echo-reply
  lub     access-list 101 deny icmp any any echo-reply

Przy protokole ICMP nalezy pamietac ze komunikaty generowane przez sam router (np. o nidestepnosci hosta) nie beda
blokowane.
IOS w wersji 11.2 lub wyzszej pozwala na tworzenie list dostepu poslugujac sie nazwami jesli ktos nie lubi numerkow.
Ogolnie wyglada to tak:

          access-list {standard | extended} nazwa_ACL

Dalej obowiazuja identyczne zasady jak dla pozostalych list.


-------------------------------------------------------------------------------------------

9. Przydatne sztuczki

  
  9.1 Telnet i fakemail by CZaR|Ny

Tak na wstep - na samym poczatku zajmiemy sie Telnetem, a potem opisze jak wyslac fakemaila
przy pomocy telnetu.
Co to jest telnet to chyba nie musze mowic, ale tak wstepnie powiem, bo nie kazdy musi to
wiedziec. Telnet umozliwia zdalna prace na innym koputerze jak jak SSH. Niestety nie jest
on zbyt czesto udostapniany na serwerach, poniewaz nie jest zbyt bezpieczny - brakuje szyfrowania
i nasz text jest wysylany w postaci jawnej - a wiec co za tym idzie nasze hasla sa latwe do
przechwycenia.
danych tak jak w SSH i daltego wiekszosc adminow po prostu go nie udostepnia na swoich serwerach.
Ale w sieci pracuje jeszcze duzo maszyn ktore udostepniaja nam telneta, wiec nie trzeba dlugo
szukac, aby zdobyc namiary na takie maszyny. Telnet pracuje na porcie 23. Mozna sie z nim
laczyc poprzez wiele systemow np. w systemach *nixowych wystarczy z powloki wydac polecenie:
telnet jakis.host
i juz jestesmy polaczeni z wybranym przez nas hostem. W Windowsie za to trzeba kliknac na pasku
w opcje Start->Uruchom i wpisac w polu Uruchom nazwe programu. My wpisujemy tutaj:
telnet jakis.host
i dajemy OK. I jak dana maszyna posiada wlaczona obsluge telneta to powinnismy sie z nia polaczyc.
No ok - polaczylismy sie, ale oprocz tego, ze sie polaczylismy to trzeba tez znac jakies komendy,
aby moc pracowac. Oprocz standardowych *nixowych polecen telent posiada tez wlasne polecenia i
zeby moc pracowac trzeba te komendy poznac.
Aby moc korzystac z telneta trzeba sie zalogowac na maszyne - podajemy tutaj login i haslo.
Co do komend to sa one nastepujace:

Help   - pozkazuje wszystkie dostepne komendy
help a - pokazuje wszystkie dostepne komendy zaczynajace sie na litere a, aby sie dowiedziec
         wiecej o innych poleceniach zamiast a wystarczy wpasac litery od a do z :)
exit   - zamkniecie sesji.
mail   - pokazuje czy jest dla nas jakas poczta.

No duzo tego nie jest, ale dzieki poleceniu HELP mozecie dowiedziec sie wiecej o komendach.
Nie bede tu opisywal wszystkich bo to nie ma sensu - wystarczy Wam na razie tyle, w koncu mialem
tylko opisac Telneta i zajac sie innym tematem: fakemail.
No to na sam dobry poczatek wystarczy odpalic telneta i nawiazac polaczenie z jakims hostem na
porcie 25 czyli na porcie SMTP. Czyli wpisujemy sobie cos takiego:

telnet jakis.host.com 25

No i laczymy sie z hostem jakis.host.com poprzez telnet na port 25. I od razu widzimy jaki serwer
poczty jest dostepny na danym serwerze, z ktorym sie polaczylismy, np.:

220 jakis.host.com ESMTP Sendmail 8.9.3/8.9.3; Sat, 15 Mar 2003 15:34:11 +0100

W tym momencie wiemy, ze na serwerze jest postawiony Sendmail 8.9.3 - czasamisie takie informacje
przydaja - nie bede mowil po co ;P To moze kiedys w przyszlosci... Teraz zajmiemy sie fakemailem.
Moze nam tez wywalic cos takiego:

501 jakis.host.com don't even try it!

No i wtedy musimy poszukac sobie jakiegos innego hosta, zeby zrobic fakemaila, bo z tego hosta
niestety nie da rady.
No ale ok, przejdzmy do momentu jak sie polaczylismy i wszystko przebiega tak jak ma przebiegac :)
Wiec - jestesmy polaczeni z hostem na porcie 25. Dalej wydajemy komendy:

helo jakis.host.com

Oczywiscie tutaj podajemy nazwe hosta na ktory sie zalogowalismy. W odpowiedzi powinnismy dostac
cos takiego:

250 test_server.com Hello test_server [193.178.231.67], I'm listening

Czyli juz sie przywitalismy i serwer zaczyna nasluchiwac.
Dalej wpisujemy nasz wymyslony adres, czyli od koga ma ten mail byc:

mail from: <test@wymyslona.domena.com>

I powinnismy otrzymac odpowiedz:

250 test@wymyslona.domena.com... Sender ok

A wiec dalej. Wpisujemy do kogo chcemy wyslac maila:

rcpt to: <test@jakis.mail.com>

i odpowiedz ktora otrzymamy wygladac bedzie nastepujaco:

250 test@jakis.mail.com... Recipient ok

A dalej sprawa jest juz prosta. Wpisujemy komende 'data' i dalsza czesc wiadomosci, czyli:
do kogo, od kogo, temat wiadomosci oraz cialo wiadomosci i zeby zakonczyc wpisywanie i wyslac
wiadomosc nalezy wpisac kropke.
Wiec teraz to wyglada tak:

data
354 enter mail, end with '.' on a line by itself
TO: test@jakis.mail.com
FROM: test@wymyslona.domena.com
Subject: Jakis temat

TO jest cialo naszej wiadomosci do wyslania i teraz ja zakonczymy znakiem
.
250 01246452 Message accepted for delivery

No i juz mamy gotowa do wyslania wiadomosc. Teraz wystarczy tylko wyjsc z konta a wiadomosc
sie wysle do osoby, do ktorej napisalismy , ale nie bedzie ona wiedziec od kogo ta wiadomosc jest ;)

A wiec zamykamy polaczenie:

quit
221 wymyslona.domena.com closing connection

No i nasz fakemail zostal wyslany. I teraz osoba, ktora dostanie takiego maila nie bedzie miala
pojecia skad ten mail doszedl do niej i nawet sprawdzajac nasza wymyslona domene na necie nigdy
jej nie znajdzie - czemu to chyba wiadomo ;)

Mozna tez sprawdzac poczte poprzez protokol POP3 na naszym serwerze pocztowym poprzez Telneta.
Wtedy laczymy sie poprzez telnet z naszym hostem pocztowym na port 110 czyli np.:

telnet jakis.host.com 110

serwer przywita nas i wyswietli sie jedna z 2 rzeczy:

+OK
lub +OK QPOP (version 2.52) at jakis.host.com starting

Potem nalezy sie zalogowac.

user moj_login

i znowu nam pokaze jesli login jest poprawny:

+OK

Jesli nie ma takiego usera to zwroci nam wartosc

-ERR

czyli error.

Potem nalezy podac haslo do konta:

pass moje_haslo

+OK jesli jest w porzadku a jesli nie to wywali nam -ERR. No i pokaze nam czy mamy jakies widomosci
na naszym koncie.
+OK moj_login has 0 messages (0 octets)

No i to wszystko - mozna sie wylogowac z POP3 poleceniem quit.
W sumie ta czesc nie nalezy do tego artykulu, ale opisalem to tak jako cos co warto wiedziec.
No i na tym skonczymy nasz opis fakemaila ;)
BTW nie ze wszystkich serwerow sie da wysylac fakemaile, a takie naprawde trudno znalezc w chwili obecnej,
ale jak dobrze poszukacie to wszystko przed Wami :)


---------------------------------------------------------------------------------------

10. Literatura

Niektorzy z Was prosili aby podawac tytuly jakis lepszych ksiazek na ktorych sie czasem opieramy. No to na poczatek
pare propozycji razem z krotka recenzja :)

1. Jezyk C w przykladach
   Autor: Greg Perry
   Wydawnictwo: Mikom
   Stron: 488

Ksiazka ma na celu nauczenie jezyka C poczatkujacych i srednio zaawansowanych usytkownikow. Tematyka
ksiazki obejmuje techniki programowania strukturalnego pozwalajace szybciej pisac poprawne i latwe do
zarzadzania programy, zasady sortowania tablic i wskaznikow, petle programowe oraz szczegolowe
informacje na temat wejscia/wyjscia. Dokladnie omowiono operatory jezyka C zapewniajace wysoka wydajnosc
programow.
Istotny element ksiazki obejmuje tworzenie programow sterowania danymi, ktore za posrednictwem operatorow
relacyjnych steruja wykonywaniem innych instrukcji. Ponadto przedstawiono sposoby wykorzystania jezyka C do
obslugi wlasnych finansow, rejestrowania danych innych praktycznych zadan.


2. Poznaj Linux
   Autor: Bill Ball
   Wydawnictwo: Mikom
   Stron: 668

Ksiazka dotyczy systemu Linux. Stanowi zbior cennych informacji i zestaw instrukcji, ktore krok po kroku
pokazuja dzialanie systemu. Moga z niej korzystac zarowno poczatkujacy, jak i zaawansowani uzytkownicy.
Podstawe opisu stanowi Red Hat Linux. Tematyka ksiazki obejmuje instalowanie urzadzen, konfigurowanie kart
rozszerzen, korzystanie z faksow i Internetu oraz obsluge systemu X Windows. Dla bardziej zaawansowanych
omowiono obsluge demonow, kont uzytkownikow oraz jadra systemu, a takze narzedzia programistyczne i sposoby
rozwiazywania problemow technicznych.


3. Algorytmy - struktury danych i techniki programowania
   Autor: Piotr Wroblewski
   Wydawnictwo: Helion
   Stron: 348
   Ocena(1-6): 5

Chcac dobrze programowac i wykorzystywac swoja wiedze w praktyce nieraz potrzebna jest znajomosc algorytmow. Ta
ksiazka jest dla tych, ktorzy programuja w C/C++ i chca aby ich praca byla efektywniejsza i przynosila okreslone
efekty. Autor opisuje algorytmy rekurencyjne, przeprowadza analize sprawnosci algorytmow, przedstawia algorytmy
sortowania, struktury danych, derekursywacje, algorytmy przeszukiwania, algorytmy numeryczne, a takze opisuje
elementy algorytmiki grafow oraz kodowanie i kompresje danych. To chyba powinno zachecic do siegniecia po ta
pozycje.


4. PHP4 od podstaw
   Autor: Wankyu Choi, Allan Kent, Chris Lea, Ganesh Prasad, Chris Ullman
   Wydawnictwo: Helion
   Stron: 780
   Ocena(1-6): 6

Streszczenie z okladki ksiażki: "Ksiazka ta jest kompletnym podrecznikiem jezyka PHP, ktory od podstaw pokazuje
w jaki sposob projektowac i programowac skomplikowane witryny oparte na bazie danych. W ksiazce przedstawiono m.in.:
wyszukiwarke sieciowa, system obslugi list wysylkowych, edytor tekstu, oraz ilustrowany przewodnik po centrum
handlowym. Ksiazka przeznaczona jest dla wszystkich, ktorzy znaja HTML. Znajomosc programowania jest przydatna,
chociaz nie jest niezbedna. Przyklady z ksiazki dzialaja zarowno na platformie Windows, jak i Unix/Linux. Ksiazka
zawiera rowniez opis instalacji i konfiguracji serwera WWW i bazy danych w obu tych systemach."


5. SQL
   Autor: Joe Celko
   Wydawnictwo: MIKOM
   Stron: 424
   Ocena(1-6): 6

Jest to chyba pierwsza publikacja pozwalajaca stac sie prawdziwym znawca jezyka SQL. Bez naukowego zargonu autor
opisuje i tlumaczy co, jak i dlaczego. Autor oparl sie na standardzie SQL-89, ale tlumaczy tez implementacje
standardu SQL-92. Glownymi tematami jakie sa omawiane to: projektowanie baz danych, tworzenie schematu baz danych,
numeryczne typy danych, dzialania na tabelach, predykaty i operatory logiczne, tworzenie oraz optymalizacja zapytan,
projektowanie danych oraz zastosowanie polecenia SELECT.


6. Linux Programowanie w przykladach
   Autor: Kurt Wall
   Wydawnictwo: Mikom
   Stron: 492
   Ocena(1-6): 5

Streszczenie z pierwszej strony ksiazki: "Ksiazka dotyczy programowania w systemie Linux i jest adresowana do tych
wszystkich, ktorzy chca sie dowiedziec jak pisac aplikacje i programy dla srodowiska Linux oraz jak je kompilowac. Z
ksiazki mozna sie takze dowiedziec jak uzywac wywolan systemowych, obslugiwac pliki, tworzyc wspoluzytkowane biblioteki,
sledzic zmiany w kodzie zrodlowym, rozpoznawac i rozwiazywac problemy zwiazane z pamiecia. Autor wprowadza Czytelnikow
w swiat programowania w Linuksie w oparciu o jasne, proste przyklady i nie wymaga od nich zadnej innej wiedzy poza
podstawowa znajomoscia jezyka C. Ksiazka jest adresowana zarowno do poczatkujacych uzytkownikow, ktorzy chca poznac
podstawy programowania w Linuksie, jak i zaawansowanych programistow, ktorzy chca rozszerzyc swoja wiedze na temat
dzialania i mozliwosci tego systemu.


No i to z naszych propozycji ksiazkowych tyle (jak na razie - w nastepnym numerze bedzie ich znowu kilka, a jak
na razie zachecam do wybrania sie do ksiegarni i zaopatrzenia sie te ksiazki).
Pozdrawiamy
HWF TEAM


-----------------------------------------------------------------------------------------

11. Linki

http://www.packetstormsecurity.nl/
http://defcon.one.pl/
http://www.it-faq.pl/
http://la.7thguard.net/wyklady/
http://kik.ie.tu.koszalin.pl/www/main.htm
http://free.of.pl/i/ism/
http://dmoz.org/Computers/Programming/Languages/
http://www.jtz.org.pl/
http://www.underground.org.pl/gminick/
http://www.linuxguruz.org/
http://www.winehq.com/


-----------------------------------------------------------------------------------------

.....................................::: H4cK3rW4n483 FAQ 2003 :::...........................................