Uploaded by cristi.barabas

curs-linux

advertisement
Linux Basic Administration
Capitolul 1 - Introducere & Instalare
1.1 Istorie Unix/Linux
Anii 60
Bell Laboratories (devizie de cercetare a AT&T) formeaza un consortiu impreuna
cu MIT (Massachusetts Institute of Technology) si General Electric pentru a dezvolta un
sistem de operare interactiv, multiuser si multi-tasking numit Multics (Multiplexed
Information and Computing Service) care sa ruleze pe Mainframe-uri GE-645. Proiectul nu
a avut succesul scontat, iar Bell Labs se retrage. Un programator pe nume Ken Thompson
nu renunta si continua dezvoltarea proiectului impreuna cu un alt programator pe nume
Dennies Ritchie.
1970
Noul proiect este numit Unics (Uniplexed Information and Computing Service).
Numele este atribuit de Brian Kernighan, iar mai tarziu este schimbat in UNIX. Sistemul de
operare este scris in limbaj de asamblare.
1973
Unix este rescris in C pentru a putea fi portabil (sa ruleze si pe alte masini). Acest
lucru a dus la o dezvoltare accelerata. AT&T distribuie noul sistem universitatilor, marilor
firme dar si guvernului USA.
1973-1979
Unix-ul este in continuare dezvoltat in cadrul Universitatii Berkeley din California.
Δƒeste adaugat suportul pentru lucrul in retea.
1980-1983
AT&T lanseaza prima versiune comerciala de UNIX fara a introduce modificarile
aduse de Berkeley.
1982
Un programator din cadrul proiectului BSD (Berkeley Software Distribution Berkeley Unix) impreuna cu cativa colegi de la Stanford University creaza firma SUN Stanford University Network. Prima lansare de Unix are loc in 1983 si se numeste SunOS.
Printre altele sunt introduse NFS (Network File System) care devine un standard.
1984
Richard Matthew Stallman (nickname RMS) paraseste MIT (care crea doar
software proprietar) pentru a crea un sistem de operare complet FREE (Free as in Freedom)
- FREE (Free as in Freedom). Noul proiect poarta numele de GNU (GNU's not UNIX). Primul program creat a fost
editorul emacs. In 1985 RMS creaza fundatia FSF - Free Software Foundation. Scopul
acesteia este ca software-ul sa fie free in sensul de liber si oricine sa poata avea acces liber
si fara restrictii la sursa. Acest tip de licenta se numeste GPL - General Public License.
1988
SunOS/BSD, AT&T System V Release 3 si Xenix ( Microsoft version of Unix
pentru PC cu procesoare Intel cumparat de la AT&T in 1979) au fost combinate in System
V Release 4 (SVR4).
Nota
Xenix a fost versiunea Microsoft de Unix pentru PC cu procesoare Intel cumparata de la
AT&T in 1979. Aceasta a fost ulterior vanduta firmei Santa Cruz Operation(SCO) si a
devenit SCO UNIX.
1990
GNU continea aproape toate componentele necesare unui nou sistem de operare,
mai putin kernel-ul.
1991
Profesorul olandez Andrew Tanenbaum scrie o carte intitulata "Operating System"
in care explica conceptul unui nou sistem de operare numit Minix. Un student finlandez pe
nume Linus Torvalds de la Universitatea din Helsinki scrie un Kernel pentru GNU care sa
ruleze pe calculatoarele AT-386 si 484, bazandu-se pe anumite concepte din cartea lui
Tanenbaum.
Ulterior intre Linus Torvalds si Andrew Tanenbaum se isca un conflict bazat pe
viziunea diferita pe care acestia o aveau asupra noului Kernel. Detalii
Celebrul anunt al lui Linus Torwalds precum ca a dezvoltat un kernel a fost postat pe un
newsgroup comp.os.minix:
Nota
Hello everybody out there using minix - I'm doing a (free) operating system (just a hobby,
won't be big and professional like gnu) for 386(486) AT clones. This has been brewing
since april, and is starting to get ready. I'd like any feedback on things people like/dislike
in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to
practical reasons) among other things). I've currently ported bash(1.08) and gcc(1.40),
and things seem to work. This implies that I'll get something practical within a few months,
and I'd like to know what features most people would want. Any suggestions are welcome,
but I won't promise I'll implement them?:) Linus (torvalds@kruuna.helsinki.fi) PS. Yes it's free of any minix code, and it has a multi-threaded fs. It is NOT portable (uses 386 task
switching etc), and it probably never will support anything other than AT-harddisks, as
that's all I have:-(.
Sistemul de operare creat astfel prin folosirea kernelului lui Linus si a programelor si
utilitarelor GNU poata numele de GNU/Linux.
Nota
Numele complet si corect al sistemului de operare nu este Linux ci GNU/Linux.
GNU/Linux este un sisteme de operare multiuser si multitasking care ruleaza pe
procesoare 32 si 64 biti pe aproape toate platformele hardware existente. Este format din
kernelul lui Linus Torvalds si programele de la GNU. Intre Linux si Unix exista o mare
diferenta. Unix-ul este un sistem de operare proprietar cu sursa inchisa, iar GNU/Linux este
un sistem de operare FREE cu sursa deshisa care la inceput a incercat sa imite sistemul
Unix original.
Marile firme private si-au dezvoltat propriile sisteme de operare Unix astfel:HP---UX - Unix-ul celor de la Hewlard Packard (SVR4). Versiunea actuala este 11.i
-AIX - Unix-ul celor de la IBM bazat pe SVR
-BSD - Unix-ul celor de la universitatea din California.
In prezent exista FreeBSD, OpenBSD, NetBSD. Prima distributie de Linux a fost
Slackwarelansata in 1993.
Ulterior au aparut multe alte distributii fiecare avand specificul sau:
• RHEL (RedHat Enterprise Linux - Sistem Comercial)
• Fedora (varianta free de la RedHat)
• SuSE (cumparat de Novell, Sistem Comercial)
• Debian
• Ubuntu
• Gentoo
• Mandriva
• CentOS (bazat pe RHEL, necomercial)
• Knoppix (prima distributie de Linux care ruleaza direct de pe CD - LiveCD)
• Puppy
• MEPIS
1.2 Cosideratii Hardware
1.2.1 ACPI
ACPI (Advanced Configuration and Power Interface) este un standard dezvoltat de
un consortiu format din HP, Intel, Microsoft, Phoenix si Toshiba in 1996. Ultima versiune
dateaza din Octombrie 2006.
ACPI reprezinta un standard prin care OS are controlul asupra recunoasterii
elementelor hardware si power management. Folosind aceasta interfata BIOS-ul furnizeaza
OS toate mecanismele necesare pentru controlul low-level ale componentelor hardware. OS
poate determina ca sistemul sa consume putina energie in anumite perioade si multa
energie cand este cazul (ca si in cazul laptop-urilor). Exista pe tastatura "power
management keys" pentru oprirea sistemului, cresterea luminozitatii monitorului etc.
Hardware-ul (placa de baza si chiar CPU) trebuie sa fie compatibil cu acest standard.
Un sistem compatibil ACPI poate sa se gaseasca in urmatoarele stari:
a)G0 - Working - starea normala de operare a unui calculator cand aplicatiile ruleaza,
CPU executa instructiuni etc
b)G1 - Sleeping - are 4 substari ( Standby, Hybernation etc)
c) G2 - Soft off - Aproximativ asemantor cu G3 (mechanical off) doar ca anumite
componente raman alimentate cu energie astfel incat diferite evenimente sa poate aduce
statia in starea G0 (keyboard, LAN, USB). Din aceasta stare sistemul trebuie sa buteze
pentru a intra in starea G0.
d)G3 - Mechanical Off - Nivelul de energie consumat este aproape zero.
Wake on LAN (WoL)
WoL este o tehnologie care permite pornirea unui calculator de la distanta prin
trimiterea unui frame Ethernet special. Placa de retea este alimentata continuu cu energie si
asculta primirea frame-ului special.
Supportul pentru Wake on Lan (WoL) este implementat pe placa de baza. NIC-ul
(care inca primeste energie) asculta dupa acel pachet special numit "Magic Packet". Daca
acesta este valid buteaza calculatorul.
Magic Packet: se trimite pe adresa de broadcast folosind UDP si portul 0 (la
inceput), 7 sau 9 (mai recent).
Datele din MagicPacket: FFFFFFFFFFFF urmat de 16 repetitii ale MAC-ului
targetului si eventual o parola formata din 4 sau 6 bytes
In afara de hardware (placa de baza) compatibil exista si componenta software si anume
programul care genereaza si trimite target-ului magic packet. Exista mai multe astfel de
aplicatii atat pentru Windows cat si pentru Linux. Un exemplu de astfel de program este
Nota
Daca se doreste pornirea calculatorului dintr-o alta retea de exemplu Internet, Routerul
trebuie configurat pentru redirectarea pachetelor "Directed Broadcast"
1.2.2 Hard Disks
In prezent pentru PC-uri exista 2 standarde de conectare a hard disk-urilor la placa
de baza: SATA si PATA
ATA - Advanced Technology Attachment reprezinta o interfata prin care hard diskurile, CD/DVD se conecteaza la placa de baza. Odata cu introducerea SATA (Serial ATA)
in 2003, ATA a fost redenumita PATA (Parallel ATA).
Pe placa de baza a arhitecturii X86 exista 2 sloturi pentru conectarea hardiskurilor
PATA. Pe fiecare cablu paralel se pot conecta 2 hdd. Avem astfel in total maxim 4 hdd.
Ele sunt reprezentate in Linux astfel:
/dev/hda - primary master hard disk
/dev/hdb - primary slave hard disk
/dev/hdc - secondary master
/dev/hdd - secondary slave
Fiecare Hard Disk poate contine partitii primare care pot fi maxim 4 si partitii logice care
se gasesc in cadrul unei partitii extinse. A 4-a partitie primara este considerata partitia
extinsa, este unica si va contine restul partitiilor logice.
Nota
In cazul hard disk-urilor SATA sau SCSI acestea sunt reprezentate prin fisierele
/dev/sda, /dev/sdb, /dev/sdc si /dev/sdd
1.2.3 RAID
RAID (Redundant Array of Inexpensive/Independent Disks)
Definitie
RAID reprezinta o metoda prin care mai multe hard diskuri fizice se grupeaza intr-o
singura unitate logica. Tehnologia RAID a fost definita prima data de catre un grup de
cercetatori de la universitatea Berkeley din California.
Exista 2 categorii de configuratii
1. Software RAID. Hard diskurile sunt combinate intr-o singura unitate logica de catre
sistemul de operare. OS vede fiecare disk si trebuie configurat sa le foloseasca ca
un singur ansambl - JBOD (Just a Bunch Of Disks).
2. Hardware RAID. Hard diskurile sunt combinate intr-o singura unitate logica de
catre un controller. OS (Operating System) vede ansamblul ca un singur hard disk.
Nu este nevoie de nicio configuratie la nivel de sistem de operare.
Hardware RAID ofera mai multa securitate si performata a datelor dar este mai scump.
Nivele RAID
a) RAID 0 (Data Striping without redundancy). Acest nivel este cel mai eficient ca si
performanta dar nu ofera protectia datelor. Se formeaza din minimum 2 hard diskuri. Informatia este "sparta" in fragmente si redistribuita pe mai multe diskuri din
array (ansamblul de diskuri fizice care pentru sistemul de operare reprezinta singura
unitate logica). Se poate scrie/citi in paralel. Daca un singur disk se defecteaza
intreg sistemul devine inutilizabil.
b) RAID 1 (Disk Mirroring). Nr. minim de diskuri din array este 2. Datele sunt salvate
pe fiecare dintre cele 2 hard diskuri. Securitatea datelor este maxima iar
performantele de citire/scriere sunt mari. Singurul dezavantaj este ca acest nivel
necesita de doua ori mai mult spatiu de stocare.
c) RAID 2 - Nu se foloseste.
d) RAID 3 si RAID 4 (Striped Set with dedicated parity) - minimum 3 discuri.
e) RAID 5 (Striped Set with Distributed Parity). Nr. minim de diskuri este 3. O
defectiune a unui disk nu duce la distrugerea tuturor datelor. Datele aflate pe diskul
defect pot fi recuperate de pe celelalte diskuri.
f) RAID 0/1, RAID 10 - reprezinta o combinatie intre RAID 0 si RAID 1. Nr. minim
de discuri este 4.
Pentru RAID 0 si RAID 1 avem nevoie de cel putin 2 partitii pe 2 hard diskuri diverite.
RAID 5 necesita 3 partitii. Se recomanda folosirea partitiilor de aceeasi marime.
Nota
Exista si posibilitatea folosirii unui singur hard disk, doar ca beneficiile RAID dispar.
1.2.4 LVM
LVM (Logical Volume Management)
Reprezinta posibilitatea prin care se pot crea "Logical Volumes" care se intind pe
mai multe diskuri si partitii. Un volum logic poate fi folosit ca o partitie si anume se poate
formata cu un sistem de fisiere si monta intr-un anumit mount-point.
Mai multe "physical partitions" - hard diskuri intregi sau partitii se combina intr-un
singur "volume group". LVM nu trebuie confundat cu RAID. Acestea sunt 2 tehnologii
diferite care se completeaza. EVMS (Enterprise Volume Management System) reprezinta o
interfata comuna pentru LVM si RAID
Avantaje LVM:
o se pot combina mai multe partitii sau hdd intr-un singur "volume group"
o un "logical volume" poate fi largit cand este nevoie de mai mult spatiu intr-un mod
foarte simplu.
o se pot adauga noi "logical volumes" la "volume group" fara a fi nevoie de oprirea
sistemului sau demontarea partitiilor.
o se pot adauga noi hdd la "volume group" intr-un "running system"
1.3 Boot Loader/Boot Manger
Boot manager & Boot loader
Boot Loaderul este primul program executat in momentul butarii unui calculator.
Acesta este responsabil sa transfere controlul catre kernelul sistemului de operare. Acesta
din urma incarca intreg sistemul de operare.
Definitie
Procesul de butare (booting) reprezinta incarcarea/copierea sistemului de operare de
pe Hard Disk in RAM si executarea de catre acesta a diferitelor functii pentru initializarea
dispozitivelor hardware (recunoasterea placii grafice pentru afisare la monitor, stabilirea
rezolutiei monitorului, montarea sistemelor de fisiere de pe hard disk, initializarea
porturilor seriale, usb, initializarea mouse-ului si a tastaturii etc. Detalii).
Un boot manager este un program care ajuta utilizatorul sa aleaga intre mai multe
sisteme de operare, sa seteze sistemul default, timeout etc.
Pe Linux se folosesc in principal 2 programe care contin atat boot loader cat si boot
manager. Acestea sunt LILO - Linux Loader si GRUB - GRand Unified Bootloader. Grub
este mai flexibil, este de preferat.
Grub este instalat automat de multe distributii de Linux dar si Unix (ex. Solaris).
Grub poate incarca si alte sisteme de operare (Windows, Solaris, etc).
Fisierul de configurare al lui Grub este default in /etc/grub.conf sau in
/boot/grub/menu.lst
Boot Loaderul se instaleaza intr-un singur sector al hard disk-ului numit sector de
boot. Exista 2 categorii de sectoare de boot:
1. VBR - Volume Boot Record - reprezinta primul sector al unui hard disk care nu a
fost partitionat sau primul sector al unei partitii a unui hard disk care a fost
partitionat. Contine cod pentru a incarca sistemul de operare de pe acel hard disk
sau de pe acea partitie.
2. MBR - Master Boot Record - reprezinta primul sector al unui hard disk care a fost
partitionat. Contine cod pentru a identifica partitia activa si a invoca Volume Boot
Record al acelei partitii. Dimensiunea MBR este 512 bytes din care maximum 446
reprezinta cod executabil.
Fisierul de configurare al GRUB este: /boot/grub/menu.lst In momentul in care dorim
modificari referitoare la modul de functionare al acestuia precum adaugarea unui nou
sistem de operare in meniul grubului de la inceput, stergerea unui sistem de operare in care
sa butam, modificare timeout etc trebuie sa modificam fisierul precizat mai sus.
Structura acestuia este:
default 0
timeout 8
title Windows XP
rootnoverify (hd0,0)
chainloader +1
title Fedora Core
root (hd0,1)
kernel /boot/vmlinuz root=/dev/sda2
initrd /boot/initrd
title Solaris
rootnoverify (hd0,2)
chainloader +1
1.4 Instalare
Instalarea unui sistem de operare Linux modern decurge asemanator cu instalarea
sistemului Windows. Installer-ul recunoaste componentele hardware, instaleaza drivere
pentru acestea, partitioneza hard disk-ul, creaza utilizatori, configureaza reteaua etc. La
sfarsit avem un sistem de operare Linux perfect functional.
Nota
In comparatie cu Windows, o distributie Linux contine aproape toate programele necesare
utilizatorului. Acestea sunt incluse pe DVD-ul sau CD-urile de instalare, iar daca sunt alese
de utilizator sunt instalate o data cu sistemul de operare. La final vom avea acces la la
majoritatea programele necesare precum: editoare de text, playere video, mp3 player,
program de copiere CD-uri, program de Backup, client de E-mail, Browser, client de
messenger
etc.
Pentru o echivalenta a programelor Windows-Linux cititi sectiunea capitolului "Mediul
Grafic" a acestui curs numita "Programe Desktop".
Aspecte care trebuie avute in vedere inaintea inceperii instalarii unui sistem de operare
Linux:
1. Linux are nevoie de propria partitie pe care sa se instaleze. Aceasta poate fi creata
anterior din Windows folosind un program precum Partition Magic sau in timpul
instalarii Linux. Dimensiunea partitiei se recomanda sa fie de circa 10 GB pentru o
folosire normala a sistemului Linux. In cazul in care aceasta se creaza din Windows
poate sa fie formatata cu orice sistem de fisiere (fat, ntfs etc), iar in timpul instalarii
Linux aceasta trebuie formatata cu un sistem de fisiere precum ext3 sau reiserfs.
2. Pentru performante crescute, Linux necesita o partitie speciala de tip swap. Se
recomanda ca dimensiunea partitiei sa fie de 2 ori dimensiunea memoriei RAM.
Partitia de swap trebuie creata anterior din Windows sau in timpul instalarii Linux.
Se va formata ca swap in timpul instalarii. Partitia de swap NU este obligatorie.
1.5 Linux rescue
1.5.1 Refacerea configuratiei de boot
Exista foarte multe cazuri in care sistemul de operare nu mai buteaza din cauza unei
erori, cand am "pierdut" parola de root sau cand vrem sa rescriem Grub-ul pe MBR pentru
butarea in mai multe sisteme. Dupa instalarea Windows (Linux fiind deja instalat) MBR-ul
este suprascris de Windows astfel incat nu vom mai putea alege sistemul de operare in care
sa butam sau sa intram in Linux.
Nota
CD-ul de rescue poate sa fie primul CD dintre CD-urile de instalare, un CD special in
cazul Fedora sau DVD-ul de instalare. La butare folosind CD-ul de rescue trebuie aleasa
butarea in modul rescue sau la anumite distributii precum Slackware sau Fedora Core
2,3,4,5 sau 6 se scrie linux rescue in linie de comanda din prima fereastra care apare.
Etapele sunt urmatoarele (in cazul in care folosim primul CD Fedora, similar pentru alte
distributii):
1. Butam folosind CD-ul de rescue
2. Scriem in linia de comanda din prima fereastra: linux rescue
3. Sistemul va intra in modul rescue, iar dupa o serie de intrebari (daca pornim
interfata de retea, alegerea limbii) va incerca sa identifice daca exista un sistem de
operare Linux deja instalat. In acest caz acesta este montat automat in
/mnt/sysimage
4. Daca sistemul de operare anterior a fost gasit si montat in /mnt/sysimage trebuie sa
executam comanda chroot /mnt/sysimage.
Comanda chroot are urmatoarea sintaxa: chroot NEWROOT [COMMAND [ARGS]...]
In mod normal comenzile si fisierele sunt cautate incepand cu root directory care este
"/". chroot schimba "/" cu un nou director NEWROOT si executa comanda COMMAND
cu argumentele ARGS. Daca comanda nu este specificata este pornit shellul default sau
Bourne ( /bin/sh) daca acesta nu este definit. Comanda chroot permite executarea
urmatoarelor comenzi in sistemul de fisiere avand root directory /mnt/sysimage (unde se
gaseste sistemul de operare Linux care este deja instalat) in loc de "/"care contine sistemul
de fisiere generat automat de modul rescue.
5. Se instaleaza Grub cu vechea configuratie pe MBR prin comanda grub-install
/dev/hda.
Nota
/dev/hda se inlocuieste cu fisierul care reprezinta Hard Disk-ul pe care se instaleaza
Grub. In cazul hard disk-urilor SATA sau SCSI acestea sunt reprezentate prin sda, sdb,
sdc si sdd.
1.5.2 Recuperarea parolei de root
Exista cazuri in care parola userului root a fost uitata, schimbata accidental sau in mod
intentionat de o alta persoana care avea acces la contul de root astfel incat nu mai ne putem
loga ca root in sistem.
Important
Orice sarcina administrativa din Linux poate fi realizata DOAR de userul root deci accesul
la contul root este obgligatoriu. In Linux orice modificare a unei setari a sistemului de
operare se realizeaza modificand un fisier text aferent numit fisier de configurare. Aceste
fisiere se gasesc in directorul /etc
Un user normal sau neprivilegiat are permisiunea de a modifica DOAR fisierele si
directoarele
din
propriul
Home
Directory.
Exista in general 2 posibilitati de recuperare a parolei de root:
1) Butarea sistemului folosind CD-ul de rescue. In cazul in care exista acces fizic la
calculator se buteaza folosind CD-ul de rescue dupa care se monteaza partitia pe
care se gaseste sistemul de fisiere "/" si care contine fisierele /etc/passwd (contine
userii din sistem inclusiv root) si /etc/shadow (contine hash-ul parolei uitate).
In continuare exista 3 posibilitati:
a) Se editeaza folosind editorul preferat (Exemplu VI) fisierul /etc/shadow si
se sterge hash-ul parolei lui root. Dupa restartarea calculatorul se poate loga
ca root fara a mai cere parola
b) Se inlocuieste hash-ului parolei lui root cu hash-ul unei parole cunoscute a
unui cont oarecare. Se logheaza ca root folosind acea parola
c) Se monteaza sistemul de fisiere pe care se gaseste sistemul Linux in root si
se foloseste comanda passwd root.
Exemplu
Presupunem ca Linux s-a instalat pe prima partitie primara de pe primul hard disk
SATA ( /dev/sda1)
mount /dev/sda1 /mnt
chroot /mnt
passwd root
2. Modificarea boot loader (GRUB). Scopul acestei metode este de a instrui Grubul sa buteze in run-level 1 (single mode) caz in care exista un singur utilizator si anume
root caruia nu i se mai cere parola pentru logare. Ulterior se schimba parola folosind
comanda passwd root.
Capitolul 2 - Structura Linux
2.1 Structura Linux
Un sistem de operare este format din urmatoarele componente:
Kernel
Reprezinta partea cea mai importanta a OS, cea care lucreaza cu CPU si este cea
mai apropriata de Hardware. Fizic kernelul se regaseste intr-un fisier iar de cele mai multe
ori acesta este /boot/vmlinuz-version_no
Functii:
o I/O Management
o managementul memoriei RAM si SWAP
o apelarea functiilor de sistem
o lucrul cu echipamentele periferice prin drivere
o managementul sistemului de fisiere, a proceselor care ruleaza
Ultima versiune de Kernel este 2.6.24.2 (11.02.2008)
Memoria SWAP reprezinta un tip special de memorie care se gaseste pe Hard disk,
dar care este folosita de Kernel ca si cand ar fi memorie RAM. Dimensiunea acesteia se
recomanda a fi de doua ori mai mare decat RAM. Pe Linux se foloseste o partitie speciala
pentru memoria de tip Swap.
Shell
Utilizatorul nu poate comunica direct cu Kernelul. Accesul la functiile kernelului se
face prin intermediul shell-ului. Acesta este un program care primeste comenzi de la user
sau alte aplicatii, le interpreteaza si le transmite kernelului pentru a le executa.
Printre functiile shell-ului se afla si customizarea intregului environment (mediu de
lucru) precum si programarea folosind shell scripts.
Exista mai multe shell-uri printre cele mai importante amintim:
a) Bourne Shell (sh) - Primul shell pentru Unix. A fost dezvoltat de Stephen Bourne la
AT&T. Nu are foarte multe optiuni.
b) Korn Shell (ksh) - A fost dezvoltat de David Korn la Bell Labs.
c) C Shell (csh) - A fost dezvoltat de Bill Joy la Sun si se bazeaza pe limbajul de
programare C.
d) Enhanced C Shell (tcsh)
e) Z Shell (zsh) - Este asemanator de Korn shell dar are mai multe functii.
f) Bash (bash) - Bourne Again Shell - Default pe Linux. Cel mai folosit si mai
puternic shell. Sistemul de fisiere . Pentru detalii cititi subcapitolul "Sistemul de
fisiere" a acestui curs.
2.2 Structura unei comenzi
Pentru managementul sistemului Linux (copiere de fisiere sau directoare, stergere,
redenumire, afisare continut, listare, editare etc) se folosesc comenzi. Exista peste 400
comenzi de baza in Unix/Linux.
Exista comenzi incluse in shell ( Exemplu: alias, cd, umask) si comenzi
independente reprezentate prin programe ( Exemplu: ls, cp, rm etc).
Structura unei comenzi este urmatoarea:
NUME_COMANDA OPTIUNI [ARGUMENT 1] [ARGUMENT 2]
NUME_COMANDA = reprezinta numele comenzii. Trebuie sa apara primul. Directorul
in care se gaseste comanda trebuie sa fie in variabila PATH (la fel ca si in WINDOWS).
Nota
In contrast cu Windows, in Linux directorul curent reprezentat prin . (punct) nu se gaseste
in PATH. Pentru a executa o anumita comanda nu este suficient sa ne mutam in directorul
care contine programul respectiv sau comanda si sa executam respectiva comanda.
OPTIUNI
o pot fi scurte (o litera). Exemplu: ls -R sau pot fi combinate mai multe litere.
Exemplu: ls -Fal
o pot fi formate din unul sau mai multe cuvinte. Exemplu: smart --ignore-locks
ARGUMENTE
o reprezinta scopul comenzii. Pot fi fisiere sau directoare, adrese IP, nume de
domenii DNS etc
2.3 Comenzile ls si less
Comanda ls
Una dintre cele mai folosite comenzi in Linux este ls (list). Aceasta afiseaza informatii
diverse despre fisiere si directoare.
ls OPTIONS FILE - listeaza continut
-l
listare lunga, sortare dupa nume
-F
afiseaza tipul fisierului
-t
sortare dupa mtime
-h
human readable
-i
afiseaza inode
-R
afiseaza recursiv
-S
sortare dupa marime
-d
afiseaza informatii despre director in loc de continutul acestuia
-c
afiseaza ctime (in combinatie cu -l)
-u
afiseaza atime (in combinatie cu -l)
-a
afiseaza hidden files
Comanda less
Intreaga configuratie a unui sistem Linux, fie ca ne referim la servere care ruleaza, firewall
sau la rezolutia monitorului se gaseste aproape exclusiv in fisiere text. Una dintre sarcinile
cele mai frecvente ale unui admin este vizualizarea diferitelor fisiere text. Cea mai folosita
comanda pentru vizualizare care se gaseste pe orice distributie de Linux sau chiar de Unix
este less.
less FILE - afiseaza continut fisier text
In timpul vizualizarii continutului fisierului putem folosi urmatoarele taste:
enter
afisare urmatorul rand
space
afisare urmatoarea fereastra
d
afisare urmatoarea jumatate de fereastra
u
afisare jumatatea de fereastra anterioara
/sir
cautare sir forward
?sir
cautare sir backward
n
urmatoarea aparitie a sirului
N
aparitia anterioara a sirului
g
salt la inceputul fisierului
G
salt la sfarsitul fisierului
q
quit
h
help
2.4 Console/terminale virtuale
In Linux si Unix exista conceptul de Consola Virtuala si Terminal Virtual sau
Terminal Text.
Considerente istorice
Initial se folosea un singur calculator de tip mainframe sau similar la care se
conectau mai multi useri simultan folosind fiecare o consola. O consola era reprezentata
printr-un ansamblu de tastatura si monitor.
Linux pune la dispozitia utilizatorului 7 console virtuale (logice) care pot fi
accesate folosind combinatia de taste CTRL+ALT+F1 pt consola 1, CTRL+ALT+F2
pentru consola 2 etc. In consola 7 este pornit mediul grafic. Terminal windows, terminal
emulator sau terminal virtual reprezinta o consola pornita din modul grafic.
Nota
Fizic, cele 7 console virtuale sunt reprezentate prin fisierele /dev/tty1-7, iar terminalele
virtuale sunt reprezentate prin fisierele /dev/pts*. Fisierul /etc/securetty contine pe fiecare
linie locatiile de unde userul root are voie sa se logheze
2.5 Runlevel
Reprezinta starea in care se afla si opereaza sistemul de operare la un anumit
moment dat.
Exemplu: un sistem de operare Linux care intra in runlevel 0 se opreste, daca intra
in runlevel 6 tocmai se restarteaza.
In functie de runlevel-ul in care opereaza sistemul de opereare exista anumite
facilitati oferite si anumite procese care ruleaza. Un sistem de operare Linux se poate afla
la un moment dat intr-un singur runlevel.
Linux runlevels
Runlevel
Semnificatie
Descriere
0
Halt, Shut down
Oprirea sistemului, aducerea lui in starea in care se intrerupe
alimentarea cu energie electrica
1
single-user
Modul administrator folosit pentru mentenanta. Nu exista
retea, mediu grafic si doar sistemele de fisiere locale sunt
montate. Exista un sigur user care se poate loga in sistem si
anume root. Este echivalentul lui Safe-Mode din Windows
2
multi-user
Modul multi-user fara retea.
3
multi-user + retea Runlevel default pentru servere.
4
N/A
5
multi-user + retea
Run level default pentru Desktop
+ mediul grafic
6
reboot/restart
Nu exista
Restartarea calculatorului
Mai poate exista runlevel-ul S sau s, care nu este folosit direct ci de catre programe
si scripturi care se executa cand se intra in runlevel 1. Pentru trecerea dintr-un runlevel in
altul se foloseste comanda: init noul_runlevel
Exemplu
1.Restartare calculator /sbin/init 6
2. Oprire calculator /sbin/init 0
3. Intrare in single-user mode /sbin/init 1
4. Revenire in runlevel 5 /sbin/init 5
2.6 Sistemul de fisiere
2.6.1 Prezentare generala
Sistemul de fisiere reprezinta modul de organizare, structurare si accesare a
fisierelor, directoarelor si linkurilor pe hard disk. Modul de organizare, accesare si
recunoastere particularitarilor fiecarui sistem de fisiere cade in sarcina Kernelului. Acesta
trebuie sa "ofere suport" pentru acel sistem de fisiere.
In prezent Kernelul de Linux recunoaste majoritatea sistemelor de fisiere existente:
fat16, fat32, ntfs, ext2, ext3, ReiserFS, nfs, smb, iso9660 etc. Pentru majoritatea
distributiilor de Linux default este ext3 - Third Extended File System (default pt. RedHat,
Fedora, Ubuntu) sau ReiserFS (default pt. Slackware, SuSE, Xandros, Yoper).
De multe ori in studiul sistemelor de operare Unix/Linux gasim sintagma "everything is a file". Acest lucru se refera la faptul ca fiecare program, sau dizpozitiv
hardware este reprezentat printr-un fisier. Nu mai exista alta modalitate de reprezentare a
informatiei. In Linux fisierele sunt case sensitive - se face distinctie intre litera mare si
mica.
Un fisier se considera ascuns (hidden) daca numele sau incepe cu "." (punct).
Exemplu
/dev/hda1 reprezinta prima partitie de pe hard disk-ul primary master
/dev/cdrom reprezinta CD-ROM-ul. O scriere sau o citire de pe hard disk sau CD inseamna
de fapt o scriere sau citire din fisierul respectiv.
In Linux un director este tot un fisier (dar special care are anumite proprietati).
Sistemul de fisiere in Linux este arborescent (ca si in windows) doar ca avem un sigur
arbore chiar daca avem mai multe partitii sau hard disk-uri. Radacina sistemului de fisiere
se numeste ROOT si se noteaza cu "/".
2.6.2 FHS
De-a lungul timpului s-a incercat standardizarea sistemului de fisiere pentru
sistemele Unix/Linux luand nastere astfel FHS - Filesystem Hierarchy Standard. Cu toate
acestea nu exista un standard general acceptat in prezent.
Principalele directoare care exista in majoritatea distributiilor de Linux si Unix sunt:
• /sbin - utilitare pentru administrarea sistemului, multe accesibile doar lui
root
• /bin - utilitarele sistemului care trebuie sa fie disponibile atat userilor
normali cat si lui Root
• /dev - fisiere speciale care reprezinta dispozitivele din sistem
• /lib - librarii de functii folosite de aplicatii, kernel etc /var - fisiere care in
general isi modifica continutul (loguri, mailuri etc)
• /usr - o ierarhie asemanatoare cu "/" ( /usr/sbin, /usr/bin, /usr/etc )
• /etc - fisierele de configurare ale sistemului, ale serverelor care ruleaza etc
• /root - home directory userului root
• /home - home directory pentru userii din sistem. Fiecare user are home
directory un director in interiorul lui
• /home (de cele mai multe ori directorul poarta numele userului)
• /proc - printre functiile principale ale kernelului este si aceea de a controla
dispozitivele fizice si de a coordona modul in care procesele folosesc aceste
resurse. In /proc se gaseste statusul curent al kernelului cu toate informatiile
pe care acesta le cunoaste. Aceste fisiere si directoare sunt create automat la
butare. Ele se numesc virtuale. De aici vine si numele de "Sistem de Fisiere
Virtual" (acesta este proc). Aceste fisiere contin multe informatii utile, iar
cu toate acestea dimensiunea lor este de 0 bytes.
Nota
Fisierele din /proc pot fi modificate pentru a configura sistemul "on-the-fly".
Exemplu: echo "new-hostname" > /proc/sys/kernel/hostname
•
•
•
•
•
•
/media - mount point pt. sisteme de fisiere temporare
/mnt - mount point pentru sisteme de fisiere remote
/lost&found - fisiere care au fost salvate in timpul unui "failure"
/boot - fisiere necesare boot loader-ului, kernel-ului
/opt - programe si aplicatii adaugate ulterior care nu fac parte din distributie
/cdrom - mount point pt CD
Mount Point - reprezinta locul din sistemul de fisiere UNIC in care se alipesc sisteme
dfisiere de pe alte partitii locale sau externe, de pe CD-ROM/DVD-ROM, USB Stick etc.
2.6.3 Structura sistemului de fisiere
Sistemul de fisiere in Linux este arborescent si unic. Radacina se numeste root si se
noteaza cu "/". In Linux fisierele sunt case-sensitive - se face distinctie intre litera mare si
mica. In Linux "totul este un fisier". Nu mai exista alta forma de reprezentare a informatiei.
Un sistem de fisiere poate fi impartit in 4 parti distincte in urmatorea ordine:
1. Boot Block - aflat la inceputul partitiei si care contine cod (BootLoder) pentru a
incarca sistemul de operare.
2. Super Block - contine informatii actuale despre sistemul de fisiere: marimea
acestuia, nr. de blocuri de date libere, locatia acestora, marimea lui inode table, nr
maxim de inoduri etc.
3. Inode Table (List) - Lista statica definita initial la instalare si care nu se poate
schimba si care contine inodurile din sistem.
4. Data Blocks - Datele sunt salvate in blocuri (in general 1 block = 512 bytes).
Boot Block
Super Block
Inode Table
Data Block
2.6.4 Structura unui fisier
Un fisier consta in informatia pe care acesta o contine (text, date, imagine, sunet
etc) dar si o structura de date care se numeste inode (index node) si care contine informatii
suplimentare despre acel fisier.
Standardul POSIX stabileste ca fiecare inode sa contina urmatoarele informatii:
• tipul de fisier
• owner
• group owner
• drepturile de acces (citire, scriere, executie) pentru owner, group si others
• nr. de hard linkuri catre aceiasi informatie
• atime
• ctime
• mtime
• marimea unui fisier (size)
• pointer catre blocurile de date care reprezinta informatia tinuta de fisier.
• inum - nr. intreg care identifica unic fiecare inode
Nota
Atentie !!! Numele fisierului nu este pastrat in structura inodului.
Un director este un fisier de tip container care contine perechi de nume_fisier
si inode-ul corespunzator.
In momentul in care ne referim (utilizatorul sau un proces) la un fisier, kernelul
cauta in structura de directoare conform cu calea relativa sau absoluta de referire la fisier,
inode-ul corespunzator pentru acel nume. Fiecare inode se identifica unic printr-un numar
de tip intreg numit "inode number" sau i number. Acesta poate fi vizualizat folosind
comanda ls –i. Exista un nr. maxim pt. acest i-number care se defineste automat la
instalarea sistemului in functie de dimensiunea partitiei si deci exista un nr. maxim de
fisiere (comanda df -i).
In Linux fiecarui fisier sau director i se ataseaza 3 (trei) timpi:
• ctime ( change time ) - reprezinta data la care s-au modificat informatiile continute
in inode-ul fisierului sau directorului (permisiuni, owner, group etc). Nu se refera la
timpul cand au avut loc modificari ale continutului. Se afiseaza cu comanda ls-lc
• mtime (modify time) - data la care s-a modificat informatia din fisier. Se afiseaza
cu ls–l
• atime ( access time ) - data la care s-a afisat continutul fisierului. Se afiseaza cu ls–
lu
Comanda stat afiseaza de asemenea acesti 3 timpi. Pentru modificarea celor 3 timpi ai unui
fisier sau director se foloseste comanda touch.
touch OPTIONS FILE - listeaza continut
fara optiuni
modifica atime, mtime si ctime cu timpul curent
-t DATE_TIMESTAMP
motifica atime si mtime cu DATE_TIMESTAMP in loc de data
curenta
ex: touch -t 200301231230 a.txt
-d DATE_STRING
modifica
atime
si
mtime
cu
ex: touch -d '1 May 2006 10:22' /etc/group
-a
modifica doar atime cu data curenta sau cu o alta data daca este
specificata
ex: #touch -a -d '23 May 2006 10:22' /etc/group
-m
modifica doar mtime cu data curenta sau cu o alta data daca este
specificata
-r REFERENCE_FILE
schimba atime si mtime cu cele ale lui REFERENCE_FILE
ex: touch -r b.txt a.txt
DATE_STRING
Nota
ctime nu poate fi setat in mod expres si independent de catre user
2.6.5 Tipuri de fisiere
In Unix si Linux fisierele se impart in urmatoarele categorii:
1. fisiere standard (regular files). Acestea pot fi text, executabile, binare etc
2. directoare. Acestea sunt tot fisiere care au rol de container pentru alte fisiere sau
directoare. Ele reprezinta un tip special de fisier (container) folosit pentru formarea
structurii arborescente.
3. link-uri. Pot fi soft links/sym links (echivalentele shortcut-urilor din windows) si
hard links - se refera la aceiasi zona de date, dar identificata prin nume diferite.
4. fisiere speciale (device files). Toate dispozitivele fizice (hard disk, RAM, etc) sunt
reprezentate printr-un fisier. Accesul la aceste dispozitive se realizeaza prin
scrierea/citirea din aceste fisiere.
Exista mai multe feluri de fisiere (dispozitive) speciale:
a. de tip caracter - folosite pentru accesarea byte cu byte a fisierului care reprezinta
dispozitivul hardware ( Exemplu: /dev/pts/0)
b. de tip bloc - folosite pentru accesarea in blocuri de date a fisierului care reprezinta
dispozitivul hardware ( Exemplu: /dev/sda1)
c. named pipes - procesele in Linux comunica cu ajutorul unui pipe (conducta) care se
creaza cu ajutorul caracterului "|". In acest mod outputul unui proces poate fi
directionat ca input pentru un alt proces. Acest tip de pipe exista doar pe timpul
executiei comenzii. Exista un al doilea tip de pipe numit "named pipe" introdus
initial in Unix-ul de tip AT&T si care este folosit pentru comunicarea dintre
procese prin intermediul unei cozi de tip FIFO (First In First Out). Acest tip de
fisier se creaza de catre administratorul sistemului pentru a interconecta 2 procese
cu comanda mkfifo
d. Socket (unix domain socket) este asemanator cu pipe-ul, adica se foloseste pentru a
conecta doua procese. Exista o oarecare asemanare cu socketul TCP/IP chiar daca
este vorba despre un alt concept.
Comanda ls -lF afiseaza diferitele tipuri de fisiere folosind anumite simboluri:
Simbol
Descriere
nimic
fisier standard
/
director
*
fisier executabil (ex: /bin/ls)
@
sym link (ex: /etc/grub.conf)
=
socket (ex: /dev/log) - procesele scriu in /dev/log pentru a comunica cu syslogd
|
named pipe (ex: /dev/initctl) - folosit pentru a comunica cu init
2.6.6 Links
In Linux, comparativ cu Windows exista 2 categorii
de linkuri:
1) hard links
o se refera la asocierea unui nume de fisier cu un inode number (asocierea va fi
prezenta intr-un director). Avem astfel doua sau mai multe nume care sunt asociate
cu aceiasi structura de tip inode;
o nr. de hard linkuri din structura inodului este incrementat de fiecare data cand se
creaza un nou hard link;
o in momentul in care se sterge un fisier, se decrementeaza nr. hard linkurilor din
inode, iar cand se ajuge la zero este dealocat inodul si marcat ca liber;
o nu se pot crea MANUAL hard linkuri catre directoare. Un director nou creat are
default 2 hard linkuri. De fiecare data cand se creaza un subdirector, numarul de
hard linkuri al directorului parinte este incrementat fiindca se creeaza o noua
referinta catre acesta si anume ".." care exista in orice director. Daca un director are
17 hard linkuri inseamna ca acesta contine 16 subdirectoare. Al 17-lea este "." care
se gaseste in orice director.
o nu se pot crea hard linkuri intre fisiere de pe partitii diferite;
o daca fisierul initial este sters, redenumit sau mutat hard linkul nu este influentat;
o un hard link se creaza folosind comanda ln
2) soft links / sym links
o echivalentul shortcuts din Windows;
o daca fisierul sau directorul initial este sters, mutat sau redenumit soft linkul nu mai
functioneaza;
o listarea continutului folosind comanda ls -F identifica un symlink dupa caracterul
"@" de la sfarsitul numelui;
o se pot crea symlinkuri catre directoare sau fisiere de pe alte partitii;
o un symlink se creaza folosind comanda ln cu optiunea -s
Exemplu
1. Pentru a crea un soft link numit mylink.txt care pointeaza la /home/stud/proiect.txt se
foloseste comanda: ln -s /home/stud/proiect.txt /home/stud/mylink.txt
2. Pentru a crea un hard link al lui /etc/passwd in /etc numit hl-passwd se foloseste
comanda: ln /etc/passwd /etc/hl-passwd
2.6.7 Piping & Redirectare
Unix/Linux este un sistem de operare care se bazeaza pe comenzi foarte
specializate care lucreaza impreuna. Astfel mai multe comenzi pot fi combinate si se poate
crea astfel o comanda complexa. Se foloseste astfel caracterul pipe "|".
Exemplu
ls -l | less - outputul comenzii ls -l este trimis lui less pentru paginare
ls -a | sort - outputul comenzii ls -l este trimis comenzii sort care sorteaza in ordine
alfabetica
Redirectarea outputului
In general scopul unei comenzi este de a trimite outputul catre standard output care
este monitorul. Este posibil ca outputul unei comenzi sa fie redirectat catre un fisier care
exista sau nu. Se foloseste ">" sau ">>"
Exemplu
ls -l /bin > /home/student/binaries.txt - creaza fisierul /home/student/binaries.txt (daca
acesta exista il suprascrie) care va contine outputul comenzii ls -l /bin
ls -l /sbin >> /home/stud/binaries.txt - adauga outputul comenzii ls -l /sbin fisierului
/home/student/binaries.txt (daca acesta nu exista il creaza)
Outputul unei comenzi poate fi redirectat in afara de standard output si catre
standard error. Pentru acesta se foloseste "2>". Pentru a combina standard output cu
standard error se foloseste "&>"
Exemplu
gcc program.c > output.txt 2> errors.txt - redirecteaza outputul compilarii fisierului
program.c catre output.txt, iar erorile sunt redirectate catre fisierul errors.txt
gcc program.c &> output.txt - redirecteaza catre fisierul output.txt atat standard output cat
si standard error.
Capitolul 3 - Comenzi si Editoare
3.1 Editorul VI
In Unix/Linux exista mai multe editoare de text acestea impartindu-se in editoare
grafice ( gedit, kate ) si editoare care ruleaza in consola ( vi, vim, emacs, joe, pico, nano
etc). Editorul omniprezent pe orice sistem Unix/Linux este VI (Visual Editor). Acesta este
extrem de flexibil, complex si plin de optiuni.
Se caracterizeaza prin 3 modalitati de operare:
Command Mode
In momentul in care se deschide VI suntem introdusi in "command mode". Se
foloseste pentru a accesa celelalte moduri, pentru a vizualiza si edita fisierul curent,
copy/paste, search etc. Pentru a schimba intre celelalte 2 moduri de operare ( Insert Mode si
Last Line Mode) trebuie sa trecem prin Command Mode. Se foloseste tasta ESC. Modul
comanda se foloseste pentru a sterge un caracter, un cuvant, un grup de cuvinte sau litere
precum si pentru a inlocui un text. In modul command ne gasim dupa deschiderea unui
fisier ( Exemplu: vim /etc/passwd) sau din celelalte moduri apasand tasta ESC.
In timp ce ne aflam in modul comanda avem urmatoarele optiuni:
1. r - replace a char
2. x - sterge caracterul de sub cursor.
3. cw - change word - sterge cuvantul incepand cu litera de unde este pozitionat
cursorul si ne introduce in Insert Mode.
4. dd - sterge o linie
5. 7dd - sterge 7 linii
6. dw - sterge cuvantul de sub cursor incepand cu caracterul care se gaseste sub
cursor.
7. u – undo
8. G - se duce la sfarsitul fisierului
9. $ - muta cursorul la sfarsitul liniei
10. 0(zero) sau ^(carret) - muta cursorul la inceputul unei linii
11. :x - muta cursorul pe linia nr. x. Exemplu: :37 - muta pe linia 37
12. shift+v, alt+v si ctrl+v ne introduce intr-un sub mod in care putem selecta vizual un
bloc de text sau mai multe randuri (valabil doar in VIM).
13. y(yank) - echivalentul lui copy din Windows
14. p(paste)
15. /(slash) - search forward.
16. ? - search backward
17. n - urmatoarea aparitie
18. N - aparitia anterioara
19. ZZ (z mare, z mare) - salvare cu iesiere din fisier
Insert Mode
Este folosit pentru a insera text in documentul curent. Pentru a intra in Insert Mode
din Command Mode se pot folosi urmatoarele taste:
i - insereaza inaintea caracterului de sub cursor
I - insereaza la inceputul unui rand
a - insereaza dupa caracterul de sub cursor
A - insereaza la sfarsitul randului
o - insereaza pe randul urmator.
Last Line Mode
Se foloseste pentru a salva documentul curent, pentru revenire la varianta de la
ultima salvare a fisierului sau pentru a executa diferite comenzi (text substitution, afisarea
nr. de linii etc). Pentru a intra in acest mod se foloseste : (doua puncte) din Command
mode.
In Last Line mode utilizatorul are la dispozitie urmatoarele comenzi:
wq - write and quit
q! - quit fara salvare
w! - salvare fara quit
e! – undo
et nu - numeroteaza lini
Editorul VI foloseste fisierul de configurare ~/.exrc. Acesta poate fi modificat pentru
customizarea editorului.
Nota
VIM (VI Improved) reprezinta o varianta imbunatatita a lui VI care ofera multe facilitati
suplimentare si este de recomandat sa fie folosit atunci cand se poate. Toate regulile din VI
raman valabile
3.2 Comenzi de baza
In Linux exista peste 300 de comenzi folosite pentru managementul sistemului. Nu
toate sunt insa utilizate pentru taskurile zilnice ale unui administrator de sistem. Mai jos neam propus sa explicam cele mai folosite comenzi din Linux. O intelegere buna a acestora
este extrem de importanta pentru a putea avansa in studiul unui sistem de operare Linux.
Important
Cunoasterea tuturor comenzilor si a tuturor optiunilor acestora este imposibila chiar
si pentru cei mai experimentati admini. Documentatia comenzilor se gaseste in man pageuri care trebuie folosite intesiv in momentul in care se doreste aflarea efectului unei
comenzi sau a unei optiuni a comenzii.
Exemplu: man ls
pwd - Print Working Directory
Afiseaza directorul curent. Nu are optiuni sau argumente.
cd - Change Directory
Schimba directorul curent.
cd NEW_DIRECTORY - mutare in directorul NEW_DIRECTORY
.. = directorul parinte
. = directorul curent
~ = home directory
Exemplu
1. Directorul curent se schimba cu /etc/ cd /etc
2. Viitorul director curent va fi parintele directorului curent actual cd ..
3. Directorul curent devine Home Directory al userului care executa comanda. Daca
se ruleaza comanda cd fara argumente se schimba directorul curent cu Home
Directory. Cele 2 comenzi sunt echivalente
cd ~
cd
4. Directorul curent devine ultimul director in care ne-am aflat cd - = mutare in
directorul anterior
mkdir - Make Directory
mkdir OPTIONS DIRECTORY
Optiuni:
-p = creaza atat directorul sau directoarele parinte daca acestea nu exista. Daca directorul
parinte nu exista comanda mkdir returneaza eroare daca se foloseste fara optiunea -p
-v = verbose
Exemplu: mkdir /home/stud/documents/privat
ls - List
Listeaza continut director sau listare informatii despre fisier.
ls OPTIONS FILE/DIRECTORY
mv - Move
Muta sau redenumeste (in functie de context) fisiere si directoare. In Linux nu
exista comenzi diferite pentru mutare respectiv redenumire.
mv OPTIONS SOURCE DESTINATION
Optiuni:
-f = force (do not prompt before overwriting)
-i = interactive (prompt before overwriting)
-u = update (muta doar daca sursa este mai noua ca destinatia sau destinatia lipseste)
-v = verbose
Exemplu
1. Muta fisierul file1.txt din /home/paul/ in /home/dan/ sub numele de file2.txt
mv /home/paul/file1.txt /home/dan/file2.txt
2. Redenumire director
mv /home/dan /home/andrei
cp - Copy
Copiaza fisiere sau directoare din sursa in destinatie.
cp OPTIONS SOURCE DESTINATION
Optiuni:
-i = interactiv
-p = pastreaza owner, group si permisiuni pt. fisierul destinatie creat
-r = copiaza recursiv (obligatoriu pentru directoare)
-f = force (do not prompt before overwriting)
rm - Remove
Sterge fisiere sau directoare.
rm OPTIONS FILES/DIRECTORIES
Optiuni:
-i = interactiv
-r = sterge recursiv, obligatoriu pentru directoare
-f = force
Nota
Comanda rm (ca si comenzile asemanatoare din Windows) nu sterge efectiv
informatia reprezentata de fisier ci doar marcheaza inode-ul si blocurile de date catre care
acesta pointeaza ca fiind "libere pentru a fi utilizate din nou". Folosind programe speciale
informatia stearsa poate fi recuperata FOARTE USOR.
Programe cunoscute si folosite pentru investigarea unui sistem dupa
compromiterea sa de catre un Black Hat Hacker si care contin inclusiv utilitare pentru
recuperarea informatiei sterse accidental sau intentional sunt The Sleuth Kit, Autopsy Browser si The
Coroner's Toolkit (TCT).
Important
Un fisier sau director sters folosind comanda rm nu mai poate fi recuperat in mod
standard din Recycle Bin. In Linux pentru fisierele si directoarele sterse din consola cu
cumanda rm nu exista Recycle Bin.
touch
Creaza un fisier gol daca FILE nu exista sau reseteaza atime, mtime si ctime pentru FILE
daca acesta exista.
touch OPTIONS FILE
cat
Concateneaza si/sau afiseaza continutul unui fisier
cat OPTIONS FILES
Optiuni:
-b = no. of nonblank lines
-n = no. of output lines
Exemplu
1. Afiseaza fisierul /etc/passwd la consola cat /etc/passwd
2. Concateneaza fisierele /etc/passwd si /etc/shadow in fisierul /home/dan/passwd
shadow pe care il si creaza daca nu exista sau il suprascrie daca exista.
cat /etc/passwd /etc/shadow > /home/dan/passwd-shadow
more & less
Programe de paginare.
more FILE
less FILE
head
Afiseaza primele linii (default 10) dintr-un fisier
head OPTIONS FILE
Optiuni:
-n nr = afiseaza primele 'nr' linii
tail
Afiseaza ultimele linii (default 10) dintr-un fisier
tail OPTIONS FILE
Optiuni:
-n nr = afiseaza ultimele 'nr' linii
-n +nr = afiseaza incepand cu linia 'nr'
-f = afiseaza in timp real ultimele linii dintr-un fisier. tail -f fisier este cea mai importanta
comanda pentru urmarirea modificarii in timp real a logurilor.
Exemplu
Afiseaza fisierul /etc/passwd incepand cu linia nr. 5 si pana la final
tail -n +5 /etc/passwd
tail -n 5 /var/log/messages
Afiseaza in timp real ultimele 10 linii din fisierul cu loguri
var/log/messages tail -f /var/log/messages
strings
Afiseaza caracterele printabile/ascii dintr-un fisier binar.
strings FILE
Exemplu: strings /bin/ls
wc
Afiseaza nr. de randuri, caractere sau cuvinte dintr-un fisier
wc OPTIONS FILE
Optiuni:
-l = nr. de linii
-w = nr de cuvinte
-m = nr de caractere
file
Determina tipul fisierului
file OPTIONS FILE
Optiuni:
-p = preserve atime
du - disk usage
Afiseaza marimea unui fisier sau director
du OPTIONS FILE
Optiuni:
-k = adauga prefixul KB
-s = sum (summarize)
-h = human readable format
Exemplu: du -ksh /etc/
df - disk free
Afiseaza spatiul total, spatiul ocupat si spatiul liber de pe fiecare partitie de pe hard disk.
df OPTIONS
Optiuni:
-h = human readable
-i = print used/free inodes
Exemplu: df -hi
cmp - compare
Compararea a 2 fisiere fara afisarea diferentelor dintre ele.
cmp FILE1 FILE2
diff
Compara FILE1 si FILE2 dupa continut si afiseaza diferentele
diff OPTIONS FILE1 FILE2
Optiuni:
-i = case insensitive
-B = ignora liniile goale (blank lines)
-w = ignora spatiile libere (white spaces)
-c = comparare detaliata
-y = afiseaza pe coloane
stat - statistics
Afiseaza informatii despre FILE (size, type, atime, mtime, ctime)
stat FILE
history
Afiseaza comenzile din history
history OPTIONS
Optiuni:
-c = sterge comenzile din history
-d nr = sterge linia nr. din history
which
Cauta si afiseaza calea catre o comanda
whereis
Cauta si afiseaza calea catre o comanda, man page sau sursa
uptime
Afiseaza timpul de cand hostul este pornit precum si load-ul din ultimele 1,5 si 15 minute
date
Afiseaza/modifica data
free
Afiseaza informatii despre RAM si SWAP
free OPTIONS
Optiuni:
-t = total
-m = MB
-k = KB
uname
Afiseaza informatii despre sistem (kernel version etc)
uname OPTIONS
Optiuni:
-a = all info
-s = kernel name
-r = kernel release
-v = kernel version
-m = machine
-p = processor
-o = operating system
Exemplu: uname -a uname -s -r -v -m
vmstat - virtual memory statistics
Afiseaza informatii despre despre memorie, cpu, I/O blocks. Informatiile afisate sunt
documentate in man page-ul comenzii.
ifconfig - Interface configuration
Afiseaza informatii despre interfetele de retea. Se foloseste si pentru a seta caracteristicile
interfetelor de retea (IP, Network Mask, MAC etc).
Nota
Multe exemple din aceasta pagina au folosit fisierul /etc/passwd. Acesta este unul dintre
cele mai importante fisiere din sistem in care se gasesc utilizatorii sistemului, cate unul pe
fiecare linie, impreuna cu multe informatii despre acestia.
3.3 Regular Expressions
O expresie regulata (regex) reprezinta o modalitate (metoda) de identificare a unui
string (sir de caractere) dintr-un text dat conform anumitor reguli. Un regex este reprezentat
fizic printr-un string format din caractere speciale.
Reguli:
1. Blocul fundamental reprezinta un singur caracter si se selecteaza pe sine
2. O expresie paranteza patrata (bracket expression) reprezinta o lista de caractere
cuprinsa intre "[" si "]" si descrie un sigur caracter din acea lista.
3. Daca primul caracter este ^ (caret) descrie orice caracter care nu se gaseste in lista.
Exemplu: regex-ul [0123456789] - reprezinta o singura cifra iar [^0123456789]
reprezinta orice caracter care nu este cifra.
4. In interiorul unei expresii paranteza patrata un "range expression" reprezinta 2
caractere separate prin -(minus) si selecteaza(identifica) orice caracter care se gaseste
intre cele 2 caractere din range expression.
5. ^ (caret) in afara parantezelor drepte reprezinta un metacaracter care identifica
inceputul unei linii (daca este primul caracter din regex).
6. $ reprezinta un metacaracter care identifica sfarsitul unei linii (daca este ultimul
caracter din regex)
Exemplu
^ab - linie care incepe cu ab
ab$ - linie care se termina cu ab\
^$ - linie goala
^a[a-z0-9] - linie care incepe cu "a" urmat de orice caracter intre "a" si "z" sau "0" si "9"
7. backslash ("\") urmat de un caracter special selecteaza caracterul special respectiv.
Caractere speciale sunt: ., *, [, \ (punct, asterix, paranteza dreapta deschisa si backslash).
Caracterul special "." (punct) selecteaza orice caracter mai putin NEWLINE (linie goala)
8. "?" (semnul intrebarii) selecteaza 0 sau 1 caractere anterioare
9. * (asterix) selecteaza zero (0) sau mai multe caractere anterioare
10. + (doar pt. expresii regulate extinse) selecteaza caracterul anterior o data sau de mai
multe ori
11. {n} Elementul precedent este selectat de n ori (exact)
12. {n,} Elementul precedent este selectat de n sau mai multe ori
13. {n,m} Elementul precedent este selectat de cel putin n ori dar nu mai mult de m ori
Cand folosim acolade trebuie sa le precedam cu backslash ("\")
Exemplu
1. Gasirea tuturor liniilor care contin un string de tip CNP dintr-un fisier numit file1
grep '[01][0-9]\{12\}' file1.Daca se doreste gasirea tuturor liniilor care contin DOAR string
de tip CNP se foloseste "^" pentru ancorarea regex-ului la inceput de rand si "$" pentru
ancorarea regexului la sfarsit de rand. grep '^[01][0-9]\{12\}$' file1
2. Sa se creeze un fisier care sa contina toate fisierele si doar fisiere (de tip regular file)
din /etc eliminand liniile goale liniile care contin cuvantul 'total' sau liniile care afiseaza
directoare ls -lR /etc/ | egrep -v '(^$|^total|^/)' > etc_content
3.4 Comenzile find si grep
1.find
Comanda find cauta fisiere si directoare dupa criterii complexe in mod recursiv find
[path...] [expression]. Daca unul dintre argumente este numeric si are valoarea n se poate
folosi:
+n for greater than n
-n for less than n
n for exactly n
-type f = tipul este fisier
-type d = tipul este director
-user uname = userul este uname
-group gname = grupul owner este gname
-links n = fisierul are n hard link-uri
-perm mode = permisiunile fisierului sunt exact mode (octal or symbolic).
-perm -mode = all of the permission bits mode are set for the file.
-perm +mode = any of the permission bits mode are set for the file.
-size n = marimea fisierului este n (poate fi folosit ca sufix c=bytes, b=blocuri de 512
bytes,k=kilobytes, M=megabytes, G=gigabytes).
Se poate folosi +n = mai mare decat n, -n mai mic decat n
-inum inode_number = fisierul are nr. inod inode_number
-name REGEX = cauta dupa nume folosind regular expression (vezi capitolul referitor la
regular expressions)
Exemplu
1. Cauta recursiv fisiere cu dimensiunea mai mare de 2M care-l au owner pe root
find / -size +2M -user root -type f
2. Cauta fisiere din /etc care nu-l au owner pe root find /etc -not -user root
Criteriile comenzii find sunt asociate folosind SI logic (optiunea -a care este default) si
SAU logic ( -o)
2. grep
grep [options] PATTERN [FILE...] - cauta sabloane de text (string patterns) in FILE sau
in outputul unei comenzi
-i = ignore case
-n = line number din fisierul in care a fost gasit patternul
-R = recursive
-v = invert match
-w = cauta numai cuvinte
-H = afiseaza numele fisierului in care a fost gasit pattern-ul
Exemplu
1.Cautare cuvantul 'nameserver' in toate fisierele din /etc/ grep 'nameserver' /etc/*
2. Cautare cuvantul 'root' in /etc/passwd cu afisarea numarului liniei pe care se gaseste
grep -n 'root' /etc/passwd
3. Cautarea tuturor proceselor numite httpd care ruleaza ps -ef | grep httpd
Capitolul 4 - Useri
4.1 Concepte generale
Conturile de utilizator permit sistemului de operare sa identifice si sa restrictioneze
accesul la resurse. Administrarea conturilor de utilizator reprezinta una dintre principalele
sarcini ale unui administrator de sistem. In Linux sau in Unix fiecare actiune care are loc
(proces care ruleaza) sau fiecare resursa de tip fisier este controlata de un anumit utilizator.
Exista 2 categorii principale de utilizatori:
1. useri de sistem.
Fiecare daemon care ruleaza foloseste un user pentru a avea acces la resurse si
pentru a executa taskurile necesare.
Definitie
Un daemon este un proces care ruleaza in background fara interactiunea unui
utilizator. Exemplu: httpd ruleaza sub userul wwwuser si wwwgroup, sendmail ruleaza sub
userul mail etc.
Important
In Linux si Unix orice proces sau daemon ruleaza cu drepturile utilizatorului care-l
lanseaza in executie. Exemplu: daca root lanseaza un proces, procesul are acces total asupra
sistemului. Daca un utilizator normal lanseaza acelasi proces, procesul va avea acces doar
asupra fisierelor la care are acces utilizatorul si in acelasi mod. Acest concept este
fundamental, iar pe el se bazeaza o mare parte din securitatea generala Linux/Unix.
2. useri persoane.
Se autentifica in general prin username si parola. Un asemenea cont de user este
format din: username, parola, home directory, mediul de lucru (environment) - $PATH,
umask, shell-ul folosit etc.
Fiecare user este identificat printr-un UID. UID este in general pe 16 sau 32 de biti
(intre 0 si 65535 sau 0 si 4294967295). Userul root are UID = 0. Cu toate ca se recomanda
ca UID-ul sa fie unic pentru fiecare utilizator acest lucru nu este obligatoriu. Daca mai
multi utilizatori au acelasi UID ei vor fi tratati in mod identic de catre sistem.
Userii sunt organizati in grupuri pentru a se putea seta permisiuni la nivel de grup.
Fiecare user face parte din unul sau mai multe grupuri. Exista deci pentru fiecare user un
grup principal (cel definit in /etc/passwd) si optional mai multe grupuri secundare. Fiecare
grup este identificat printr-un nr. unic numit GID.
4.2 Fisiere specifice
1. /etc/passwd
Userii sistemului se gasesc in fisierul /etc/passwd. Structura acestuia este formata
din campuri separate prin ":" (doua puncte) astfel:
user_name:parola:uid:gid_principal:comentariu:home_directory:shell_default
Exemplu
stud:x:500:500:User principal:/home/stud:/bin/bash
user1:x:501:501:user folosit pentru teste:/home/user1:/bin/bash
sshd:x:71:65:SSH daemon:/var/lib/sshd:/bin/false
Daca in loc de parola in /etc/passwd este "x" parola se gaseste in fisierul
/etc/shadow (hash-ul acesteia sau criptata). Comanda pwck verifica integritatea fisierului
/etc/passwd
2. /etc/shadow
Structura fisierului /etc/shadow este urmatoarea:
username:password:last_change_min:max:warn:inactive:expire
username: userul din /etc/passwd. Reprezinta legatura intre fisierul /etc/passwd si
/etc/shadow
password: forma criptata a parolei sau hash-ul acesteia
last_change: nr. de zile de la 1 Ian 1970 pana in ziua in care a avut loc ultima schimbare a
parolei
min: nr minim de zile intre doua schimbari succesive
max: nr maxim de zile intre doua schimbari succesive
warn: nr. de zile dinaintea expirarii parolei in care userul este avertizat
inactive: nr de zile de la expirarea parolei si pana cand contul este dezactivat
expire: nr. de zile de la 1 Ian 1970 de cand contul este dezactivat
In fisierul /etc/login.defs se gasesc informatii care vor fi foloste default in
momentul in care se creaza un user (lungimea minima a parolei, in cat timp expira contul
etc).
3. /etc/group
Grupurile se gasesc in fisierul /etc/group Structura acestuia este formata din
campuri separate prin ":" (doua puncte) astfel:
group_name:parola:GUID:userii_din_acest_grup
Exemplu
programatori:x:100:dan,vali,george
root:x:0:root
4.3 Management conturi
Administrarea conturilor de utilizator presupune adaugarea de noi conturi,
schimbarea parametrilor unui cont (parola, grupuri, etc), stergerea de conturi etc. Exista 3
modalitati principale de a administra conturile utilizatorilor:
1.Editarea directa a fisierelor care contin informatii despre useri, grupuri si parole
folosind editorul preferat cum ar fi VI. Fiesierele care trebuie modificate sunt:
/etc/passwd, /etc/shadow si /etc/group. Aceasta metoda trebuie evitata fiindca poate duce la
erori si deci la instabilitate.
2.Admistrarea folosind unelte grafice
Fiecare distributie de Linux are propriile utilitare. In Fedora in KDE si GNOME:
System Settings -> Users and Groups De multe ori, in special pe calculatoare cu rol de
server mediul grafic nu este instalat sau nu ruleaza. In plus de cele mai multe ori
administrarea se face remote prin ssh deci aceasta metoda nu ne este mereu la indemana.
3.Folosind comenzi de shell in consola.
a) Pentru adaugare/modificare/stergere useri: useradd, userdel, usermod
useradd OPTIONS USER -> adauga un utilizator
-c 'comment'
-d home directory
-g grupul principal
-G grup1, ... grupN
-s shell
-u uid
-m create home dir. Daca se foloseste optiunea -k skeleton_dir, fisierele si directoarele
din scheleton_dir vor fi copiate in home, daca nu vor fi copiate cele din /etc/skel
-k skeleton dir (doar impreuna cu -m)
Exemplu
useradd -c 'dan programator' -d /home/dan -m -g programatori -G users,office –s /bin/bash
-u 7878 dan
userdel -r USER -> sterge un user si grupul principal corespunzator (daca nu mai exista
useri in acel grup).
Optiunea -r se refera la faptul ca va fi sters si home directory.
passwd USER -> modifica parola utilizatorului user
usermod USER -> modifica datele unui user. Command usermod foloseste aceleasi
optiuni ca si useradd
Exemplu
usermod -c 'dan contabilitate' -d /home/dan2 -m -g contabilitate -G users,office -s /bin/bash
-u 80 dan
b) Pentru adaugare/stergere/modificare grupuri: groupadd, groupdel, groupmod
Exemplu
groupadd programatori
groupdel programatori
groupmod -n profesori programatori - schimba denumirea grupului programatori in
profesori.
Unui grup i se poate seta o parola folosind comanda gpasswd.
Exemplu: gpasswd programatori
Aceasta este ceruta in momentul in care un utilizator doreste sa ruleze un shell (sa devina
parte a unui grup pentru a avea permisiunile grupului respectiv) cu un alt GUID folosind
comanda:
newgrp NOUL_GROUP.
Modificare owner/grup owner pentru un fisier sau director
Fiecare fisier sau director are un owner si un grup owner. Acestea fac parte din
structura inodului unui fisier respectiv director. Default ownerul unui fisier este userul
care-l creaza, iar grupul owner al fisierului este grupul principal al userului care creaza
fisierul sau directorul.
Exemplu: Daca userul dan creaza un fisier numit a.txt, fisierul il va avea owner pe dan, iar
grupul owner al fisierului va fi grupul principal din care face parte dan. Pentru a
schimba ownerul si grupul owner al unui fiser/director se foloseste comanda chown si
chgrp. root este singurul user care poate modifica ownerul respectiv grupul owner pentru
fisiere si directoare.
Exemplu
1. Schimba ownerul fisierului a.txt in dan
chown paul a.txt
2. Schimba grupul owner al directorului /home/programe in programatori
chgroup programatori /home/programe
3. Se schimba in mod recursiv atat ownerul cat si grupul owner al directorului
/home/programe in dan respectiv programatori. Modul recursiv se refera la schimbarea
ownerului si grupului atat pentru director cat si pentru toate subdirectoarele si fisierele
continute de acesta. Acest mod de folosire al comenzii chown face ca comanda chgrp sa
fie folosita extrem de rar in practica. chown -R paul.programatori /home/programe
Important
Atentie! Intre grupul owner al unui fisier si grupul principal sau grupurile secundare
ale ownerului fisierului nu exista legatura. Un fiser poate sa-l aiba ca owner pe userul dan,
ca grup owner sa apartina grupului programatori fara ca dan sa faca parte din grupul
programatori
4.4 su & sudo
Odata logat in sistem un user poate "deveni" un alt user folosind comanda su
(substitute user) care ruleaza un nou shell cu UID si GID noului user. Urmatoarele comenzi
vor fi executate cu UID si GUID userului nou. su [-] [username] caracterul "-" are ca efect
imprumutarea mediului de lucru (environmet) al noului user.
Apar in acest moment 2 noi concepte: RUID (Real User ID) ca fiind UID-ul
utilizatorului care s-a logat initial in sistem si EUID (Effective User ID) ca fiind UID-ul
utilizatorului devenit in urma rularii comenzii su.
Pentru a vizualiza RUID se foloseste comanda who am i, iar pentru a vizualiza
EUID se foloseste comanda whoami sau id
Nota
Se poate configura ce useri au dreptul sa devina root folosind su. Din pdv al securitatii
sistemului este esential sa permitem numai catorva useri sa poata deveni root (chiar daca si
altii stiu parola ei nu pot deveni root).
Exemplu
Se editeaza fisierul /etc/pam.d/su astfel (pentru Fedora):
auth sufficient /lib/security//pam_wheel.so trust use_uid
auth required /lib/security//pam_wheel.so use_uid
Prima linie specifica faptul ca este suficient ca un user sa faca parte din grupul wheel
pentru a deveni root. Acesta devine root fara a i se mai cere parola.
A doua linie specifica faptul ca doar userii care fac parte din grupul wheel vor putea
deveni root. Alti useri chiar daca cunosc parola de root nu pot deveni root prin folosirea
comenzii su.
Numai una dintre cele 2 linii poate sa apara in fisier. Pentru a comenta o linie se
foloseste caracterul # (diez).
Important
Un principiu de baza in Linux este ca userul root nu trebuie folosit in mod curent.
Administratorul trebuie sa se logheze folosind un user neprivilegiat iar in momentul in care
are nevoie de executia unui task ce necesita drepturi de root, acesta "devine" root folosind
comanda su. Altfel sunt introduse grave probleme de securitate care pot duce la rezultate
distructive pentru intreg sistemul.
sudo reprezinta o alta modalitate de a executa comenzi cu drepturi de root fara a fi
root sau a cunoaste parola de root necesara devenirii root folosind comanda su.
Modul de folosire al comenzi sudo este: sudo command. Commanda command este
executata cu drepturi de root.
Exemplu
Toate exemplele de mai jos sunt rulate de useri neprivilegiati dar cu drepturi de root
1. Instalarea unui program pe Ubuntu folosind apt-get
sudo apt-get install k3b
2. Configurarea parametrilor placii de retea precum IP si Network Mask
sudo ifconfig eth0 192.168.0.1 netmask 255.255.255.0
Nota
Modalitatea de a executa comenzi cu drepturi de root folosind sudo este folosita
intensivpe anumite distributii de Linux si mai putin pe altele. Distributiile bazate in mod
intensivpe folosirea comenzii sudo sunt cele derivate din Debian precum Ubuntu,
Kubuntu,Knoppix etc. Pe alte distributii precum cele bazate de RedHat sau Slackware,
Gentoo etc se obisnuieste rularea de comenzi cu drepturi de root dupa ce in prealabil userul
neprivilegiat a devenit root folosind comanda su
4.5 Monitorizare useri
Aceasta sarcina a administratorului de sistem presupune monitorizarea logarilor in
sistem sau vizualizarea userilor logati la un moment dat (prezent sau trecut). Se folosesc
urmatoarele comenzi:
1) who - afiseaza userii logati in sistem la momentul prezent. Comanda afiseaza informatia
sub forma tabelara in urmatorul mod:
username
terminalul de unde s-a logat
data logarii
Optiuni:
-H - afiseaza un header pentru a interpreta mai usor output-ul
-q - afiseaza nr. userilor logati
Exemplu
# who
stud
:0
2007-01-30 09:32
root
tty2
2007-01-30 11:35
dan
pts/0 2007-01-30 11:33 (:0.0)
dan
pts/1 2007-01-30 11:35 (:0.0)
Important
Comanda who afiseaza RUID adica userul logat initial in sistem.
2) w - afiseaza cine este logat in sistem si comanda curenta a fiecarui user.
Pe prima linie se afiseaza: data curenta, uptime, nr user logati si "system load" pt. ultimele
1, 5 si 15 minute. Informatii despre userii logati se gasesc in fisierul /var/run/utmp
(informatii despre utilizatorii logati in acel moment) si /var/log/wtmp (informatii despre
istoria logarii in sistem)
3) last - afiseaza informatii din /var/log/wtmp in ordine cronologica inversa.
Logurile se rotesc periodic. Pentru a vizualiza inregistrariile dintr-un fisier wtmp mai vechi
precum /var/log/wtmp.3 se foloseste optiunea -f
Exemplu: last -f /var/log/wtmp.3
Optiuni:
-n nr = nr. de linii afisate
nume_terminal = logarile de la terminalul specificat
Exemplu: last pts/2
4) lastlog - afiseaza inregistrarile din /var/log/lastlog (ultimile logari in sistem pentru
fiecare user)
Optiuni:
-u user = lastlog doar pentru userul user
Capitolul 5 - Sistemul de permisiuni
5.1 Concepte generale
Sistemul de fisiere in Linux imparte in mod standard utilizatorii in 3 categorii:
a) owner (proprietarul fisierului). By default (implicit) un fisier nou creat primeste ca
owner creatorul sau. Owner-ul are drepturi totale asupra fisierului, poate sa-l stearga, sa-l
modifice sau sa-i schimbe proprietatile.
Exemplu: Daca userul numit dan creaza un fisier nou numit raport.pdf, ownerul fisierului
va fi userul dan
b) group (grupul proprietar al fisierului). Folosind grupul care detine fisierul se pot seta
drepturi pentru un nr. mai mare de utilizatori. By default un fisier nou creat primeste ca
grup owner, grupul principal al userului care-l creaza.
Exemplu: Daca userul dan are ca grupul principal numit contabili, fisierele create de
acesta vor avea ca owner pe dan, iar ca grup owner contabili.
c) others (ceilalti sau restul lumii). Toti utilizatorii care nu fac parte din cele 2 categorii.
Nota
Conceptele referitoare la owner si group owner mai sus mentionat sunt adevarate atat
pentru fisierele nou create cat si pentru directoarele nou create.
Fiecare dintre cele 3 categorii detine independent urmatoarele drepturi asupra unui
fisier sau director:
a) r (read) - dreptul de citire
b) w (write) - dreptul de scriere
c) x (execute) - dreptul de executie
Aceste drepturi au efect diferit in functie tipul fisierului (fisier normal sau director).
Permisiune
Fisier
Director
read
dreptul de citire al
continutului fisierului
dreptul de a afisa continutul directorului
write
dreptul
de
a
modifica
continutul
dreptul de modificare al directorului(stergere,
creare,
redenumire
continutuluifisierului
fisiere/directoare continute in director) impreuna
cu x
execute
dreptul de a executa fisierul
acces la fisierele continute. dreptul de a ne muta
in director.
Nota
Daca un director contine dreptul de scriere ( w) pentru o anumita categorie de user ( owner,
group sau other), acea categorie are dreptul de a sterge/modifica continutul directorului
(doar fisiere NU si directoare) chiar daca pentru acele fisiere nu exista drepturi.
Pentru a sterge/modifica continutul directorului trebuie sa avem atat w cat si x.
Exemplu
1. Daca un director are pentru owner permisiunile de read(r) si write(w) dar nu si
execute(x), owner-ul nu va putea crea noi fisiere in director, nu va putea sterge continutul
directorului si nu se va putea muta in director. Motivul este lipsa permisiunii execute
pentru director.
5.2 Permisiuni speciale
In afara permisiunilor standard (read, write si execute) exista urmatoarele
permisiuni
speciale:
1) SUID (setuid).
Reprezinta o permisiune speciala pentru fisierele executabile.
Important
In Linux un fisier executabil are aceleasi drepturi ca si userul care il executa.
Setand bit ul SUID, la executare fisierul are drepturile owner-ului si nu al celui care il
executa. Fisierele cu SUID setat si cu owner root reprezinta o grava problema de securitate.
Oricine le poate executa, iar in urma executiei procesul creat va avea drepturi de root.
Exemplu
1. Comanda rm este reprezentata fizic prin fisierul executabil /bin/rm care are drept owner
pe root. In momentul in care root executa comanda rm efectul este ca aceasta comanda
are drepturile lui root si poate sterge orice fisier din sistem. Daca un alt user executa
comanda rm, efectul este ca aceasta comanda va avea drepturile userului care a executat-o
si deci nu va putea sterge niciun fisier important.
In schimb daca se seteaza permisiunea SUID pentru fisierul /bin/rm, orice user non-root
care executa comanda rm va putea sterge ORICE fisier din sistem. Acest lucru se intampla
fiindca comanda rm are drepturile ownerului adica root si nu drepturile celui care o
executa cum este default.
2. User neprivilegiat care poate vizualiza fisierul /etc/shahow fiindca comanda less are
SUID
setat
Comanda ls -l afiseaza pentru fisierele cu SUID setat "s" (s mic) pe pozitia
dreptului de executie pentru owner daca fisierul are dreptul de executie pt. owner sau "S" (s
mare) daca fisierul nu are dreptul de executie pentru owner.
2) SGID (setgid).
Reprezinta o permisiune speciala care are efecte diferite daca se aplica unui fisier
sau unui director. Cand se aplica unui fisier, daca fisierul este executabil, procesul creat in
urma executiei fisierului va rula cu drepturile grupului care detine fisierul si nu cu grupul
primar al userului care executa fisierul.
Aceasta permisiune ( SGID) este folosita mai ales pentru directoare si anume pentru
a crea directoare "shared". Fisierele noi create in interiorul directorului vor avea ca grup
care le detine grupul directorului si nu al userului care le creaza cea ce se intampla default.
Comanda ls -l afiseaza pentru fisiere cu SGID setat "s" (s mic) pe pozitia dreptului
de executie pentru grup daca fisierul sau directorul are dreptul de executie pt. grup sau "S"
(s mare) daca fisierul sau directorul nu are dreptul de executie pentru grup.
3) Sticky bit.
Se foloseste pentru directoarele "world writeable" si are rolul de a preveni
posibilitatea stergerii continutului acestora de catre useri altii decat ownerul directorului cu
sticky bit setat sau ownerul fisierului din acel director, chiar daca drepturile directorului ar
permite acest lucru (rwx).
Exemplu: /tmp
Nota
Root face exceptie, iar grupul fisierului se supune regulii (nu poate modifica).
Aplicatie: Sticky Bit se foloseste in momentul in care se doreste crearea unui
director world writeable (toate permisiunile pentru toti userii), dar cu protejarea
continutului. Fara sticky bit orice user poate creare fisiere in director, dar poate si sterge
fisierele create de alti useri. Daca directorul are sticky bit, fiecare user are dreptul sa stearga
doar propriile fisiere.
Comanda ls -l afiseaza pentru directoarele cu sticky bit setat "t" (t mic) pe pozitia
dreptului de executie pentru other daca fisierul are dreptul de executie pentru other sau "T"
(t mare) in rest.
5.4 Modificare permisiuni
Pentru a modifica drepturile de acces ale unui fisier se foloseste comanda chmod
(change mode) cu urmatoarea sintaxa:
chmod [OPTION]... MODE... FILES
Exista doua posibilitati de setarea a drepturilor de acces:
1) Modul simbolic (relativ)
Trebuie avute in vedere urmatoarele:
a) ale cui drepturi se modifica (u pentru owner, g pentru group, o pentru other, a pentru all)
b) ce presupune modificarea (+ (plus) pentru adaugare, - (minus) pentru eliminare, =
(egal) pentru setare indiferent de permisiunile deja existente)
c) ce permisiuni se modifica (r pentru read, w pentru write, x pentru execute, s pentru
setuid/setgid si t pentru sticky bit)
Exemplu
1. Pentru fisierul /home/stud/orar.doc se modifica drepturile de acces astfel: pentru owner
se aduga r,w si x, pentru grup se adauga r si w, iar pentru o se adauga r. Totul este relativ la
drepturile avute deja.
chmod u+rwx,g+rw,o+r /home/stud/orar.doc
2. Pentru fisierul /home/stud/test_conexiune_internet.sh se modifica drepturile de acces
astfel: pentru owner si group se adauga dreptul de executie iar pentru other se elimina toate
drepturile.
chmod ug+x,o-rwx /home/stud/test_conexiune.sh
3. Se seteaza sticky bit pentru directorul /home/stud/tmp
chmod +t /home/stud/tmp
Totul este relativ la permisiuniele deja existente.
2. Modul octal (absolut)
Se folosesc 4 cifre in baza 8 (intre 0 si 7) in mod pozitional astfel: pentru fiecare
grupa de permisiuni (u, g si o) in functie de existenta sau lipsa unei permisiuni specific se
aduna o cifra conform cu puterea lui 2 corespunzatoare acelei pozitii. Lipsa unei permisiuni
se marcheza su semnul "-" (minus).
Exemplu
r
w -
4
2
r
-
x r
-
-
0 4 0 1 4 0 0
Permisiune fisier = 654
Prima cifra din cele 4 reprezinta biti speciali care se pot seta ( SUID, GUID si
Sticky bit). Daca este zero reprezinta lipsa lor. Daca se omite se considera zero ( Exemplu:
permisiunea 654 este de fapt 0654).
Pentru prima cifra se poate folosi:
1 pentru sticky bit
2 pentru SGID
4 pentru SUID
Exemplu
Echivalenta dintre modul relativ si obsolut:
rwx rwx rwx = 0777
Exemplu: chmod 0777 /home/stud/a.txt
r-- --- --- = 0400
Exemplu: chmod 0400 /home/stud/b.txt
rwS rw- r-x = 4664
Exemplu: chmod 4664 /home/stud/c.txt
rw- r-s rwx = 2657
Exemplu: chmod 2657 /home/stud/d.txt
5.5 Umask
Conceptul de umask se foloseste pentru a stabili modul default de permisiuni cu
care este creat un director sau fisier.
By default fisierele au permisiunile 0666(rw- rw- rw-) iar directoarele 0777(rwx
rwx rwx). Pentru a modifica modul default de permisiuni se foloseste umask in urmatorul
mod: din valoarea default se scade umask (pozitional), rezultand modul in care vor fi
create fisierele in ceea ce priveste permisiunile.
Exemplu
daca umask este 0002 noile fisiere create vor avea permisiunile 0664 iar directoarele 0775
daca umask este 0022 noile fisiere create vor avea permisiunile 0644 iar directoarele 0755
Exista o singura valoare umask pentru fiecare user. Se vizualizeaza cu comanda:
umask.Pentru a modifica umask se foloseste comanda umask NOUA_MASCA ( Exemplu:
umask 0222).
NOUA_MASCA poate fi reprezentata octal sau simbolic.
Nota
Umask nu trebuie schimbata decat in situatii deosebite. Modificarea umask poate duce la
caderea intregului sistem.
Nota
Odata modificat umask noua valoare nu se pastreaza decat pana la urmatorul restart. Pentru
ca modificarea umask sa fie permanenta se scrie comanda de modificare a umask intr-un
fisier de initializarea al environment-ului utilizatorului precum ~/.bashrc.
5.5 Atribute speciale
Sistemele de fisiere extinse precum ext3 folosesc pe langa permisiunile clasice si
cateva atribute speciale pentru fisiere si directoare. Pentru setarea acestora se foloseste
comanda chattr.
chattr ATRIBUT FISIER
-i = immutable (nu poate fi sters sau modificat)
-A = nu actualizeaza atime
-R = modifica atributele speciale recursiv pentru directoare
-a = just append
Exemplu:
chattr +i a.txt
chattr -a a.txt
Pentru vizualizare atribute se foloseste comanda lsattr
-R = listeaza recursiv continutul directorului
-d = listeaza atributele directorului in loc de continutul acestuia
-a = listeaza atributele fisierelor ascunse
Exemplu: lsattr a.txt
Capitolul 6 - Procese
6.1 Concepte generale
Una dintre sarcinile kernelului este si alocarea resurselor (RAM, CPU etc)
diferitelor aplicatii.
Definitie
Un proces reprezinta unitatea elementara de alocare a resurselor in sistem si ruleaza
in propriul sau spatiu de memorie.
In momentul in care se executa o comanda este creat un nou proces. Parintele acelui
proces este shell-ul curent. Imaginea procesului reprezinta programul care se executa si
care se incarca in memoria RAM.
Exista diferente intre un program si un proces. Acelasi program poate genera mai
multe procese diferite.
Exemplu: deschiderea simultana a editorului VI sau folosirea de mai multi useri a
comenzii ls.
Nota
Procesoarele (exceptie cele dual-core) executa un singur proces la un anumit moment dat.
Fiecare primeste un anumit slot de timp in care poate folosi procesorul, apoi ofera
posibilitatea altui proces de a folosi CPU. Astfel este creata senzatia de executie simultana.
Important
Fiecare proces care se executa are anumite drepturi asupra sistemului si anume
drepturile userului care l-a executat (user de sistem sau persoana). Un proces pornit de root
are drepturile lui root (totale), iar acelasi proces pornit de un user normal are drepturile
userului (limitate). Exceptie fac programele care au SUID sau GUID setat. Acestea pleaca
cu drepturile ownerului sau grupului owner si nu ale celui care le executa.
Exista comenzi care sunt incluse in shell si care nu se gasesc ca programe
independente (fisiere executabile)
Exemplu: cd, jobs, alias, umask, ulimit, echo etc
Acestea nu creaza un nou proces cand se executa.
6.2 Caracteristici procese
1.Sistemul de operare foloseste functia de sistem fork() pentru a crea noi procese. Prima
etapa este crearea unui proces identic cu parintele sau (aceleasi resurse, drepturi, practic se
creaza o copie identica a parintelui). Ulterior procesul nou creat "urmeaza propriul sau
drum" adica modifica datele primite de la parinte pentru a executa propria sarcina.
2.Fiecare proces are un parinte, cel care l-a creat. Exceptie face procesul init.
3.Procesele sunt identificate dupa un nr. unic pentru intreg sistemul numit PID (Process
ID).
4.Parintele fiecarui proces este identificat cu un PPID (Parent Process ID).
5.Procesul init este primul care porneste la butarea sistemului si are PID = 1. Init se mai
numeste si parintele tuturor proceselor.
6.Un proces dureaza din momentul in care este creat de parintele sau si pana cand
programul executat de proces se termina iar rezultatul procesului este intors parintelui. In
acest moment parintele comunica Kernelului sa elibereze resursele alocate procesului.
Starile unui proces
Un proces se afla in urmatoarele stari de la nastere (fork()) si pana la terminarea sa.
a) created
Reprezinta etapa in care procesul este creat si astepta permisiunea schedulerului pentru
starea ready.
b) ready (waiting sau runnable)
Procesul a fost incarcat in memorie si asteapta executia procesorului. Exista mai multe
procese
care
se
gasesc
simultan
in
aceasta
stare.
c) blocking (sleeping)
Procesul este blocat din cauza unei resurse inaccesibile (fisier, variabila de tip semafor,
device). Este sters din lista de asteptare pentru a fi executat de procesor. Daca resursa se
elibereaza procesul intra in starea "ready".
d) running (active sau executing)
Procesul este executat de procesor in acest moment. Daca isi depaseste slice-ul (timpul)
alocat pentru executie va trece din nou in starea ready.
e) terminated
Un proces intra in aceasta stare fie din starea running daca a terminat executia sau daca
este omorat (killed) printr-un semnal. Daca nu este sters din memorie devine zombie.
Daca procesul are copii, acestia sunt preluati de init.
f) suspended and waiting
Reprezinta procesele care au fost indepartate din memoria principala si duse in memoria de
tip swap.
g) suspended and blocked
Reprezinta procesele care se gasesc in memoria de tip swap in starea de suspendare.
Atributele unui proces
Un proces detine urmatoarele atribute:
a) PID -> Process ID - identificatorul unic al unui proces
b) PPID -> Parent Process ID - identificatorul parintelui procesului
c) UID -> User ID - Identificatorul userului sub care ruleaza procesul
d) GUID -> Group ID - Identificatorul grupului sub care ruleaza procesul
e) Prioritate
6.3 Categorii de procese
In Linux exista urmatoarele categorii de procese:
1. Parinte (parent)
Fiecare proces poate genera un alt proces si devine parinte. In afara procesului init
fiecare proces are un parinte.
2. Copil (child)
In momentul in care procesul copil se executa, parintele intra in starea de sleeping
pana cand copilul termina executia. Daca copilul se executa in background parintele
intra/ramane in starea ready.
3. Daemon
Reprezinta un proces care ruleaza in background.
4. Orfan (orphan)
Reprezinta procesele ale caror parinti au intrat in starea terminated inaintea lor.
Sunt preluate automat de init, parintele tututor proceselor.
5. Zombie (defunct)
Reprezinta procesele care au terminat executia dar nu sunt sterse din tabele de
procese. Nu pot fi terminate in modul conventional (folosind comanda kill) ci doar de catre
procesul parinte sau init daca procesul parinte termina executia. In general zombie nu fac
rau sistemului fiindca nu consuma resurse.
6.4 Comenzi vizualizare
1. ps (process status) - afisarea tabelara a listei de procese
Optiuni:
fara optiuni = afiseaza procesele pornite din terminalul curent
-e (sau A) = toate procesele tuturor userilor
-f = full description
-u user = doar procesele userului user.
--forest = afiseaza arborescent
Fiindca de cele mai multe ori lista de procese nu incape pe un ecran, comanda ps se
foloseste in combinatie cu grep sau less.
Exemplu
ps
-ef
ps -ef | grep init
ps -u stud -f | less
2. pstree - afisare arborescenta a proceselor
-a = afisarea argumentelor liniei de comanda
-c = afisare decompactata a sub arborilor
-h = sublinierea procesului curent si a parintilor acestuia
-p = afisare PID
Exemplu: pstree -ahp
3. pgrep - afiseaza procesele care ruleaza, cautandu-le dupa nume.
-l = afiseaza si PID
-u username = afiseaza procesele detinute de username (EUID).
Exemplu: preg -l -u root,stud sshd
4.top = afisarea in timp real a proceselor cu optiuni diverse de ordonare dupa diferite
criterii
Optiuni:
-c = afisarea comenzii complete.
-p PID = afiseaza doar procesul cu PID
-d ss.tt (seconds.tenths)= refresh la fiecare secunda.zecime (sunt permise numere mai
mici ca 1)
-u username = doar procesele care ruleaza sub username.
Exemplu: top -d 0.3 = refres la fiecare 3 zecimi de secunda.
In timpul operarii putem apasa urmatoarele taste:
h sau ? = vizualizam un help pentru top
q = quit
f = selectarea campurilor care vor fi afisate
o(o mic) = selectarea ordinii de afisare
O(O mare) = selectarea campului de sortare
d = insert delay refresh
u = afisarea proceselor doar pentru un user.
k = trimite un semnal unui proces.
Semnificatia celor mai importante coloane afisate de top:
PID = process id
PPID = parent process id
USER = utilizatorul sub care ruleaza procesul
PR = prioritatea procesului
NI = NICE = valoarile negative reprezinta o prioritate mai mare, iar cele pozitive o
prioritate mai mica.
RES = Resident Size = Cantitatea de memorie non-swap (kb) folosita
VIRT = Virtual Image (Swap + Res)
SHR = Shared Memory - memoria shared folosita. Acest tip de memorie poate fi
impartita intre mai multe procese.
S = Process Status
Statusul unui proces poate fi
D = uninterruptible sleep
R = running
S = sleeping
T = stopped
Z = zombie
%CPU = procentul din timpul CPU folosit de la ultima afisare
%MEM = procentul din memorie folosit
TIME
COMMAND
Nota
Tasks shown as running should be more properly thought of as 'ready to run' -- their
task_struct is simply represented on the Linux run-queue. Even without a true SMP
machine, you may see numerous tasks in this state depending on top's delay interval and
nice value. SMP = Symetric multiprocessing (multiprocessor computing)
http://en.wikipedia.org/wiki/Symmetric_multiprocessing
Sortarea dupa un camp afisat de top:
b = toggle on/off - afecteaza daca top va arata boldat coloanele dupa care se sorteaza si
procesele running.
x = afiseaza boldat coloana de sortare
y = afiseaza boldat randurile care reprezinta procesele "running" sau "ready to run"
Pentru a modifica campul de sortare se apasa "O" (o mare) si se alege campul
corespunzator. Se poate trece dintr-un camp in altul cu "<" si ">"
Shortcuts:
M = sort by memory
P = sort by processor
R = schimba modul de ordonare (crescator, descrescator).
Pentru a salva modificarile facute: W (salveaza in ~/.toprc)
5. nice
Pentru a modifica prioritatea unui proces se foloseste comanda nice (default +10)
Exemplu:
nice -n -20 sort nr.txt = prioritate maxima
nice -n +19 top = prioritate minima
6.5 Comunicatia dintre procese / Semnale
In Linux si Unix procesele comunica prin doua modalitati principale:
1.Pipes (conducte)
Procesele pot cumunica prin canale speciale numite pipes. Un proces trimite
informatie pe acest canal care va fi folosita de celalalt proces. Sincronizarea este posibila
fiindca in momentul in care un proces doreste sa citeasca dintr-o conducta goala este blocat
pana cand exista date disponibile.
Example: sort < numere.txt | head
Comanda sort ordoneaza fisierul numere.txt care reprezinta inputul sau. Outputul
comenzii sort in loc sa fie redirectat catre standard output este conectat la o conducta (care
exista doar pe durata executiei comenzilor) care transmite datele ca input comenzii
head. Daca conducta "se umple", sort asteapta ca head sa folosesca si sa indeparteze
informatia din conducta.
Procesele pot comunica si folosind conducte de tipul named pipes sau domain
named sockets.
Nota
Exemplu
de
procese
care
folosesc
sockets
pentru
comunicare:
Procesul server de e-mail comunica printr-un socket cu procesul antivirus si printr-un alt
socket cu procesul care verifica daca un e-mail este spam. Astfel e-mailul este transmis
prin socket intre aceste procese, fiecare actionand intr-un anumit mod.
2. Intreruperi software (Semnale)
O alta modalitate de comunicare dintre procese este prin semnale sau intreruperi
software. Exista intreruperi software care pot fi ignorate de procese sau care nu pot fi
ignorate. Exista multe semnale in Unix (de ordinul sutelor).
Dintre acestea cateva mai importante sunt:
Signal Name
Number
Description
SIGHUP
1
Hangup (POSIX)
SIGINT
2
Terminal interrupt (ANSI) - CTRL + C
SIGQUIT
3
Terminal quit (POSIX)
SIGILL
4
Illegal instruction (ANSI)
SIGKILL
9
Kill(can't be caught or ignored) (POSIX)
SIGALRM
14
Alarm clock (POSIX)
SIGTERM
15
Termination (ANSI)
SIGCONT
18
Continue executing, if stopped (POSIX) (bg %jobid)
SIGSTOP
19
Stop executing(can't be caught or ignored) (POSIX)
SIGTTIN
21
Background process trying to read, from TTY (POSIX) - (Ctrl +
Z)
SIGTTOU
22
Background process trying to write, to TTY (POSIX)
SIGIO
29
I/O now possible (4.2 BSD)
SIGPWR
30
Power failure restart (System V)
Procesele pot ignora, bloca sau "prinde" toate semnalele cu exceptia SIGSTOP si
SIGKILL. Daca un process "prinde" un semnal inseamna ca include cod care va actiona
corespunzator la primirea semnalului. Daca semnaului nu este "prins" de proces, kernelul
va executa actiunea default.
Pentru a trimite un semnal in mod expres unui proces se foloseste comanda kill .
Aceasta primeste ca argument PID-ul procesului si tipul de semnal pe care sa-l trimita
(default trimite SIGTERM(15))
Nota
Trimiterea semnalui SIGKILL (9) lui init nu are niciun efect.
Comanda pkill primeste ca argument numele comenzii care ruleaza in procesul
caruia ii va trimite semnalul.Comanda killall se foloseste pentru a trimite semnale tuturor
proceselor care ruleaza sub acelasi nume.
Diferenta intre pkill si killall este ca pkill primeste ca argument doar o parte din
numele procesului, iar killall primeste ca argument intreg numele. Pentru a specifica
semnalul trimis se poate folosi codul numeric al semnalului sau numele acestuia.
Exemplu
#ps -ef | grep bash
root
13162 13158 0 11:59 pts/1 00:00:00
-bash
root
13403 13400 0 12:19 pts/2 00:00:00
-bash
#kill -15 13162
sau
#kill -SIGTERM 13162
sau
#pkill bash
sau
#killall bash
Aplicatii:
1) sa se trimita procesului reprezentat de comanda sleep 100 semnalul corespunzator
combinatiei Ctrl+Z
2) sa se trimita procesului reprezentat de comanda sleep 50 semnalul corespunzator
combinatiei Ctrl+C
6.6 Job Control
Job control se refera la posibilitatea de a opri/suspenda executia unui proces si
repornirea sa la un moment ulterior. Pentru a rula o comanda in backgroud se foloseste "&"
la sfarsitul comenzii.
Exemplu: updatedb &
Fiecare job care ruleaza in background primeste un id (incepand cu 1). Comanda
jobs afiseaza toate aceste id-uri sub forma [1] 25647. Primul nr. reprezinta Job ID iar cel
de-al doilea Process ID.
Daca sunt mai multe joburi in background, semnul "+" identifica job-ul care va fi
utilizat ca default in cazul comenzilor bg si fg, iar semnul "-" identifica job-ul care devine
default daca job-ul curent termina executia.
Exemplu
fg %job_id - aduce in foreground un job din background.
bg %job_id - porneste in background un job suspendat cu Ctrl+Z
La inchiderea terminalului acesta primeste semnalul SIGHUP. Toate procesele
pornite din terminal primesc la randul lor semnalul SIGHUP. Comanda nohup este folosita
cand se doreste ca un proces sa nu reactioneze la primirea semnalului SIGHUP (hangup).
La inchiderea terminalului, parintele (bash) intra in starea terminated si procesul este
preluat de init.
Exemplu: nohup comanda &
Exemplu
Se porneste un proces dintr-un terminal in mod normal (fara nohup) in foreground. Se
doreste inchiderea terminalului astfel incat procesul sa isi continue executia
#wget -c http://download.fedoraproject.org/.../i386/iso/Fedora-8-i386-DVD.iso
#Ctrl+Z
#jobs
#bg %jobid
#disown -h %jobid
Capitolul 7 - Backup & Administrare software
7.1.1 Strategii de backup
Introducere
Pentru orice afacere datele reprezinta una dintre cele mai importante resurse, o
resursa strategica fara de care firma respectiva nu poate exista. Toata activitatea unei
societati se afla pe hard disk-ul computerelor. O defectiune a acestora, un incendiu sau o
inundatie este echivalenta cu pierderea datelor si chiar cu falimentul companiei respective.
Nimeni nu-si poate imagina astazi o banca ce isi pierde toate datele referitoare la
clienti, conturi, sume de bani trasferate, sau o companie de telefonie care nu mai gaseste
informatiile referitoare la abonati, numerele de telefon inca disponibile, plata facturilor etc.
Aceste pierderi fatale pentru o firma nu se intampla in realitate. Va puteti intreba de ce, din
moment ce hard diskurile se defecteza mereu, incendiile sau furturile echipamentelor sunt
tot mai frecvente? Pentru ca fiecare firma de pe glob care isi desfasoara activitatea fara a se
intreba daca a doua zi mai exista, are un sistem de backup al datelor.
Fie ca datele importante sunt copiate manual pe cd/dvd, fie exista un alt computer
secundar pe al carui hard disk se afla toate informatiile, fie este implementat un sistem
profesionist de back-up pe banda magnetica, o solutie de backup este nelipsita din strategia
oricarei companii.
Important
Backup-urile trebuiesc depozitate off-site (in alta locatie fizica) in general in seif
sau intr un loc sigur astfel incat o compromitere fizica a locului unde se afla datele
(incendiu, furt, inundatie) sau nu afecteze si backup-ul.
In principal exista 3 feluri de backup:
1. full backup - toate datele sunt salvate
2. backup incremental - doar datele care s-au modificat in raport cu ultimul backup sunt
salvate
3. backup diferential - doar datele care s-au modificat in raport cu o perioada de referinta
( Exemplu: prima zi a saptamanii) sunt salvate
Medii de stocare
1. Hard disk pe un alt calculator, eventual un hard disk extern pe USB sau FireWire de
capacitate mare (peste 300 GB) care poate fi depozitat off-site. Avantajele acestei metode
sunt multiple; pretul hardisk-urilor tinde sa devina tot mai redus, viteza de copiere si de
restaurare este foarte mare, accesul la date este direct. Un dezavantaj este fiabilitatea
scazuta. Hard disk-urile sunt sensibile la socuri mecanice, fluctuatii electrice sau magnetice
etc. Nu de putine ori auzim ca un anume hard disk s-a ars sau s-a spart.
2. Mediul optic - CD/DVD. Principalul avantaj este costul extrem de redus. Dezavantajele
sunt multiple: spatiu foarte redus de stocare (intre 600 MB - 4 GB), imposibilitatea de a fi
folosit acelasi cd/dvd un timp intelungat, dificultatea de a automatiza procesul. Aceasta
solutie este folosita mai mult de utilizatorii casnici, nu in mediul de afaceri.
3. Benzile magnetice. Acesta solutie este preferata in mediul Enterprise. Fiabilitatea
casetelor cu banda magnetica este maxima. O caseta poate fi utilizata in conditii optime
pana la 30 de ani fara intrerupere daca sunt respectate recomandarile producatorului
(umiditate, temperatura etc). Tape-urile nu au nimic electronic in componenta, doar suport
magnetic. Astfel devin imune la socurile mecanice. Informatia de pe o caseta care a fost
scapata jos si s-a spart sau a fost udata poate fi recuperata foarte usor (eventual doar o mica
parte din informatie a fost deteriorata). Pe o astfel de caseta incap pana la 240 GB.
Dezavantaje ar fi timpul lung necesar recuperarii datelor (acces secvential), viteza mica de
scriere si citire.
Exista programe de backup profesioniste atat comerciale cat si OpenSource. Un
program de referinta este AMANDA (The Advanced Maryland Automatic Network Disk
Archiver). Acest sistem solid este folosit cu succes in multe medii de afaceri. Folosind
programele clasice de Unix ( tar, dump etc), pentru a realiza un backup incremental pe
banda magnetica, recuperarea datelor poate fi facuta doar cu aceste utilitati aflate pe orice
sistem Unix/Linux. Ultimele versiuni sunt compatibile cu Samba, astfel incat pot fi incluse
in circuitul de backup si share-uri Windows. Alte solutii profesioniste includ Arkeia,
Veritas si ARCserve.
Un alt aspect important este recuperarea informatiei aflata in circuitul de backup.
Acest proces trebuie sa fie sigur, usor si eficient. Dupa setarea sistemului de backup,
trebuie verificat ca in caz de pierdere a fisierelor, bakup-ul chiar functioneaza si datele pot
recuperate efectiv. Altfel cel mai complex sistem de backup este nefolositor.
Securitatea datelor nu este de neglijat. De curand o companie aflata in Fortune Top
500 declara ca firma de trasport FedEx a pierdul casetele cu backup in timp ce le transporta
intr-o alta locatie. Imaginati-va toate acele informatii in valoare de miliarde de dolari la
indemana oricui ! De aceea este recomandat ca datele sa fie criptate. In caz de pierdere/furt
nimeni nu le poate accesa.
7.1.2 Comenzi specifice
Comenzi de arhivare si comprimare
1. tar (tape archive) - reprezinta principala comanda de arhivare pe Linux. Tar nu
realizeaza comprimare (in mod default) ci doar arhivare.
tar optiuni output_file files/dirs
Comanda tar primeste obligatoriu una dintre optiunile:
-c = create - creaza o arhiva
-x = extract - extrage fisierele din arhiva
-t = table of content (vizualizare continut)
-r = adauga la sfarsitul arhivei
-u = adauga in arhiva doar fisierele noi
Important
Folosind optiunea -x se pot suprascrie fisierele care exista pe hard disk cu cele care se
dezarhiveaza.
Alte optiuni:
-f = file (se specifica fisierul arhiva care se creaza)
-v = verbose
--atime-preserve = nu schimba atime pentru fisierele adaugate
Exemplu
a) se creaza arhiva.tar in directorul curent din directorul
/home/stud/dir_care_se_arhiveaza
tar -cvf arhiva.tar /home/stud/dir_care_se_arhiveaza
b) vizualizarea continutului unei arhive
tar -tf arhiva.tar
c) adaugare fisier a.txt la arhiva.tar
tar -rf arhiva.tar a.txt
d) adaugare fisiere noi in arhiva. Acestea sunt adaugate, versiunile mai vechi din arhiva
nu sunt inlocuite.
tar -uf arhiva.tar f*
e) pastreaza atime pentru fisierele adaugate
tar --atime-preserve -cvf arhiva.tar dir1/
f) Extrage doar un fisier din arhiva
tar -xzvf arhiva.tar a.txt
2. BZIP2, GZIP
Programul tar poate fi folosit si pentru a compresa fisiere. Se folosesc optiuni specifice
care au drept efect trecerea fisierelor printr-un program de compresie inainte de arhivare.
Optiuni ale comenzii tar pentru comprimare:
-j = create bzip2 (fisierul care se arhiveaza sunt trecute prin filtrul de compresie bzip2)
Exemplu
Creaza in directorul curent arhiva directorului /home/dan/dir1 numita archivefile.tar.bz2
comprimata cu bzip2
tar -cvjf archivefile.tar.bz2 /home/dan/dir1 echivalent cu
tar -cvf - /home/dan/dir1 | bzip2 > archivefile.tar.bz2
Extragere arhiva bz2:
tar -xjvf arhiva.tar.bz2
echivalent cu
bunzip2 arhiva.tar.bz2 - rezulta fisierul arhiva.tar
tar -xvf arhiva.tar
-z = create gzip arhive
Exemplu
tar -czvf arhiva.tar.gz dir1/
tar -xzvf arhiva.tar.gz
Exista si comenzile zip, unzip, gzip si gunzip dar sunt mai putin folosite datorita faptului
ca in general se foloseste comanda tar impreuna cu optiuni de compresie.
Exemplu: Backup la directorul /etc in /root : tar -cjvf /root/etc-$(date +%F).tar.bz2 /etc
3. SCP - Secure Copy (Copy over SSH)
Reprezinta posibilitate de a copia fisiere remote de pe calculatoare conectate in
LAN sau pe Internet. Copierea are loc criptat. Pentru aceasta avem nevoie de acces prin
SSH la calculatorul de pe care dorim sa copiem sau pe care dorim sa copiem. Datele sunt
copiate folosindu-se un tunel SSH creat intre sursa si destinatie.
scp optiuni SURSA DESTINATIE
- P = port (poate folosi un alt port - default 22)
- p = preserve (atime, mtime si permisiunile)
- r = recursive copy (pt. directoare)
- v = verbose
Exemplu
a) Se copiaza fisierul arhiva.tar.bz2 de pe calculatorul local pe calculatorul cu IP-ul
192.168.0.1 in directorul /home/dan sub numele de arhiva-stud.tar.bz2. Userul dan
trebuie sa aiba acces prin ssh la 192.168.0.1
scp /home/stud/arhiva.tar.bz2 dan@192.168.0.1:/home/dan/arhiva-stud.tar.bz2
b) Sursa poate fi host-ul remote identificat prin nume DNS. Conexiunea foloseste portul
destinatie 2323 (daemonul ssh trebuie sa asculte pe acest port). Se copiaza fisierul
/etc/passwd in dir. curent.
scp -P 2323 root@host.ro:/etc/passwd
c)Copiaza recursiv directorul /etc/ sub numele /backup-etc/
scp -rpv /etc/ root@backuphost:/backup-etc/
4. rsync
Solutie de backup incrementala folosind rsync si Linux
Inainte de a configura o solutie de backup, care este critica pentru orice utilizator
privat sau din mediul de afaceri, trebuie sa ne punem cateva intrebari:
ο‚· La ce vreau sa fac bakup?
ο‚· Pentru cat timp vreau sa pastrez backup-ul?
ο‚· Pe ce mediu vreau sa salvez datele?
ο‚· Ce importanta au datele care sunt salvate?
Cel mai rau lucru care se poate intampla este ca solutia de backup in care ne-am pus toata
increderea sa nu functioneze la momentul oportun (dupa ce s-a produs pierderea datelor, sa
nu le putem recupera). De acea verificarea functionarii backup-ul este de importanta
capitala.
rsync (remote syncronization) este o utilitara inclusa in toate distributiile moderne de
Linux. Aceasta realizeaza sincronizarea fisierelor si directoarelor locale cu cele de pe un alt
calculator remote sau cu un alt director local.
Sintaxa de baza este:
#rsync /sursa /destinatie
Acesta comanda copiaza directorul numit /sursa in directorul numit /destinatie (cu crearea
directorul destinatie daca nu exista).
O varianta mai complexa poate fi:
# rsync -e ssh -av --delete /usr/local/backup/ daniel@backup.host:/home/backups/
Acesta comanda face un backup incremental (doar diferentele dintre sursa si destinatie) pe
un calculator remote.
-e ssh: reprezinta modalitatea de transport a datelor folosind protocolul ssh. Se creaza un
tunel criptat prin care fisierele si directoarele sunt copiate. Pentru a folosi ssh ca protocol
de comunicare trebuie sa fie setat ssh sa realizeze autentificare fara parola folosind chei
publice si private. Altfel procesul nu poate fi automatizat fiindca trebuie introdusa parola
de autentificare.
-a: archive mode, echivalent cu -rlptgoD ( r = recursive, l = copiaza si linkurile, p =
pastreaza permisiunile fisierelor intre sursa si destinatie, t = pastreaza ctime, atime, mtime,
o=pastreaza owner, g=group pt fisier sau director, D = preserve device (numai pt Root))
-v: verbose
--delete: sterge fisierele sau directoarele de la destinatie care sunt diferite fata de sursa
/usr/local/backup reprezinta sursa backup-ului
daniel@backup.host:/home/backups -> username daniel pe calculatorul remote backup.host
(poate fi dat si ca IP) care are drept de scriere in directorul destinatie, iar /home/backups
reprezinta destinatia
Rularea automata a script-ului de back-up
Pentru a executa un backup incremental automat in fiecare seara, se creeaza un
cronjob. Intr-un script (fisier cu drept de executie pt owner care trebuie sa fie root pentru a
evita eventualele probleme legate de drepturile de acces) scriem comanda de mai sus care
realizeaza backup incremental apoi ca root executam
# crontab -e: deschide fisierul cu cron joburile lui root pentru editare folosind editorul
implicit (vi, emacs, etc) 0 0 * * * /calea_catre_scriptul_creat_mai_sus: ruleaza scriptul cu
numele calea_catre_scriptul_creat_mai_sus la ora 0:0 in fiecare zi
Alta posibilitate ar fi sa copiem scriptul creat mai sus in /etc/cron.daily (redhat,
fedora, slackware etc). Fisierele aflate in /etc/cron.daily se executa automat la ora 22:00
(sau cea configurata in /etc/crontab) a fiecarei zile.
rsync este o unealta cu foarte multe optiuni (vezi man rsync) simpla, dar foarte flexibila.
Exemplu
1. Pentru a realiza o sincronizare a doua directoare( /home si /backup/home) de pe acelasi
computer: rsync -a --delete /home /backup/home
2. Daca vrem sa sincronizam/copiem un director recursiv, dar vrem sa omitem un anume
director sau fisier, putem folosi optiunea -filter rsync -e ssh -aq --delete --filter=':
/etc/.rsync-filter' /home/mihai/ 10.0.0.2:/home/mihai/
Aceasta comanda sincronizeaza /home/mihai/ de pe calculator local cu /home/mihai/ de pe
calculatorul 10.0.0.2 omitand directoarele /home/mihai/samba, /home/mihai/jeny si
/home/mihai/jocuri.
Fisierul /etc/.rsync-filter trebuie creat si trebuie sa contina pe cate o linie numele
directoarelor sau fisierelor pe care vrem sa le excludem de la sincronizare/copiere (pot si
folosite si regular expressions).
In acest exemplu, fisierul .rsync-filter contine:
samba/
jeny/
jocuri/
3. Pentru a realiza o arhiva gzip a lui /usr/local/backup si a o copia temporar in /tmp si apoi
pe host-ul remote 192.168.3.l ca username jeny cu stergerea ulterioara din /tmp
#!/bin/bash
DATE=`date +%F`
tar -czpf /tmp/backupfile-.gz /usr/local/backup
rsync -e ssh -a /tmp/backupfile-$DATE.gz jeny@192.168.3.1:/home/backups
rm /tmp/backupfile-$DATE.gz
4. rsync poate fi folosit si pentru o simpla copiere ( ca si cp) rsync /etc/named.conf
/home/omi/named.conf
Comanda este echivalenta cu:
cp /etc/named.conf /home/omi/named.conf
rsync poate functiona si client-server. Cu clientul de rsync ne conectam la serverul rsync
de pe calculatorul destinatie. Astfel nu mai este nevoie de ssh ca protocol de trasport.
7.2 Cron jobs
Cron daemon
Se foloseste pentru a executa o comanda sau program intr-un mod repetat, la un
moment dat in viitor. Programul este executat in background. Crontab este programul care
instaleaza, dezinstaleaza si editeaza lista de job-uri pentru fiecare utilizator folosite de cron
daemon. Cron daemon cauta fisierele crontab in directorul numit cron spool directory si
care este /var/spool/cron/ si unde se gaseste un fisier pentru fiecare user din sistem. Aceste
fisiere sunt incarcate in memorie. Fiecare utilizator din sistem are propriile cron job-uri
independent de ceilalti useri. Cron daemon verifica la fiecare minut daca mtime al spool
directory s-a modificat.
Exista 2 fisiere ( /etc/cron.deny si /etc/cron.allow) care stabilesc userii care au
dreptul sa foloseasca crontab. Daca fisierul cron.allow nu exista, dar cron.deny exista si
este gol, fiecare user are dreptul sa foloseasca crontab. Daca nici cron.allow nici cron.deny
nu exista utilizatorii nu au dreptul sa foloseasca crontab. Daca ambele fisiere exista dar
sunt goale, niciun utilizator nu are dreptul sa foloseasca crontab.
Aceste fisiere se editeaza cu username-ul celui la care ne referim (cel care are
dreptul sau nu sa foloseasca crontab), cate un username pe fiecare linie. Poate fi folosit
cuvantul ALL sau NONE.
Accesul sau restrictia unui utilizator la crontab se refera la dreptul acestuia de a
edita fisierul din /var/spool/cron folosind crontab sau direct folosind un editor. Nu se refera
la dreptul de a avea si executa cron job-uri. Userul root va putea in continuare sa editeze
cron-urile pentru utilizator.
Exista 2 categorii de cron jobs:
1. Joburi pentru fiecare utilizator ( /var/spool/cron)
2. Joburi globale
Structura unui fisier crontab este urmatoarea:
Nu se recomanda editarea in mod direct (cu editorul preferat precum VI) a fisierului
care este folosit de cron daemon ci folosind crontab. Cron Daemon pastreaza logurile in
/var/log/cron. Comentariile sunt permise dar trebuie sa fie unice pe linie. Se foloseste "#".
Exemplu
* 12 10-16/2 * * backup.sh
identic
cu
* 12 10,12,14,16 * * backup.sh
Optiune:
-e = editare crontab sau creare daca nu exista - foloseste editorul default, cel definit in
variabila globala EDITOR sau VISUAL
-l = listare cron jobs
-r = remove user crontab
-i = interactiv la delete
La editarea crontab-ului se pot folosi intervale continue sau discrete folosit caracterul "-"
(minus) sau "," (virgula)
Exemplu: 1-5 * * 1,2 * script
In afara cronjob-urilor pentru fiecare utilizator care se gasesc in /var/spool/con/,
cron daemon foloseste fisierul de configurare numit /etc/crontab. Structura acestuia este
urmatoarea:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
Dupa declarea variabilelor pe care le va folosi cron, pe fiecare linie se gaseste un
job de rulat. Dupa cele 5 coloane care reprezinta timpii folositi de cron se gaseste user-ul
care va executa programul si comanda de executat. run-parts este un concept original din
Debian care are drept scop executarea tuturor scripturilor dintr-un director. Deci cron
daemon va executa la fiecare ora, zi, saptamana si luna scripturile aflate in directoarele
/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly si /etc/cron.monthly
Limitari: exista programe care nu pot fi rulate de catre cron ( Exemplu: ssh-agent)
acest lucru in special fiindca variabilele de environment nu sunt accesibile lui crond.
Important
La specificarea scripturilor care trebuie sa fie rulate in mod repetat este obligatoriu
sa folosim cai absolute fiindca crond nu are acces la variabilele globale ale sistemului si
exista astfel posibilitatea sa nu functioneze corect. Aceasta eroare este frecventa si greu de
depistat.
7.3 Administrarea pachetelor software
7.3.1 Rpm
RPM reprezinta un acronim recursiv de la RPM Package Manager. Initial s-a numit
Red Hat Package Manager si a fost dezvoltat de firma RedHat.
RPM se refera la 2 aspecte:
1. Un format de fisier binar care reprezinta un program/aplicatie
2. O aplicatie care ruleaza in consola in modul text folosita pentru instalare, dezinstalare,
update si interogare a bazei de date cu toate programele RPM instalate.
RPM foloseste o baza de date care se vaseste in /var/lib/rpm. Este formata din
fisierul Packages care contine informatii de tip metadata despre rpm-urile instalate precum
si alte fisiere folosite cu scop de indexare.
Numele unui packet RPM este de cele mai multe ori conform unui "standard" si
contine urmatoarele informatii:
a) numele programului
b) versiunea programului
c) package release: identifica distributia pentru care a fost compilat (fc6, mdv, rhel4,
suse100 etc)
d) arhitectura pentru care a fost compilat (i386, i686, athlon, noarch). noarch se refera la
pachete care nu sunt compilate pentru o arhitectura anume ( Exemplu: fonturi, sau alte
elemente folosite de alte aplicatii).
Exemplu: apache-1.3.33-6mdk.x86_64.rpm
lyx-1.4.3-3.fc4.i386.rpm
Un fisier rpm este format din urmatoarele componente:
1) Lead (identifica fisierul ca fiind rpm si contine headere absolute)
2) Semnatura digitala
3) Header (meta information - package name, version, file list, arhitecture)
4) arhiva gzip cu binarele programului
Distributiile de Linux care folosesc RPM sunt urmatoarele (lista incompleta):
ο‚· RedHat Enterprise Linux
ο‚· Fedora Core
ο‚· Mandriva
ο‚· CentOS
ο‚· SuSE
ο‚· Yellow Dog (Fedora pentru PowerPC)
ο‚· Turbo Linux
Comanda rpm
rpm OPTIONS package_name
Optiuni:
-i = install
-q =query
-e = erase
-F = freshen (upgrade doar daca o versiune mai veche exista deja)
-U = upgrade (instaleaza pachet daca pachetul nu exista sau upgrade pachet daca exista.
Daca exista versiunea mai veche este stearsa)
-v = verbose
-f file_name = query package owning file
-l = list files in package
--force = forteaza instalarea chiar daca nu sunt satisfacute dependintele
Exemplu
1. Afiseaza toate fisierele documentatie ale pachetului samba
rpm -qd samba
2. Afiseaza numele pachetului din care face parte un fisier din sistem
rpm -qf /usr/bin/clamav
3. Afiseaza toate fisierele care fac parte dintr-un pachet
rpm -ql tightvnc
4. Reinitializeaza baza de date daca aceasta se corupe
rpm --rebuilddb
5. Instalare programe din rpm-uri locale sau direct de pe Internet
rpm -ivh httpd-1.3.3.fc4.rpm
rpm -ivh ftp://rpmfind.net/linux/fedora/core/4/i386/os/Fedora/RPMS/gftp-2.0.18
2.i386.rpm
7.3.2 deb
Un format binar foarte des intalnit si folosit este deb. Acesta isi are originea in
Debian si se foloseste acum pe orice distributie Debian Based (Debian, Ubuntu, Kubuntu,
Knoppix, Damm Small Linux, Mepis, Linex, Xandros etc).
Nota
Numele Debian a fost dat de creatorul acestei distributii Ian Murdock si reprezinta o
combinatie intre numele sotiei sale Debra si numele sau Ian.
Un fisier deb este de fapt o arhiva Unix de tip ar care contine 2 alte arhive gzip sau
bzip. Intr-una se gasesc informatii metadata (versiune, release, dependinte etc) iar in
cealalta binarele efective ale programului care se gasesc in deb.
Programul folosit pentru instalarea, stergerea sau modificarea programelor instalate
din deb-uri se numeste dpkg. De multe ori acesta se foloseste cu ajutorul unui alt program
numit apt. Synaptic este o interfata grafica pentru apt.
apt-get
apt-get este o aplicatie in linie de comanda folosita pentru managementul pachetelor deb
si este considerat user back-end tool pentru apt
Mod folosire:
apt-get [options] [command] [package ...]
Comenzi:
update = se foloseste pentru sincronizarea caracteristicilor pachetelor software instalate in
sistem cum ar fi versiunea acestora cu sursele acestora din repositoarele specificate in
/etc/apt/sources.list . Se recomanda rularea comenzii apt-get update inainte de rularea lui
apt-get folosind optiunea upgrade. Cu ajutorul acestei comenzi apt-get ia la cunostinta
despre ultimele versiuni existente in repozitoare.
upgrade = se foloseste pentru instalarea automata a ultimei versiuni a tuturor pachetelor
instalate in sistem din repositoarele specificate in /etc/apt/sources.list. Pachetele sunt
automat downloadate din repositoare si upgradate la ultima versiune. NU se instaleaza
pachete noi si nu se dezinstaleaza pachete deja instalate.
dist-upgrade = pe langa procesul de upgrade, optiunea dist-upgrade are grija in mod
inteligent si de dependintele pachetelor care se upgradeaza.
install nume-pachet1 nume-pachet2 etc = se foloseste pentru instalarea de noi programe
din repozitoare impreuna cu dependintele necesare.
remove nume-pachet1 nume-pachet2 etc = se foloseste pentru dezinstalarea respectivelor
pachete
check = reprezinta un tool de diagnostic folosit pentru update-ul cache-ului pachetelor
precum si verificare dependintelor cu probleme
clean = sterge pachetele downloadate din repositor (cache-ul pachetelor) si care au fost sau
nu deja instalate.
Optiuni:
-m = ignora pachetele lipsa
-d = doar downloadeza pachetele, dar nu le si instaleaza
-f = repara "broken dependencies"
Exemplu: apt-get -f install bind9
-y = se asuma raspunsul yes la orice intrebare. Folositor pentru upgrade automat.
-h = printeaza help-ul comenzii
-V = printeaza versiunile pachetelor care se instaleaza
Exemplu: apt-get -V install bind9
7.3.3 Aplicatii pentru managementul programelor
Deoarece comanda rpm este in general greoaie si nu rezolva automat dependintele
aparute, exista multe alte aplicatii care au drept scop managementul RPM-urilor. Aceste
programe evoluate downloadeaza programul dorit de pe Internet din repositoare speciale
impreuna cu toate dependintele sale. Folosind astfel de aplicatii managementul programelor
pe Linux este mult mai eficient si usor de realizat decat pe Windows.
Important
Una dintre cele mai frecvente probleme in Linux legate de instalarea de noi
programe este satisfacerea diferitelor dependinte. O dependinta este un alt program sau o
librarie de care depinde programul care se doreste a fi instalat.
Exemplu: Se doreste instalarea Snort (cel mai folosit si cunoscut Intrusion
Detection System pentru Linux). Functionarea Snort depinde de alte librarii si programe
precum: pcre, libpcap, mysql-headers - daca se doreste salvarea alertelor intr-o baza de date
MySql etc. Aceste librarii si programe se numesc dependinte ale lui Snort si nu se gasesc in
arhiva cu sursele snortului pe care o downloadam sau in rpm-ul acestuia. Pentru instalarea
snortului trebuie mai inainte sa instalam toate dependintele sale.
Dintre cele mai importante, cunoscute si folosite programe pentru managementul
programelor din sistem putem enumera:
1. yum
2. YaST (SuSE)
3. up2date (RHEL)
4. apt/synaptic (initial folosit pentru Debian, merge si pe RedHat sau Fedora)
5. Smart Package Manager (Suse, Fedora etc)
6. urpmi (Mandriva)
YUM (Yellow Dog Updater Modified)
Yum reprezinta rescrierea completa a programului initial YUP (Yellor Dog
Updater) si se foloseste pentru managementul sistemelor bazate pe RPM. Yum este o
aplicatie in linie de comanda, dar exista si programe front-end grafice pentru aceasta (pup,
pirut, yumex, yum extender)
Fisierul de configurare al lui YUM este /etc/yum.conf
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
tolerant=1
exactarch=1
retries=20
obsoletes=1
gpgcheck=1
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
YUM foloseste repositoare pentru download-ul si instalarea de programe.
Definitie
Un repositor este un director de pe un server HTTP sau FTP la care yum are acces.
Acel repository contine pachetele software precum si fisiere index.
Yum cauta, downloadeaza si instaleaza automat pachetele dorite (impreuna cu toate
dependintele) de pe repozitoarele pentru care a fost configurat. Fiecare repozitor poate fi
scris in /etc/yum.conf sau in propriul fisier in directorul /etc/yum.repos.d/. Adaugarea de
noi repositoare inseamna instalarea acelui repositor.
Repozitoarele care vin default cu Fedora sau cu o alta distributie nu sunt suficiente
daca dorim o gama larga de programe. Pentru acestea trebuie sa instalam asa numitele
"third party repositories" precum:
ο‚· The DAG repository
ο‚· ATrpms repository
ο‚· RPMforge repository
ο‚· FreshRPMS repository
ο‚· Dries repository
Folosire YUM
1) Pentru a cauta, downloada si instala un packet impreuna cu toate dependintele sale
yum install 'nume_packet'
2) Pentru a updata un pachet
yum update nume_pachet
3) Pentru a verifica daca exista update-uri disponibile
yum ckeck-update
4) Sterge pachetul specificat impreuna cu alte pachete care depind de pachetul specificat
yum [ erase | remove ] nume_pachet
5) Afiseaza informatii despre un pachet
yum info nume_pachet
6) Cauta pachete dupa descriere sau nume. Util atunci cand nu stim numele exact al
Pachetului
yum search cuvant
Exemplu: yum search sniffer
Optiuni:
-y = assume yes at any question
-c config_file = folosirea unui fisier de configurare alternativ in loc de /etc/yum.conf
-d nr = debug level (intre 0 - minim si 10 - maxim).
-R = nr. maxim de minute pe care le asteapta yum pentru a executa o comanda
--exclude nume_pachet = exclude un pachet
Important
Este important ca programele esentiale precum Kernelul, diferite servere de baza
etc sa fie excluse de la instalarea automata. Fiindca intreg sistemul se bazeaza pe
functionalitatea si stabilitatea acestora este bine sa se faca o verificare manuala (ce versiune
se instaleaza, ce aduce nou noua versiune, daca este necesara, daca s-au raportat bug-uri
etc) a acestora inainte de instalare.
Fragment din man page-ul lui yum referitor la cautare si listare:
LIST OPTIONS
The following are the ways which you can invoke yum in list mode.
yum list [all | regexp1] [regexp2] [...]
List all available and installed packages.
yum list available [regexp1] [...]
List all packages in the yum repositories available to be installed.
yum list updates [regexp1] [...]
List all packages with updates available in the yum reposito- ries.
yum list installed [regexp1] [...]
List the packages specified by args. If an argument does not match the name of an
available package, it is assumed to be a shell-style glob and any matches are printed.
yum list extras [regexp1] [...]
List the packages installed on the system that are not available in any yum repository listed
in the config file.
yum list obsoletes [regexp1] [...]
List the packages installed on the system that are obsoleted by packages in any yum
repository listed in the config file
Specifying package names
All the list options mentioned above take file-glob-syntax wild- cards or package names
as arguments, for example yum list avail- able foo* will list all available packages that
match foo*.
CLEAN OPTIONS
The following are the ways which you can invoke yum in clean mode.
yum clean packages
Eliminate any cached packages from the system. Note that pack- ages are not
automatically deleted after they are downloaded.
yum clean headers
Eliminate all of the files which yum uses to determine the remote availability of packages.
Using this option will force yum to download all the headers the next time it is run.
yum clean all
Runs yum clean packages and yum clean headers as above.
Capitolul 8 - TCP/IP & Networking
8.1 TCP/IP
Orice calculator comunica in retea folosind stiva de protocoale TCP/IP. TCP/IP este
"de facto" industry standard.
TCP/IP este o colectie de protocoale cele mai cunoscute si importante fiind TCP
(Transmission Control Protocol) si IP (Internet Protocol) de unde si numele TCP/IP. Pe
langa aceste protocoale exista multe altele fiecare gasindu-se la un anumit layer si avand o
anumita functionalitate. Stiva TCP/IP se instaleaza automat la instalarea sistemului de
operare (Windows sau Linux).
Acesta stiva de protocoale a fost creata de DoD (Department of Defense, USA) la
inceputul anilor '70, avand drept scop crearea unei retele care sa supravietuiasca in orice
conditii, chiar in cazul unui atac nuclear.
Este impartit in 4 layere:
1. Application Layer
La acest layer se gasesc protocoale precum: DNS, HTTP, FTP, TFTP, SMTP,
IMAP, POP3, SSL, SNMP etc. La acest layer se gasesc serviciile oferite de retea cele mai
apropiate de utilizatorul final. Programele existente sunt client sau server care
implementeaza protocoalele enumerate mai sus.
2. Transport Layer
La acest layer se gasesc protocoalele TCP si UDP.
TCP (Transmission Control Protocol) este un protocol complex care garanteaza
ajungerea datelor la destinatie. Inainte de a se initializa transferul datelor are loc un schimb
de mesaje intre sursa si destinatie pentru se se sincroniza. Acest fapt il face sa fie
"Connection-oriented"
UDP (User Datagram Protocol) este mai simplu decat TCP, nu garanteaza sosirea datelor
la destinatie si este "Connection-less"
Layerul Transport este responsabil cu prima impachetare a datelor. Informatia, pe
care o primeste de la nivelul aplicatie este impartita in segmente si ii sunt adaugate headere
(informatie specifica nivelul transport). La acest nivel are loc segmentarea datelor. Printre
altele, headerul contine 2 numere, numite PORTURI. Un port ocupa 16 biti si este intre 0 si
65535.
Cele 2 numere (porturi) se numesc:
a) port sursa (identifica programul care a generat mesajul) - adresa aplicatiei sursa
b) port destinatie (identifica carui program ii este destinat mesajul pe hostul destinatie)
adresa aplicatiei destinatie. Acesta este de obicei un server
Exemplu: daca unul dintre cele 2 porturi este 21, programul este FTP, daca este 25 este
vorba despre un e-mail, daca portul este 80 programul de la nivelul aplicatie este serverul
web.
IANA este responsabila cu alocarea si inregistrarea porturilor.
IANA a definit 3 categorii de porturi:
1. Well Known ports (intre 0 si 1023)
Exemplu: 80 pt http, 110 pentru POP3, 993 pentru IMAPs (IMAP over SSL)
2. Registered Ports (intre 1024 si 49151)
Exemplu: 3036 pentru MySql, 3756 pentru canon
3. Dynamic / Private Ports (intre 49152 si 65535)
Un port se poate afla in urmatoarele 3 stari:
1) Deschis (open). Ne putem conecta (folosind 3-way handshake) la un port deschis, exista
o aplicatie (server) care accepta conexiuni folosind acel port. Se spune ca aplicatia
destinatie (serverul) "asculta" pe acel port.
Exemplu: un server web care ruleaza si care este configurat sa asculte pe portul 80.
2) Inchis (close). Nu exista nicio aplicatie care sa primeasca conexiuni pe acel port.
3) Filtrat (stealth). Portul este deschis, dar un firewall sau o lista de acces blocheaza
conexiunile catre acel port.
Scopurile nivelului transport:
a) segmenteaza informatia conform cu lungimea maxima admisa pe canalul de comunicatie
(segmentation)
b) numeroteaza aceste segmente pentru a-le pune cap-la-cap la destinatie si a forma mesajul
initial
c) trimite confirmari (acknowledgment) celeilalte parti cum ca a primit pachetele. Se
foloseste "positive acknowledgment" - confirmarea se refera la urmatorul segment pe care
asteapta sa-l primeasca.
Exemplu: daca trimite ca acknowledgment nr. 7, inseamna ca asteapta segmentul cu nr. 7,
iar sursa stie ca destinatia le-a primit cu succes pe primele 6
d) identifica segmentele primite gresit (cu erori) si notifica destinatia sa le retransmita
(error recovery)
e) regleaza fluxul datelor (viteza de transmisie) (flow control)
3. Internet Layer
La acest layer se gasesc protocoale precum IP (protocol rutabil sau rutat), ICMP
(protocol de detectare a erorilor si de testare a legaturii), protocoale de rutare (routing
protocols) precum RIP, OSPF, EIGRP, IGRP, BGP, IS-IS
Scopul unui protocol rutabil este de a transporta informatia catre destinatie prin
incapsulare pe calea pe care protocoalele de rutare o gasesc.
Primeste segmenul de la nivelul transport si ii adauga headerele specifice.
Segmentul primit de la Layer Transport se numeste la Layer Internet pachet. La acest nivel
are loc impachetarea datelor.
Scopurile nivelului Internet:
a) rutarea pachetelor folosind cea mai buna cale (drum) pe care pachetele o pot urma catre
destinatie (routing)
b) gasirea celei mai bune cai catre destinatie dintre mai multe cai posibile (best effort
delivery)
c) avertizarea celor implicati in comunicatie print-o serie de mesaje specifice, testarea
liniei de comunicatie etc (protocolul ICMP).
d) impachetarea datelor ( segmentelor primite de la layer4 li se adauga un Header si devin
pachete)
Se folosesc 2 adrese, numite si logice (adrese IP):
a) adresa sursa (identifica calculatorul sursa)
b) adresa destinatie (calculatorul destinatie)
O adresa IP are 32 de biti si se reprezinta prin 4 numere intre 0 si 255 separate prin .
(punct) Exemplu: 10.0.0.1 sau 192.89.43.251
4. Network Access Layer
La acest Layer se gasesc protocoale care definesc tipul de retea: Ethernet, WLAN,
PPP, ADSL, CaTV, FrameRelay, ISDN etc
Acest layer primeste pachetul de la Layer Internet si ii face o noua impachetare (a
3-a) astfel: adauga in fata pachetului un header si la finalul lui un trailer. Pachetul se va
numi la acest layer Frame.
In Frame se vor gasi alte 2 adrese care identifica placa de retea a fiecarui calculator
implicat in comunicatie (adrese fizice sau MAC).
O adresa MAC are lungimea de 48 de biti reprezentati prin 12 cifre hexazecimale.
Exemplu: 00:01:AC:17:AB:C9
Scopurile nivelului Network Access:
a) stabileste topologia retelei (bus, star, extended star, mesh)
b) adresarea fizica a fiecarui calculator folosind adrese MAC
c) identificarea erorilor (nu si corectia sau recuperarea lor)
Nota
Adresele de tip MAC exista doar in cadrul retelei locale de tip Ethernet. Acestea nu se
transmit pe Internet. Daca se folosesc alte tehnologii la Network Access Layer precum
ISDN, PPP, Catv etc adresele MAC nu se folosesc pe linkul respectiv.
Important
Protocoalele de layerele aplicatie, transport si internet sunt independente de
protocoalele de la Network Access. Protocolul DNS, IP sau TCP functioneaza indentic,
fara nicio modificare indiferent daca la layer "Network Access" avem Ethernet, WLAN,
ADSL sau ISDN. De fapt protocoalele superioare nu au cunostinta despre protocoalele de
la Network Access Layer.
Important
Procesul prin care datele (email-ul, pagina web etc) sunt transformate in segmente
la Layer4 apoi in pachete la Layer3 apoi in frame-uri la Layer2 si in biti la Layer1 se
numeste incapsulare si are loc la sursa care a generat mesajul. Procesul invers se numeste
decapsulare si are loc la destinatie. Incapsulare: data->segment->packet->frame->biti
Decapsulare: biti->frame->packet >segment->data
Pentru o buna intelegere a modului in care retelele comunica este necesara o
cunoastere aprofundata a protocoalelor care fac parte din stiva TCP/IP.
Pentru vizualizarea tuturor pachetelor care parasesc interfata (placa de retea)
calculatorului sau a celor care sunt primite de interfata calculatorului se folosesc programe
numite sniffere.
Cele mai cunoscute si folosite sunt: Wireshark si tcpdump. Acestea sunt cele mai
utile programe pentru troubleshooting in retea.
Wireshark functioneaza atat pe Linux cat si pe Windows iar modul in care
pachetele sunt afisate este grafic. Tcpdump ruleaza doar pe Linux in linie de comanda.
8.2 Clasificarea adreselor IP
O adresa IP se mai numeste si adresa logica si apartine L3 OSI.
Se foloseste pentru a identifica logic hosturile conectate la retea. Rutarea pachetelor
(trimiterea acestora de la sursa la destinarie pe calea cea mai buna) se bazeaza in primul
rand pe IP-uri. Fiecare calculator conectat la retea trebuie sa aiba o adresa IP unica pentru
acea retea pentru a putea fi identificat.
In comparatie cu adresa MAC care apartine L2 OSI si care nu se poate
modifica(teoretic), adresele IP sunt setate de catre user. Fiecare placa de retea poate avea
una sau mai multe IP-uri.
O adresa IP este format din 4 bytes (32 de biti in total).
Ecesta poate fi scris in baza zece, trasformand fiecare byte din baza 2 in baza 10 si
separandu-i prin punct.
O adresa IP este format din 2 parti:
1) Network Address (adresa retelei sau adresa firului)
2) Host Address (adresa hostului din retea). Deci biti componenti ai unei adrese IP se
impart in biti de retea si biti de host.
Toate hosturile din aceiasi retea trebuie sa aiba aceiasi Network Address.
Network Mask
Strans legat de IP este notiunea de masca de retea (Network Mask). Scopul acesteia
este de a stabili care biti din IP sunt biti de retea si care sunt de host. Adresa IP nu exista
fara masca, intotdeauna se configureaza doar impreuna.
Exemplu
1. 255.0.0.0 sau /8
Daca transformam aceasta masca in baza 2 observam ca primii 8 biti sunt 1. Rezulta ca
primii 8 biti din adresa IP sunt biti de network, iar ultimii 24 de host.
2. 255.255.255.0 sau /24
Daca transformam aceasta masca in baza 2 observam ca primii 24 biti sunt 1. Rezulta ca
primii 24 biti din IP sunt biti de network, iar ultimii 8 de host.
Important
Un Router realizeaza o operatie de AND LOGIC (si logic) intre IP si masca pentru a afla
Network Address.
Varianta simplificata pentru a separa network address de host address este:
1) se transforma IP-ul si masca in baza 2
2) se aseaza IP si masca una sub celalalta, bit sub bit
3) biti din IP care sunt in dreptul bitilor de "1" (unu) din masca se numesc biti de retea si
formeaza Network Address. Biti din IP care sunt in dreptul bitilor de zero ("0") se numesc
biti de host.
Masca se mai poate scrie si sub forma slash ("/") urmat de nr. bitilor de 1. Network
Prefix este sinonim cu Network Address
Exemplu
255.0.0.0
sau
/8
255.255.0.0 sau /16
255.255.255.0 sau /24
255.255.128.0 sau /17
Clasificarea adreselor IP
1. In functie de primii biti din primul octet exista 5 clase de IP-uri.
bitii primului octet interval primul octet Masca default
clasa A 0xxxxxxx
0-127
255.0.0.0 sau /8
clasa B 10xxxxxx
128-191
255.255.0.0 sau /16
clasa C 110xxxxxx
192-223
255.255.255.0 sau /24
clasa D 1110xxxx
224-239
Nu exista
clasa E 1111xxxx
240-255
Nu exista
Exemplu
10.0.0.1 - IP de clasa A
2.12.255.8 - IP de clasa A
189.189.189.189 - IP de clasa B
213.12.0.1 - IP de clasa C
135.9.9.1 - IP de clasa B
224.0.0.10 - IP de clasa D (clasa de multicast)
249.90.90.1 - IP de clasa E (clasa rezervata)
Nota
1. 127.0.0.1 este rezervata si folosita ca adresa de loopback. Se foloseste de hosturi entru
redirecta traficul pentru ele insele. Cel mai folosit caz concret este atunci cand atat clientul
cat si serverul se afla pe acelasi host. Exemplu: instalam un server Apache si ne conectam
la
acesta
de
pe
acelasi
calculator
folosind
un
Browser
2. Clasa D este o clasa speciala folosita pentru multicast. Nu se configureaza interfete
sau placi de retea cu aceasta adresa.
3. Clasa E este rezervata pentru studii sau cercetari. Nu este foloseste in realitate.
Adrese IP speciale
1. Clasa E (adrese experimentale - rfc 3330) - 240.0.0.0 - 255.255.255.254
2. Clasa D (Multicast) - 224.0.0.0 - 239.255.255.255
3. Link-local address: 169.254.0.0 - 169.254.255.255 si se foloseste de hosturi pentru
setarea automata a unui IP cand nicio alta metoda nu este disponibila (DHCP, BootP, PPP,
static etc). Se pot folosi doar in reteau locala, iar TTL este 1.
4. TEST-NET Address: 192.0.2.0 - 192.0.2.255 - teaching and learning purpose. Pot fi
folosite in documentatii si exemple. Device-urile le accepta in configuratie. Se gasesc in
multe ori in RFC pt. IP ale domeniilor example.com, example.net sau in
documentatii ale producatorilor
5. Loopback: 127.0.0.1
2. In functie de destinatia pachetelor, adresele IP pot fi:
a) Unicast Identifica un sigur host intr-o retea.
b) Multicast Identifica un grup de hosturi dintr-o retea. Un calculator sursa poate
comunica simultan cu un grup de calculatoare folosind adresa IP destinatie de tip multicast.
c) Broadcast Indentifica toate hosturile dintr-o retea.
Exista 2 categorii de Broadcast Address:
a. Directed Broadcast Address
Se calculeaza punand toti bitii din portiunea de host address pe "1"
Exemplu
1. Pentru IP-ul 192.168.0.1/24.
Masca este /24 sau 255.255.255.0 adica din cei 32 de biti ai mastii primii 24 sunt 1 iar
restul 0. Rezulta ca Network Address este reprezentata de primii 24 de biti din IP (atitia
cati biti de 1 sunt in componenta mastii). Restul bitilor se pun pe valoarea 0. Network
Address = 192.168.0.0
Daca primii 24 biti din IP identifica Network Address, restul bitilor pana la 32 (8 biti)
identifica bitii de host. Pentru a afla broadcast address se scrie adresa de retea
(192.168.0.0) si se pun toti bitii din Host Address pe 1. Rezulta Broadcast Address=
192.168.0.255
2. Pentru IP-ul 10.0.0.0/8 broadcast address este 10.255.255.255.0
3. Pentru IP-ul 190.190.0.17/26 broadcast address este 190.190.255.255.
4. Pentru IP-ul 210.210.210.67/27 broadcast address este 210.210.210.95
b. Limited Broadcast Address. Este invariabil 255.255.255.255
3. In functie de modul de procurare si utilizare exista IP-uri
a) Publice
- se cumpara sau se inchiriaza de la un LIR (Local Internet Registry) sau de la un ISP
Local.
- sunt publice, oricine poate afla informatiile despre proprietarul unui IP (adresa, nume,
email de contact etc).
- indentifica in mod unic un host pe Internet. Fiecare calculator conectat DIRECT la
Internet trebuie sa aiba o adresa publica.
b) Private
- nu se cumpara, nu se inchiriaza, nu se platesc
- sunt folosite doar in cadrul unui LAN
- pachetele de date nu au voie sa contina pe Internet IP sursa sau destinatie de tip privat
(vor fi blocate la primul Router)
- un Router trebuie sa fie configurat pentru NAT (Network Address Translation) astfel
incat un LAN care foloseste IP-uri private sa poate comunica pe Internet - IETF (Internet
Engineering Task Force) a definit clasele de IP-uri private in RFC1918.
Acestea sunt:
a) de clasa A -> 10.0.0.0 - 10.255.255.255
b) de clasa B -> 172.16.0.0 - 172.31.255.255
c) de clasa C -> 192.168.0.0 - 192.168.255.255
4. In functie de modul de alocare IP-urile pot fi:
a) Statice sunt configurate pentru fiecare interfata de catre administrator sau user
b) Dinamice sunt configurate prin intermediul unor programe speciale fara interventia
user-ului. Exemplu: DHCP, BootP sau PPP pentru DialUp
Important
Cunoasterea in profunzime a protocoalelor din stiva TCP/IP precum si modul
acestora de functionare reprezinta un aspect extrem de importat pentru o cariera perfomanta
in domeniul Networking.
8.3 Configurare retea
Configurarea statica a interfetelor de retea
Pentru a comunica intr-o retea TCP/IP un host trebuie sa fie configurat cu:
1) IP (obligatoriu)
2) Network Mask (obligatoriu) - se configureaza impreuna cu IP
Exista 2 posibilitati de a configura IP-ul si masca:
a) Editand fisierul in care se salveaza configuratia placii de retea.
Acesta poate sa difere de la distributie la distributie. In RedHat, Fedora core si
SUSE acesta este /etc/sysconfig/network-scripts/ifcfg-ethNr, unde Nr reprezinta numele
interfetei de retea Ethernet.
Exemplu: fisierul ifcfg-eth0 sau ifcfg-eth1. In acest caz modificarea configuratiei se
salveaza la reboot.
#confinutul fisierului ifcfg-eth0 pentru interfata eth0
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.0.255
HWADDR=00:06:4F:00:6E:F4
IPADDR=192.168.0.13
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
TYPE=Ethernet
In Ubuntu exista un singur fisier pentru toate interfetele si anume /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth1 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
auto eth1
b) Folosind comanda ifconfig. Modificarea configuratiei nu se salveaza la reboot, iar
sintaxa acesteia este identica pe orice distributie de Linux.
Exemplu
1. Afiseaza configuratia interfetelor active
ifconfig
2. Afiseaza configuratia tuturor interfetelor instalate si recunoscute de sistem
ifconfig -a
3. pornesete/opreste o interfata (enable/disable)
ifconfig eth0 down | up
4. Configureaza IP si Masca pentru o interfata
ifconfig eth0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255
5. Schimba adresa MAC interfata
ifconfig eth0 hw ether 31:32:33:34:35:36
6. Modificare MTU
ifconfig eth0 mtu 1412
7. Crearea subinterfata si setare IP si Masca
ifconfig eth0:0 10.0.0.0 netmask 255.0.0.0 broadcast 10.255.255.255
3) Default Gateway (optional)
Se poate configura de asemenea in 2 moduri:
a) Editand fisierul in care se gaseste. Pe RedHat Family acesta este
/etc/sysconfig/network
echo "GATEWAY=192.168.0.1" >> /etc/sysconfig/network
In Ubuntu se gaseste in acelasi fisier cu IP-ul si Masca ( /etc/network/interfaces)
b) Folosind comanda route
route add default gw 192.168.0.1
Comanda route fara optini listeaza tabela de rutare a hostului.
4) Servere DNS (optional)
Se configureaza in /etc/resolv.conf pentru ORICE distributie de Linux
Continut /etc/resolv.conf:
nameserver 193.231.236.3
nameserver 193.231.236.25
Pentru a crea o mapare statica IP/NUME se editeaza fisierul /etc/hosts
Continut /etc/hosts
192.168.0.1 gateway
192.168.0.18 server
82.34.1.9 home
Fisiereul /etc/host.conf determina ordinea de translatare a domeniului in IP (default:
/etc/hosts si apoi query catre serverele DNS). Dupa fiecare modificare a parametrilor
interfetelor de retea, serviciul retea trebuie restartat: /etc/init.d/networking restart.
8.4 Managementul serviciilor si Procesul de Butare
Linux Boot Process
O sarcina importanta a oricarui administrator de sistem este de a stabili ce servicii
pornesc automat la butare, ce servicii trebuie oprite etc.
Etapele butarii unei calculator care ruleaza Linux sunt urmatoarele:
1) BIOS executa POST (Power on Self Test) si conform cu configuratia sa (de unde este
configurat sa buteze: Hard Disk, CD-ROM, DVD-ROM etc) citeste MBR-ul care
reprezinta primul sector al hard diskului (primii 512 bytes).
2) In MBR (Master Boot Record - primul sector al Hard diskului) se gaseste un boot loader
(GRUB sau LILO) care incarca in memorie de pe disk, kernelul si initrd inainte sa monteze
root file system. Functionalitatea interna a lui GRUB permite sa citeasca de pe disk
kernelul si initrd si sa le incarce in memorie intainte sa monteze partitia pe care acestea se
gasesc. Kernelul se decomprima si foloseste modulele din initrd (monteaza initrd) pentru a
buta de pe disk. Daca nu exista initrd funtionalitatea pt. a buta de pe disk trebuie sa fie
compilata in kernel.
Nota
initrd reprezinta un RAMDISK
Fizic acesta este un fisier. Exemplu: /boot/initrd.img-2.6.22-14-server
initrd contine module necesare kernelului in prima faza a procesului de butare inainte sa
monteze root file system.
Exemplu: initrd ar putea contine un modul care reprezinta driver pentru SATA si care nu a
fost compilat in kernel. Kernelul are nevoie de acest driver pentru a putea monta hard
diskul.
3) Primul program pe care kernelul il executa de pe disk este init (parintele tuturor
proceselor).
Fisierul de configurare al lui init este /etc/inittab. Acesta controleaza modul in care init
initializeaza sistemul.
Important
Fisierul /etc/inittab stabileste runlevelul in care sistemul buteaza:
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 – unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
# id: 5:initdefault:
4) Ubuntu/Debian: /etc/rc.d/rcS se executa precum si toate scripturile din directorul
/etc/rcS.d/
Fedora/RedHat/SuSe: /etc/rc.sysinit se executa
5) In functie de runlevelul in care intra sistemul se executa /etc/rc*.d/*
* (asterix) reprezinta runlevelul in care intra sistemul. Poate fi 0,1,2,3,4,5 sau 6.
Exemplu:
Daca se intra in runlevel 3 se executa scripturile din /etc/rc3.d/
Daca se intra in runlevelul 5 se executa scripturile din /etc/rc5.d/
Pentru fiecare serviciu exista in /etc/rc[0-6].d/ un fisier de forma SnrNumeServiciu si
KnrNumeserviciu.
Exemplu: S10network si K10network.
Fisierele care incep cu litera S se executa la intrarea in runlevelul respectiv iar cele care
incep cu litera K se executa la iesirea din runlevelul respectiv.
Ordinea de executie a fiecarui serviciu este importanta si se stabiliteste in functie de
numarul care urmeaza dupa litera S sau K.
Fisierele din /etc/rc[0-6].d/ sunt de fapt symlinkuri catre fisierele din /etc/init.d/ - directorul
global cu startup files. Fiecare fisier din /etc/init.d/ trebuie sa poata primi ca parametru
start|stop|reload|restart.
Exemplu: executia fisierului /etc/rc3.d/S10network este echivalenta cu executia scriptului
/etc/init.d/network start.
Nota
rc = Runlevel Script / resource control
Managementul serviciilor
Pentru a stabili ce servicii pornesc la butare avem mai multe optiuni:
1) Varianta 1
a) se creaza un script in /etc/init.d/ care sa porneasca serviciul atunci cand primeste
parametrul start si sa-l opreasca atunci cand primeste parametrul stop.
b) se creaza 2 sym linkuri in /etc/rc[0-6].d/ catre /etc/init.d/nume_script. Un symlin trebuie
sa fie de forma SnrNume iar celalalt KnrNume.
* (asterix) reprezinta runlevelul in care intra sistemul.
2) Varianta 2
a) Fedora/Redhat
Se foloseste comanda chkconfig pentru a stabili ce servicii vor porni la butare.
chkconfig - se foloseste pentru crearea/stergerea automata a symlinkurilor din
/etc/rc[06].d/
--lists = listeaza toate serviciile precum si modul in care sunt configurate sa porneasca in
fiecare runlevel.
--add service_name = adauga un serviciu pentru a fi administrat cu chkconfig.
--del service_name = sterge un serviciu
--level = stabileste runlevelul pentru care se configureaza serviciul.
Exemplu
chkconfig --list sendmail
chkconfig –list
chkconfig --add sendmail
chkconfig --del sendmail
chkconfig --level 35 sendmail on
b) Ubuntu
Se foloseste comanda update-rc.d
Exemplu
1. Pornire serviciu ssh in mod default (cuvantul cheie default porneste serviciul in runlevel
2,3,4 si 5 si-l opreste in 0,1 si 6)
update-rc.d script_name defaults
2. Remove the symlink from /etc/rc[0-6]d/. Serviciul nu va mai porni in runlevelul
specificat.
update-rc.d ssh remove
3. Stabilire runlevel explicit in care se porneste/opreste serviciul
update-rc.d ssh start 0123 stop 456
Oprire/Pornire de servicii:
Pentru a opri/porni un serviciu exista in principiu 2 modalitati.
1. Folosind startup scripts si pasand argumentul start, stop sau restart.
Exemplu:
/etc/init.d/sendmail start
/etc/init.d/sshd restart
2. Folosind comanda service
Exemplu:
service sendmail start
service httpd stop
service sshd restart
Comanda service ruleaza scriptul pe care il primeste ca parametru ( Exemplu: sendmail)
cu optiunile aferente (start, stop etc). Scriptul trebuie sa se gaseasca in /etc/init.d/
Nota
/sbin/service este un script de shell
Daca nu dorim sa cream cate un script pentru fiecare serviciu putem adauga
comenzi in fisierul /etc/rc.local care este executat dupa terminarea tuturor celorlalte
scripturi de initialiazare. Trebuie sa existe un symlink catre el in /etc/rc[0-6].d/
Linux Server Administration
Capitolul 1 – Shell Scripts
1.1 Introducere Bash
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernelului spre executie.
Exista mai multe shelluri (Bourne, Korn, C Shell etc), dar default pe Linux este shellul
numit Bash (Bourne Again Shell). Fizic Bash-ul este reprezentat de fisierul /bin/bash
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat
propriu.
Un script de shell este un fisier text (ASCII) care contine comenzi de shell
organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale
sau globale), parametri pozitionali precum si structuri de programare specifice
(if..then..else, while, do, until, for, case, selsect etc).
Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru
a oferi o noua functionalitate sau a automatiza task-uri.
Etapele crearii unui script sunt:
a) crearea unui fisier text folosind editorul preferat ( Exemplu: vim)
b) editarea fisierului pentru a contine functionalitatea dorita
c) testarea scriptului adica executia/rularea acestuia
Moduri de executie a unui script numit script1:
1. Din directorul care contine scriptul se ruleaza : ./script1
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu
calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al
shellului curent in care se executa comenzile din script.
2. Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca
variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si
in prima varianta.
Nota
Varianta cea mai folosita de executie a unui script este prima: ./script
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa
(Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil:
#!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima
linie.
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.
Exemplu: echo "Linux"
Exemplu
1. Script care afiseaza mesajul: Acesta este primul exemplu !
#!/bin/bash echo "Acesta este primul exemplu !"
2. Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele
si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare
partitie de pe Hard Disk.
#!/bin/bash ls -l /etc > continut_etc.txt echo "Fisierul continut_etc.txt a fost creat in
directorul curent!" echo "Informatii partitii:" df -h
Important
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice
Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in
programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se
incepe cu exercitii simple si anume scripturi formate din cateva randuri.
1.2 Variabile, constante si functii
Prezentare generala:
1. O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare.
Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.
2. Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip.
Ele sunt string-uri, dar in functie de context pot fi evaluate ca intreg, double etc.
3. O variabila se declara: NUME_VAR=valoare
Important
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.
Exemplu:
NUME="dan"
varsta=20
4. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata
numelui variabilei.
Exemplu: echo $varsta
5. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar
cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent.
Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi
accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt
accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie
face varianta 2 de executie a unui script adica folosind source nume_script
6. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie
export
Exemplu: export VARSTA=20
variabilele globale se numesc de environment;
pentru a vizualiza variabilele locale se foloseste comanda set;
pentru a vizualiza variabilele globale se foloseste comanda env;
pentru sterge o variabila se foloseste comanda unset NUME_VAR;
Exemplu de varibile globale predefinite:
PATH -> contine o lista de directoare in care shell-ul cauta comanda care se executa.
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).
Exemplu
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export
PATH=PATH:/home/stud/scripts
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne
am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in
director se executa: ./nume_comanda
HOSTNAME -> contine hostname-ul calculatorului
SHELL -> contine shell-ul default
HISTSIZE - contine nr. de comenzi care vor fi memorate in history
USER -> contine EUID
PWD -> contine directorul curent
OLDPWD -> contine directorul precedent si se foloseste de comanda: cd –
HOME -> contine home directory al EUID
RANDOM -> variabila al carei continut este pseudoaleator
TMOUT -> nr in secunde dupa care se face logout automat daca nu se executa nicio
comanda
7. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele
simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare
caracter special cu exceptia ' (ghilimea simpla) este interpretat literal.
Exemplu
varsta=20 echo "$varsta" ##se afiseaza 20 echo '$varsta' ##se afiseaza $varsta
8. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai
numeste si constanta.
Exemplu
1. var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.
declare -r var1=7
2. Pentru a declara un array/vector:
ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo
${ARRAY[]} unset ARRAY[1] unset ARRAY
ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.
9. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read
Exemplu:
#!/bin/bash echo "Introdu nume fisier:" read FILE echo "Fisierul introdus este $FILE"
10. In bash exista caractere speciale care sunt interpretate in mod deosebit.
Exemple: $ (dollar), "(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al
caracterului, acesta se precede cu \ (backslash).
Exemplu: echo \$var -> Afiseaza $var. $ nu mai este caracter special.
1.3 Parametri pozitionali
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea
standard.
Acestia sunt:
1. $0 - contine numele scriptului
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un
simlink catre /bin/grep dar are totusi functionalitate diferita).
2. $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc.
Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau
cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).
3. $? - reprezinta statusul ultimei comenzi executate.
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru
eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru
a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de
statusul comenzilor anterioare.
4. $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de
argumente cu care a fost rulat scriptul.
5. $* - reprezinta toate argumentele date scriptului.
6. $$ - reprezinta PID shell.
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta
PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa
comenzile
7. $! - reprezinta PID ultimului proces executat in background.
Exemplu
1. Script care sterge fisierul sau directorul pe care-l primeste ca argument
#!/bin/bash rm -rf $1
2. Afisarea numelui scriptului
#!/bin/bash Echo "Numele scriptului executat este: $0"
1.4 Alte facilitati Bash
1.4.1 Alias
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind
un alt nume.
Pentru a crea un alias se foloseste comanda: alias comanda_noua='comanda_substituita'
Exemplu
1. alias copy='cp'
2. alias search='grep'
3. alias ls='ls -F'
4. alias rm='rm -i'
5. alias ll='ls -l'
6. alias stop='kill -9'
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste
comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului
se foloseste \ (backslash) urmat de comanda.
Example: \ls
Pentru a sterge un alias se foloseste comanda unalias
Example: unalias ls
Nota
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului
curent).
1.4.2 Customizare Environment
Prompting variables (prompt strings)
Bash foloseste 4 variabile speciale numite "prompt strings": PS1, PS2, PS3 si PS4.
1. PS1 este numit "primary prompt string" si reprezinta prompterul curent.
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre
sesiunea curenta.
PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:
\A - current time in HH:MM hours format
\d - current date
\@ - the current time in 12 hours format
\H - the hostname
\h - the hostname up to the first dot (.)
\s - the name of the shell
\u - username of the EUID
\w - the current working directory
\W - the current working directory (basename) - relativ
\$ - if EUID==0 print # else print $
Nota
Un exemplu excelent de modificare PS1 este: export PS1='[\u@\h \w]$'
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a
conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia
de mai sus se adauga in fisierul de customizare ~/.bashrc
2. PS2 este numit "secondary prompt string" si are valoarea default > (mai mare).
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.
Exemplu: echo "dfasfdas
3. PS3 se numeste "prompt string for the select command" si se foloseste in scripting
impreuna cu comanda select
4. PS4 se numeste "prompt string for the xtrace option" si reprezinta un prompt string
folosit in debugging si flow control.
Environment
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de
lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare
pornire a acestuia:
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,
alias-uri etc pentru fiecare user.
~/.bash_profile - este citit dupa ~/.bashrc
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile,
sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.
Fisierul /etc/profile este un alt fisier de customizare "system-wide". Acesta nu
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de
exemplu daca dorim setarea unui alias pentru toti userii din sistem.
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile
au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a
sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau .
(dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.
Exemplu: source ~/.bashrc sau . ~/.bashrc
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista
cauta ~/.profile.
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc
pentru fiecare utilizator
Nota
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~)
si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu
optiunea -a Exemplu: ls -la ~
Nota
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a
mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a
distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista
~/.bashrc. In acest caz se recomanda folosirea doar a acestuia
Exemplu ~/.bashrc:
# User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias
cauta=find alias muta=mv alias S='ssh -l root -p 7890 ssh.crystalmind.ro' # Source global
definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi export PS1='[\u@\h \w]$' export
PATH=:/home/dan/scripts umask=0022
1.5 Flow Control
1.5.1 Conditii de testare
Nota
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de
control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara
conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc
Structurile de control (if..then..else, while etc) presupun conditii de testare.
Acestea sunt:
1. Pentru fisiere
-e = fisierul exista
-f = fisierul exista si este de tipul regular file
Exemplu: -f $FILE
-s = fisierul nu are dimensiunea zero
-d = fisierul exista si este de tip director
-c = fisierul exista si este de tip char device
-b = fisierul exista si este de tip block device
-r = fisierul exista si are permisiunea read
-w = fisierul exista si are permisiunea write
-x = fisierul exista si are permisiunea execute
-g = fisierul are GUID setat
-u = fisierul are SUID setat
-k = fisierul are sticky bit setat
-nt = fisierul este mai nou decat un alt fisier
Exemplu: file1 -nt file = file1 is newer than file2
! -> inverseaza sensul (neaga)
2. Pentru comparatie
-eq = equal to
-ne = not equal to
-gt = greater than
Exemplu: $i -gt -$j
-ge = greater than or equal
-lt = less than
-le = less than or egal
3. Pentru stringuri (siruri de caractere)
-z = lungimea sirului este zero
-n = lungimea sirului este non-zero
= egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur
egal)
!= diferit
Exemplu: $str1 != $str2
-a = SI LOGIC (AND)
-o = SAU LOGIC (OR)
Exemplu
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei
USER este root si valoarea variabilei SHELL este bash)
$USER = "root" -a $SHELL = "bash"
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu
un spatiu inainte de = (egal) si un spatiu dupa = (egal).
Exemplu: $USER="root" este gresit, $USER = "root" este corect.
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai
mare ca 100)
$i -lt 10 -o $i gt 100
Nota
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa
executati: man test
test EXPR sau [ EXPR ] au acelasi rezultat.
1.5.2 If..then..else
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie
executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau
sunt referitoare la stringuri.
Sintaxa pentru if este:
if [ conditie_de_test ] then lista_de_instructiuni fi
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se
executa.
Exemplu
1. Daca primul argument al scriptului este fisier se executa: cat fisier
if [ -f $1 ] then cat $1 fi
2. Daca valoarea variabilei i este 10 se afiseaza mesajul "Variabila i are valoarea 10"
if [ $i -eq 10 ] then echo "Variabila i are valoarea 10" fi
Sintaxa pentru if..else este:
if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa
lista_de_instructiuni_default
Exemplu
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza
mesajul "Esti minor!", altfel se afiseaza mesajul "Esti major!"
#!/bin/bash echo "Introdu varsta:" read VARSTA if [ $VARSTA -lt 18 ] then echo "Esti
minor!" else echo "Esti major!" fi
Sintaxa pentru if..elif..else este:
if [ conditie_de_test1 ] then lista_de_instructiuni1 elif [ conditie_de_test2 ] then
lista_de_instructiuni2 elif [ conditie_de_test3 ] then lista_de_instructiuni3 else
lista_de_instructiuni_default fi
Exemplu
Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul "Buna
dimineata" daca este intre 12 si 18 se afiseaza mesajul "Buna ziua", daca este intre 18 si 24
se afiseaza "Noapte Buna!". Pentru orice alta situatie se afiseaza mesajul "Eroare!".
#!/bin/bash read i if [ $i -lt 12 ] then echo "Buna dimineata!" elif [ $i -ge 12 -a $i -lt 18 ]
then echo "Buna ziua!" elif [ $i -ge 18 -a $i -le 24 ] then echo "Noapte buna !" else echo
"Eroare!" fi
-a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate
simultan.
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este
adevarata.
Exemplu
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si
exista SI are permisiunea de read). Ambele conditii sunt adevarate simultan.
if [ -e $1 -a -r ]
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este
director. Una dintre conditii este adevarata.
if [ -f $1 -o -d $1 ]
1.5.3 For
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.
Sintaxa pentru for este:
for VAR in lista_de_valori do instructiuni done
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare
iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista
este default spatiu sau valoarea variabilei globale IFS.
Exemplu
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din
cele 3 IP-uri.
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt
separate prin spatiu.
#!/bin/bash for IP in 192.168.0.1 192.168.0.2 192.168.0.3 do ping -c 1 $IP done
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.
#!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand IFS=: for
DIR in $PATH do echo $DIR done
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.
Exemplu for ca in C/C++:
LIMIT=10 for((a=0;a<=$LIMIT;a++)) do echo $a done
1.5.4 While
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele
dintre do si done) atata timp cat conditia de test este adevarata.
while [ conditie_de_test ] do lista_de_instructiuni done
Exemplu while:
#!/bin/bash
#script care afiseaza numerele intre 0 zi 100
LIMIT=100
i=0
while [ $i –le $LIMIT ]
do
echo "i=$i"
let i=i+1
done
1.5.5 Case
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de
diferite conditii de testare.
Sintaxa pentru case este:
case VARIABILA in
valoare1)
instructiuni1
;;
valoare2)
instructiuni
;;
*)
instructiuni_default
;;
esac
* -> reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre
valorile de mai sus.
Exemplu
#!/bin/bash echo "Introdu nr:" read nr case $nr in 1) echo "nr este 1" ;; 2) echo "nr este
2" ;; *) echo "nr are alta valoare" ;; esac
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else
Exemplu de mai sus folosind if..elif..else este:
#!/bin/bash
echo "Introdu nr:"
read nr
if [ $nr -eq 1 ]
then echo "nr este 1"
elif [ $nr -eq 2 ]
then
echo "nr este 2"
else
echo "nr este altceva" fi
Important
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.
Structura unui script de initializare din /etc/init.d este:
case $1 in
start) instructiuni de pornire serviciu
;;
stop) instuctiuni de oprire serviciu
;;
restart) instructiuni de restartare serviciu
;;
*) afisare help script
esac
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network
este scriptul de initializare iar restart primul parametru pe care-l primeste.
Exemplu
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu
/opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart.
Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.
Etape:
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta
se numeste init_apache
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache.
Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.
La intrarea in runlevell 3 se va rula automat acest script cu parametrul start.
Structura scriptului /etc/init.d/init_apache este:
#!/bin/bash
case $1 in
start)
echo "Starting Apache..." /opt/apache/bin/apachectl start echo "OK"
;;
stop) echo "Shutting down Apache..." /opt/apache/bin/apachectl stop echo "OK"
;;
restart) $0 stop $0 start
;;
*) echo "init_apache <start|stop|restart>"
esac
Nota
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul
"Managementul Serviciilor" din cursul "Linux Basic Administration" disponibil de
asemenea online.
1.5.6 Select
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de
meniuri.
Sintaxa acesteia este:
select MENUITEM in menu_list
do
lista_de_comenzi
done
Detalii:
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la
consola);
- PS3 contine prompterul de selectare a meniurilor;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2
pentru al doilea etc;
Exemplu:
#!/bin/bash
PS3="Alege:"
select ITEM in "Afiseaza continut /etc" "Afiseaza spatiu liber" "Exit"
do
case $REPLY in
1) ls -l /etc
;;
2) df -h
;;
3) exit 0
;;
*) echo "Optiune incorecta"
esac
done
1.6 Substituirea comenzilor
Unei variabile i se poate asigna o valoare in 2 moduri:
1. Folosind NUME_VAR=valoare
Exemplu: EDITOR="VIM"
2. Substituind o comanda cu outputul ei
Exemplu:
VAR=`ls /etc` -> in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul
ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.
Nota
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai
puternice ale Bashului, iar majoritatea scripturilor folosesc acest mod de lucru.
Pentru a substitui o comanda cu outputul ei exista 2 variante:
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau
ghilimele simple.
Exemplu: ME= `whoiam ` -> variabila ME va contine outputul comenzii whoami
2. Comanda se incadreza intre $( si )
Exemplu: ETH0= $(ifconfig eth0) -> variabila numita ETH0 va contine outputul comenzii
ifconfig eth0
Exemplu script ce nu poate fi rulat de catre root
#!/bin/bash
if [ "$(whoami)" = "root" ]
then
echo "Esti root, sorry !"
exit 1;
fi
#incep instructiunile ce nu pot fi rulate de catre root"
ls -la ~
Nota
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este
bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.
Exemplu:
VAR="`ifconfig eth0`" if [ -z "$VAR" ] then echo "Interfata eth0 nu exista!" fi
rights reserved
Capitolul 2 - Compilare Kernel
2.1 Introducere, necesitate compilare
Kernelul sistemului de operare Linux reprezinta componenta cea mai importanta a
acestuia. Toata functionalitatea sistemului este realizata de kernel.
Dintre cele mai importante functii ale kernelului Linux amintim:
- alocarea resurselor diferitelor procese (o parte din RAM, o parte din CPU etc);
- contine drivere pentru toate dispozitivele hardware de la placa de baza, placa video, placa
de sunet, placa de retea, monitor, tastatura etc;
- lucrul cu sistemele de fisiere;
- orice operatie de creare, stergere, citire, modificare fisier sau director este realizata de o
functie din Kernel;
- firewall & routing;
- QoS;
Orice administrator de sistem s-a lovit macar o data de necesitatea upgrade-arii
kernelului.
Un upgrade de kernel se poate face in 2 moduri:
1. Folosind o versiune de kernel direct compilata pentru o anumita distributie si arhitectura.
In acest caz noul kernel se instaleaza dintr-un fisier RPM sau DEB.
Aceasta metoda are numeroase dezavantaje printre care cele mai importante sunt:
- kernelul este compilat pentru o arhitectura generica. Acesta nu este optimizat special
pentru tipul nostru de procesor, placa de baza etc. Astfel performantele vor fi mai scazute;
- facilitatile oferite sunt generice si anume acesta include facilitati necesare majoritatii
utilizatorilor;
Exemplu: poate include suport pentru RAID, iar serverul nostru nu foloseste RAID, nu va
include suport pentru un firewall la nivel de aplicatie, iar necesitatile serverului nostru
presupun folosirea unui astfel de firewall, nu va include driver pentru o anumita placa de
retea wireless pe care o folosim daca aceasta este putin mai "deosebita" etc;
- kernelul cuprinde multe optiuni nefolositoare in cazul nostru particular;
Exemplu: va cuprinde drivere pentru majoritatea placilor de baza, a placilor de retea,
diferite aplicatii pe care nu le folosim niciodata etc;
- dupa aparitia unei noi versiuni de kernel dureaza o perioada de timp pana cand apare
forma sa compilata ca RPM sau DEB. In acest fel exista un "vulnerability window" in care
nu suntem protejati impotriva ultimelor vulnerabilitati sau pur si simplu kernelul nostru nu
acopera diferite buguri;
2. Compiland direct sursele kernelului
Aceasta este metoda preferata in cele mai multe cazuri. Dorim sa compilam un nou kernel
in urmatoarele conditii:
a) vrem sa includem drivere pentru hardware nou aparut sau pentru hardwareul ale carui
drivere nu sunt incluse in versiunea standard de kernel care vine cu distributia;
b) includerea de optiuni pentru diferite aplicatii sau servicii (QoS - HTB, firewall la nivel
de aplicatie, criptografie, LVM, RAID etc);
c) vrem sa acoperim diferite bug-uri sau probleme de securitate. In medie apare o noua
versiune de kernel la circa 2 saptamani. Aceasta acopera bug-urile din versiunea trecuta
descoperite intre timp;
d) dorim un "fine tuning" al kernelului exact pentru configuratia hardware a serverului
nostru (tipul nostru de procesor in special);
Nota
Indiferent de distributia de Linux folosita, kernelul este acelasi. Acesta este marca
inregistrata a lui Linus Torvalds, iar dezvoltarea sa este supravegheata si avizata de
acesta.
2.2 Structura Kernel Linux
Numele kernelul de linux are forma: linux-major.minor.patchlevel.extra_version
Exemplu: linux-2.6.25.12 lansat in Iulie 2008
Important
Versiunile minore pare sunt stabile, iar cele impare sunt pentru teste (development).
Pe un server in productie se instaleaza doar versiuni stabile de preferat ultima versiune.
Versiunile de test se folosesc doar pentru developerii de kernel sau testeri.
Un kernel se poate gasi in 2 forme:
1. Modular
Un kernel modular se caracterizeaza prin faptul ca intreaga sa functionalitate nu
este inclusa in acesta ci in alte fisiere numite module si care se pot incarca/descarca in/din
kernel in timp ce acesta este incarcat in RAM si ruleaza.
Exemplu: Kernelul nu include suport pentru ipv6 sau pentru ntfs. Suportul pentru ipv6 sau
ntfs se gaseste in fisiere separate numite module. Acestea se pot incarca in kernel in
momentul in care avem nevoie de respectiva functionalitate respectiv dorim sa folosim
ipv6 sau sau sa montam o partitie ntfs.
2. Nemodular
Un kernel nemodular se caracterizeaza prin faptul ca intreaga sa functionalitate este
inclusa in acesta. Nu se pot incarca/descarca module din kernelul care ruleaza.
Important
Kernelul de linux este reprezentat fizic printr-un SINGUR fisier care se gaseste de
obicei in directorul /boot sub numele /boot/vmlinuz-versiune
Acesta reprezinta imaginea compilata si compresata a kernelului care se incarca in RAM la
butare si doar la butare.
Exemplu: /boot/vmlinux-2.6.25.12
Fiecare optiune pe care kernelul o ofera poate fi compilata ca parte integranta a
kernelului sau ca modul.
LKM (Loadable Kernel Modules) sunt fisiere binare care contin cod folosit pentru a
extinde functionalitatea kernelului care ruleaza (the base kernel). Acestea se compileaza
odata cu kernelul.
Comenzi folosite pentru listare/incarcare/descarcare module din kernel:
lsmod - listeaza modulele incarcate in memorie
Pentru a incarca/descarca module in/din kernel se foloseste comanda modprobe (fisierul de
configurare este /etc/modprobe.conf)
modprobe nume_modul - incarca un modul
-l = listeaza toate modulele disponibile (nu neaparat incarcate in kernel)
-r module_name = descarca un modul din kernel
Exemplu: modprobe ip6_tunnel
Modulele se gasesc fizic pe hard disk in /lib/modules intr-un director cu numele
kernelului si intr-o categorie anume.
Nota
Kernelul de Linux precum si marea majoritate a serverelor si programelor sunt scrise in
limbajul de programare C
2.3 Ghid compilare kernel
De cele mai multe ori compilarea kernelului se realizeaza cu ajutorul unui ghid de
compilare. Exista mai multe astfel de ghiduri si anume pasi care trebuie urmati pentru
compilarea kernelului. Toate acestea au in comun aceiasi pasi importanti.
Ghidul de compilare prezentat mai jos a fost testat cu succes pe majoritatea
distributiilor de Linux. In exemplul nostru compilarea s-a realizat pentru o distributie
FEDORA. Puteti urma aceiasi pasi identici sau doar cu mici modificari pentru orice alta
distributie.
Etape compilare kernel
Etapa 1
Download ultima versiune de kernel de la www.kernel.org, decomprimarea si
dezarhivarea sa intr-un director la alegere. Dupa decomprimarea arhivei ne mutam in
directorul nou creat.
Important
Toate operatiile si comenziile care vor urma se vor executa din directorul care
contine sursele kernelului. Pana la ultima etapa si anume restartarea calculatorului
ramanem in acest director.
In exemplul acestui curs sursele kernelului se downloadeaza in /home/dan, iar in
urma decomprimarii arhivei cu sursele rezulta directorul /home/dan/linux-2.6.25.12. Toate
comenzile vor fi executate din directorul /home/dan/linux.2.6.25.12
In functie de versiunea kernelului si de directoarele din propriul sistem, caile
absolute si relative pot diferi. Acestea trebuie ajustate corespunzator.
Exemplu
1. cd /home/dan
2. wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.12.tar.bz2
3. tar -xjvf linux-2.6.25.12.tar.bz2
Etapa 2 (Aceasta etapa este optionala, dar foarte recomandata)
Fiind cea mai importanta componenta a sistemului, este aproape obligatoriu sa
verificam semnatura digitala a arhivei. Aceasta operatie garanteaza faptul ca avem o
versiune de kernel originala (nemodificata si downloadata fara erori).
Pentru verificarea semanturii digitale a unui fisier avem nevoie de urmatoarele:
1. Fisierul a carui semnatura digitala se verifica (in acest caz arhiva care contine sursele
kernelului)
2. Fisierul care reprezinta semnatura digitala. In acest exemplu acesta este linux
2.6.25.12.tar.bz2.sign. Acesta se obtine din acelasi loc din care se downloadeaza kernelul (
www.kernel.org)
3. Cheia publica a celui care a semnat fisierul si anume producatorul kernelului.
4. Un program care verifica semanatura digitala si care este invariabil gpg.
Nota
Intreaga teorie legata de criptografie si semanaturi digitale este prezentata in cursul
"Advanced Linux & Infosec" disponibil de asemenea online.
Exemplu
1. Download semnatura digitala
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.12.tar.bz2.sign
2. Importarea chei publice cu care s-a semnat. Fiecare cheie are un ID unic.
gpg --keyserver wwwkeys.pgp.net --recv-keys 517d0f0e
3. Verificare
gpg --verify /home/dan/linux-2.6.25.12.tar.bz2.sign /home/dan/linux-2.6.25.12.tar.bz2
Etapa 3
Kernelul foloseste un fisier de configurare numit .config. Acesta se numeste "kernel
configuration starting point". La acest pas copiem fisierul de configurare .config al
kernelului care ruleaza in directorul cu sursele kernelului abia downloadat si care se doreste
a fi compilat.
Fisierul .config pentru kernelul care ruleaza se gaseste cel mai probabil in directorul
/usr/src/kernels/VERSIUNE_KERNEL_CARE_RULEAZA sau in directorul /boot
Nota
Pe Fedora Core 9 fisierul de configurare al kernelului care ruleaza este /boot/config
2.6.25-14.fc9.i686 pentru versiunea 2.6.25.14
Nota
Compilarea unui nou kernel presupune pornirea de la o baza de facilitati si anume cele
oferite de kernelul care ruleaza. Practic pentru noul kernel adaugam facilitati noi sau
renuntam la facilitati in raport cu "running kernel". Acesta este motivul pentru care avem
nevoie de .config al kernelului care ruleaza.
Daca .config nu exista in directoarele specificate mai sus, se poate downloada un
kernel in format RPM pentru distributia si arhitectura respectiva si i se foloseste fisierul
.config.
Fisierul de configurare al kernelului este format din optiunile care vor fi incluse in
kernel, una pe cate o linie urmate de y (yes) daca se compileaza in imaginea kernelui sau m
daca se compileaza ca modul.
Exemplu
1. cp /boot/config-2.6.25-14.fc9.i686 /home/dan/linux-2.6.25.12
2. cd /home/dan/linux-2.6.25.12
3. mv config-2.6.25-14.fc9.i686 .config
Etapa 4
Executam comanda: make oldconfig
Atentie ! Aceasta comanda precum si urmatoarele se executa din directorul cu sursele
kernelului.
Rularea comenzii determina aparitia unei interfate text care foloseste fisierul de
configurare de la kernelul vechi ( .config) pe care il modifica astfel incat sa introduca noile
optiuni din kernelul nou care se compileaza, in vechiul fisier de configurare.
Etapa 5
Executam comanda: make menuconfig
Comanda make gconfig reprezinta o alternativa grafica la make menuconfig
Rularea comenzii determina aparitia unei interfete text sau grafice pentru a alege optiunile
ce vor fi incluse in kernel la compilare.
Important
Acesta este momentul in care trebuie sa adaugam optiunile pe care le dorim in
kernel, sa le scoatem pe cele in plus etc. Pentru compilarea kernelului in cele mai optime
conditii este nevoie de o cunoastere foarte buna a hardware-ului hostului.
Etapa 6
Executam comanda: make
In acest moment are loc compilarea kernelului si a modulelor, rezultand imaginea
comprimata a acestuia numita bzImage. Aceasta operatie poate sa dureze mult (1-2 ore).
Etapa 7
Executam: cp System.map /boot/System.map-2.6.25.12
ln -sf /boot/System.map-2.6.25.12 /boot/System.map
Un simbol reprezinta un nume de variabila sau un nume de functie. System.map
reprezinta un tabel cu echivalenta dintre numele simbolurilor si adresele acestora din
memorie si este folosit de kernel.
Etapa 8
Executam: make modules_install
Comanda de mai sus instaleaza modulele.
Etapa 9
Executam: cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.25.12
In functie de arhitectura directorul x86 poate sa fie i386.
bzImage vine de la "big zImage" - Imagine kernelului comprimata cu algoritmul zlib
Cu toate ca numele nu este important, prin conventie se foloseste denumirea de
vmlinuz sau bzImage pentru imaginea binara comprimata a kernelului.
Nota
Intreg kernelul se gaseste intr-un singur fisier si anume fisierul bzImage sau vmlinuz.
Sursele kernelului nu mai sunt necesare si pot fi sterse.
Etapa 10
Executam:
/sbin/mkinitrd
/boot/initrd-2.6.25.12.img
2.6.25.12
pentru
RedHad/Fedora/SuSE sau mkinitramfs -o /boot/initrt-2.6.25.12.img 2.6.25.12 pentru
Ubuntu/Kubuntu/etc
Exemplu: Se doreste suport pentru RAID, LVM sau SATA sau pentru alte functionalitati
low level. Comanda de mai sus creaza un RAM Disk care contine modulele necesare la
butarea sistemului.
Nota
Primul argument al comenzii mkinitrd este fisierul de tip RAM Disk care se va crea. Al
doilea argument si anume 2.6.25.12 este numele directorului din /lib/modules in care se
gasesc modulele noului kernel. Automat in fata argumentului 2 se pune /lib/modules/
Etapa 11
Se modifica bootloaderul si anume grub.conf pentru a adauga noul kernel.
Nota
Kernelul compilat nu este inca folosit de sistem. Acesta va fi folosit doar dupa restartarea
calculatoruliu si alegerea sa din lista de kernele din meniul Grub. Referirea la vechiul
kernel din grub.conf NU se sterge !
Important
Posibilitatea ca sistemul sa nu mai buteze datorita unei erori sau datorita lipsei unei
optiuni incluse in kernel este destul de mare. Este extrem de important sa nu stergem
vechiul kernel (cel butabil) pentru a buta cu el in caz de nevoie. Eroarea fatala care poate
sa apara este KERNEL PANIC.
Capitolul 3 - Serverul DHCP
3.1 Protocolul DHCP
Protocolul DHCP (Dynamic Host Configuration Protocol) este definit in RFC2131
si se foloseste pentru configurarea automata a placii de retea (IP, Network Mask, Default
Gateway, DNS Servers etc).
DHCP ruleaza client-server, serverul fiind acela care inchiriaza o anumita
configuratie clientului pentru o anumita perioada de timp numita "lease time".
Nota
DHCP este urmasul protocolului BOOTP.
Toate sistemele de operare moderne includ un client de DHCP. Cel mai folosit
server DHCP OpenSource este cel de la ISC (Internet System Consortium).
DHCP - mod operare
Comunicatia dintre client si server se imparte in 4 faze distincte si anume exista 4
tipuri de mesaje care se schimba intre client si server.
1. DHCP Discovery
Clientul trimite DHCP Discovery folosind IP destinatie de tip "limited broadcast" si
anume 255.255.255.255 iar ca IP sursa 0.0.0.0 Se foloseste protocolul UDP. Clientul
utilizeaza portul 68, iar serverul 67. Acestea nu trebuie sa fie filtrate de vreun firewall.
IP Sursa=0.0.0.0
IP Destinatie=255.255.255.255
Port Sursa=68
Port Destinatie=67
2. DHCP Offer
Serverele DHCP (pot exista mai multe intr-un LAN) care au primit DHCP
Discovery raspund cu un mesaj numit DHCP Offer in care ofera clientului o anumita
configuratie (IP, Masca, DG, DNS etc). Configuratia poate fi statica, stabilita apriori de
catre administrator in functie de MAC.
IP Sursa=Server_IP
IP Destinatie=255.255.255.255
Port Sursa=67
Port Destinatie=68
3. DHCP Request
Clientul alege o oferta (daca exista mai multe servere de la care a primit) trimitand
un pachet numit DHCP Request - in general pe prima primita - si trimite un broadcast in
care isi face cunoscuta alegerea. In pachet se gaseste IP-ul serverului ales astfel incat toate
celelalte servere sa cunoasca alegerea clientului si sa elibereze oferta facuta in caz ca nu a
fost aleasa de client.
IP Sursa=0.0.0.0
IP Destinatie=255.255.255.255
Port Sursa=68
Port Destinatie=67
4. DHCP Acknowledgment
Serverul ales trimite DHCPACK clientului in care precizeaza "lease time" precum
si alte informatii necesare.
IP Sursa= DHCP_Server_IP
IP Destinatie=255.255.255.255
Port Sursa=67
Port Destinatie=68
Nota
In momentul in care "lease time" pentru oferta primita expira, clientul trebuie sa
reinnoiasca configuratia de la server. Acesta trimite doar DHCP Request pentru aceiasi
configuratie, iar serverul raspunde cu DHCP ACK.
Important
Pentru o buna intelegere a protocolului DHCP se recomanda:
a) citirea RFC2131 care reprezinta de fapt documentatia oficiala.
b) pornirea unui sniffer precum Wireshark sau tcpdump si urmarirea modului de
comunicatie dintre client si server.
3.2 Compilare si instalare server
ISC este o organizatie non-profit al carei scop este dezvoltarea de software pentru
Internet. Cele mai cunoscute aplicatii sunt serverul DNS numit BIND si serverul DHCP.
Ambele sunt si cele mai folosite servere de DNS respectiv de DHCP OpenSource.
ISC DHCP reprezinta o suita de programe (dhcp daemon, dhpc client si dhcp relay
agent) care implementeaza toate aspectele protocolului DHCP definit in RFC2131.
Pasi de urmat:
1. Download sursele ultimei versiuni ISC DHCP de pe site-ul producatorului
www.isc.org
Se ruleaza: wget -c http://ftp.isc.org/isc/dhcp/dhcp-3.0.7.tar.gz
2. Verificare integritate arhiva tar.gz folosind hash-ul sau semnatura digitala (Optional
dar foarte recomandat)
3. Decomprimare si dezarhivare arhiva
Se ruleaza: tar -xzvf dhcp-3.0.7.tar.gz
4. Rularea scriptului configure care verifica sistemul si anume daca acesta contine toate
componentele necesare compilarii si instalarii serverului DHCP.
Se ruleaza: ./configure
Nota
Instalarea prin compilare a serverului DHCP este atipica datorita faptului ca nu se pot
transmite parametri scriptului configure si deci nu se poate instala serverul intr-un anumit
director sau compila cu anumite optiuni speciale.
5. Compilare
Se recomanda compilarea oricarei aplicatii de catre un user neprivilegiat. In urma
compilarii rezulta din fisierele sursa fisiere executabile.
Se ruleaza: make
6. Instalare
Instalarea presupune doar mutarea fisierelor executabile rezultate in urma compilarii in
directoarele corespunzatoare precum /sbin/, /usr/bin etc. Comanda poate fi executata doar
de root.
Se ruleaza: make install
3.3 Configurare server
Ca si in cazul celorlalte servere configurarea serverului dhcp presupune editarea
catorva fisiere text de configurare.
Serverul ISC DHCP foloseste 2 fisiere:
1. In fisierul /var/state/dhcp/dhcpd.leases se pastreaza informatii despre configuratiile
inchiriate deja clientilor, leased time pentru fiecare etc
Nota
Dupa instalarea serverului prin compilare acest fisier nu exista. El trebuie creat manual
altfel serverul nu porneste.
Se ruleaza: touch /var/state/dhcp/dhcpd.leases
2. Fisierul de configurare al serverului care este by default /etc/dhcpd.conf
Exemplu /etc/dhcpd.conf
authoritative;
#(diez) reprezinta un comentariu
ddns-update-style interim; #interim sau none. DHCPD face update la fisierul zona al
clientului de pe serverul DNS
#ignore client-updates;
#allow client-updates;
#vezi man dhcpd.conf
subnet 192.168.0.0 netmask 255.255.255.0 { #stabileste subnetul pentru care va furniza
servicii
range 192.168.0.50 192.168.0.60;
#range-ul de IP furnizat
range 192.168.0.100 192.168.0.120;
#un al doilea range
#allow unknown-clients;
default-lease-time 600;
#lease time default daca clientul nu cere un anumit timp
max-lease-time 7200;
#max lease time
option routers 192.168.0.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 193.231.236.25,193.231.236.30;
option domain-name "crystalmind.ro";
host pc1
{
hardware ethernet 00:03:47:F6:B0:44;
fixed-address 192.168.0.125;
option routers 192.168.0.10;
#primeste Default Gateway diferit
}
}
Detalii fisier dhcpd.conf:
- fiecare linie se termina cu ";" (punct si virgula)
- sintaxa este extrem de sensibila, orice caracter precum ; (punct si virgula) lipsa reprezinta
o eroare fatala;
- semnul "#" (diez) inseamna un comentariu;
- subnet 192.168.0.0 netmask 255.255.255.0 - se stabileste subnetul din care serverul va
furniza IP-uri
- range 192.168.0.50 192.168.0.60; - se stabileste range-ul din care serverul va funiza IP
uri. In exemplul nostru primul client va primi 192.168.0.50, al doilea 192.168.0.51 etc. Pot
exista mai multe directive range. Atentie ! Ip-urile setate static pe alte hosturi trebuie
excluse;
- option routers 192.168.0.1; - stabileste Default Gateway oferit clientilor;
- option subnet-mask 255.255.255.0; - stabileste masca retelei oferite clientilor
- option domain-name "crystalmind.ro"; - stabileste un domeniu care va fi oferit clientilor,
acestia facand parte din el;
- daca se doreste furnizarea unei configuratii in functie de MAC-ul clientului, pentru
FIECARE astfel de client in fisierul de configurare al serverului si anume dhcpd.conf
trebuie sa apara un container de tip host in care se specifica MAC-ul precum si configuratia
oferita. Daca nu se specifica un anumit parametru (exemplu servere DNS), clientul
respectiv va primi serverele DNS specificate in sectiunea globala;
- allow unknown-clients; - specifica daca serverul va oferi configuratie clientilor al caror
MAC nu se gaseste intr-un container de tip host;
Pornire server
Ruleaza serverul in foreground cu trimiterea mesajelor de debug la consola
dhcpd -d -f
Optiuni dhcpd:
-cf file.conf #specificarea unui fisier de configurare alternativ
-p port #specifica un alt port pe care sa asculte serverul. By default foloseste portul UDP
67.
-t #testeaza fisierul de configurare fara a porni serverul.
Nota
Pornirea serverului in modul Debug are loc doar dupa instalare sau in perioade de teste
pentru a observa modul de comunicatie al acestuia cu clientii. Pe un server stabil, serverul
DHCP trebuie sa porneaza automat la butare folosind fisierele de management al
serviciilor (/etc/inid.d/). In cazul compilarii, fisierul care porneste serverul nu exista si
trebuie creat. Pentru detalii citeste capitolul "Managementul serviciilor" din cursul "Linux
Basic Administration" oferit de asemenea online.
Clientul DHCP pe Linux
Programul se numeste dhclient si se gaseste cel mai probabil in /sbin. Foloseste fisierul
de configurare /etc/dhclient.conf
Utilizare:
Activeaza modul de configurare al interfetei prin DHCP
dhclient nume_interfata
Exemplu: /sbin/dhclient eth0
Returneaza serverului configuratia primita
dhclient -r nume_interfata
Exemplu: dhclinet -r eth0
Fisierul /var/lib/dhcp/dhclient.leases este folosita de dhclient pentru a tine evidenta
configuratiilor primite.
La pornire dupa ce citeste /etc/dhclient.conf, dhclient citeste /var/lib/dhcp/dhclient.leases
Nota
Numele interfetei si anume eth0 poate sa difere de la caz la caz. Acesta se afla cu
comanda ifconfig.
Capitolul 4 - Serverul FTP
4.1 Protocolul FTP
FTP (File Transfer Protocol) este un protocol de nivel aplicatie OSI care foloseste
TCP la nivelul transport si se foloseste pentru a transfera fisiere intre 2 hosturi, client si
server. Protocolul FTP este definit in RFC959.
Server de FTP = calculator pe care ruleaza un program numit server de FTP (Linux:
ProFTP, Pure-FTP, Windows: BulletProofFTP, CureFTP etc)
Client de FTP = calculator pe care este instalat un program care se conecteaza la
serverul de FTP (Linux: gftp, Krusader Windows: Total Commander, FTP Commander
etc)
Orice sistem de operare (Windows, Linux, Unix, *BSD) include un client ftp in
linie de comanda. Acesta este comanda ftp. Exista si se prefera a se folosi clienti de FTP in
modul grafic.
FTP este un protocol considerat complex ca mod de operare si asta fiindca foloseste
mai multe canale de comunicare si doua moduri de operare complet diferite (modul pasiv si
modul activ).
FTP foloseste un canal de comunicare pentru control sau comenzi specifice
protocolului (portul 21) si un canal pentru transferul datelor (portul 20 pentru FTP active
sau un alt port pentru FTP pasive).
Deci orice conexiune FTP presupune 2 etape:
a) conectarea la server folosind portul de control (21)
b) conectarea folosind portul de date (in functie de modul de operare poate fi sau nu portul
20)
Important
Intreaga comunicatie dintre client si server se realizeaza in cazul FTP in clar necriptat.
Orice dispozitiv intermediar sau host din LAN care ruleaza un atack gen ARP Spoofing
poate intercepta informatia schimbata intre client si server.
4.2 Moduri
de operare
Protocolul
moduri diferite
pasiv.
FTP include 2
de operare: activ si
FTP activ
Caracteristica generala a acestui mod este ca in prima etapa clientul se conecteaza
la server la portul 21 pentru a schimba comenzi folosind un port aleator mai mare ca 1023,
iar apoi serverul devine activ si se conecteaza el la client pentru a schimba date cu acesta.
Deci in etapa 2 se poate spune ca serverul a devenit client, iar clientul server.
Etape:
1. Clientul se conecteaza la server la portul destinatie 21 (portul de comanda) folosind
portul sursa N (N > 1023). Clientul trimite serverului comanda PORT N+1 si incepe sa
asculte pe portul N+1 pentru conexiuni de date.
2. Serverul trimite ACK la client pentru portul de comanda de la pasul anterior.
3. Serverul se conecteaza la client folosind ca port sursa portul 20 (port date) iar ca port
destinatie N+1 (portul de date al clientului) trimis anterior de client.
4. Clientul trimite ACK serverului pentru pasul 3.
Din punctul de vedere al clientului conexiunea serverului de la punctul 3 este
vazuta ca o conexiune din exterior si este de cele mai multe ori blocata de orice firewall
(inclusiv firewall standard din Windows). Clientii care se afla in spatele unui Router si
folosesc NAT nu pot folosi de multe ori modul activ fiindca conexiunea serverului de la
pasul 3 nu poate trece de router catre client.
Concluzie: Modul activ este extrem de dezavantajos pentru client, dar este
avantajos pentru server.
FTP pasiv
Reprezinta o alternativa la modul activ si anume permite clientilor care se afla in
spatele unui Router si fac NAT sa se conecteze la server. Clientii cu firewall pot de
asemenea folosi modul pasiv. Aceasta este modalitatea folosita in majoritatea cazurilor.
Caracteristica genera a modului pasiv este ca atat pentru sesiunea de control cat si pentru
sesiunea de date clientul este cel care initializeaza conexiunea. Serverul asculta pe portul
21 pentru control dar nu mai exista portul 20 pentru date.
Etape:
1. Clientul deschide 2 porturi: N si N+1 si se conecteaza la server folosind portul sursa N
(N>1023) si portul destinatie 21. In loc sa trimita comanda PORT ca in cazul FTP activ,
trimite comanda PASV prin care anunta serverul ca este pregatit pentru modul pasiv.
2. Serverul deschide portul M ( M > 1023) si-l trimite clientului pentru ca acesta sa se
conecteze la portul M folosind portul sursa N+1 pentru a transfera date.
3. Clientul se conecteaza la portul destinatie M folosind portul sursa N+1.
4. Server trimite ACK clientului.
Concluzie: Modul pasiv este avantajos pentru client, dar este complet dezavantajos
pentru server. Acesta trebuie sa deschida porturile mai mari ca 1023 pentru a se conecta
clientul la acestea.
4.3 Compilare si instalare server
Cele mai cunoscute si folosite servere de FTP pe Linux sunt ProFTPD si PureFTP.
In exemplul acestui curs vom instala si configura serverul ProFTPD.
Instalarea prin compilare a ProFTPD se realizeaza in mod standard fara probleme
deosebite. Exemplu de mai jos s-a realizat pe Fedora Core 9. In mod IDENTIC se
compileaza si instaleaza pe orice distributie Linux.
Pasi de urmat:
1. Download sursele ultimei versiuni ProFTPD de pe site-ul producatorului www.proftpd.org.
Acestea pot fi downloadate in orice director din sistem.
wget -c ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.1.tar.gz
2. Verificare integritate arhiva tar.gz folosind hash-ul sau semnatura digitala (Optional dar
foarte recomandat)
3. Decomprimare si dezarhivare arhiva Se ruleaza: tar -xzvf proftpd-1.3.1.tar.gz
4. Rularea scriptului configure care verifica sistemul si anume daca acesta contine toate
componentele necesare compilarii si instalarii serverului ProFTPD. Dorim instalarea in
directorul /opt/proftpd astfel incat sa putem urmarii si studia toate componentele cu care
vine serverul. Se recomanda rularea scriptului configure de catre un user neprivilegiat. Se
ruleaza din directorul cu surse: ./configure --prefix=/opt/proftpd
Nota
Fara optiunea --prefix=/opt/profptd instalarea are loc in directoarele standard precum
/usr/bin, /usr/sbin, /etc. In acest caz ne va fi greu sa gasim fisierele componente ale
serverului sau sa-l dezinstalam/stergem.
5. Compilare
Se recomanda compilarea oricarei aplicatii de catre un user neprivilegiat.
In urma compilarii rezulta din fisierele sursa fisiere executabile.
Se ruleaza: make
6. Instalare
Instalarea presupune doar mutarea fisierelor executabile rezultate in urma compilarii din
directorul cu surse in directorul dorit ( /opt/proftpd). Comanda poate fi executata doar de
root.
Se ruleaza: make install
4.4 Configurare minimala server
Fisierul de configurare al serverului ProFTPD este proftpd.conf Acesta este format
din directive si valorile acestora care stabilesc modul in care serverul functioneaza.
Exemplu:
proftpd.conf
#serverul asculta pe portul 21 pentru conexiuni de control Port 21
Se recomanda pornirea de la un "schelete" de fisier de configurare care se modifica
in functie de necesitati.
O astfel de mostra este /opt/proftpd/proftpd.conf. Aceasta nu contine toate
directivele de configurare ci doar pe cele mai importante.
Configurarea minimala a serverului ProFTPD presupune:
1. Crearea unui user si a unui grup sub care sa ruleze serverul.
Fisierul default de configurare cu care vine serverul si anume /opt/proftpd/proftpd.conf in
cazul compilarii in directorul /opt/proftpd specifica faptul ca acesta ruleaza ca user nobody
si grup nogroup. Acest user si grup sunt folositi in mod default de multe servere ceea ce
duce la probleme de securitate.
Exemplu: In cazul in care exista un server Apache si un server Proftpd care ruleaza ca
nobody si nogroup, iar serverul Apache este compromis, crackerul va avea acces total si la
serverul Proftpd fiindca ruleaza sub acelasi user.
Important
Din punct de vedere al securitatii sistemului este obligatoriu ca fiecare server sa ruleze sub
propriul user si group, iar acestea sa nu mai fie folosite in alt scop.
proftpd.conf
# Set the user and group under which the server will run. User ftpuser Group ftpgroup
2. Stabilirea modului de acces la sistemul de fisiere a unui utilizator odata logat.
Trebuie stabilit daca acesta este blocat (chrooted/jailed) in propriul home directory sau se
poate "plimba" in mod liber prin tot sistemul de fisiere.
Directiva DefaultRoot NUME_DIRECTOR stabileste directorul in care un user odata logat
este plasat. Pentru respectivul utilizator radacina sistemului de fisiere este
NUME_DIRECTOR. Acesta nu poate iesi din director.
proftpd.conf
DefaultRoot ~
Important
Default directiva DefaultRoot este comentata ceea ce inseamna ca un user conectat prin ftp
la server poate iesi din propriul home directory si se muta in orice director din sistemul de
fisiere.
3. Activare/dezactivare modul anonymous
Protocolul FTP face referire la un mod special si anume modul anonymous. Acesta se
foloseste in momentul in care se doreste logarea userilor fara autentificare.
Exemplu: downloadarea serverului ProFTPD s-a realizat prin FTP. Clientul de FTP s-a
conectat la serverul FTP pe care se gaseau sursele logandu-se anonim (fara username sau
parola). De multe ori username-ul introdus este anonymous iar parola o adresa de e-mail.
Fisierul sample profptd.conf face referire la sfarsitul sau la modul anonymous. Daca se
doreste dezactivarea acestui mod (de recomandat daca nu este un server public) trebuie
comentata intreaga sectiune.
Detalii sectiune anonymous din proftpd.conf
Specifica directorul home al userilor anonimi. Acesta poate fi modificat, dar atentie la
permisiunile pentru acel director.
<Anonymous /var/ftp>
Specifica userul care se va loga anonim. Acesta este ftp sau anonymous (directiva
UserAlias) User ftp Group ftp # We want clients to be able to login with "anonymous" as
well as "ftp" UserAlias anonymous ftp
Limit the maximum number of anonymous logins
MaxClients 10
4. Alte configuratii
a) specificarea porturilor pasive pe care le va folosi serverul. Default acesta poate trimite
clientului care doreste folosirea modului pasiv orice port mai mare ca 1023 pentru ca acesta
sa se conecteze la server la portul trimis. Se recomanda limitarea intervalului de porturi
pasive folosite.
PassivePorts 49152 65534
b) modificare umask si anume pentru stabilirea permisiunilor default cu care se creaza noile
fisiere si directoare.
Umask 0022
c) modificare umask doar pentru un anumit director.
<Directory ~/test> umask 0066 0077 </Directory>
d) Dezactivare logarii userului root. Se recomanda din considerente de securitate.
RootLogin off
Exemplu configuratie completa server proftpd:
server asculta pe portul tcp/21 pentru conexiuni pentru sesiunea de control (default);
serverul ruleaza sub userul ftpuser si ftpgroup;
fiecare user conectat si autentificat la server este "jailed" sau izolat in propriul home
directory;
nr. maxim de conexiuni concurente este 10;
modul anonymous este dezactivat;
autentificarea userilor are loc pe baza informatiilor din /etc/passwd si /etc/shadow;
porturile pasive folosite de server sunt doar cele din intervalul 49152-49172;
login-ul userului root nu este permis;
Exemplu proftpd.conf complet:
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
# Port 21 is the standard FTP port.
Port 21
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections # at once, simply
increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 10
# Set the user and group under which the server will run.
User ftpuser
Group ftpgroup
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~
# Normally, we want files to be overwriteable.
AllowOverwrite on
# Bar use of SITE CHMOD by default
<Limit SITE_CHMOD>
DenyAll
</Limit>
# stabilirea umask pentru directorul test din home directory al userului
# care se conecteaza pentru fisiere respectiv directoare
<Directory ~/test>
umask 0066 0077
</Directory>
#Porturile pe care le deschide serverul pentru conexiuni pasive (default sunt porturile mai
mari ca 1023)
PassivePorts 49152 49172
#Important ! Fara urmatoarele 2 directive serverul ar putea incerca rezolvarea inversa a IPului clientului
#care se conecteaza ceea ce duce la delay foarte mare la conectare
UseReverseDNS off
IdentLookups off RootLogin off
# A basic anonymous configuration, no upload directories. If you do not
# want anonymous users, simply delete this entire <Anonymous> section.
#<Anonymous ~ftp>
# User ftp
# Group ftp
# We want clients to be able to login with "anonymous" as well as "ftp"
# UserAlias anonymous ftp
# Limit the maximum number of anonymous logins
# MaxClients 10
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
# DisplayLogin welcome.msg # DisplayChdir .message
# Limit WRITE everywhere in the anonymous chroot
# <Limit WRITE>
# DenyAll
# </Limit>
#</Anonymous>
4.5 Configurare avansata server
4.5.1Modalitati de autentificare
ProFTPD poate folosi 5 modalitati diferite de autentificare a userilor care se logheaza la
server.
Acestea sunt:
1) mod_auth_unix
Este metoda default si se foloseste schema clasica de autentificare din Unix/Linux. Userii
care se conecteaza la server sunt cei definiti in / etc/passwd, grupurile sunt cele din
/etc/group, iar informatiile de autentificare sunt cele din /etc/passwd si /etc/shadow
2) mod_auth_file
Se foloseste un alt fisier, diferit de /etc/passwd sau /etc/group in care se gasesc userii si
parolele acestora. Acestia se numeste si useri virtuali.
3) mod_ldap
Se folosesc informatii din LDAP Directories (Lightweight Directory Access Protocol).
4) mod_radius
Se foloseste un server RADIUS (Remote Authentication Dial In User Service ) pentru
autentificare.
5) mod_sql
Informatiile despre utilizatori sunt pastrate intr-o baza de date MySql.
5.2 Virtual Users
Modalitatea default de autentificare la serverul FTP este cea folosind un username
definit in /etc/passwd si parola din /etc/shadow.
Pentru un server cu putine conturi aceasta varianta de autentificare este optima, dar
in cazul unui server pe care se gasesc sute de conturi ( Exemplu: un server dedicat de
hosting) varianta clasica de autentificare nu mai este scalabila si nici optima.
Pentru fiecare cont FTP dintre cele cateva sute, ar trebui creat un cont de sistem
identificat prin username, parola dar si un intreg mediu de lucru (home directory, variable
de mediu precum PATH, shell default etc). Userii respectiv sunt folositi doar pentru
conectarea la serverul FTP, nu se doreste autentificarea acestora la server prin ssh, logarea
acestora printr-o consola etc.
Solutia este folosirea de useri virtuali numiti si "FTP only users". Acestia nu exista
in sistem ci sunt folositi doar de FTP.
Variantele cele mai folosite pe care le avem la dispozitie ar fi: mod_sql si anume
informatiile despre useri sa gasesc intr-o baza de date mysql si mod_auth_file caz in care
informatiile despre useri se gasesc in fisiere speciale altele decat /etc/passwd si
/etc/shadow.
Configurarea ProFTPD pentru useri virtuali folosind mod_auth_file
Etape:
1. Editare proftpd.conf pentru folosire useri virtuali
#specificarea fisierului cu userii virtuali. Acesta nu exista si va trebui creat. Poate fi folosit
orice nume
AuthUserFile /opt/proftpd/etc/passfile
#specificarea fisierului cu grupurile virtuale. Acesta nu exista si va trebui creat. Poate fi
folosit orice nume
AuthGroupFile /opt/proftpd/etc/grpfile
#ordinea in care proftpd incearca sa autentifice userii.
AuthOrder mod_auth_file.c mod_sql.c mod_auth_unix.c
#userii care se autentifica la server nu sunt useri de sistem si deci nu necesita shell valid
RequireValidShell off
2. Crearea fisierelor in care se gasesc userii si grupurile si crearea conturilor virtuale
(username+parola+grup la care apartine user)
Pentru a creare useri/grupuri virtuale se foloseste un script in perl numit ftpasswd. Acesta
se gaseste in directorul contrib din directorul cu sursele serverului (in exemplul nostru este
/home/dan/proftpd-1.3.1/contrib).
Exemplu de folosire ftpasswd:
a) Creare user virtual numit tom cu uid 1003 si fara shell valid
/home/dan/proftpd-1.3.1/contrib/ftpasswd --passwd --file=/opt/proftpd/etc/passfile
name=tom --uid=1003 --home=/opt/proftpd/tom --shell=/bin/false
–
b) Creare grup virtual numit programatori cu gid 1000
/home/dan/proftpd-1.3.1/contrib/ftpasswd --group --name=programatori --gid=1000 –
member=bob --member=tom --file /opt/proftpd/etc/grpfile
c) Schimbare parola user virtual.
/home/dan/proftpd-1.3.1/contrib/ftpasswd --passwd --name=bob --change-password –
file=/opt/proftpd/etc/passfile
Se poate folosi orice ID pentru userii virtuali, doar ca este bine sa fie diferit (nu
obligatoriu) de ID-urile userilor din /etc/passwd pentru a pastra diferite nivele de securitate.
Daca avem acelasi UID, userii din /etc/passwd vor avea aceleasi drepturi.
Important
Fisierul cu useri virtuali si anume cel definit de directiva AuthUserFile trebuie sa poata fi
citit doar de userul care ruleaza daemonul proftpd. Default fisierul nu exista dar este creat
la prima rulare a comenzii ftpasswd
3. Setare permisiuni useri virtuali
Userul virtual nu va avea acces la propriul home directory cel definit la crearea sa fiindca
sistemul verifica in /etc/passwd owner-ul, iar userul virtual nu exista in /etc/passwd. Pentru
aceasta se foloseste comanda chown care ia drept argument uid-ul userului virtual pentru a
schimba ownerul directorului home al userului virtual. UID-ul ownerului unui director se
vizualizeaza cu comanda ls -n
Nota
Pentru folosirea diferitelor moduri de autentificare precum mod_sql, mod_ldap sau
mod_radius, serverul trebuie sa fi fost compilat cu suport pentru acestea.
Capitolul 5 - NFS - Network File System
5.1 Prezentare generala
NFS (Network File System) reprezinta un protocol dezvoltat initial de Sun
Microsystems in 1984 care permite accesarea de resurse (file sharing) intre calculatoarele
dintr-o retea. Exista mai multe versiuni, ultima fiind 4 care a fost standardizata de IETF in
RFC 3530.
NFS ruleaza pe arhitectura client-server, astfel serverul este hostul care ofera
resurse si anume unul sau mai multe directoare al caror continut poate fi accesat de pe alte
hosturi numite clienti. Clientii monteaza local directoarele shared de pe server. NFS se
foloseste de RPC (Remote Procedure Call). RPC reprezinta o modalitate prin care se pot
rula functii si metode low-level de catre un host, remote prin retea pe un alt host.
Exemplu
Presupunem ca un host client monteaza directorul /backup de pe un server NFS. Pentru a
putea modifica, sterge sau crea fisiere in directorul /backup (care se gaseste pe un alt host)
clientul trebuie sa ruleze functii precum fread(), fwrite(), fopen() etc pe server unde se
gasesc fisierele. RPC realizeaza acest aspect.
5.2 Configurare
Configurarea NFS presupune:
1. Pe server
a) Daemonul nfsd trebuie sa ruleze.
b) Procesul portmap sau rpcbind (in functie de distributie) trebuie sa ruleze. Pentru a obtine
informatii despre rpcbind se ruleaza comanda: rpcinfo -p
c) Fisierul /etc/exports stabileste accesul la resurse. Acesta contine o lista de directoare ce
pot fi exportate in retea precum si permisiunile cu care acestea pot fi montate local de catre
clienti.
Fisierul /etc/exports face referire la cate un director pe fiecare linie.
Structura sa este: dir_to_export host_allowed_to_mount(option1,option2,option3) unde
dir_to_export este directorul care se doreste a fi exportat, host_allowed_to_mount
reprezinta IP-ul hostului client care are permisiunea sa monteze directorul, iar cele mai
folosite optiuni sunt: ro, rw, root_squash si no_root_squash
Detalii:
ro -> directorul se monteaza read/only pe client;
rw -> directorul se monteaza read/write pe client;
root_squash -> userul root de pe client nu va avea drepturi de root in sistemul de fisiere
remote;
no_root_squash -> userul root pe client are drepturi de root si pe sistemul remote care se
monteaza local;
Exemplu /etc/exports:
/home/shared 192.168.0.2(rw,no_root_squash) /backup 192.168.0.1(rw,no_root_squash)
/home/projects 192.168.0.0/24(ro,root_squash)
d) Se ruleaza comanda exportfs -a care exporta toate directoarele specificate in /etc/exports.
2. Pe client
Se monteaza directorul remote astfel: mount -t nfs 192.168.0.1:/shared_dir /mnt,
unde 192.168.0.1 este IP-ul serverului NFS.
Nota
Daca se doreste montarea automata la butare pe client se modifica fisierul /etc/fstab
adaugand linia de mai sus.
Important
Comunicatia dintre client si server se realizeaza in cazul NFS in clar. Nu se recomanda
montarea de directoare remote peste Internet folosind NFS din motive de securitate !
Capitolul 6 Serverul DNS
6.1 Protocolul DNS
6.1.1 Spatiul de nume DNS
DNS - Domain Name System - reprezinta un protocol la nivelul aplicatie (layer 7)
al modelului de referinta OSI care are drept scop principal translatarea numelor de domenii
in adrese logice sau IP. Acesta este definit de IETF intr-o serie de RFC-uri.
Nota
DNS reprezinta un acronim care inseamna "Domain Name System" si NU "Domain Name
Server"
Protocolul DNS cuprinde un ansamblu de concepte si programe printre care:
1. Spatiul de nume DNS
2. Servere DNS
3. Clienti DNS sau DNS Resolver
Spatiul de nume DNS reprezinta ansamblul de nume DNS. Acest spatiu are o
structura arborescenta asemanatoare cu structura sistemului de fisiere din Linux. Fiecare
nume de domeniu complet reprezinta o cale in acest arbore inversat numit spatiul de nume.
IANA este organizatia care se ocupa de alocarea si managementul numelor de domenii.
Important
Spatiul de nume DNS este unic in Internet asa cum un IP public este de asemenea unic. Nu
pot exista 2 sau mai multe domenii identice.
In varful arborelui se gaseste domeniul radacina (root). Acesta se reprezinta printrun punct ("."). Urmeaza pe urmatorul nivel domenii generice numite TLD (Top Level
Domains).
Exemplu: com, net, org, biz, ro, de , fr, eu, bg etc.
Fiecare nod al arborelui are o eticheta (label) - cu exceptia root - formata din
maximum 63 de caractere fara punct (litere, cifre si semnul minus "-"). Underscore nu este
permis. Fiecare nod poate fi la randul sau radacina pentru un subarbore al arborelui general.
Definitie
Un nume complet se numeste FQDN (Fully Qualified Domain Name) si se
specifica de la frunza pana la radacina "." (punct) care trebuie specificata.
Exemplu: www.invata-online.ro. sau mail.yahoo.com. sau calendar.google.com.
6.1.2 Delegare
Fiecare domeniu se gaseste in administrarea unei organizatii.
Exemplu: Domeniul yahoo.com se gaseste sub administrarea lui Yahoo, domeniul invata
online.ro se gaseste sub administrarea organizatiei Crystal Mind Academy etc.
O organizatie cumpara sau inchiriaza un domeniu la fel ca pe o adresa IP publica. O
organizatie care administreaza un domeniu poate sa-l imparta in subdomenii si sa delege
administrarea acestora catre alte organizatii. Delegarea de autoritate presupune ca pentru
noul domeniu toate informatiile despre translatarea acestuia in adrese IP se afla in grija
organizatiei catre care se face delegare.
Impartirea unui domeniu in subdomenii presupune crearea de noduri sub nodul
principal. Aceasta impartire se gaseste la libera dorinta a organizatiei care detine domeniul.
Exemplu: Domeniul test.com poate fi impartit in subdomenii in urmtorul mod:
www.test.com, login.test.com, mail.test.com, linux.test.com etc
Nu este obligatoriu ca intreg domeniul sa fie delegat ci doar subdomenii din acesta.
Exemplu
Subdomeniul cursuri.crystalmind.ro se poate gasi in administrarea unei companii,
examene.crystalmind.ro se poate gasi in administrarea unei alte companii iar
crystalmind.ro poate fi sub autoritatea unei alte organizatii. Compania care detine
crytalmind.ro a delegat autoritatea catre celelalte pentru subdomeniile respective.
Cine deleaga autoritatea pentru un domeniu, al cui este domeniul?
Domeniul din varful arborelui DNS si anume root reprezentat prin punct "."
apartine lui IANA. Aceasta a delegat autoritatea catre domeniile TLD ( ro, de, uk, com, net,
biz etc) catre alte organizatii.
Exemplu: Domeniul ro se afla sub autoritatea ROTLD, domeniul de se afla sub autoritatea
DENIC, domeniul eu se afla sub autoritatea NICEU etc.
Faptul ca domeniul ro se afla sub autoritatea ROTLD presupune ca doar ROTLD
poate sa creeze subdomenii ro si sa delege autoritatea. In momentul in care dorim sa
cumparam un domeniu ro precum invata-linux.ro trebuie sa facem cererea la ROTLD si sa
indicam numele si IP-ul serverului care va fi autoritativ pentru noul domeniu. Acest server
poate fi orice calculator conectat la internet care ruleaza un server DNS. Acesta va face
translatiile in IP si din IP pentru respectivul domeniu.
Ca proprietari ai domeniului invata-linux.ro putem crea subdomenii in numar
nelimitat precum www.invata-linux.ro sau login.invata-linux.ro, iar o parte din acestea pot
fi date in administrarea unei alte companii (delegare de autoritate).
Nota
Domeniile ro se inchiriaza pe timp nelimitat de la ROTL, iar pretul unui domeniu este de
circa 50$. Marea majoritate a restului de domenii precum com, biz, net, org, eu etc se
inchiriaza pe o perioada de un an, iar pretul unui domeniu este de circa 10$.
6.1.3 Servere DNS
Prin procesul de delegare un server DNS este responsabil doar cu o parte din spatiul
de nume si nu cu intreg domeniul. Astfel un domeniu poate fi imprastiat pe mai multe
servere.
O zona DNS este acea parte din spatiul de nume DNS care se gaseste pe un anumit
server. O zona poate cuprinde un domeniu intreg sau doar o parte din acesta, restul
subdomeniilor aflandu-se pe alte servere in alte zone.
Fisierul zona este acela care pastreaza informatiile referitoare la zona aflata in
administrarea serverului.
Serverul care stocheaza fisierul zona se numeste autoritativ pentru acea zona. Un
server poate fi autoritativ pentru o zona sau mai multe zone.
Serverele DNS se impart in 2 categorii:
1. Primary Master Name Server
Citeste informatiile referitoare la zona dintr-un fisier aflat pe hard disk-ul sau. Este
acela declarat in resursa SOA. Modificarile referitoare la o zona se pot face doar pe
primary master.
2. Secondary master name server sau slav
Isi ia informatia referitoare la zona automat de la un alt server numit masterul sau.
Acesta poate fi primary master sau un alt server secondary master.
Informatia referitoare la zona nu se poate modifica pe secondary master. In
momentul in care porneste, secondary master contacteaza primary masterul sau pentru a-si
copia fisierului zona. Aceasta operatiune se numeste "zone transfer".
Ulterior serverul slave face backup la fisierul zona pe propriul HDD, iar la
urmatorul restart incarca intai fisierul local si apoi contacteaza masterul sau pentru a vedea
daca informatia mai este actuala. Atat primary master cat si secondary master sunt
autoritativi pentru acea zona.
Notiunile de Primary Master si Secondary Master (slave) sunt relative. Un server
poate fi primary master pentru o zona si secondary master pentru alte zone.
Negative caching
In momentul in care un alt server DNS trimite serverului nostru o informatie despre
un domeniu inexistent, serverul face cache si la acea informatie. Urmatoarele cereri pentru
domeniu vor fi raspunse din cache.
Clientul DNS
Este reprezentat printr-un modul al sistemului de operare numit "DNS resolver".
Rezolverul DNS primeste din partea aplicatiei (firefox, thunderbird etc) sarcina de a
transforma numele domeniului intr-o adresa logica sau IP. Acesta interogheaza serverul
DNS configurat in sistem.
Serverul DNS va raspunde cu informatia ceruta sau cu o eroare. DNS resolver
dispune de un cache propriu local in care salveaza raspunsurile de la cererile facute. In
Windows cache-ul local poate fi vizualizat cu comanda ipconfig /displaydns si sters cu
comanda ipconfig /flushdns
6.1.4 DNS Queries
Un client DNS poate trimite catre server 2 categorii de query:
1. Query iterativ
Clientul trimite un query serverului iar acesta trebuie sa raspunda IMEDIAT fie din
fisierul zona (daca este autoritativ) fie din cache-ul sau (daca nu este autoritativ) dar are
raspunsul. Serverul trebuie sa dea cel mai bun raspuns pe care il stie chiar daca acesta nu
este raspunsul final.
Daca informatia ceruta nu ii este cunoscuta serverului DNS, acesta raspunde cu un
"referal" adica o lista de servere DNS care ar putea furniza raspunsul.
Exemplu
Daca cererea clientului incearca sa translateze numele www.crystalmind.ro in IP, serverul
DNS ar putea raspunde cu o serie de servere autoritative pentru domeniul ro. In acest caz
cade in sarcina clientului sa contacteze serverele respective pentru a afla raspunsul.
Mod functionare query interativ.
Presupunem ca DNS resolverul doreste translatarea numelui de domeniu
online.ro in IP.
www.invata
Etape:
1. Clientul trimite query iterativ la serverul DNS default (cel configurat in /etc/resolv.conf).
2. Daca serverul DNS este autoritativ (are in fisierul zona de pe propriul hard disk
informatia) raspunde cu valoarea adresei IP. Daca nu este autoritativ incearca sa caute in
cache. Fiecare server mentine un cache cu ultimele cereri facute de clienti, astfel incat in
momentul in care un nou client face o cerere daca aceasta a mai fost facuta de un alt client
in trecut, serverul va raspunde din cache. Daca serverul nu este autoritativ si nici nu are
raspunsul in cache trece la pasul 3.
3. Serverul DNS trimite query iterativ in care doreste aflarea ip-ului pentru domeniul
www.invata-online.ro la unul dintre serverele root (cele autoritative pentru domeniul "."
(punct))
Nota
Orice server DNS cunoaste default fara nicio configuratie numele si IP-urile serverelor
autoritative root. Acesta sunt in nr. de 13 distribuite geografic in mod uniform in toata
lumea.
4. Serverul root va raspunde cu un referal si anume numele si ip-ul serverului autoritativ
pentru domeniul ro. Serverul root cunoaste informatia fiindca el a facut delegarea de
autoritate pentru domeniul ro (domeniul ro se afla sub el si este un subdomeniu).
Important
Un server cunoaste numele si ip-urile tuturor serverelor pentru domeniile imediat de sub
domeniul pentru care este autoritativ.
5. Serverul nostru trimite acelasi query iterativ catre serverul autoritativ pentru domeniul ro
aflat la pasul 4. Serverul autoritativ pentru domeniul ro raspunde cu un referal care indica
numele si ip-ul serverului autoritativ pentru domeniul invata-online.ro. Acesta cunoaste
informatia fiinca el a facut delegarea de autoritate (domeniul invata-online.ro este un
subdomeniu al domeniului ro)
6. Serverul nostru trimite query iterativ catre serverul autoritativ al domeniului invata
online.ro. Acesta din urma fiind autoritativ raspunde cu ip-ul domeniului www.invata online.ro
Important
In general un server este autoritativ (are informatia pe propriul hard disk) pentru doar
cateva domenii, dar poate raspunde la query pentru orice domeniu din Internet folosind
query iterative din aproape in aproape.
2. Query recursiv
Clientul trimite un query serverului, iar acesta trebuie sa furnizeze valoarea finala
ceruta sau un mesaj de eroare. Serverul este acela care trebuie sa contacteze alte servere
DNS in cazul in care nu cunoaste raspunsul la intrebare. Aceasta modalitate este cea mai
des intalnita. In mod implicit orice client dns trimite la server query recursive (doreste
raspunsul final nu raspunsul intermediar adica un referal - un alt server pe care sa-l
intrebe). Astfel ramane in sarcina serverului sa afle prin cereri iterative valoarea ceruta de
client.
Nota
Un forwarder este un server DNS catre care alte servere DNS trimit query recursive pentru
a evita parcurgerea arborelui de nume de sus in jos pentru aflarea raspunsului. Forwarderul
este acela care trebuie sa afla valoarea ceruta prin cereri iterative si sa o transmita
serverului initial. In general Forwarderul este un server mai puternic, eventual cel furnizat
de ISP.
6.1.5 Rezolutii DNS
Protocolul DNS defineste 2 tipuri de rezolutii sau translatii.
1. Rezolutia directa
Presupune translatarea unui nume de domeniu in IP. Se foloseste RR de tip A.
Nota
Exemplu de query trimis de client la server este: www.test.com A
2. Rezolutia inversa
Presupune transformarea adreselor IP in nume de domeniu. Rezolutia directa si
inversa sunt doua concepte diferite. Cu ajutorul protocolului DNS NU se realizeaza
echivalente intre domenii si IP ci doar corespondente intr-un singur sens. Astfel nu orice
nume de domeniu care se rezolva intr-un IP se poate rezolva si invers adica IP-ul sa rezolve
sau sa se translateze in domeniu.
Pentru rezolutia inversa se foloseste un domeniu special si anume in-addr.arpa.
Acesta are ca subdomenii (noduri) octetii corespunzatori adresei IP scrisi de la stanga la
dreapta.
Nodul in-addr.arpa. poate avea 255 subdomenii, iar fiecare nod mai departe poate
avea 256 subdomenii. Numerele de mai sus sunt aproximative fiindca exista IP-uri
rezervate. Pentru rezolutia inversa se solicita serverului un Resource Record (RR) de tip-ul
PTR.
Nota
Exemplu de query pentru rezolutia inversa trimis de client la server este: 191.17.1.1 PTR
6.1.6 RR (Resource Records)
Serverul DNS foloseste o baza de date in care pastreaza informatiile pe care le va
furniza clientilor pentru un anumit domeniu pentru care este autoritativ. Tipurile de
informatii pe care le pastreaza un server DNS autoritativ pentru un domeniu in fisierul zona
al acelui domeniu se numesc Resource Records (RR).
Tipuri de RR.
SOA
Start of Authority - declara serverul autoritativ pentru acea zona. In fiecare
fisier zona trebuie sa existe un RR de tip SOA. Poate fi unul singur pentru o
zona. Este obligatoriu sa se gaseasca in fiecare fisier zona.
NS
Name server - declara numele serverului autoritativ pentru acel domeniu. Este
obligatoriu sa se gaseasca in fiecare fisier zona.
A
IPv4 Address - Declara o corespondenta intre domeniu si IP (rezolutie directa)
PTR
Pointer - declara o echivalanta intre IP si domeniu (rezolutie inversa). Acest
RR este optional
CNAME
Canonical Name - declara un alias al unei resurse. Un alias reprezinta un alt
nume pentru acelasi lucru. Acest RR este optional
MX
Mail Exchanger - declara un server de e-mail pentru acea zona. Se foloseste
impreuna cu o prioritate (preferinta ) care poate fi intre 0 si 65535. Cu cat nr.
este mai mic cu atat serverul este de preferat. Se pot seta astfel servere de
Backup. Acest RR este optional.
6.2 Serverul BIND
6.2.1 Compilare si instalare
Instalarea prin compilare a BIND-ului se realizeaza in mod standard fara probleme
deosebite. Exemplu de mai jos s-a realizat pe Fedora Core 9. In mod IDENTIC se
compileaza si instaleaza pe orice distributie Linux.
Pasi de urmat:
1. Download sursele ultimei versiuni BIND de pe site-ul producatorului www.isc.org. Acestea
pot fi downloadate in orice director din sistem. Se ruleaza: wget http://ftp.isc.org/isc/bind9/9.5.0-P2/bind9.5.0-P2.tar.gz
2. Verificare integritate arhiva tar.gz folosind hash-ul sau semnatura digitala (Optional dar
foarte recomandat)
3. Decomprimare si dezarhivare arhiva
Se ruleaza: tar -xzvf bind-9.5.0-P1.tar.gz
4. Rularea scriptului configure verifica sistemul si anume daca acesta contine toate
componentele necesare compilarii si instalarii serverului DNS. Dorim instalarea in
directorul /opt/bind astfel incat sa putem urmari si studia toate componentele cu care vine
BIND. Se recomanda rularea scriptului configure de catre un user neprivilegiat.Se ruleaza:
./configure --prefix=/opt/bind
Nota
Fara optiunea --prefix=/opt/bind instalarea are loc in directoarele standard precum /usr/bin,
/usr/sbin, /etc. In acest caz ne va fi greu sa gasim fisierele componente ale serverului sau
sa-l dezinstalam/stergem.
5. Compilare
Se recomanda compilarea oricarei aplicatii de catre un user neprivilegiat.
In urma compilarii rezulta din fisierele sursa fisiere executabile.
Se ruleaza: make
6. Instalare
Instalarea presupune doar mutarea fisierelor executabile rezultate in urma compilarii din
directorul cu surse in directorul dorit ( /opt/bind). Comanda poate fi executata doar de root.
Se ruleaza: make install
6.3 Configurare BIND
6.3.1 Aspecte generale
In urma compilarii si instalarii serverului DNS in directorul /opt/bind sunt formate
mai multe subdirectoare care contin fisierele necesare functionarii serverului DNS BIND.
Dintre cele mai importante enumeram:
/opt/bind/bin - contine utilitare pentru testarea functionalitatii serverului precum dig, host,
nslookup nsupdate
/opt/bind/include - contine headere care contin constante si alte date necesare
/opt/bind/lib - contine librarii necesare serverului
/opt/bind/man - contine man page-uri pentru utilitarele cu care a venit pachetul BIND
/opt/bind/sbin - contine daemonul dns reprezentat prin fisierul named precum si alte
utilitare dintre care cele mai importante:
rndc - utilitar de control al serverului (start, restart, stop etc)
rndc-confgen - utilitar de configurare al modului de comunicare intre rndc si server
named-checkconf - utilitar de validare a fisierului de configurare named.conf
named-checkzone - utilitar de validare a fisierelor zona
Configurarea serverului DNS BIND pentru un domeniu autoritativ presupune:
1. Editarea fisierului global de configurare numit named.conf care se gaseste in
/opt/bind/etc. In acest fisier se definesc aspecte care tin de functionarea generala a
serverului precum si referire la zonele/domeniile pentru care serverul este autoritativ
Nota
In cazul in care instalam serverul dintr-un pachet binar deja compilat precum rpm sau deb
sau daca il compilam fara optiunea --prefix a scriptului configure, fisierul global de
configurare named.conf se va gasi cel mai probabil in /etc
2. Crearea si editarea fisierelor zona pentru domeniile pentru care serverul este autoritativ.
Exista un fisier zona pentru fiecare domeniu autoritativ
3. Alte configurari specifice cum ar fi controlul logurilor, controlul accesului etc.
6.3.2 Master pentru domeniu autoritativ
In exemplul nostru ne propunem configurarea serverului ca autoritativ pentru
domeniul invata-linux.ro.
Configurea serverului BIND ca master pentru un domeniu autoritativ presupune:
1. Editarea fisierului global de configurare named.conf
Detalii named.conf:
- fiecare linie se termina cu ";" (punct si virgula)
- sintaxa este extrem de sensibila, orice caracter precum ; (punct si virgula) lipsa reprezinta
o eroare fatala;
- fisierul contine 2 sectiuni, sectiunea globala care se refera la modul de functionare al
intregului server si care se defineste in containerul options si sectiunea zonelor pentru care
serverul este autoritativ;
- directiva directory din options defineste un director in care serverul va cauta fisierele la
care ne referim in continuare folosind calea relativa; Exemplu: daca ne referim la fisierul
zoneInvata-linux.ro, serverul il va cauta in /opt/bind/etc;
- pentru fiecare zona pentru care serverul este autoritativ trebuie sa specificam numele
zonei, faptul ca serverul este master sau slave precum si numele fisierului zona (in
exemplul nostru zoneInvata-linux.ro). Numele fisierului poate fi ales fara vreo restrictie;
- ultima linie se refera la o cheie folosita pentru comunicatia dintre rndc si named. Pentru a
genera cheia se foloseste comanda /opt/bind/sbin/rndc-confgen -a;
Exemplu named.conf minimal
options{
directory "/opt/bind/etc";
};
zone "invata-linux.ro"
{
type master; file "zoneInvata-linux.ro";
};
include "/opt/bind/etc/rndc.key";
2. Crearea si editarea fisierului zona pentru respectivul domeniu
Detalii fisier zona pentru domeniu invata-linux.ro:
- fisierul zona este format din linii care contin:
nume_domeniu tip_RR valoare_RR
Exemplu:
ns1.invata-linux.ro.
www
A
A
192.168.0.1
192.168.0.1
- in intreg fisierul zona, numele de domenii trebuie sa fie FQDN si sa se termine cu punct
(domeniu root)
Exemplu:
login.invata-linux.ro.
A
192.168.0.1
In momentul in care un domeniu nu se termina cu punct, acesta este considerat un
subdomeniu al domeniului pentru care serverul este autoritativ (se adauga ca sufix intreg
domeniul)
Exemplu:
www
A
192.168.0.1
este echivalent cu
www.invata-linux.ro.
A
192.168.0.1
- @ este un caracter special si reprezinta FQDN. In cazul nostru @ se inlocuieste cu invatalinux.ro.
- in fisierul zona conteaza indentarea
Exemplu:
@ SOA ns1.invata-linux.ro. admin.invata-linux.ro. (
3
3h
5m
3w
1h )
NS ns1.invata-linux.ro.
MX 10 mail.invata-linux.ro.
Fiindca pe linia care contine RR NS este liber pe prima pozitie (pozitie rezervata
numelui de domeniu), se preia automat numele de domeniu de deasupra adica @ care
reprezinta invata-linux.ro.
In exemplu nostru NS ns1.invata-linux.ro. este echivalent cu invata-linux.ro. NS
ns1.invata-linux.ro. Echivalent si pentru RR-ul MX. Nr. 10 de pe linia care defineste MX
reprezinta prioritatea serverului de e-mail. In cazul in care se definesc mai multe servere de
e-mail pentru domeniu in scop de backup cel cu prioritate minima va fi folosit.
Atentie: valoarea resursei MX nu poate fi definita ca CNAME. Acesteia trebuie sa i
se ataseze o resursa de tip A. In tutorialul video in mod intentionat a fost definit domeniul
mail.invata-linux.ro. ca CNAME (alias) al lui www rezultand astfel o eroare.
Exemplu fisier zona pentru domeniul invata-linux.ro. Fisierul se numeste zoneInvata
linux.ro
$TTL 3h;
@ SOA ns1.invata-linux.ro. admin.invata-linux.ro. (
3 ;serial
3h ;refresh in 3 hours
5m ;retry in 5 minutes
3w ;expire in 3 weeks
1h ;min in 1 hour )
NS ns1.invata-linux.ro.
MX 10 mail.invata-linux.ro.
ns1.invata-linux.ro. A 192.168.0.16
invata-linux.ro. A 192.168.0.16
mail A 192.168.0.1
www CNAME mail
pc1 A 192.168.0.11
pc2 A 192.168.0.12
Cei 5 timpi au urmatoarea semnificatie:
serial = orice nr. intre 0 zi 4294967295. Trebuie modificat de fiecare data cand se modifica
fisierul zona
refresh = timpul dupa care serverele slave vor incerca sa reciteasca fisierul zona de pe
master
retry = timpul dupa care serverele slave vor incerca sa faca retry la citirea zonei de pe
master daca are loc o eroare
expire = timpul dupa care serverul slave nu mai este autoritativ pentru o zona. Are efect in
cazul in care nu poate face zone-tranfer. Nu va mai raspunde la query pentru acea zona
min = perioanda de timp in care negative response sunt pastrate in cache. In aceasta
perioada slave-ul raspunde NXDOMAIN. Dupa ce perioada expira incerca din nou
interogarea masterului.
6.3.3 Rezolutia inversa
Rezolutia inversa presupune translatarea de catre serverul DNS a IP-urilor in nume
de domenii. Rezolutia inversa nu este obligatorie, dar se recomanda in anumite cazuri.
Exemplu: Daca exista un server de email
Configurarea serverului pentru rezolutie inversa pentru domeniu autoritativ presupune:
1. Definirea unei noi zone in named.conf si anume zona pentru rezolutia inversa In
named.conf se adauga:
zone "0.168.192.in-addr.arpa"{
type master;
file "zone192.168.0.0"; };
2. Crearea si editarea unui fisier zona pentru rezolutia inversa
Detalii:
- ca si in cazul fisierului zona pentru rezolutia directa sunt obligatorii RR-urile SOA si NS.
In plus apare RR-ul PTR folosit special pentru translatia ip-ului in nume de domeniu;
Fisier zona pentru rezolutia inversa. Acesta este zone192.168.0.0:
@ SOA ns1.invata-linux.ro. root.invata-linux.ro (
1
1h
2h
3h
1h )
NS ns1.invata-linux.ro.
1
PTR
www.invata-linux.ro.
1
PTR
mail.invata-linux.ro.
11
PTR
pc1.invata-linux.ro.
12
PTR
pc2.invata-linux.ro.
Detalii:
randul: 1 PTR www.invata-linux.ro. este echivalent cu 1.0.168.192.in-addr.arpa PTR
www.invata-linux.ro, fiindca numele domeniului si anume 1 nu este FQDN, caz in care i se
adauga ca sufix zona pentru care este serverul autoritativ si anume 0.168.192.in addr.arpa
www.invata-linux.ro se va translata in 192.168.0.1, iar pc2.invata-linux.ro se va translata in
192.168.0.12
6.3.4 Server Slave
Configurarea unui server DNS slave autoritativ pentru un domeniu presupune:
- editarea fisierului global de configurare named.conf al acestuia;
- editarea fisierului global de configurare al masterului astfel sa permita conectarea
serverului slave pentru copierea fisierului zona pentru domeniu (zone transfer);
Exemplu named.conf pentru slave:
options {
directory "/opt/bind/etc"; };
zone "invata-linux.ro" {
type slave;
file "zoneInvata-linux.ro";
masters { 192.168.0.13; };
};
192.168.0.13 reprezinta IP-ul serverului Master.
In fisierul named.conf al masterului in cadrul containerului options trebuie adaugat:
allow-transfer { 192.168.0.15; };
Serverul master permite serverului slave cu IP-ul 192.168.0.15 sa se conecteze pentru zone
trasfer.
Astfel named.conf al serverului master devine:
options
{ directory "/opt/bind/etc";
allow-transfer { 192.168.0.15; };
};
zone "invata-linux.ro" {
type master;
file "zoneInvata-linux.ro";
};
include "/opt/bind/etc/rndc.key";
Nota
Fisierul zona pentru slave nu trebuie creat/editat de catre admin. Acesta este copiat
automat de pe master in momentul in care slave-ul face zone transfer. Slave-ul are o copier
read-only a fisierului zona.
Orice modificare a fisierului zona are loc pe master si trebuie sa fie insotita de
incrementarea numarului serial pentru zona respectiva.
Slave-ul face zone transfer doar daca fisierul zona de pe master are numarul serial mai
mare decat copia locala de pe slave.
Important
Acelasi server poate sa fie master pentru un domeniu sau mai multe si slave pentru alte
domenii.
6.3.5 Delegare
Cerinta: se doreste delegarea autoritatii pentru subdomeniul servers.invata-linux.ro unui
alt server.
Implementare:
- in fisierul zona al serverului autoritativ pentru domeniul invata-linux.ro se adauga un RR
de tip NS care indica numele serverului catre care se deleaga autoritatea ( Exemplu:
ns1.servers.invata-linux.ro)
- in acelasi fisier zona se adauga un RR de tip A pentru numele serverului catre care se face
delegarea si anume ns1.servers.invata-linux.ro
In fisierul zona al serverului autoritativ pentru domeniul invata-linux.ro adaugam:
servers.invata-linux.ro.
NS
ns1.servers.invata-linux.ro.
ns1.servers.invata-linux.ro.
A
192.168.0.111
Important
Serverul catre care s-a realizat delegarea trebuie configurat pentru domeniul servers.invatalinux.ro in acelasi mod in care serverul principal a fost configurat pentru domeniul invatalinux.ro
Nota
Presupunem cumpararea unui domeniu ro si anume crystalmind.ro
Serverul autoritativ pentru domeniul ro trebuie sa delege autoritatea catre noul subdomeniu
crystalmind.ro
In formularul de la www.rotld.ro ne sunt cerute urmatoarele informarii: numele serverului
autoritativ pentru domeniul crystalmind.ro si IP-ul acestuia. Presupunand ca furnizam ca
informatie ns1.crystalmind.ro si 88.0.0.1, administratorul domeniului ro adauga in fisierul
zona al acestuia:
crystalmind.ro.
NS
ns1.crystalmind.ro.
ns1.crystalmind.ro.
A
88.0.0.1
6.3.6 Logging
Serverul BIND este extrem de complex de multe ori fiind foarte complicat sa facem
troubleshooting. Un aspect foarte important in vederea procesului de troubleshooting
reprezinta logarea/salvarea informatiilor despre modul in care acesta functioneaza.
Nota
Unii administratori de sistem logheaza toate cererile clientilor catre serverul DNS ceea ce
poate fi interpretat ca o incalcare a dreptului la intimitate. Salvand toate query-urile catre
server avem informatii despre fiecare web site vizitat, frecventa cu care un user intra pe un
site, domeniile unde userul are cont de email, nr. de accesari al acestuia etc
Pentru logarea activitatii BIND trebuie:
- modificare named.conf;
- modificare fisier configurarea syslog (serverul responsabil cu procesul de logare din
intreg sistemul);
In named.conf se adauga:
logging
{ channel my_syslog
{ syslog local1;
severity info; };
category queries { my_syslog; };
category default { my_syslog; };
};
In /etc/syslog.conf se adauga:
local1.info /var/log/bind
Nota
Pentru ca modificarile sa fie preluate, ambele servere (Syslogd si Bind) trebuie restartate
Syslog este prezentat in capitolul "Managementul Logurilor".
6.4 DNS Troubleshooting
6.4.1 nslookup
nslookup este un utilitar care are drept scop interogarea manuala a serverelor DNS.
Se foloseste in scop de troubleshooting si pentru aflarea de informatii despre diferite
domenii
Exemplu
Serverul DNS default este cel configurat in /etc/resolv.conf
1. Interogheaza serverul DNS default cerand valoarea resursei de tip A pentru domeniu
nslookup www.crystalmind.ro
2. Interogheaza serverul default folosind rezolutia inversa (translatarea IP-ului in domeniu)
nslookup 192.168.0.1
3. Interogheaza un alt server DNS si anume cel de la IP-ul 88.0.0.1
nslookup crystalmind.ro 88.0.0.1
4. Interogheaza un alt server (cel de la 88.0.0.1) folosind rezolutia inversa (translatarea IPului 64.233.167.99)
nslookup 64.233.167.99 88.0.0.1
5. Interogheaza serverul DNS de la 193.25.112.245 pentru valoarea resursei de tip MX
nslookup -type=MX mail.crystalmind.ro 193.25.112.246
6. Modul interactiv al lui nslookup
nslookup -all
> www.domeniu.com
>mail >192.168.0.1
>server DNS_SERVER_IP //urmatoarele interogari vor fi facute catre acest server
> set type=soa
> ro
>set type=mx
>crystalmind.ro
Important
Comanda nslookup exista si pe Windows, iar sintaxa este identica.
6.4.2 dig
dig este un utilitar complex cu foarte multe optiuni folosit pentru interogarea
manuala a unui server DNS.
Exemplu
1. Interogarea serverului DNS care ruleaza pe localhost (translatarea domeniului
www.cma.ro in IP)
dig @localhost www.cma.ro
2. Interogarea serverului DNS care ruleaza la 88.0.0.1 (translatarea domeniului
www.cma.ro in IP)
dig @88.0.0.1 www.cma.ro 3. Interogarea de tip rezolutie inversa a serverului care ruleaza
pe localhost (translatarea IP-ului 192.167.34.2 in domeniu)
gig @localhost -x 192.167.34.2
4. Interogarea serverului care ruleaza la 88.0.0.1 despre resursa de tip MX a domeniului
crystalmind.ro
dig @88.0.0.1 -t mx crystalmind.ro
Dig output
Flags:
qr = query response
aa = authoritative answer
rd = recursion desired
ra = recursion available
ad = authenticated data (DNSSEC)
DNS status:
NOERR = No error
FORMERR = Format error. serverul DNS nu a putut interpreta query
SERVFAIL = Server fails. Serverul nu a putut satisface cererea datorita unor erori.
NXDOMAIN = Name error. Domeniul din query nu exista.
NOTIMP = Not implemented.
REFUSED
Capitolul 7 Serverul Apache
7.1 Protocolul HTTP
HTTP (Hypertext Transfer Protocol) reprezinta un protocol la nivel de aplicatie
care defineste modalitatea de comunicatie dintre un server care implementeaza protocolul
HTTP si un client. Dintre serverele HTTP cele mai folosite sunt Apache si Microsoft IIS,
iar dintre clientii HTTP Mozilla Firefox, Internet Explorer si Opera.
Dezvoltarea protocolului HTTP a fost coordonata de organizatia W3C (World Wide
Web Consortium) care a culminat cu publicarea a o serie de RFC-uri de catre IETF dintre
care RFC2616 defineste HTTP/1.1
Protocolul HTTP este cel care a dus la formarea World Wide Web care reprezinta o
colectie de documente interconectate prin link-uri.
Nota
Un server HTTP se mai numeste si server web. Un client HTTP se mai numeste si
Browser.
Rolul unui server WEB este de a translata adrese numite URL-uri cerute de browser
in fisiere si trimiterea continutului acestora prin retea (Internet sau LAN) la client.
Protocolul HTTP foloseste default portul TCP/80. Acesta este portul pe care serverul web
asculta dupa conexiuni de la clienti.
Un URL (Uniform Resource Locator) este format din:
<scheme>://<host>/<path>
<scheme> reprezentat de http ceea ce indica protocolul folosit de client si server;
<host> reprezinta numele sau IP-ul serverului WEB la care se conecteaza browserul cum
ar fi www.crystalmind.ro sau 88.0.0.1;
<path> reprezinta calea catre fisierul cerut de client relativ la DocumentRoot;
Browserul primeste de la server DOAR continut text formatat dupa standardul
HTML. Folosind plugin-uri speciale clientul poate primi si un fisier non-text in format
binar precum flash, audio, video, pdf etc
Important
DocumentRoot reprezinta un termen generic dar si o directiva de configurare a unui
server web care reprezinta un director din sistemul de fisiere al serverului de unde acesta va
servi fisierele cerute de clientii.
Exemplu
Daca DocumentRoot este directorul /var/web, iar un client se conecteaza la server folosit
schema http://www.crystalmind.ro/cursuri/linux.html, atunci serverul va translata
http://www.crystalmind.ro/cursuri/linux.html in /var/web/cursuri/linux.html si va incerca sa
livreze fisierul clientului.
HTTPS
HTTP este un protocol text (tot ceea ce transmite serverul clientului este text in
format HTML) si in clar (informatia nu se cripteaza).
Odata cu dezvoltarea exploziva a web-ului si cu aparitia de servicii critice care
folosesc HTTP (online banking, online shopping etc) modul in clar de operare a HTTP-ului
a inceput sa reprezinta un mare dezavantaj. Informatia dintre client si server poate fi usor
interceptata folosind un simplu sniffer precum tcpdump sau wireshark.
HTTPS inseamna HTTP Secure sau HTTP over SSL (Secure Socket Layer) si este
un protocol cu acelasi scop ca si HTTP la care comunicatia dintre client si server este
criptata folosind SSL/TLS.
Initializarea unei sesiuni criptate presupune folosirea schemei https in loc de http
ceea ce are ca efect conectarea la serverul web pe portul tcp/443 in loc de tcp/80.
Exemplu: https://mail.google.com
7.2 Prezentare generala server
Apache reprezinta un server care implementeaza protoculul HTTP (Hyper Text
Transfer Protocol) si care ruleaza pe mai toate sistemele de operare (Windows, Linux,
Unix, BSD, MacOS etc). Este cel mai folosit server web din lume fiind instalat pe zeci de
milioane de hosturi. Cota sa de piata variaza intre 60-70%.
Dintre cele mai populare web site-uri care ruleaza Apache enumeram: Google
(ruleaza o versiune putin modificata de Apache numita GWS - Google Web Server), Cisco
Systems, Wikipedia etc
Apache a pornit ca un proiect al National Center for Supercomputing Applications
(NCSA) pentru crearea unui server web. In momentul in care coordonatorul de proiect
Robert McCool a parasit NCSA in 1994, dezvoltarea proiectului a fost sistata. Ulterior
ceilalti membri ai echipei au infiintat "Apache Group" si au continuat dezvoltarea
serverului.
Initial aplicatia s-a numit NCSA HTTPd.Din punct de vedere istoric numele
Apache are 2 radacini:
1. Conform cu FAQ de la Apache Group: The name 'Apache' was chosen from respect for
the Native American Indian tribe of Apache, well-known for their superior skills in warfare
strategy and their inexhaustible endurance.
2. Fiind bazat pe cod initial (de la NCSA) serverul s-a dezvolatat prin adaugarea de patchuri. (a patchy server)
7.3 Compilare si instalare
Instalarea prin compilare a Apache-ului se realizeaza in mod standard fara
probleme deosebite. Exemplu de mai jos s-a realizat pe Fedora Core 9. In mod IDENTIC
se compileaza si instaleaza pe orice distributie Linux.
Pasi de urmat:
1.Download sursele ultimei versiuni Apache de pe site-ul producatorului httpd.apache.org.
Acestea pot fi downloadate in orice director din sistem.
Se ruleaza: wget http://mirrors.evolva.ro/apache.org/apache-dist/httpd/httpd-2.2.9.tar.bz2
2. Verificare integritate arhiva tar.bz2 folosind hash-ul sau semnatura digitala (Optional dar
foarte recomandat)
3. Decomprimare si dezarhivare arhiva. Se ruleaza: tar -xjvf httpd-2.2.9.tar.bz2
4. Rularea scriptului configure care verifica sistemul si anume daca acesta contine toate
componentele necesare compilarii si instalarii serverului Apache. Dorim instalarea in
directorul /opt/apache astfel incat sa putem urmari si studia toate componentele cu care
vine serverul. Se recomanda rularea scriptului configure de catre un user neprivilegiat. Se
ruleaza din directorul cu surse: ./configure --prefix=/opt/apache --enable-so --enable-mods
shared=all
Nota
Fara optiunea --prefix=/opt/apache instalarea are loc in directoarele standard precum
/usr/bin, /usr/sbin, /etc. In acest caz ne va fi greu sa gasim fisierele componente ale
serverului sau sa-l dezinstalam/stergem.
Optiunea --enable-so are rolul de a compila serverul cu suport modular, iar optiunea
enable-mods-shared=all are rolul de a compila toate modulele disponibile. Acestea se vor
gasi in directorul /opt/apache/modules si trebuie incarcate la pornirea serverului pentru ca
acesta sa se foloseasca de functionalitatea oferita de acestea.
Scriptul configure al serverului are foarte multe optiuni de compilare.Pentru vizualizarea
tuturor optiunilor se poate rula din directorul cu surse ./configure --help | less
5. Compilare
Se recomanda compilarea oricarei aplicatii de catre un user neprivilegiat. In urma
compilarii rezulta din fisierele sursa fisiere executabile. Se ruleaza: make
6. Instalare
Instalarea presupune doar mutarea fisierelor executabile rezultate in urma compilarii din
directorul cu surse in directorul dorit ( /opt/apache). Comanda poate fi executata doar de
root. Se ruleaza: make install
Nota
Dupa instalare se recomanda editarea fisierului /etc/man.config pentru includerea man
page-urilor utilitarelor venite odata cu instalarea serverului.In /etc/man.config se adauga:
MANPATH /opt/apache/man
7.4 Structura Apache
In mod standard o versiune compilata a serverului contine in directorul reprezentat
prin ServerRoot (in cazul nostru /opt/apache) urmatoarele directoare si utilitare:
- bin - contine daemonul httpd (serverul web) precum si alte utilitare cum ar fi apachectl
folosit pentru controlul serverului si anume pornirea, oprirea sau restartarea acestuia,
httpasswd folosit pentru crearea de useri pentru accesul restrictionat la anumite directoare,
ab folosit pentru benchmarking, apxs (APache eXtenSion tool) folosit pentru extinderea
functionalitatii Apache prin compilarea de noi module, logrotate folosit pentru rotirea
logurilor etc;
- man - contine man pages (help-ul oficial) pentru aplicatiile instalate ( httpd, apachectl,
htpasswd etc);
- htdocs - contine fisierele care vor fi servite clientilor. Acest director si toate de sub el
poata denumirea generica de WebSpace si sunt accesibile tuturor (Atentie Securitate!).
Directorul /opt/apache/htdocs este default DocumentRoot;
- logs - contine logurile serverului Apache. Exista 2 fisiere importante access_log si
error_log;
- cgi-bin - contine scripturi CGI (Common Gateway Interface);
- conf - contine fisiere de configurare dintre care cel mai important este httpd.conf;
- modules - contine module DSO (Dynamic Shared Objects) reprezentate prin fisiere
executabile ce sunt incarcate de server la pornire pentru a-si extinde functionalitatea;
- manual - contine manualul de utilizare si configurare al serverului in format HTML;
- error - contine fisiere care reprezinta pagini HTML ce vor fi servite clientilor in caz de
eroare standard. Fiecare eroare standard are un cod unic ( Exemplu: 404 - Page not found);
Nota
Apache poate fi compilat modular sau nemodular. In primul caz functionalitatea sa se
gaseste in fisiere speciale numite module. In al doilea caz functionalitatea sa se afla chiar
in daemonul httpd. Pentru a afisa modulele compilate in daemon se ruleaza:
/opt/apache/bin/httpd -l.
In cazul in care Apache se compileaza modular (optiunea --enable-so a scriptului
configure), modulele se gasesc in directorul /opt/apache/modules (si mai corect in
directorul numit modules din directorul reprezentat de directiva ServerRoot care este in
cazul nostru /opt/apache). Daca acesta este gol cu toate ca s-a dorit compilarea modulara
inseamna cel mai probabil o optiune eronata a scriptului configure.
7.4.1 Configurare Apache
Configurarea serverului Apache presupune editarea fisierului de configurare
httpd.conf sau a altor fisiere care ulterior sunt incluse in acesta.
Exista peste 300 de directive de configurare, iar fiecare directiva este introdusa de
un anumit modul (daca serverul a fost compilat modular), deci directiva exista si poate fi
folosita in masura in care modulul a fost incarcat in server.
Un modul este reprezentat printr-un fisier executabil din directorul modules din
ServerRoot (Exemplu: /opt/apache/modules).
Pentru ca serverul sa incarce un modul, in httpd.conf trebuie adaugat in acesta:
LoadModule NUME_MODUL
CALEA_CATRE_FISIERUL_CARE_REPREZINTA_MODULUL
Exemplu:
LoadModule alias_module modules/mod_alias.so
Fisierul de configurare este citit de catre Apache doar la pornire (ca la toate
serverele Linux de altfel). Orice modificare in fisierul de configurare presupune restartarea
serverului.
Serverul se porneste, opreste sau restarteaza folosind utilitarul apachectl din
directorul /opt/apache/bin. Acesta primeste ca parametri start, stop sau restart.
Exemplu:
cd /opt/apache/bin
./apachectl restart
7.4.2 Configurare Minimala
Configurarea serverului Apache presupune editarea fisierului de configurare
httpd.conf. In general se porneste de la un schelet de fisier cu care serverul "vine" in mod
default.
Important
Serverul Apache este extrem de complex. O intelegere aprofundata a modului in care
acesta opereaza poate fi dobandita numai dupa foarte multa de experienta. Pentru un server
in productie, modificarea fisierului de configurare trebuie facuta cu grija dupa intelegerea
rolului si scopului fiecarei directive pe care o modificam.
In primele randuri ale fisierului mostra httpd.conf gasim un avertisment din partea
Apache Group: "Do NOT simply read the instructions in here without understanding what
they do. They're here only as hints or reminders. If you are unsure consult the online docs.
You have been warned."
Configurarea minimala a serverului presupune:
- modificarea ServerRoot cu directorul in care acesta este instalat;
- stabilirea IP-ului si portului pe care asculta serverul: directiva Listen;
- stabilirea userului si grupului sub care ruleaza serverul: directivele User si Group. Acestea
nu trebuie sa fie sub nicio forma useri generici folositi si de alte servere. Trebuie creat un
user si un group pentru Apache care sa nu mai fie folosit in alt scop;
- modificarea ServerName cu numele sau IP-ul serverului;
- stabilirea DocumentRoot, directorul din care serverul va furniza fisiere clientilor;
- stabilirea fisierelor default pe care serverul le ofera clientilor: directiva DirectoryIndex;
- configurarea modului de logare, fisierele in care serverul salveaza logurile si cantitatea de
informatii logata;
- alte configuratii cum ar fi documentele standard de eroare etc;
7.4.3 Directive principale
1. Adresa si portul pe care va asculta serverul.
Listen 192.168.0.13:80
In cazul in care serverul are mai multe interfete si deci IP-uri si se doreste ca
Apache sa asculte pe toate interfetele se foloseste: Listen *:80
2. Userul si grupul sub care ruleaza Apache
User wwwuser Group wwwgroup
3. Numele folosit de server pentru a se identifica clientilor. Valoarea directivei ServerName
este in mod normal numele serverului ( Exemplu: www.crystalmind.ro). Se poate folosi si
adresa IP.
ServerName 192.168.0.13:80
4. Directiva ServerRoot reprezinta directorul in care se gaseste Apache si toate fisierele
necesare lui. Daca pe viitor in fisierul de configurare NU se va folosi o cale absoluta si o
cale relativa aceasta va fi adaugata la ServerRoot.
ServerRoot /opt/apache
Exemplu: dir1/access inseamna /opt/apache/dir1/access
5. Directorul din care Apache va servi continut clientilor. Acesta este Webspace-ul. Se
poate folosi directiva Alias pentru a indica alte locatii DocumentRoot /opt/apache/htdocs
6. Modulul dir_module introduce directiva DirectoryIndex.
DirectoryIndex reprezinta fisierul servit default clientilor in momentul in care acestia nu
specifica in mod express un fisier.
Exemplu: daca DirectoryIndex are valoarea index.php, iar un client se conecteaza la server
folosind http://www.crystalmind.ro, serverul va furniza clientului fisierul index.php din
DocumentRoot ca si cand acesta s-ar fi conectat la server folosind
http://www.crystalmind.ro/index.php
LoadModule dir_module modules/mod_dir.so <IfModule dir_module> DirectoryIndex
index.html index.php home.php </IfModule>
7. Directiva IndexOptions genereaza index-ul unui director automat, asemanator comenzii
ls. Directiva este introdusa de autoindex_module
LoadModule autoindex_module modules/mod_autoindex.so IndexOptions
FancyIndexing FoldersFirst IndexIgnore *.jpeg
8. Directivele Alias si ScriptAlias se folosesc pentru a mapa un URL cu un director din
sistemul de fisiere care se gaseste in afara directorului definit de DocumentRoot.
Browserul poate accesa astfel fisiere din afara lui DocumentRoot. Directiva ScriptAlias se
foloseste daca directorul target contine doar scripturi CGI. Cele 2 directive sunt introduse
de alias_module care trebuie incarcat.
LoadModule alias_module modules/mod_alias.so Alias /icons /var/apache/images
Alias se foloseste pentru a mapa o resursa din webspace cu una locala, iar Redirect
pentru a mapa o resursa cu una remote. Directiva Redirect este introdusa de mod_alias
Redirect /help http://www.invata-online.ro
9. Directiva ErrorLog stabileste fisierul in care serverul va salva mesajele de eroare. Foarte
util pentru troubleshooting si debugging.
ErrorLog logs/error_log
#LogLevel: Control the number of messages logged to the error_log.
#Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn
10. Directiva ErrorDocument specifica fisierul sau mesajul pe care serverul il returneaza in
caz de eroare standard. Fiecare eroare este identifica printr-un cod.
#Modificarea paginilor default care vor fi furnizate in caz de eroare
ErrorDocument 500 "The server made a boo boo."
ErrorDocument 404 "Lipseste!"
#ErrorDocument 404 http://www.google.com
#ErrorDocument 404 /missing.html
ErrorDocument 402 http://www.example.com/subscription_info.html
Nota
Apache status return codes (lista incompleta):
400 Bad Request - HTTP_BAD_REQUEST
401 Authorization Required - HTTP_UNAUTHORIZED
402 Payment Required - HTTP_PAYMENT_REQUIRED
403 Forbidden - HTTP_FORBIDDEN
404 Not Found - HTTP_NOT_FOUND
405 Method Not Allowed - HTTP_METHOD_NOT_ALLOWED
406 Not Acceptable - HTTP_NOT_ACCEPTABLE
407 Proxy Authentication Required
HTTP_PROXY_AUTHENTICATION_REQUIRED
408 Request Time-out - HTTP_REQUEST_TIME_OUT
409 Conflict - HTTP_CONFLICT
410 Gone - HTTP_GONE
411 Length Required - HTTP_LENGTH_REQUIRED
413 Request Entity Too Large - HTTP_REQUEST_ENTITY_TOO_LARGE
414 Request-URI Too Large - HTTP_REQUEST_URI_TOO_LARGE
500 Internal Server Error - HTTP_INTERNAL_SERVER_ERROR
501 Method Not Implemented - HTTP_NOT_IMPLEMENTED
503 Service Temporarily Unavailable - HTTP_SERVICE_UNAVAILABLE
505 HTTP Version Not Supported - HTTP_VERSION_NOT_SUPPORTED
11. Pentru a seta optiuni pentru un anumit director din WebSpace se folosesc directive in
cadrul unui container de tipul <Directory>
<Directory directorul_caruia_ii_setam_optiunile> Optiune1 Optiune2 </Directory>
Exemplu:
<Directory
/opt/apache/htdocs/docs>
Options Indexes FollowSymLinks
#apartine modulului core si poate sa apara doar in <Directory> global. Specifica directivele
care pot aparea in .htaccess si suprascriu directivele din contextul global sau <Directory>.
Daca AllowOverride este NONE, serverul nici macar nu va mai incerca sa citeasca
.htaccess AllowOverride ALL
</Directory>
Important
.htaccess este un fisier special care se foloseste pentru a seta optiuni pentru un director din
WebSpace. La pornire serverul scaneaza directoarele din WebSpace pentru fisierul
.htaccess si incarca directive folosite in acesta. Este modalitatea prin care se pot seta
optiune pentru diferite directoare fara a modifica fisierul global de configurare httpd.conf.
Nu orice directiva poate fi folosita in .htaccess.
Deci pentru a seta optiuni pentru un director acestea pot sa apara in fisierul global de
configurare (doar root il poate modifica) sau intr-un fisier numit .htaccess in directorul
respectiv (orice user cu drepturi de scriere pe director poate crea si modifica .htaccess).
12. Directiva FilesMatch se foloseste de cele mai multe ori pentru restrictionarea accesului
la anumite fisiere.
Exemplu: se doreste configurarea serverului astfel incat acesta sa nu transmita clientilor
anumite fisiere cum ar fi imagini sau documente.
Poate fi folosita si in .htaccess (in contrast cu <Directory> si <Location> care nu
pot fi folosite in .htaccess) Permite folosirea de regular expressions. Este echivalenat cu
directiva <Files>, dar de preferat. Daca se foloseste <Files>, stringul care trebuie "prins" de
regular expression trebuie precedat cu "~" (tilda).
<FilesMatch "^\.ht">
Order allow,deny Deny from all
</FilesMatch>
<Files ~ "\.(gif|jp?g|png)$">
Order allow,deny Allow from 192.168.0.2
</Files>
Pentru detalii despre directivele Order, Allow si Deny cititi capitolul "Controlul
accesului la resurse" a acestui curs.
13. Modulul mime_module se foloseste pentru a asocia o anumite actiune a serverului in
functie de extensia fisierului cerut de client. Detalii.
Exemplu: clientul cere serverului un fisier html sau un fisier pdf.
LoadModule mime_module modules/mod_mime.so
DefaultType text/plain
TypesConfig conf/mime.types
De obicei exista fisierul mime.types care contine toate informatiile necesare despre
tipurile de fisiere si care se include in httpd.conf
7.5 Virtual Hosting
De cele mai multe ori pe un server Apache se doreste gazduirea mai multor web
site-uri. In cazul unui server dedicat de hosting, pot fi gazduite cateva sute de site-uri.
Nota
Gazduirea mai multor site-uri pe un sever poarta denumirea de Virtual Hosting.
Serverul Apache trebuie sa poata face diferenta intre site-uri si sa serveasca
continutul corespunzator.
Exista 2 modalitati de virtual hosting:
1. IP-based Virtual Hosting
Serverul web se configureaza cu mai multe IP-uri, cate unul pentru fiecare site. IPurile se configureaza pentru fiecare interfata sau se pot crea interfete virtuale astfel incat
unei singure interfete fizice i se pot asocia mai multe IP-uri.
Fiecare nume de domeniu care reprezinta un site se translateaza intr-un alt IP. In
functie de IP-ul destinatie din pachet, serverul web alege DocumentRoot al unui anume site
si serveste continutul din acesta.
Exemplu
Presupunem gazduirea a 3 site-uri pe un server. Acestea sunt www.crystalmind.ro, www.invataonline.ro si www.limbistraine.net. Serverul trebuie configurat cu 3 IP-uri cate unul pentru fiecare
site.
In functie de IP-ul destinatie din pachetele pe care le primeste serverul identifica site ul la
care se conecteaza clientul si serveste continutul astfel (fiecare site are propriul
DocumentRoot): pentru primul IP DocumentRoot este /opt/apache/htdocs/crystal, pentru al
doilea IP DocumentRoot este /opt/apache/htdocs/invata, iar pentru al 3-a IP Apache
serveste clientilor fisiere din /opt/apache/htdocs/limbistraine
In cazul unui numar mare de site-uri IP-based Virtual Hosting nu este o
configuratie scalabila mai ales daca ne referim la un server conectat direct la Internet care
trebuie configurat cu IP-uri publice.
2. Named-based Virtual Hosting
Reprezinta varianta cea mai folosita si la indemana de gazduire a mai multor siteuri pe un singur server. Acesta este configurat cu un singur IP catre care sunt rezolvate prin
DNS toate domeniile.
Exemplu
Presupunem gazduirea a doua site-uri www.crystalmind.ro si www.invata-linux.ro. Cele 2 domenii
se translateaza catre unicul IP public al serverului care este 88.0.0.1. Un user de pe Internet
se va conecta atat la www.crystalmind.ro cat si la www.invata-linux.ro folosind IP-ul
88.0.0.
Intrebarea care apare este: cum diferentiaza serverul web la ce site s-a conectat clientul?
Raspunsul sta in implementarea protocolului HTTP/1.1 si anume folosirea unui header din
protocolul HTTP de catre client numit HOST. Astfel un client va folosi IP-ul destinatie
88.0.0.1 si HOST www.crystalmind.ro pentru a se conecta la primul site si IP-ul destinatie 88.0.0.1
si HOST www.invata linux.ro pentru cel de-al doilea site. In functie de valoarea HOST serverul
Apache stabileste DocumentRoot din care trebuie sa serveasca continutul.
Pentru configurarea Named-based VirtualHosting in httpd.conf se adauga:
NameVirtualHost 88.0.0.1
<VirtualHost www.crystalmind.ro>
ServerName www.crystalmind.ro
ServerAdmin admin@crystalmind.ro
DocumentRoot /opt/apache/htdocs/crystalmind
ErrorLog/opt/apache/error/crystalm_erorr
TransferLog /opt/apache/logs/crystalm_access_log
</VirtualHost>
<VirtualHost www.invata-linux.ro>
ServerName www.invata-linux.ro
ServerAdmin admin@invata-linux.ro
DocumentRoot /opt/apache/htdocs/invata-linux
ErrorLog /opt/apache/error/invatal_erorr
TransferLog /opt/apache/logs/invatal_access_log
</VirtualHost>
Detalii:
Directiva NameVirtualHost specifica serverului Apache ca requesturile catre IP-ul 88.0.0.1
trebuie mai departe sub divizate; pentru fiecare site este nevoie de un container
<VirtualHost>;
<VirtualHost www.crystalmind.ro> - specifica numele site-ului. Poate fi folosit si IP-ul pe
care asculta serverul;
Directivele cruciale pentru Named-based Virtual Hosting sunt ServerName care indica
valoarea headerului HOST trimis de browser si deci site-ul la care se conecteaza clientul si
DocumentRoot care identifica directorul din care serverul va servi continut pentru acel site;
restul directivelor sunt optionale, dar recomandate in cazul in care dorim pentru fiecare site
sa configuram o alta adresa de e-mail a adminului, un alt fisier cu logurile de eroare sau de
transfer etc;
Nota
1.Named-based Virtual Hosting functioneaza doar pentru browserele care implementeaza
versiunea 1.1 a protocolului HTTP.
2.Conceptul de Named-based Virtual Hosting a fost implementat pentru prima data de
Apache, ulterior fiind inglobat de cam toate serverele web.
7.6 Controlul accesului la resurse
Modul default de functionare al serverului Apache presupune ca acesta serveste
orice fisier din orice director de sub directorul definit de DocumentRoot clientilor. Pentru
un site de prezentare acest comportament este acceptabil, dar pentru un sistem informatic,
pentru o sectiune de administrare, pentru un Intranet sau pentru un site care contine
informatii sensibile sau confidentiale, Apache trebuie sa limiteze accesul la resurse doar
pentru clientii autorizati.
Exista 2 moduri in care Apache poate limita accesul la resurse:
1. In functie de IP-ul de la care se conecteaza clientul
Aceasta varianta este optima in momentul in care accesul la informatiile
confidentiale se realizeaza de la un IP sau grup de IP-uri cunoscute dinainte.
In cazul in care conexiunea are loc de pe Internet limitarea accesului in functie de
IP este considerata foarte sigura. IP-ul public este furnizat de un ISP, iar un posibil Cracker
nu poate sub nicio forma folosi un IP care nu i-a fost setat de provider.
2. In functie de username si parola
Aceasta varianta este optima in momentul in care accesul la informatiile
confidentiale se realizeaza de la IP-uri dinamice, necunoscute apriori cum ar fi cazul
utilizatorilor mobili care doresc accesarea informatiei de oriunde s-ar afla.
Nota
Pentru o securitate crescuta serverul web poate fi configurat pentru ambele moduri de
restrictionare a accesului.
Acces in functie de IP
Modulul care introduce directivele ce realizeaza accesul la resursele serverului in
functie de IP-ul clientului este mod_authz_host pentru Apache 2.2 si mod_access pentru
Apache 1.3 si 2.0
Directivele folosite pentru restrictionara accesului sunt: Order, Allow si Deny si se
folosesc in interiorul unui container <Directory> pentru stabilirea accesului la un intreg
director, <Location>, <Files> sau <FilesMatch> pentru stabilirea accesului doar la anumite
fisiere.
Directiva Allow specifica IP-urile de la care se permit conexiuni. Se pot folosi atat
IP-uri cat si clase de IP-uri sau nume de domenii.
Exemplu
1. Permite un singru IP
Allow from 192.168.0.1 Allow from 88.0.0.1
2. Permite un intreg domeniu ( com sau www.crystalmind.ro). Serverul realizeaza un
reverse DNS pentru translatarea IP-ului in nume de domeniu care ulterior este folosit
pentru evaluare Allow from .com Allow from www.crystalmind.ro
3. Permite un intreg range de IP-uri folosind un prefix (/8)
Allow from 10.0.0.0/8
4. Verifica doar partial (sa inceapa cu 10 sau 172.16)
Allow from 10 172.16
5. Permite pentru un IPv6
Allow from 2001:db8::a00:20ff:fea7:ccea
6. Permite toate IP-urile
Allow from all
Directiva Deny specifica IP-urile de unde nu se permit conexiuni. Modul de
folosire este identic cu cel al directivei Allow
Exemplu
1. Blocheaza un singur IP
Deny from 192.168.0.90
2. Blocheaza un intreg range de IP-uri
Deny from 88.0.0.0/16
3. Blocheaza in functie de domeniu. Serverul Apache realizeaza reverse DNS
Deny from evil.linux.com
4. Blocheaza conexiuni de la toate IP-urile
Deny from all
A 3-a directiva necesara, Order poate avea 2 forme si stabileste ordinea de evaluare.
Cele 2 forme sunt:
1. Order Allow,Deny
Prima data sunt evaluate toate directivele Allow. Daca nici una nu este adevarata
requestul clientului este rejectat.
Deny este policy: ce nu este permis de un Allow este rejectat
<Directory
/opt/apache/htdocs/crystalmind.ro/website/cursuri>
Order Allow,Deny
Allow from crystalmind.ro
Deny from 88.0.0.1
</Directory>
Pentru directorul /opt/apache/htdocs/crystalmind.ro/website/cursuri sunt permise
doar requesturile de la IP-urile care se rezolva invers in DNS in crystalmind.ro.
Requesturile de la 88.0.0.1 precum si restul requesturilor sunt rejectate.
2. Order Deny, Allow
Prima data sunt evaluate toate directivele Deny. Daca vreuna este adevarata FARA ca IP ul
clientului sa fie "prins" si de o directiva Allow, requestul este rejectat. Requesturile care nu
corespund cu nicio directiva Deny sau Allow sunt permise.
Allow este Policy: ce nu este rejectat de un Deny este permis
<Directory
/opt/apache/htdocs/crystalmind.ro/website>
Order Deny,Allow
Deny from 88.0.0.1
Deny from 192.168.0.0/24
</Directory>
Pentru directorul /opt/apache/htdocs/crystalmind.ro/website requesturile de la IP-ul
88.0.0.1 sau din subnetul 192.168.0.0/24 sunt rejectate. Restul requesturilor sunt premise
din cauza ordinei de evaluare Deny, Allow
Orice fisier cu terminatia sau extensia xls este servit doar daca clientul se
conecteaza de la 88.0.0.1
<FilesMatch "\.xls$">
Order Allow,Deny
Allow from 88.0.0.1 </FilesMatch>
Important
Modulul de evaluare al directivelor Allow si Deny este diferit de modul de evaluare
a regulilor unui Firewall. Regulile unui firewall sunt evaluate pana cand o regula 'prinde'
pachetul caz in care se executa o actiune fara a se mai evalua restul regulilor.
In cazul directivelor Allow si Deny toate regulile se evalueaza pana la final ceea ce
determina ca ordinea in care acestea apar sa nu fie importanta ceea ce este in contrast cu un
firewall.
7.7 PHP
Prezentare generala
PHP a fost inventat in 1995 de catre un programator danez pe nume Rasmus
Lerdorf. La inceput PHP insemna "Personal Home Page". In prezent se considera ca PHP
reprezinta un acromim recursiv de la "PHP - Hypertext Preprocessor" si este un limbaj de
scripting OpenSource care este rulat de serverul web pentru a furniza in mod dinamic
continut clientului (browserului).
Programe interpretate versus programe executate
PHP este un limbaj de programare interpretat si nu executat. Alte programe
interpretate sunt PERL, Python si Java.
Limbajele executate creaza prin compilare un fisier binar care se ruleaza. De fiecare
daca cand se modifica ceva in sursa programului acesta trebuie recompilat. Limbajele
compilate sunt C, C++, Visual Basic etc
Limbajele interpretate nu genereaza programe, fisiere binare executabile in urma
compilarii. Acestea nu se compileaza. In schimb programul este impartit in mai multe
operatii elementare numite opcodes care se executa de catre serverul web (in cazul php de
catre Apache) una cate una. Daca se modifica ceva in program, se modifica doar operatia
elementara corespunzatoare.
De fiecare data cand se acceseza printr-un URL pagina o PHP, serverul trimite
pagina spre procesare interpretorului PHP care executa instructiunile din pagina si apoi
returneaza cod HTML clientului (IE=Internet Explorer, Firefox etc).
7.7.1 Instalare si compilare
Nota
Pentru instalarea PHP presupunem existenta serverului Apache instalat conform cu
indicatiile din capitolele anterioare.
Instalarea prin compilare a PHP se realizeaza in mod standard folosind scriptul
configure, make si make install. Exemplu de mai jos s-a realizat pe Fedora Core 9. In mod
IDENTIC se compileaza si instaleaza pe orice distributie Linux.
Pasi de urmat:
1. Download sursele ultimei versiuni PHP de pe site-ul producatorului php.net.
Acestea pot fi downloadate in orice director din sistem.
wget -c http://www.php.net/get/php-5.2.6.tar.bz2/from/ro.php.net/mirror
2. Verificare integritate arhiva tar.bz2 folosind hash-ul sau semnatura digitala (Optional
dar foarte recomandat)
3. Decomprimare si dezarhivare arhiva
Se ruleaza: tar -xjvf php-5.2.6.tar.bz2 apoi cd php-5.2.6
4. Rularea scriptului configure care verifica sistemul si anume daca acesta contine toate
componentele necesare compilarii si instalarii PHP. Dorim instalarea in directorul /opt/php.
Se recomanda rularea scriptului configure de catre un user neprivilegiat.
Se ruleaza: ./configure --with-apxs2=/opt/apache/bin/apxs -with-mysql --prefix=/opt/php
Nota
1.Fara optiunea --prefix=/opt/php instalarea are loc in directoarele standard precum
/usr/bin, /usr/sbin, /etc. In acest caz ne va fi greu sa gasim fisierele componente sau sa-l
dezinstalam/stergem.
2. apxs - APache eXtenSion tool - is a tool for building and installing extension modules
for the Apache HyperText Transfer Protocol (HTTP) server. This is achieved by building a
Dynamic Shared Object (DSO) from one or more source or object files which then can be
loaded into the Apache server under runtime via the LoadModule directive from mod_so.
3. Platforma LAMP(Linux+Apache+MySql+PHP/Perl/Python) presupune folosirea ca
baza de date a serverului MySql. Platforma pentru aplicatii web presupune interactiunea
dintre PHP si Mysql pentru servirea de continut dinamic clientilor din baza de date.
Optiunea --with-mysql compileaza in PHP suport pentru MySql.
Important
In cazul in care se doreste compilarea PHP cu suport de MySql, componentele Mysql si
anume mysql, mysql-server, mysql-devel si mysql-lib trebuie sa fie deja instalate. Altfel
scriptul configure returneaza eroare.
5. Compilare
Se recomanda compilarea oricarei aplicatii de catre un user neprivilegiat.
In urma compilarii rezulta din fisierele sursa fisiere executabile.
Se ruleaza: make
6. Instalare
Instalarea presupune doar mutarea fisierelor executabile rezultate in urma compilarii din
directorul cu surse in directorul dorit ( /opt/php). Comanda poate fi executata doar de root.
Se ruleaza: make install
7.7.2 Configurare Apache si PHP
Pentru ca Apache si PHP sa poata comunica si deci lucra impreuna este nevoie de
urmatoarele configuratii:
1. Editare httpd.conf
Fisierul de configurare al daemonului httpd (serverul Apache) trebuie modificat
astfel incat acesta sa incarce modulul PHP (daca PHP a fost compilat ca modul pentru
Apache exemplul nostru si cel mai folosit in practica) si sa trimita fisierele cu extensia
.php preprocesorului PHP pentru a le executa.
In httpd.conf trebuie adaugat:
LoadModule php5_module modules/libphp5.so
<Files *.php>
SetOutputFilter PHP SetInputFilter PHP
</Files>
AddType application/x-httpd-php .php
Nota
De multe ori daca PHP a fost compilat ca modul pentru Apache folosind apxs2, liniile de
mai sus sunt adaugate automat in httpd.conf, caz in care trebuie doar sa verificam prezenta
lor.
Fisierul care reprezinta modulul PHP apare in directorul cu module al lui Apache, in cazul
nostru /opt/apache/modules. Numele modulului poate sa difere, caz in care trebuie sa
adaptam in httpd.conf
2. Testare
Pentru a testa functionarea Apache + PHP se creeaza un fisier cu extensia .php
(Exemplu: php_test.php) in DocumentRoot care sa contina urmatoarele linii: <?php
phpinfo(); ?>
Ulterior se acceseaza acest fisier conectandu-ne cu Browserul la serverul web si
cerand fisierul php_test.php.
Important
In cazul in care Browserul doreste downloadarea fisierului sau afiseaza exact cele 3 linii de
mai sus, PHP nu a fost instalat sau configurat corect. Este nevoie de troubleshooting.
In cazul in care PHP (si Apache) a fost instalat si configurat corect la accesarea
paginii php_test.php este afisat mult continut care indica modul de operare al PHP, diferite
variabile.
3. Configurare PHP
Configurarea modului in care PHP opereaza este controlata de un fisier numit
php.ini. In mod express acest pas a fost trecut dupa pasul de testare pentru simplu fapt ca
locatia unde PHP cauta fisierul php.ini nu este standard, nu poate fi modificata decat la
compilare, iar unui user incepator ii este foarte greu sa gaseasca locatia sa.
Locatia fisierului php.ini se identifica in outputul generat de pagina php_test.php de
la pasul 2. Dupa identificarea locatiei in care trebuie sa se gaseasca php.ini, un 'schelet' de
fisier trebuie copiat in directorul respectiv (in cazul nostru este /opt/php/lib). O astfel de
mostra gasim in directorul cu surse si se numeste php.ini-recommented. Acesta se copiaza
in /opt/php/lib sub numele de php.ini si se editeaza pentru a configura modul de operare al
PHP.
7.7.3 Securitate Web
Securitatea unui sistem informatic este la fel de buna ca cea mai slaba veriga a sa.
Este suficient ca un cracker sa compromita serverul web sau sa ruleze un exploit la nivel de
aplicatie cum ar fi un Sql Injection pentru ca apoi sa mai aiba un mic pas pana sa devina
root pentru intreg sistemul de operare.
Platformele web formate din server http, php, server baze de date si aplicatiile
instalate au un istoric plin de vulnerabilitati. De foarte multe ori compromiterea unui sistem
de operare a plecat de la configurarea gresita a modului in care PHP opereaza sau de la
serverul MySql ori Apache.
Securitatea informatiei este un proces continuu, o stare de fapt.
Securizarea unui server presupune cunostinte avansate si experienta.
Imi propun enumerarea catorva aspecte minimale care conduc catre o platforma web stabila
si sigura.
1. Ascunderea a cat mai multa informatie despre serverul web care ruleaza, versiunea
acestuia, versiunea de PHP sau de MySql.
Primul pas al oricarui atac informatic este identificarea serviciilor si versiunilor
care ruleaza. Ulterior un cracker experimentant sau nu, poate cauta pe Internet exploit-uri
pentru anumite versiuni de Apache sau de PHP si le poate rula.
Ascunderea de informatie in vederea cresterii securitatii informatice poarta
denumirea de"security through obscurity". In general acest proces nu imbunatateste
securitatea generala a sistemului ci doar evita atacuri din partea persoanelor
neexperimentate si care cauta tinte la intamplare.
2. Instalarea ultimei versiuni stabile de server web, php si server MySql
Intre specialistii in securitate si crackeri exista o cursa continua. Oricat de bun ar fi
un produs acesta nu poate fi 'bug-free'. Periodic se descopera erori de programare in
majoritatea serverelor care pot fi exploatate de persoane rau intentionate. Singura solutie
finala este aplicarea unui patch care 'astupa' respectiva 'gaura de securitate'.
3. Rularea serverului Apache si MySql sub propriul user care sa nu mai fie folosit in alt
scop.
Exemplu: apache ruleaza sub wwwuser si wwwgroup, iar MySql sub mysqluser si
mysqlgroup
4. Setarea accesului la resursele oferite de server in functie de IP-ul clientilor sau de
username si parola.
Directoarele sau fisierele sensibile si confidentiale trebuie protejate impotriva
accesului neautorizat. Acces neautorizat poate fi chiar si indexarea paginilor respective de
catre motoare de cautare precum Google. In ultima vreme multe tipuri de atacuri se bazeaza
pe cautarea pe Google de continut confidential care a fost indexat datorita configurarii
necorespunzatoare a serverelor HTTP.
5. PHP Session Security.
6. Instalarea si configurarea mod_status pentru a urmarii activitatea si performantele
serverului Apache
7. Instalarea Apache in jail (chrooted)
8. Instalarea si configurarea mod_security
mod_security reprezinta cel mai cunoscut si folosit WAF (Web Application Firewall).
Acesta este extrem de complex, iar pentru intelegerea aprofundata a modului in care acesta
functioneaza este nevoie de cunostinte avansate.
9. Folosirea protocolului HTTPS in loc de HTTP pentru continut confidential. Oricat de
sigur ar fi configurat sistemul si oricat de bun ar fi firewall-ul, informatia poate fi captata si
citita pe drumul dintre sursa si destinatie in cel mai simplu mod fiindca aceasta circula in
clar. Solutia este criptarea informatiei folosind ssl/tls (HTTPS).
10. MySql Security
setarea de parola pentru userul root
stergerea userilor anonimi
Important
Nu exista sistem 100% sigur. Oricat de pregatit este adminul si oricata munca depune in
vederea securizarii serverului, tot exista posibilitatea ca acesta sa fie compromis. Sansa ca
serverul sa fie compromis trebuie luata in calcul intotdeauna. De multe ori un backup
eficient reprezinta salvarea.
Capitolul 8 Serverul MySql
8.1 Prezentare generala
MySql reprezinta cel mai cunoscut si folosit RDBMS (Relational database
management system) OpenSource scris aproate integral in C/C++.
Nota
In vara anului 2008 Sun Microsystems a cumparat firma MySql AB din Suedia,
producatorul MySql.
Exista in prezent peste 11 milioane de instalari MySql pe servere in productie din
intreaga lume. Succesul realizat de aceasta baza de date se datoreaza in primul rand
costurilor minime si performantelor crescute.
Proprietati:
- MySql ruleaza client-server;
- mysqld reprezinta serverul baze de date (daemonul mysql), mysql reprezinta clientul de
mysql in linie de comanda, iar mysqld_safe este un script cu ajutorul caruia se initializeaza
serverul mysql;
- fisierul de configurare atat pentru client cat si pentru server este /etc/my.cnf;
- in momentul in care clientul se conecteaza la server prin retea, acesta se conecteaza
folosind TCP si portul destinatie 3306 pe care asculta serverul. Daca serverul si clientul se
afla pe acelasi host, comunicatia dintre acestea nu se realizeaza prin TCP/IP ci printr-un
Socket care este default /var/lib/mysql/mysql.sock;
- administrarea serverului de baze de date se realizeaza folosind clientul mysql, utilitarul
mysqladmin care ruleaza in consola, MySql Administrator care ruleaza grafic atat pe Linux
cat si pe Windows sau phpMyAdmin in cazul aplicatiilor web;
- MySql ruleaza excelent impreuna cu PHP ceea ce a dus si la numele de "the dynamic
duo". Printre aplicatiile care folosesc PHP si Mysql gasim CMS (Content Management
System) precum Drupal, Joomla!, WordPress, Moodle dar si site-uri celebre precum
Wikipedia;
Important
Pentru a putea folosi PHP si Mysql pachetul php-mysql trebuie sa fie instalat.
Description: The php-mysql package contains a dynamic shared object that will add
MySQL database support to PHP. MySQL is an object-relational database management
system. PHP is an HTML-embeddable scripting language. If you need MySQL support for
PHP applications, you will need to install this package and the php package.
8.2 Instalare MySql
Compilarea componentelor MySql poate fi dificila datorita dependintelor dintre
acestea. Pe cat posibil se recomanda instalarea automata folosind un manager de pachete
precum yum sau apt-get.
Pachetele care trebuie instalate pentru o functionare corecta sunt: mysql, mysqlserver, mysql-libs, mysql-devel si php-mysql.
8.2.1 Configurare MySql
Configurare de baza
Fisierul de configurare atat pentru server ( mysqld), pentru client ( mysql) cat si
pentru scriptul msyqld_safe este default /etc/my.cnf
Sectiunea [mysqld] sau [server] identifica directivele de configurare pentru server,
sectiunea [client] sau [mysql] identifica directivele pentru client, iar sectiunea
[mysqld_safe] identifica directivele pentru scriptul de initializare mysqld_safe.
Exemplu /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x # clients (those
using the mysqlclient10 compatibility package).
old_passwords=1
[client]
port=3036
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Detalii:
#(diez) -> reprezinta un comentariu;
[mysqld] -> identifica inceputul sectiunii de configurare pentru server;
datadir -> reprezinta directorul in care se gasesc fizic fisierele care reprezinta bazele de
date;
socket -> reprezinta fisierul de tip socket prin care clientul comunica cu serverul daca
acestea se gasesc pe acelasi host;
user -> user-ul sub care ruleaza serverul;
[client] -> identifica inceputul sectiunii de configurare pentru client (mysql);
port -> seteaza portul la care se conecteaza clientul;
[mysqld_safe] -> identifica inceputul sectiunii de configurare pentru criptul de initializare
al serverului;
Configurarea de baza a serverului mysql presupune:
1. Stabilirea username-ului sub care ruleaza serverul.
Acesta nu trebuie sa fie un user generic precum nobody ci un user folosit special si doar
pentru mysql. In fisierul de configurare /etc/my.cnf: user=mysql
2. Setarea ca owner pentru directorul in care se gasesc bazele de date ( /var/lib/mysql) a
userului sub care ruleaza serverul.
Se ruleaza: chown -R mysql /var/lib/mysql
3. Initializarea bazelor de date mysql si test
Serverul MySql pastreaza informatii despre userii care se conecteaza la acestas,
permisiunile fiecaruia etc tot intr-o baza de date. Aceasta se numeste mysql. test este o baza
de date folosita pentru benchmarking sau alte teste.
Se ruleaza: mysql_install_db care este un script ce creeaza bazele de date mysql si test
4. Securizarea serverului MySql
Serverul MySql autentifica fiecare conexiune pe baza unui cont. Un cont mysql este format
din username+parola+host, unde host reprezinta IP-ul sau numele hostului de unde se
conecteaza userul.
Exemplu: un cont pentru conectarea la server poate fi: dan+passtest+localhost, iar
dan+passtest+192.168.0.1 reprezinta un cu totul alt cont fara nicio legatura cu primul.
Acest concept este fundamental pentru intelegerea modului in care MySql functioneaza.
Important
Serverul MySql instalat default adauga o grava problema de securitate. Implicit
exista 3 conturi de root fara parola. Acestea sunt root+PAROLA_LIPSA+localhost,
root+PAROLA+LISPA+127.0.0.1 si root+PAROLA_LISPA+hostname
Userii folositi de mysql sunt "mysql only users". Acestia nu trebuie sa exista in
/etc/passwd si se folosesc doar pentru conectarea la server. Implicatia modului in care
mysql opereaza default este ca ORICE user se poate conecta ca root de mysql la server si
are acces complet.
Securizarea minimala a serverului presupune stergerea userilor root sau setarea unei
parole pentru acestia.
Etape (serverul mysqld trebuie sa ruleze):
a) conectarea la server de pe localhost folosind userul root fara parola mysql -h localhost -u
root
b) alegerea bazei de date mysql pentru urmatoarele comenzi mysql>use mysql;
c) setarea de parole pentru userii root sau stergerea acestora Userii de mysql impreuna cu
toate privilegiile acestora se gasesc in tabelul user din baza de date mysql.
Colectarea de informatii:
- pentru vizualizarea structurii tabelei user se ruleaza: mysql>describe user;
- coloanele care prezinta interes sunt: user, password si host
- pentru vizualizarea conturilor de root se ruleaza: select user,password,host from user;
Setare parola pentru un cont:
mysql>set password for root@127.0.0.1=password('parola_dorita');
Stergere cont root fara parola:
mysql>delete from user where user='root' and password='';
Crearea unui nou cont(admin+mypass+192.168.0.1) cu setarea de privilegii:
mysql>grant all privileges on mysql.* to admin@192.168.0.1 identified by 'mypass';
- mysql reprezinta baza de date pe care userul va avea privilegii, iar * inlocuieste orice
tabel din baza de date. Dupa executarea comenzii de mai sus userul admin cu parola
mypass care se conecteaza la server de la 192.168.0.1 va avea drepturi totale pentru toate
tabelele din baza de date mysql. Acesta este echivalent cu root.
Nota
1. Dupa crearea sau modificarea informatiilor despre un cont se recomanda rularea
comenzii msyql>flush privileges; si restartarea serverului.
2. Un user se conecteaza la server folosind comanda msyql executand din consola:
mysql -h IP_SERVER_MYSQL -u USERNAME -p, unde -h identifica serverul, -u
username-ul cu care se conecteaza, iar -p faptul ca acesta are parola setata.
8.3 PHP & MySql
Platforma pentru aplicatii web numita LAMP (Linux+Apache+MySql+PHP)
presupune folosirea bazei de date MySql si a limbajului de scripting PHP pentru
manipularea informatiilor din baza de date.
Pentru ca PHP sa poata interactiona cu MySql sunt necesare:
- PHP trebuie sa fie compilat cu suport de MySql (optiunea --with-mysql a scriputului
configure). Pentru detalii recititi capitolul "PHP - Compilare si instalare" a acestui curs;
- PHP ruleaza ca modul pentru Apache si interactioneaza corect cu serverul HTTP. Pentru
detalii recititi capitolul "Configurare Apache si PHP" a acestui curs;
- libraria php-mysql trebuie sa fie instalata. Aceasta librarie contine un set de functii PHP
pentru interactiunea cu serverul baze de date ( Exemplu: mysql_connect,
mysql_fetch_assoc, mysql_array etc);
- un cont (username+parola+host) mysql folosit in scripturile PHP pentru conectarea la
baza de date;
Nota
Platforma pentru aplicatii web LAMP presupune
Linux+Apache+MySql+Php/Perl/Python.
Multi developeri de aplicatii web folosesc sistemul de operare Windows ca si mediu de
programare ceea ce a dus la termenul de WAMP
(Windows+Apache+MySql+Php/Perl/Python). Toate componentele platformei adica
serverul Apache, Mysql si PHP ruleaza si pe Windows. Acestea pot fi instalate
independent sau folosind anumite programe care le contin pe toate cele 3 componente.
Astfel de programe sunt EasyPHP sau Wamp Server. Aplicatiile web profesionale sunt gazduite pe
servere Linux daca acestea folosesc Apache. De multe ori programatorii dezvolta
aplicatiile de Windows pe WAMP, iar ulterior in faza de productie acestea sunt mutate pe
Linux.
Programatorul nu trebuie sa cunoasca in mod detaliat cum se instaleaza si configureaza un
server, cum functioneaza acesta pentru a crea aplicatii de calitate. Programarea si
Administrare de Sistem sunt doua profesii diferite.
Nota
reprezinta o solutie de administrare a unui server Linux folosind un Browser. Se
utilizeaza in special pe serverele dedicate de hosting unde sarcinile administrative sunt
multe si dese. Cu ajutorul cPanel se poate configura Apache, PHP, Mysql, se pot crea
conturi de e-mail, seta parole, vizualiza procese etc. Dezavantajul este o flexibilitate si un
control oarecum scazut. Adminul nu stie exact ce comenzi sau programe ruleaza cPanel in
spate, unde salveaza fisire etc. cPanel nu este un produs gratuit.
Plesk este o alta aplicatie folosita pentru administrarea LAMP. Niciun program de
administrare grafic nu poate inlocui complet consola.
cPanel
8.4 NETFILTER
8.4.1 Prezentare generala
NETFILTER repezinta un framework din Kernelul de Linux responsabil cu filtrarea
pachetelor, marcarea acestora in vederea prioritizarii traficului, modificarea structurii
headerelor de layer3 (Header IP) si layer4 (Header TCP sau UDP), Source NAT,
Destination NAT/Port Forwarding etc.
Important
Comparativ cu alte sisteme de operare precum Windows in care se pot instala o
varietate de aplicatii de tip firewall, NETFILTER reprezinta SINGURA posibilitate in
Linux de realizarea a unui firewall, NAT, marcare si modificare de pachete, in general tot
ce inseamna interactiune cu pachetele.
Nota
Suportul pentru NETFILTER trebuie sa fie compilat in Kernel sau ca modul. In cazul in
care kernelul nu cuprinde NETFILTER acesta trebuie recompilat. NETFILTER este in
"kernel space".
iptables este o comanda cu ajutorul careia putem comunica cu NETFILTER. Iptables este
in "user space".
Firewall
Un Firewall reprezinta o componenta a infrastructurii de securitate care separa
retele de calculatoare sau calculatoare care au nivele diferite de securitate.
Un firewall poate fi de 2 feluri:
a) Hardware - echipament dedicat, special creat, care are drept scop filtrarea datelor dintre
2 entitati ( Exemplu: Cisco ASA).
b) Software - aplicatie, care ruleaza pe calculator(server) impreuna cu alte programe care
are acelasi scop ca si un firewall hardware
Nota
Un firewall hardware foloseste software pentru a realiza filtrarea. Pe langa filtrarea propriu
zisa un firewall hardware are si alte functii precum VPN, criptarea datelor etc.
Important
Filtrarea pachetelor se bazeaza pe headerele protocoalelor din stiva TCP/IP. O
intelegere foarte buna a acestor protocoale (inclusive structura headerelor) este esentiala
pentru crearea/configurarea unui firewall eficient.
Exista 3 generatii de firewall:
1. Packet based
Filtreaza in functie de campurile din headerele de la Layer 3 (Network) si 4 (Transport) ale
OSI. Nu diferentiaza intre pachete.
2. Circuit-based numit si stateful firewall
Filtreaza in functie de campurile din headerele de la Layer 3 (Network/IP) si 4
(Transport/TCP,UDP) OSI. Suplimentar se tine cont de relatiile dintre pachetul curent si
celelalte.
Exemplu: un pachet adresat hostului local este permis daca acesta reprezinta raspuns la un
pachet generat din interior (de hostul local).
3. Application Layer Firewall (Proxy Based Firewalls)
Firewall care "citeste" datele de la nivelul aplicatie (FTP/HTTP/DNS etc).
In Linux singura modalitatea de a crea un firewall este reprezentata de arhitectura
NETFILTER. Aceasta arhitectura foloseste comanda iptables (user space tool) pentru a
filtra pachetele de date.
NETFILTER este o tehnologie foarte avansata care permite crearea unui firewall de
la zero extrem de eficient care poate fi folosit cu incredere pe servere din mediul
Enterprise.
NETFILTER inglobeaza caracteristicile tuturor celor 3 generatii amintite mai sus
(aplication layer firewall cu module speciale).
8.4.2 Structura NETFILTER
a) Chains
NETFILTER foloseste default 5 chain-uri numite si hooks (carlige) prin care
pachetele trec si in care NETFILTER poate interactiona cu acestea. Acestea sunt de fapt
puncte de interactiune cu pachetele.
Cele 5 chain-uri predefinite sunt:
1. PREROUTING
Acest chain este atins de pachete inaintea procesului de routare, imediat ce driverul
placii de retea a acceptat pachetul.
Este folosit pentru:
- modificarea headerelor pachetelor (mangling) inaintea procesului de rutare; Exemplu:
modificare TOS (Type of service) sau modificare TTL (Time to live) pentru a influenta
procesul de rutare
- DNAT (Destination NAT sau Port Forwarding);
In acest chain trebuie evitata filtrarea fiindca nu toate pachetele trec prin el.
2. INPUT
Prin acest chain trec pachetele destinate calculatorului local. Orice pachet care
ajunge la statia locala trece prin acesta indiferent pe ce interfata intra sau de unde vine.
Este folosit pentru:
- modificarea pachetelor (mangling) dupa rutare, dar inainte sa fie trimise procesului local;
- filtrarea pachetelor;
3. OUTPUT
Prin acest hook trec pachetele generate de calculatorul local.
Este folosit pentru:
- filtrare sau manipulare pachete generate de hostul local;
4. FORWARD
Prin acest chain trec pachetele care tranziteaza hostul (acesta a devenit router, leaga
minim 2 retele). Pachetele care trec prin chain-ul FORWARD nu sunt destinate hostului
local si nici nu sunt generate de acesta.
5. POSTROUTING
Ultimul chain prin care trec pachetele, dupa procesul de rutare. Prin acest chain trec
atat pachetele care transiteaza hostul daca acesta este Router cat si cele generate de host.
Este folosit pentru:
- modificarea pachetelor (mangling) dupa procesul de rutare, dar inca pe hostul local;
- SNAD (Source NAT & Masquerading);
Fiecare din aceste 5 hook-uri/chain-uri (puncte de interactiune cu pachetele) se
foloseste pentru a interveni intr-un anume mod asupra pachetelor. Exista 3 destinatii
posibile pentru un pachet functie de care acesta trece prin anumite chain-uri din cele 5:
a) vine din retea si este destinat hostului local;
b) este generat de hostul local;
c) trece prin hostul local;
Nota
Iptables ofera posibilitatea definirii de chainuri de catre utilizatori pe langa cele 5 chainuri
default. Acest subiect este considerat avansat si va fi tratat in amanunt in cursul "Advanced
Linux & INFOSEC" disponibil de asemenea online.
b) Tables
Fiecarui hook/chain NETFILTER ii este asociat un set de reguli definite intr-un
tabel. In momentul in care un pachet "loveste" un chain acesta este verificat de fiecare
regula din tabel.
O regula contine criterii care trebuie satisfacute de pachet si un target precum
ACCEPT, DROP sau SNAT. Targetul este actiunea intreprinsa daca pachetul satisface
regula din tabel. Fiecare regula are un target.
Exemplu
Cerinta: Dorim sa blocam/dropam toate pachetele care vin catre serverul SSH ce ruleaza pe
hostul local si asculta pe portul TCP/22.
Mod realizare: Orice pachet destinat hostului local va trece prin chain-ul INPUT. Acesta
va fi si chain-ul in care intervenim pentru droparea/blocarea pachetelor ssh. Intr-un tabel
(numit filter) atasat chainului INPUT vom adauga o regula compusa din criterii precum:
pachetul este destinat hostului local, iar portul destinatie este 22. Target-ul va fi DROP.
In mod implicit NETFILTER ofera 4 tabele ce contin reguli pentru "prinderea"
pachetelor si care se ataseaza de cele 5 chain-uri. Tabele NETFILTER:
1. filter
Este folosit doar pentru filtrarea pachetelor ( ACCEPT sau DROP) si se foloseste doar pe
chainurile FORWARD, INPUT sau OUTPUT.
2. nat
Este folosit doar pentru NAT (SNAT si DNAT). Doar primul pachet dintr-un stream va fi
procesat de regulile din acest tabel. Asupra celorlalte pachete se va actiona identic. Se
poate atasa de chainurile PREROUTING in cazul SNAT si POSTROUTING in cazul
DNAT.
3. mangle
Este folosit pentru manipularea/modificarea pachetelor si anume modificarea headerelor de
Layer3 si Layer4 (modificare tos, ttl etc). Acest tabel poate fi atasat de orice chain.
4. row
Se foloseste doar pentru marcarea pachetelor care nu trebuie sa fie procesate de
"connection tracking system". Tabelul se poate folosi doar pentru chainurile
PREROUTING si/sau OUTPUT. Mecanismul de "connection tracking" este consumator de
resurse, astfel pentru un anumit tip de trafic se poate opri connection tracking system.
Exemplu: excluderea traficul generat pentru localhost
Nota
Cele 4 tabele descrise mai sus sunt implicite. Acestea nu pot fi sterse si nici alte tabele nu
pot fi create.
c) The state machine
Connection tracking este componenta NETFILTER care ofera acestuia statutul de firewall
stateful. Acesta poate lua decizii de filtrare a pachetelor nu in functie de headerul Layer3
(IP) si Layer4 (TCP/UDP) ci in functie de relatia pachetului cu celelalte pachete.
Connection tracking este realizat de un framework din kernel care se numeste
conntrack. Acesta poate fi incarcat ca modul sau poate fi parte integranta a kernelului.
conntrack reprezinta o parte din NETFILTER care identifica pachetele ca aflandu-se intr o
anume stare in functie de relatia cu celelalte pachete din acelasi stream. NETFILTER
defineste 4 stari pentru fiecare pachet:
1. NEW
Primul pachet dintr-o conexiune generat de hostul local se gaseste in starea NEW.
2. ESTABLISHED
Pachetul destinat hostului local ca raspuns la pachetul trimis anterior isi schimba starea in
ESTABLISHED in momentul in care intra in PREROUTING. Sunt toate pachetele dintr o
conexiune mai putin primul care a initiat conexiunea si care se afla in starea NEW.
3. RELATED
In starea RELATED se gasesc acele pachete legate de un alt flux de date
Exemplu: in cazul FTP activ, conexiunea de date de pe portul 20 ca raspuns la conexiunea
de control initiata catre portul 21
4. INVALID
Sunt acele pachete ale caror header contine informatii neconcordante.
Exemplu: un pachet al carui header TCP contine atat flag-ul syn cat si fin
Informatiile pe care modulul conntrack le foloseste pentru a sti in ce stare se gaseste
un pachet, pot fi vizualizate in /proc/net/nf_conntrack (FC9)
tcp 6 117
SYN_SENT
src=192.168.1.6
dst=192.168.1.9
sport=32775
\ dport=22
[UNREPLIED]
src=192.168.1.9
dst=192.168.1.6 sport=22
\ dport=32775
[ASSURED] use=2
Detalii:
tcp - protocolul de transport;
6 - valoarea campului protocolului din headerul IP;
117 - nr. de secunde in care aceasta intrare este valida. Timpul este decrementat continuu
pana cand apare trafic legat de aceasta conexiune. Apoi timpul este resetat cu valoarea
default;
SYN_SENT - trafic doar intr-o directie;
src - ip source;
dst - ip destinatie;
sport - port sursa;
dport - port destinatie;
UNREPLIED - nu a existat trafic in ambele directii. In momentul in care apare trafic in
ambele directii UNREPLIED se inlocuieste cu ASSURED;
ASSURED (la final) - informatii despre aceasta conexiune nu vor fi sterse cand se atinge
nr. maxim de conexiuni;
Nota
Fisierele referitoare la NETFILTER apar doar dupa ce se foloseste conntrack machine
adica dupa ce se incarca in memorie firewall-ul ce contine regule cu referire la starile unui
pachet.
8.4.3 Sintaxa iptables
Commanda iptables (user space tool) se foloseste pentru a comunica cu
NETFILTER.
Important
1. Scopul comenzii iptables este de a adauga, sterge, inlocui, lista, vizualiza etc reguli din
cele 4 tabele standard care sunt atasate de cele 5 chainuri.
2. In mod default nu exista nicio regula in tabele, acestea fiind goale. Implicit nu exista
firewall.
3. Un pachet traverseaza in mod secvential regulile din tabelele atasate chainurilor pana in
momentul in care o regula "prinde" pachetul, caz in care se executa TARGET-ul regulii.
Restul regulilor din tabel nu se mai verifica ulterior.
4. Daca pachetul nu este prins de nicio regula din tabel se executa politica default (-P
POLICY) care este implicit ACCEPT.
Structura comenzii iptables este:
iptables -t nume_tabel -OPERATIE_ASUPRA_CHAIN NUME_CHAIN -criterii –j
TARGET
unde:
Nume tabel:
filter
nat
raw
mangle
Nota
Numele tabelului in care se adauga regula trebuie scris cu litera mica. Daca se omite
numele tabelului acesta este default filter.
Exemplu
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT este echivalent cu:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Operatii asupra unui chain
-A -> adaugare regula la sfarsitul tabelului atasat chainului;
-I -> adaugare regula pe prima pozitie in tabelul atasat chainului;
-L -> listare reguli;
-P -> policy, actiunea default care se executa daca nicio regula nu prinde pachetul;
-N -> creare chain nou definit de utilizator;
-X -> sterge chain definit de utilizator;
-F -> flush, goleste regulile din tabelul atasat chainului;
-Z -> zero, reset counters;
Nota
Operatiile asupra regulilor din tabelele atasate chainurilor trebuie scrise cu litera mare.
Exemplu:
Adauga o regula la sfarsitul tabelului filter (default daca nu se specifica) pentru chain-ul
OUTPUT care permite trimiterea de pachete catre IP-ul din spatele domeniului
www.invata-online.ro
1. iptables -A OUTPUT -d www.invata-online.ro -j ACCEPT
Adauga policy DROP pentru INPUT. Orice pachet destinat hostului local care nu este
acceptat de nicio regula din tabelul filter de pe chainul INPUT este dropat
2. iptables -P INPUT DROP
Sterge toate regulile din tabelul filter (default daca nu se specifica) de pe chainul
FORWARDING
3. iptables -F FORWARDING
Nume Chain:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
Nota
Numele chainului se scrie cu litera mare
Exemplu:
1. Adaugam o regula in tabelul nat din POSTROUTING care realizeaza SNAT. IP-ul
privat 10.0.0.3 este inlocuit cu ip-ul public al ruterului linux care este 80.0.0.10 iptables -t
nat -A POSTROUTING -o eth0 -s 10.0.0.3 -j SNAT --to-source 80.0.0.10
2. Dropeaza toate pachetele generate de hostul local catre orice server http care daca acesta
asculta pe portul 80 iptables -A OUTPUT -p tcp --dport 80 -j DROP
Criterii
-s IP_sursa
Exemplu: -s 80.0.0.1 sau -s 192.168.0.0/24 sau -s 0/0. Specifica IP-ul sursa din pachet. 0/0
inseamna orice IP
-d IP_dest
Exemplu: -d 182.0.10.1 sau -d 10.10.0.0/26 sau -d 0/0 -> specifica IP-ul destinatie din
pachet. 0/0 inseamna orice IP
-p protocol
Exemplu: -p tcp sau -p udp sau -p icmp
--sport port_sursa
Exemplu: iptables -I INPUT -p udp --sport 53 -j DROP -> dropeaza toatea pachetele UDP
care sunt destinante hostului local si vin de la un server DNS (port 53)
--dport port_dest
Exemplu: iptables -A FORWARD -p tcp --dport 8080 -j DROP -> dropeaza toata
pachetele catre portul tcp 8080 care tranziteaza ruterul linux
-i interfata_in
Exemplu: iptables -A INPUT -i eth0 -j ACCEPT -> accepta toate pachetele destinate
hostului local care intra pe interfata eth0
-o interfata_out
Exemplu: iptables -t mangle -A OUTPUT -o eth1 -j TTL --ttl-set 67 -> modifica TTL-ul
din headerul IP setand valoarea 67 pentru toate pachetele generate de hostul local care ies
pe interfata eth1
Nota
Intre criterii unei reguli exista SI logic. Acestea trebuie sa fie adevarate simultan pentru ca
pachetul sa fie "prins" de regula si sa se executa TARGET-ul regulii.
Target
Specifica actiunea intreprinsa asupra pachetului daca criteriile sunt indeplinite.
ACCEPT -> pachetul este acceptat;
DROP -> pachetul este dropat;
REJECT -> pachetul este rejectat si hostul raspunde cu un mesaj de eroare sursei;
LOG -> logheaza/salveaza informatii despre pachet intr-un fisier;
LIMIT -> limiteaza nr. de pachete pe unitatea de timp;
SNAT -> realizeaza source nat;
MASQUERADE -> realizeaza source nat;
DNAT -> realizeaza destination nat/port forwarding;
TTL -> modifica TTL din pachet (headerul IP);
Nota
Numele targetului se scrie cu litera mare.
Important
Cuvintele cheie de mai sus trebuie scrise cu litera mare sau litera mica intocmai,
altfel rezulta o eroare.
Rezumat:
- numele tabelului se scrie cu litera mica (-t nat);
- operatia asupra chain-ului se scrie cu litera mare (-A);
- numele chain-ului se scrie cu litera mare (FORWARD);
- criteriile se scriu cu litera mica (-s 192.168.0.0/16);
- targetul se scrie cu litera mare (-j DROP);
8.4.4 Scenarii si exemple
Pentru a crea un firewall folosind NETFILTER, singura modalitate in Linux, exista
mai multe posibilitati:
1. Folosind scripturi deja create precum firestarter
Aceste scripturi contin o sectiune de configurare unde adminul seteaza modul in
care firewall-ul va opera (alege porturile pe care asculta severele locale si catre care se pot
conecta utilizatorii, seteaza IP-urile de la care se accepta conexiuni etc).
Scriptul odata rulat genereaza in spate comenzi iptables. Modalitatea este
recomandata pentru adminii incepatari care nu doresc un control total al modului in care
firewall-ul opereaza.
2. Folosind aplicatii grafice disponibile in GNOME sau KDE.
Scopul cursului este de a forma administratori de sistem pentru administrarea de
servere. Serverele Linux ruleaza in runlevel 3 fara mod grafic, iar intreaga administrare se
face remote folosind ssh din consola in mod text.
3. Creand propriul firewall de la zero.
Aceasta este modalitatea cea mai recomandata. Chiar daca la un moment dat vom
folosi din anumite considerente sau politici stabile un script general gata facut, pentru o
buna intelegere a modului in care NETFILTER functioneaza orice admin trebuie sa creeze
si sa testeze un firewall de la zero.
Important
Comenzile iptables se pot executa direct in consola. Pentru o buna organizare
metoda cea mai folosita este urmatoarea: se creaza im script care contine comenzile
iptables si care se executa.
Nota
La primul contact cu NETFILTER si iptables, acestea pot parea extrem de complexe cu
multe optiuni greu de retinut. Dupa cateva exercitii sintaxa iptables si modul de organizare
se va clarifica si va deveni natural (presupunand o buna cunoastere a stivei TCP/IP).
1) Firewall basic
Important
Crearea unui firewall eficient folosind comanda iptables poate avea loc doar dupa
intelegerea in profunzime a conceptelor prezentate in sectiunile anterioare. Exersati doar
dupa ce notiunile de CHAIN, tabele, reguli, traversarea chainurilor etc va sunt foarte clare !
Nota
Regulile unui firewall se scriu intr-un fisier text, caruia i se seteaza ulterior dreptul de
executie si se ruleaza pentru a fi incarcat in memorie (exceptie acolo unde este precizat ca
rularea comenzii iptables are loc direct din consola).
Nota
Prima regula dintr-un firewall este aceea care sterge orice firewall existent ( iptables -F).
Altfel rulari succesive ale scriptului determina incarcarea aceleiasi reguli de mai multe ori.
Scenariul 1
Se doreste obtinerea de help pentru comanda iptables pentru diferite optiuni ale
acesteia.
Nota
In general se completeaza comanda iptables pana la momentul la care dorim obtinerea
helpului apoi se foloseste optiunea -h. Comanda se executa direct in consola
a) ICMP help, specificarea tipurilor ICMP
iptables -p icmp -h
Output generat:
ICMP v1.4.0
options:
--icmp-type [!] typename match icmp type (or numeric type or type/code)
Valid ICMP
Types:
any echo-reply (pong)
destination-unreachable
network-unreachable
host-unreachable
protocol-unreachable
port-unreachable
fragmentation-needed
source-route-failed
network-unknown
host-unknown
network-prohibited
host-prohibited
TOS-network-unreachable
TOS-host-unreachable
communication-prohibited
host-precedence-violation
precedence-cutoff
source-quench redirect
network-redirect
host-redirect
TOS-network-redirect
TOS-host-redirect
echo-request (ping)
router-advertisement
router-solicitation
time-exceeded (ttl-exceeded)
ttl-zero-during-transit
ttl-zero-during-reassembly
parameter-problem
ip-header-bad
required-option-missing
timestamp-request
timestamp-reply
address-mask-request
address-mask-reply
b) Obtinerea de informatii despre filtrarea dupa MAC (doar in LAN). Se foloseste optiunea
-m mac. Se poate filtra doar dupa mac sursa si doar pe INPUT.
iptables -m mac -h
Output generat:
MAC v1.4.0 options: --mac-source [!] XX:XX:XX:XX:XX:XX Match source MAC
address
c) Obtinerea de informatii despre optiunile referitoare la TCP (specificarea porturilor sursa
si destinatie dupa care se filtreaza, filtrarea dupa flaguri etc)
iptables -p tcp -h
Output generat:
TCP v1.4.0
options:
--tcp-flags [!] mask comp match when TCP flags & mask == comp (Flags: SYN ACK FIN
RST URG PSH ALL NONE) [!]
--syn match when only SYN flag set (equivalent to --tcp-flags SYN,RST,ACK,FIN SYN)
--source-port [!] port[:port]
--sport ... match source port(s)
--destination-port [!] port[:port]
--dport ... match destination port(s)
--tcp-option [!] number match if TCP option set
Scenariul 2
Se doreste crearea unui firewall stateful pentru sistem Linux folosit ca Desktop. Pe
acesta nu ruleaza servere, iar utilizatorul poate comunica cu orice serviciu extern. Cerinte:
- hostul poate genera orice fel de trafic TCP, UDP sau ICMP catre orice IP extern;
- pachetele destinate hostului sunt acceptate doar daca reprezinta raspuns la traficul generat
din interior;
- pachetele care reprezinta initializarea unei conexiuni din exterior catre interior sunt
filtrate;
#!/bin/bash
#stergerea tuturor regulitor din tabelul filter din toate CHAIN-urile
iptables -F
#permitea tuturor pachetelor generate de host (starea NEW,ESTABLISHED si RELATED)
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#permitea pachetelor care se intorc catre host si nu reprezinta initializarea unei
conexiuni(starea ESTABLISHED si RELATED)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#setare policy DROP pe INPUT si OUTPUT. Pachetele care nu sunt prinse de cele 2 reguli
de mai sus sunt dropate
iptables -P INPUT DROP iptables -P OUTPUT DROP
Scenariul 3
Dorim crearea unui firewall statefull pentru Desktop pe care ruleaza si un server
SSH care asculta pe portul TCP/22.
Cerinte:
- hostul poate genera orice fel de trafic TCP, UDP sau ICMP catre orice IP extern
pachetele destinate hostului sunt acceptate doar daca reprezinta raspuns la traficul generat
din interior userul se conectaza uneori la host prin SSH de la un anumit IP (Exemplu: IP ul
80.0.0.1 setat in locatia de unde se conecteaza userul)
- pachetele care reprezinta initializarea unei conexiuni din exterior (exceptand SSH de la
IP-ul de mai sus) catre interior sunt filtrate
#!/bin/bash
#stergerea tuturor regulitor din tabelul filter din toate CHAIN-urile
iptables -F
#permiterea pachetelor SSH din exterior catre interior de la IP 80.0.0.1
iptables -A INPUT -p tcp --dport 22 -s 80.0.0.1 -j ACCEPT
#permitea pachetelor generate de host (starea NEW,ESTABLISHED si RELATED)
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#permitea pachetelor care se intorc catre host (starea ESTABLISHED si RELATED)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#setare policy DROP pe INPUT si OUTPUT. Pachetele care nu sunt prinse de cele 2 reguli
de mai sus sunt dropate
iptables -P INPUT DROP iptables -P OUTPUT DROP
Scenariul 4
Se doreste oprirea oricarui firewall care ruleaza pe host cu stergerea oricarei
configuratii de SNAT sau DNAT sau de modificare de pachete.
#!/bin/bash
#stergerea tuturor regulilor din tabelul filter de pe toate chainurile
iptables -t filter -F
#stergerea tuturor regulilor din tabelul nat de pe toate chainurile
iptables -t nat -F
#stergerea tuturor regulilor din tabelul mangle de pe toate chainurile
iptables -t mangle -F
#setarea policy ACCEPT pe toate chainurile unde se poate realiza filtrare
(INPUT,OUTPUT si FORWARD)
iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD
ACCEPT
Scenariul 5
Filtrarea dupa MAC
Cerinte:
- se doreste acceptarea de pachete doar de la un singur MAC
- scenariu poate fi util cand se doreste limitarea hosturilor cu care poate comunica un
- server in LAN, sau comunicarea doar cu default gateway si deci doar pe Internet
#!/bin/bash
iptables -F
#frame-urile cu mac-ul sursa specificat sunt permite pe INPUT
iptables -A INPUT -i eth0 -m mac --mac-source 00:1A:92:96:18:58 -j ACCEPT
#policy pe INPUT este DROP (restul frame-urilor sunt filtrate)
iptables -P INPUT DROP #pe ouput se poate lasa policy ACCEPT iptables -P OUTPUT
ACCEPT
Scenariul 6
Listarea unui firewall sau verificare firewall care ruleaza. Comanda se executa
direct in consola.
iptables -vnL
Outputul acestei comenzi ne indica:
- policy de pe fiecare CHAIN
- regulile din tabelele atasate chain-urilor
- nr de pachete prinse de fiecare regula
Comanda de mai sus listeaza toate regulile din tabelul filter (este default) de pe
toate chainurile. Daca se doreste listarea regulilor din tabelul nat sau mangle se foloseste:
iptables -t nat -vnL
Scenariul 7
Un host Linux a fost transformat in Router pentru conectarea unui LAN la Internet.
Acesta este configurat cu 2 placi Ethernet si realizeaza NAT. Se doreste modificarea TTLului inainte procesului de rutare
Cerinte:
-un ISP pentru nu permite unui client sa creeze o retea locala si deci pentru a impune
conectarea unui singur calcular la Internet ar putea trimite toate pachetele catre client cu
TTL=1. In momentul in care se conecteaza un Ruter, acesta va decrementa TTL-ul
pachetelor IP si fiindca acesta ajunge la zero, ruterul va arunca pachetele
-se doreste setarea TTL pentru toate pachetele primite de router la 64 (valoarea default pe
Linux) inaintea procesului de rutare
#!/bin/bash
#orice retula pentru manipularea pachetului se adauga in tabelul mangle. Fiind se doreste
modificarea TTL inaintea procesului de rutare se foloseste chainul PREROUTING. Se mai
poate folosi si OUTPUT pentru modificarea ttl-ului pentru pachetele trimise inaintea
procesului de rutarea sau POSTROUTING pentru modificare dupa procesul de rutare
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
Scenariul 8
Logarea de pachete
Cerinta:
- se doreste logarea tuturor pachetele de tip HTTP care sunt generate de host in vederea
analizarii ulterioare a site-urilor vizitate sau pentru analiza continutului headerelor acestora
#!/bin/bash
#se foloseste targetul LOG
#--log-level specifica facilitatea syslog folosita
#--log-prefix specifica un string care se va gasi in fata fiecarui pachet logat pentru o
identificare mai usoara
iptables -A OUTPUT -p tcp --dport 80 -j LOG --log-level info --log-prefix "HTTP generat
de host"
Nota
Pentru vizualizarea pachetelor poate fi rulata comanda dmesg fiindca se foloseste
facilitatea kernel din syslog. Intr-un setup profesional acestea informatii trebuie redirectate
catre un fisier special. Pentru aceasta este nevoie de configurarea syslog. Pentru detalii
cititi capitolul "Managementul Logurilor" a acestui curs.
2) Firewall avansat
Scenariu 1
Se doreste crearea unui firewall pentru un server din LAN
Cerinte:
- pe host ruleaza server ssh (tcp/22), http (tcp/80), https (tcp/443), smtp (tcp/25), pop
(tcp/110), imap (tcp/143) si dns (dns/53). Toate aceste servicii si doar acestea trebuie sa fie
accesibile userilor din LAN
- firewall-ul trebuie sa dropeze si sa logheze pachetele invalide
- serverul poate accesa pe internet doar servere web (pentru update) si dns (pentru query
iterative sau pentru a folosi un forwarder)
#!/bin/bash
#VARIABLE SECTION
###############################################################
TCP_IN_LAN="22 25 80 110 143 443"
UDP_IN_LAN="53"
TCP_OUT_WAN="80"
UDP_OUT_WAN="53"
#############################################################
#stergere orice regula din toate tabelele de pe toate chainurile
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
#logarea pachetelor invalide trimise sau primite de server
iptables -A INPUT -m state --state INVALID -j LOG --log-level info --log-prefix "INPUT
INVALID PACKET"
iptables -A OUTPUT -m state --state INVALID -j LOG --log-level info --log-prefix
"OUTPUT INVALID PACKET"
#dropara pachetelor invalide trimise sau primite de server
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
#ciclu for pentru adaugarea unei reguli pentru fiecare port tcp permis (conexiune din LAN
catre server)
for tcp_lan in
do
#permiterea pachetelor din LAN catre server
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport -j ACCEPT
#permitearea raspunsului la pachetele din LAN catre server
iptables -A OUTPUT -d 192.168.0.0/24 -p tcp --sport -j ACCEPT
done
#ciclu for pentru adaugarea unei reguli pentru fiecare port tcp permis (conexiune din LAN
catre server)
for udp_lan in
do
iptables -A INPUT -s 192.168.0.0/24 -p udp --dport -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/24 -p udp --sport -j ACCEPT
done
#ciclu for pentru adaugarea unei reguli pentru fiecare port tcp permis (conexiuni de la
server catre Internet)
for tcp_wan in
do
iptables -A OUTPUT -d 0/0 -p tcp --dport -j ACCEPT
iptables -A INPUT -s 0/0 -p tcp --sport -j ACCEPT
done
#ciclu for pentru adaugarea unei reguli pentru fiecare port udp permis (conexiune de la
server catre Internet)
for udp_wan in
do
iptables -A OUTPUT -d 0/0 -p udp --dport -j ACCEPT
iptables -A INPUT -s 0/0 -p udp --sport -j ACCEPT
done
#adaugare reguli pentru pachete ICMP din LAN (userii din LAN pot da ping la server.
Acesta nu raspunde la ping de pe Internet)
iptables -A INPUT -s 192.168.0.0/24 -p icmp -j ACCEPT
iptables -A OUTPUT -d 0/0 -p icmp -j ACCEPT
#setare policy DROP pentru pachetele care nu au fost permise de regulile de mai sus
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
Scenariul 2
Se doreste crearea unui firewall pentru un Router Linux. Routerul este un host
Linux cu 2 interfete Ethernet. Interfata eth0 este de LAN iar interfata eth1 este de WAN.
ISP-ul furnizeaza un singur IP public, iar subnetul de LAN este 192.168.0.0/24 Se
considera ca Routerul este deja configurat corect pentru NAT.
Cerinte:
- userii din LAN pot accesa pe Internet doar site-uri web, pot sa-ti citeasca e-mailul
folosind un client dedicat precum Mozilla Thunderbird sau se pot conecta prin ssh la alte
servere. Alte servicii nu trebuie sa fie accesibile
- Routerul nu poate fi verificat cu ping de pe Internet ci doar din LAN
#!/bin/bash
#VARIABLE SECTION
###############################################################
LAN_ACCESS="22 25 80 110 143 443"
##############################################################
#stergere orice regula din toate tabelele de pe toate chainurile
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
#logarea pachetelor invalide trimise sau primite de server
iptables -A INPUT -m state --state INVALID -j LOG --log-level info --log-prefix "INPUT
INVALID PACKET"
iptables -A OUTPUT -m state --state INVALID -j LOG --log-level info --log-prefix
"OUTPUT INVALID PACKET"
#dropara pachetelor invalide trimise sau primite de server
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
#ciclu for pentru permiterea pachetelor ce au voie sa tranziteze router
for port in
do
#permiterea pachtelor in directia LAN->WAN
iptables -A FORWARD -s 192.168.0.0/24 -p tcp --dport -j ACCEPT
#permiterea pachetelor in directia WAN->LAN
iptables -A FORWARD -d 192.168.0.0/24 -p tcp --sport -j ACCEPT
done
#permiterea pachetelor DNS din LAN catre WAN (altfel userii nu pot accesa site-uri
folosind nume de domenii)
iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
#blocarea pachetelor ICMP de timp echo-request (type 8) daca sursa este diferita de
192.168.0.0/24
iptables -A INPUT ! -s 192.168.0.0/24 -p icmp --icmp-type 8 -j DROP
#setare policy DROP pentru pachetele care nu au fost permise de regulile de mai sus
iptables -P FORWARD DROP
Routing (SNAT)
De cele mai multe ori utilizatorii casnici folosesc o conexiune broadband de tip
ADSL sau CaTV pentru conectarea la Internet.
Nota
In ultima vreme datorita cresterii vitezei oferite de ADSL, acest timp de tehnologie de
WAN incepe sa fie folosita si pentru companii. ADSL+ ofera un Bandwidth Downstream
de peste 22Mbs.
Indiferent de tehnologia de WAN folosita ISP-ul furnizeaza un singur IP public sau
in cel mai bun caz cateva IP-uri publice.
Solutia folosita pentru a lega mai multe calculatoare la Internet (neavand atatea IPuri publice cate calculatoare) este configurea unui Router care sa realizeze NAT (Network
Address Translation).
Se foloseste asfel un router dedicat sau un calculator care ruleaza Linux cu cel putin
2 placi de retea Ethernet (leaga 2 retele si anume LAN-ul si Internetul). O interfata si
anume cea care se conecteaza cu providerul se configureaza cu IP-ul public, iar cealalata
interfata numita interfata de LAN se configureaza cu un IP privat.
Nota
IETF a definit in RFC 1918 3 clase de IP-uri private care pot fi folosite in mod liber pentru
adresarea unui LAN.
Acestea sunt:
10.0.0.0-10.255.255.255
172.16.0.0-172.31.255.255
192.168.0.0-192.168.255.255
Procesul prin care hosturile din LAN (din spatele routerului) pot comunica pe
Internet si anume procesul de NAT presupune inlocuirea IP-ului privat de catre router din
pachetele generate de hosturile din LAN cu unicul IP public si trimiterea acestora pe
Internet. Efectul este ca pe Internet intreg LAN-ul este ascuns si nu se poate determina ce
host din LAN a generat pachetul sau ca exista LAN-ul. Pachetele par sa vina de la Router.
Avantaje NAT:
Economia de IP-uri publice. Cu un singur IP public putem crea o retea localta
conectata la Internet formata din zeci sau sute de hosturi;
Securitate. Lan-ul este izolat, nu se pot initializa conexiuni din exterior catre un
host din interior fara configuratii speciale ale routerului (port forwarding);
Un host Linux poate fi transformat intr-un router nededicat. Componenta software
care realizeaza NAT este NETFILTER (unica posibilitatea).
Nota
Procesul de NAT descris mai sus este referit de multe ori ca SNAT (source NAT) pentru
faptul ca se modifica IP-ul sursa privat cu IP-ul public. Aceasta referire nu este in
totalitate corecta fiindca SNAT este insotit intotdeauna de DNAT (destination NAT) si
anume la intoarcerea pachetului de pe Internet se inlocuieste IP-ul destinatie public cu IPul destinatie privat, iar pachetul este trimis la hostul din LAN de catre Router
Din punct de vedere al configurarii NETFILTER urmatoarele aspecte sunt
importante:
- SNAT se realizeaza pe chainul POSTROUTING folosind tabelul nat care este suficient sa
contina o singura regula;
- se foloseste targetul SNAT. Se poate folosi si targetul MASQUARADE in momentul in
care IP-ul public nu este static ci este obtinut dinamic;
- default hostul Linux nu ruteaza. Pentru a fi transformat intr-un router trebuie ca in fisierul
/proc/sys/net/ipv4/ip_forward sa se gaseasca valoarea 1 (unu);
Exemplu transformare host in router si configurare pentru SNAT (configuratie completa):
#presupunem ca ip-ul public este 213.232.32.3, subnetul local este 10.0.0.0/24 iar interfata
de WAN se numeste eth0
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j SNAT --to-source 213.232.32.3
#activeaza procesul de rutare
echo "1" > /proc/sys/net/ipv4/ip_forward
Nota
Se recomanda rularea scriptului de mai sus la butare automat folosind scripturi de
management a serviciilor din directorul /etc/init.d
Port Forwarding(DNAT)
Prin procesul de NAT intrega retea privata din spatele routerului este ascunsa pe
Internet. De multe ori se doreste conectarea la un serviciu ( Exemplu: un server web) care
ruleaza pe un host din LAN care este configurat cu IP privat ( Exemplu: 10.0.0.1)
Procesul prin care Routerul se configureaza astfel incat sa ofere posibilitatea
conectarii de pe Internet la un host din LAN cu IP privat se numeste DNAT (Destination
Network Address Translation) sau Port Forwarding.
Exemplu topologie:
Routerul are configurat un IP public pe interfata de WAN ( Exemplu: 88.0.0.1) si
un IP privat pe interfata de LAN ( Exemplu: 10.0.0.1). In LAN exista un server web care
asculta pe portul 80 si care are configurat IP-ul 10.0.0.10. Utilizatorii de pe Internet care
doresc conectarea la serverul web privat nu-l pot accesa fara ca routerul sa fie configurat
pentru DNAT.
Pentru userii de pe Internet reteaua 10.0.0.0/24 si implicit 10.0.0.10 sunt ascunse
(nu exista).
Modul de functionare DNAT este urmatorul: userul de pe Internet se conecteaza la
IP-ul public al routerului si anume 88.0.0.1 si portul 80. Routerul in momentul in care
primeste pachete catre portul 80 le redirecteaza catre serverul din LAN 10.0.0.10
modificand IP-ul destinatie din fiecare pachet (88.0.0.1 se transforma in 10.0.0.10) - de
unde si numele de DNAT. Pachetele ajung astfel la serverul web intern care raspunde catre
IP-ul sursa public (acesta nu se modifica).
Nota
Din perspectiva clientilor de pe Internet acestia se conecteaza la serverul web care ruleaza
pe router si nu la serverul web din spatele routerului.
Din punct de vedere al configurarii NETFILTER urmatoarele aspecte sunt importante:
-DNAT se realizeaza pe chainul PREROUTING folosind tabelul nat care este suficient sa
contina o singura regula. Chainul folosit este PREROUTING fiindca regulile din acesta
sunt evaluate inainte de procesul de rutare. In momentul in care are loc decizia de rutarea,
routerul trebuie sa aiba acces la IP-ul final si anume cel privat pentru o deciezie de rutare
corecta;
- se foloseste targetul DNAT;
Exemplu configurare router pentru DNAT:
- #presupunem ca IP-ul public este 88.0.0.1 iar IP-ul serverului web din LAN este
10.0.0.10. Pachetele din exterior catre 88.0.0.1 vor fi redirectate la 10.0.0.10
iptables -t nat -A PREROUTING -p tcp -d 88.0.0.1 --dport 80 -j DNAT --to-destination
10.0.0.10
Important
Pentru ca DNAT sa functioneza Routerul linux trebuie sa fie configurat si pentru
SNAT. Altfel pachetele ca raspuns ale serverului web din LAN care au ip sursa privat nu ar
putea fi trimise catre IP-ul public destinatie care este pe Internet.
Capitolul 9 Sistemul de e-Mail
Fundamente
In contextul mesajelor electronice un e-mail este format din: envelope si content (continut).
I. Envelope reprezinta un wrapper (invelitoare) in care se gaseste mesajul format din header
si body si este folosita de serverul STMP pentru a sti cum sa livreze e-mailul. Un envelope
contine
cel
putin
envelope
sender
si
envelope
recipient.
II. Content (continut) este format dintr-un header si optional un body.
1. Headerul are o structura aparte definita in diferite RFC-uri. Contine informatie tip
metadata precum Date, To, From etc
Headere obligatorii:
a) Date: specifica data la care mesajul a fost compus si trimis. Daca clientul omite acest
camp serverul il adauga automat;
b) From: specifica identitatea celui care trimite mesajul. Daca clientul omite acest camp
erverul de email il adauga automat;
Alte headere optionale:
c) Message-Id: identificator unic pentru mesaj generat de client sau de server daca clientul
il omite;
d) To: identitatea destinatarului sau destinatarilor principali (primary recipients). Daca
clientul omite acest camp serverul SMTP Postfix va adauga valoarea din parametrul
undisclosed_recipients_header;
Exemplu: undisclosed_recipients_header = To: dan
e) Subject: descrierea pe scurt e mesajului;
f) Cc: identitatea destinatarilor secundari (secondary recipients;)
g) Reply-To: indica adresa la care clientul trebuie sa trimita raspuns la mesaj;
h) Content-type: indica structura body (RFC 1049);
i) Received: Fiecare MTA (SMPT Server) care primeste mesajul adauga un astfel de
Header pentru a indica de unde, cand si cum a ajuns mesajul. Aceasta informatie este foarte
utila in detectarea rutei mesajului;
Inafara acestor Headere standard exista X-Headers care au rolul de furniza informatie nonstandard, optionala.
Exemplu: X-Mailer, X-Priority, X-Original-To etc
2. Body reprezinta o secventa de caractere care urmeaza dupa header separate de aceasta
print-o linie goala. Atasamentele fac de asemenea parte din Body si reprezinta o
reprezentare text/ASCII codata.
3. Attachments/Atasamente sunt in general fisiere binare (executabile, audio, video etc)
care sunt codate dupa anumite standarde in format ASCII si fac parte din Body.
Nota
MIME Encoding - Multipurpose Internet Mail Extensions - reprezinta un sistem/standard
de codare a informatiei binare in format text.
Valoarea din headerul Content-type care indica structura body poate fi:
text/plain -> mesaj text
multipart/mixed -> mesaj text + atasament non-text (executabile, audio, video etc)
message/rfc822 -> reply cu mesajul original atasat
In cazul tipului multipart exista un boundary care delimiteaza fiacare parte a body: text de
atasament1, de atasament2 etc
Exemplu: boundary este --=-88OdXvcEZkM/gT3yWOJX
Content-Type: multipart/mixed;
boundary="=-88OdXvcEZkM/gT3yWOJX"
Date: Wed, 30 Jan 2008 20:28:21 +0200
Message-Id:<1201717701.7673.25.camel@toshiba>
Mime-Version: 1.0 X-Mailer: Evolution 2.12.1 --=-88OdXvcEZkM/gT3yWOJX
Content-Type: text/plain Content-Transfer-Encoding: 7bit unu doi trei --=
88OdXvcEZkM/gT3yWOJX
Content-Disposition: attachment;
filename=cat
Content-Type: application/x-executable;
name=cat
Content-Transfer-Encoding: base64
f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAAIwECDQAAACsQgAAAAAA
DQAIAAHACgAGwAaAAYAA
AAAANIAECDSABAjgAAAA4AAAAAUAAAAEAAAAAwAAABQBAAAUgQQIF
EECBMAAAATAAAABAAAAA --=-88OdXvcEZkM/gT3yWOJX-Exista 2 standarde principale de codare sau transformare a atasamentelor binare in
caractere ASCII/text:
1. base64
Este cel mai folosit standar de codare definit in RFC 1421 si RFC 2045. Se folosesc
caracterele a-zA-Z0-9 precum "+" si "/". Caracterul "=" are un rol special.
Utilitarele mpack si munpack realizeaza codarea unui fisier binar in ascii.
Exemplu: mpack -o output.txt a.zip
Codarea/decodarea informatiei se realizeaza de catre MUA (clientul de e-mail). Tot acesta
adauga headere specifice.
Mime-Version: 1.0 --=-1qt4d7Y0wSyrkxqouOn6
Content-Disposition: attachment;
filename=MP612-en.pdf /*type/subtype of the message content*/
Content-Type: application/pdf;
name=MP612-en.pdf
Content-Transfer-Encoding: base64
JVBERi0xLjUNJeLjz9MNCjI3OTkgMCBvYmogPDwvTGluZWFyaXplZCAxL0wgM
EzMjIwMC9PIDI4
MDYvRSA0MDkwNi9OIDYzL1QgMjA3NjE3MS9IIFsgMjMxNiAxNDIyXT4+DWV
ZG9iag0gICAgICAg
2. quated-printable
Important
Pe scurt un e-mail este format din Envelope si Content. Content este format din Headere
si Body.
Protocolul SMTP este un protocol "text only". Chiar daca userul trimite un email care
contine imagini sau atasamente binare cum ar fi fisiere Excel, acestea sunt transformate in
caractere ASCII la sursa si trimise catre destinatie dupa un standard de codare (base64).
Destinatia decodeaza caracterele ASCII dupa acelasi standard in informatia binara
originala.
Relaying
Este procesul prin care un server de e-mail accepta mesaje pentru a le transmite. Un server
trebuie sa faca relay doar pentru userii din reteaua locala sau doar dupa ce acesta a
autentificat cumva userii. Altfel serverul poate fi folosit de spammeri pentru a trimite
mesaje nesolicitate.
Promiscuous relaying este procesul prin care un server accepta emailuri din afara retelei
locale sau de la useri neautentificati si le transmite la destinatii aleatoare. Anumite servere
(sendmail) erau configurate default pana nu de mult ca promiscuous relay.
Definitie
Notiunea de Reject sau Bounce reprezinta procesul de trimiterea a unui mesaj de eroare
inapoi la destinatar in momentul in care un e-mail nu poate fi livrat.
Inbox
Reprezinta locatia in care se gasesc e-mailurile fiecarui utilizator pe server. Default acesta
se gaseste in directorul /var/spool/mail intr-un fisier cu numele utilizatorului.
Exemplu: /var/spool/mail/dan sau /var/spool/mail/paul.
In cazul in care se foloseste IMAP si se creaza foldere, acestea se gasesc in
/home/USERNAME/mail. Exemplu: /home/dan/mail/Sent sau /home/paul/mail/Proiecte
Exista 2 formate pentru Inbox:
1. mbox
Este formatul clasic si inca foarte folosit. Toate e-mailurile din Inbox se gasesc intr-un
SINGUR fisier pe server. ( Exemplu: /var/spool/mail/dan).
Exista un separator folosit de clientul de e-mail pentru a diferentia intre doua e-mailuri.
Dezavantajul acestei metode este ca daca un singur email se corupe intreg Inbox devine
inutilizabil. In plus performantele sunt scazute fiindca in momentul citirii unui e-mail, de
fapt clientul de e-mail citeste o anumita portiune din marele fisier Inbox, care reprezinta emailul respectiv.
2. mdir
Este un concept nou introdus de qmail prin care fiecare e-mail se gaseste in propriul fisier.
Avantajele sunt performanta crescuta si securitatea.
Componentele
MUA/MDA/MTA
In comparatie cu alte servere unde un singur produs ofera o solutie finala, un sistem de
email este format din mai multe componente care lucreaza impreuna pentru a livra un e
mail de la sursa (Sender) la destinatie (Recipient).
Componentele unui sistem de e-mail sunt:
1. MTA - Mail Transfert Agent
Este aplicatia server folosit pentru trimiterea si primirea de e-mailuri. MTA este serverul de
e-mail sau serverul care implementeaza protocolul SMTP.
Printre cele mai cunoscute si folosite servere de e-mail se afla: Sendmail, Qmail, Postfix,
Exim si Microsoft Exchange.
Sendmail este primul server de e-mail din lume, creat pentru Unix, extrem de complex, dar
care de-a lungul timpului a avut o istorie plina de probleme si vulnerabilitati. Este inca cel
mai folosit server de e-mail care vine default pe distributii precum RHEL, CentOS, Fedora
sau SuSE.
Qmail se doreste un inlocuitor al lui Sendmail care a fost dezvolatat de matematicianul Dan
Bernstein avand securitatea ca principal avantaj. Se considera cel mai sigur server SMTP.
Celebrul anunt al lui Bernstein prin care acesta oferea un premiu de $500 celui care
descopera un bug de securitate in qmail este de asemenea celebru.
Postfix este un server modern creat de Wietse Venema un expert in securitate de la IMB.
Se doreste de asemenea un inlocuitor al lui Sendmail si este mult mai usor de configurat si
inteles. De asemenea se poate migra de la Sendmail la Postfix fara nicio configuratie sau cu
efort minim (configuratia sendmail este compatibila cu cea postfix). Postfix este
OpenSource
Exim este un alt MTA modern. Acesta a fost creat de Philip Hazel la Universitatea
Cambridge. Exim este OpenSource.
Exchange este serverul de e-mail al lui Microsoft folosit pe sisteme de operare Windows.
Acesta este proprietar cu sursa inchisa.
Nota
1. Fiecare server de e-mail are avantaje si dezavantaje si nu se poate spune cu siguranta
care este cel mai bun. In functie de necesitati, cerintele retelei sau trafic o solutie sau alta
poate fi optima.
2. In acest curs se va prezenta serverul de e-mail Postfix datorita modul de constructie al
acestuia si a faptului ca este mai usor de inteles si configurat decat celelalte. In plus Postfix
este compatibil cu Sendmail, inca cel mai folosit server de e-mail.
3. Intrebarea fireasca este: de ce nu se studiaza Sendmail daca este inca cel mai folosit?
Fiindca Sendmail este inca foarte folosit nu datorita in primul rand eficientei sale ci
datorita unor considerente istorice. Este primul server, vine default pe multe distributii, iar
personalul calificat in administrarea Sendmail este mai numeros. Cota de piata a acestuia
este in scadere.
Important
Serverul de e-mail este cel mai complex, greu de inteles si configurat server dintre cele
prezentate in acest curs. O intelegere profunda a modului de operare si configurare a
acestuia nu poate veni decat in timp dupa foarte multa experienta practica reala.
2. MUA - Mail User Agent
MUA este programul client folosit de user pentru a se conecta la serverul de e-mail in
scopul trimiterii de mesaje. Acesta este clientul SMTP.
Exemplu: Mozilla Thunderbird, Outlook Express, Evolution etc
3. MDA - Mail Delivery Agent
MDA este un program care ruleaza pe server si care livreaza(muta) emailul in inbox-ul
userului dupa ce acesta a fost acceptat de MTA.
Exemplu: clasicul procmail
Ca parte integranta a unui sistem de e-mail se gasesc si protocoalele POP si IMAP. Cu
ajutorul acestora utilizatorul poate downloada e-mailurile primite de pe server pe hostul
local. Pentru detalii cititi capitolul "Serverul POP/IMAP" a acestui curs.
Ruta unui E-mail intre Sender si Recipient
User A =
User B =
Sender
Recipient
1. Userul A deschide clientul de e-mail/MUA (Thunderbird) si incepe sa compuna e mailul.
In momentul trimiterii acestuia, MUA se conecteaza folosind protocolul SMTP la
MTA/server e-mail (Postfix). Userul A are cont pe serverul de e-mail.
2. Daca destinatarul are cont pe acelasi server, MDA (procmail) preia mesajul de la MTA
(postfix) si-l livreaza in inboxul userului B.
Daca destinatarul are cont pe un alt server, MTA se conecteaza la MTA remote, cel pe care
are cont userul B, si transmite e-mailul. In comunicatia dintre cele 2 servere se foloseste
protocolul SMTP.
3. Dupa ce mesajul a ajuns pe serverul remote, acesta este livrat de MDA in inbox.
4. Userul B se conecteaza cu MUA (Thunderbird) la serverul POP sau IMAP care ruleaza
pe acelasi host cu serverul de e-mail. Cu ajutorul protocolului POP sau IMAP userul B isi
downloadeza mesajul local pe propriul calculator. In comunicatia dintre MUA si sever se
foloseste protocolul POP sau IMAP.
Protocolul SMTP
SMTP (Simple Mail Transfer Protocol) este un protocol la nivel aplicatie care functioneaza
client server. Serverul asculta default pe portul TCP/25.
SMTP este standardul "de facto" de trimitere de e-mailuri in Internet. Acesta a fost
standardizat de IETF in RFC 821. In prezent se foloseste o varianta imbunatatita numita
ESMTP (Extended SMTP) care este definita in RFC 2821.
SMTP se foloseste doar pentru trimiterea e-mailului de la client (Thunderbird) la server
(Postfix) sau intre servere daca Sender-ul si Recipient-ul au conturi pe servere diferite.
Pentru primirea e-mailului pe hostul client, se foloseste POP sau IMAP.
SMTP este un protocol simplu, intreaga comunicatie realizandu-se DOAR in text. Chiar
daca userul are de trimis un fisier binar ca atasament ( Exemplu: un fisier video), acesta
este convertit in text dupa un standard (base64) si trimis catre destinatar.
Una dintre limitarile protocolului este securitatea scazuta datorita faptului ca acesta a fost
dezvoltat initial in anii 70-80 cand nu existau virusi, vulnerabilitati de securitate sau atacuri
informatice.
SMTP nu contine niciun mecanism de autentificare a Senderului. Orice user se poate
conecta la server pe portul tcp/25 si trimite e-mail catre orice destinatie. Acest mod de
operare este inacceptabil astazi in contextul in care spamurile reprezinta mai mult de
jumatate din totalitatea mesajelor de pe Internet.
Extensia care adauga functia de autentificare a clientilor pentru care serverul smtp face
relay (accepta e-mailuri pentru a le livra) se numeste SMTP-AUTH.
O alta varianta folosita este POP before SMTP sau IMAP refore SMPT si reprezinta o
modalitate prin care un user se autentifica initial la un server pop/imap iar in cazul
autentificarii cu succes ii este permis relay-ul smpt. Serverul POP/IMAP salveaza IP-ul
clientului, temporar, intr-un fisier care este verificat de SMTP server pentru a face relay.
Un alta problema de securitate a protocolului SMTP este ca acesta comunica in clar.
Informatia poate fi captata usor folosind un sniffer.
Pentru securizare se foloseste criptarea mesajelor in car cu SSL/TLS ceea ce duce la un nou
protocol numit SMTPS (SMTP over SSL).
Exemplu comunicatie SMTP intre client si server:
Serverul Postfix
Prezentare generala
Postfix este un server de e-mail sau SMTP dezvoltat de Dr. Wietse Venema, un cercetator
de la IBM cunoscut pentru lucrarile sale din domeniul securitatii informatiei. Codul a fost
facut disponibil ca OpenSource in 1998 si a continuat sa fie dezvoltat continuu.
Principalele avantaje Postfix sunt:
1. Reliability
Postfix ruleza optim in conditii de stress cand sistemul este foarte incarcat. Poate procesa
un numar foarte mare de mesaje printr-un management al resurselor extrem de eficient.
2. Security
Default Posftix presupune ca ruleaza intr-un mediu ostil si contine mai multe layere de
securitate. Fiecare proces generat de Postfix ruleaza izolat si pe principiu privilegiilor
minime.
3. Performance
Postfix a fost creat avand performanta crescuta ca principal ofiectiv.
4. Flexibility
Postfix este compus din mai multe programe si subsisteme independente care impreuna
printr-o configurare optima ofera un sistem de e-mail performat si flexibil.
5. Ease-of-use
Postfix este unul dintre cele mai usor de instalat, configurat si administrat serverele de e
mail. Avand exemplu lui Sendmail si anume o complexitate extrema, creatorul lui Postfix a
vrut sa dezvolta un program a carui configurare si administrare este logica.
6. Sendmail compatibility
Postfix poate inlocui Sendmail cu un efort minim. Acesta interactioneza cu componentele
Sendmail, iar fisierul de configurare poate fi convertit automat dintr-un format in altul.
Compilare si instalare
Instalarea prin compilare a serverului Postfix este putin deosebita fata de instalarea altor
servere, in primul rand fiindca nu exista scriptul configure. Exemplu de mai jos s-a realizat
pe Fedora Core 9. In mod IDENTIC se compileaza si instaleaza pe orice distributie Linux.
Pasi de urmat:
1. Download sursele ultimei versiuni Postfix de pe site-ul producatorului
www.postfix.org. Acestea pot fi downloadate in orice director din sistem.
Se ruleaza: wget http://postfix.imar.ro/postfix-release/official/postfix-2.5.3.tar.gz
2. Verificare integritate arhiva tar.gz folosind hash-ul sau semnatura digitala (Optional
dar foarte recomandat)
3. Decomprimare si dezarhivare arhiva si mutare in directorul cu surse creat.
Se ruleaza: tar -xzvf postfix-2.5.3.tar.gz
4. Compilare
Se recomanda compilarea oricarei aplicatii de catre un user neprivilegiat.
In urma compilarii rezulta din fisierele sursa fisiere executabile.
Se ruleaza: make
5.Instalare
Inainte de instalare trebuie creati 2 useri sub care vor rula 2 procese din Postfix si anume
userul postfix si postdrop. Acestia sunt default si pot fi schimbati daca se doreste.
Se ruleaza: useradd -s /bin/false postfix si useradd -s /bin/false postdrop
Instalarea presupune doar mutarea fisierelor executabile rezultate in urma compilarii din
directorul cu surse in directorul dorit. Comanda poate fi executata doar de root.
Se ruleaza: make install
Acest pas este interactiv. Userul poate alege diferite optiuni cum ar fi: cei 2 useri necesari
functionarii Postfix, directorul cu fisierele de configuratie, directorul cu man page-urile,
calea catre diferite programe componente ale Postfix etc
Configurare de baza
Important
Pentru a putea exersa cele exemplificate mai jos trimitand si primind e-mailuri cu un client
dedicat precum Outlook Express sau Thunderbird este nevoie si de un server POPv3 sau
IMAPv4. Serverul prezentat in acest curs este Dovecot. Il puteti instala automat folosind
yum install dovecot sau apt-get install dovecot pentru acest moment. Serverul va porni fara
nicio modificare a fisierului de configurare sau cu modificari minime (in functie de
distributie). Pentru a porni serverul: /etc/init.d/dovecot start.
Capitolul urmator va prezenta acest server in detaliu.
Notiuni generale:
Fisierele de configurare pentru Postfix sunt /etc/postfix/main.cf - Global Postfix
configuration file si /etc/postfix/master.cf - Postfix master process configuration file.
Configurarea serverului presupune editarea acestor fisiere in special main.cf. Dupa orice
editare, serverul trebuie restartat fiindca citirea configuratiei are loc doar la pornire (ca la
orice alt server Linux de altfel).
Fisierul de configurare main.cf este format dintr-o serie de parametri si valorile acestora.
Exista peste 300 parametri pentru Postfix. Daca un parametru nu apare in main.cf nu
inseamna ca acesta nu exista ci doar ca se foloseste valoarea defualt pentru el.
Exemplu: mynetworks = 192.168.0.0/24, 127.0.0.0/8
Randurile care incep cu #(diez) reprezinta comentarii si sunt ignorate.
Pentru a ne referi la valoarea unui parametru se precede parametrul cu semnul $(dollar)
Exemplu: relay_domains = $mydestination - parametrului de configurare relay_domains ise asigneaza valoarea parametrului mydestination
Directorul Inbox, cel in care sunt livrate mesajele primite de fiecarui utilizator este:
/var/spool/mail/USERNAME ( Exemplu: /var/spool/mail/dan)
Nota
/var/spool/mail si /var/mail sunt hard linkuri
In cazul in care se foloseste IMAP si se creaza foldere, acestea se gasesc fizic in directorul
/home/username/mail ( Exemplu: /home/dan/mail)
Pornirea serverului SMTP se realizeaza cu ajutorul comenzii postfix. Aceasta ia parametri
start, stop sau reload.
Fisierul default in care serverul salveaza logurile este /var/log/maillog.
Aliases
Postfix ca si Sendmail foloseste un fisier aliases pentru redirectarea e-mailurilor destinate
userilor care nu exista in /etc/passwd, catre alti destinatari locali care trebuie sa existe in
/etc/passwd.
Fisierul alis (/etc/aliases) este format din definiitii tip alias de forma: alias:
target1,target2,target3 etc. Randurile care incep cu #(diez) sunt comentarii.
Aceasta forma de redirectare se foloseste atunci cand useri care nu au Inbox primesc e
mailuri ( Exemplu: userul postfix, wwwuser sau chiar root) sau pentru crearea de mail lists.
Exemplu /etc/aliases:
#emailurile catre userii admin, wwwuser si youradmin sunt redirectate catre userul root
admin: root wwwuser: root youradmin: root
#emailurile catre root sunt redirectate catre userul dan root: dan
#emailurile catre userul marketing sunt redirectate si catre dan, paul, dana, john si smith
marketing: dan,paul,dana,john,smith
#emailurile catre dan sunt redirectate si catre userul sef dan: sef
Important
Userul din partea stanga a celor 2 puncte nu trebuie sa existe ca user de sistem, dar cei din
dreapta trebuie sa se gaseasca in /etc/passwd.
Dupa fiecare modificare a fisierului /etc/aliases trebuie rulata comanda newaliases care
creaza baza de date pentru aliasuri /etc/aliases.db care este folosita de server.
Daca la pornirea serverului obtinem mesajul de eroare fatal: open database /etc/aliases.db:
acest lucru se datoreaza faptului ca serverul nu gaseste fisierul baza de date pentru aliasuri
care este /etc/aliases.db. Pentru crearea sa se ruleaza comanda newaliases.
Securitate Postfix
Relaying
In mod implicit protocolul SMTP nu autentifica userii care se conecteaza la acesta pentru
livrarea de emailuri. Extensia care realizeaza autentificarea userilor se numeste SMTP
AUTH.
Default (fara SMTP AUTH) postfix accepta emailuri pentru delivery (face relay) doar daca
una dintre urmatoarele conditii este indeplinita:
1. IP clientului se gaseste in parametrul $mynetworks caz in care destinatia poate fi locala
sau remote.
2. Domeniul destinatie final este in $mydestination caz in care clientul poate fi local sau
remote.
Nota
Postfix nu accepta pentru delivery indiferent de la cine, mailuri catre useri din domeniile
locale ($mydestination) inexistenti in /etc/passwd sau in /etc/aliases.
Pentru a permite relay de la alte hosturi se poate folosi:
1. mynetwork_style=<class|subnet|host>
class = postfix sumarizeaza la clasa A, B sau C a interfetelor sale si face relay la hosturile
din acea clasa
subnet = postfix accepta mailuri pt. delivery doar de la subretelele interfetelor sale
host = postfix accepta mailuri doar de la propriile sale IP-uri (clientul este serverul)
Pentru a seta permisiuni individuale de relay:
mynetworks = 127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/24
2. Alternativ se poate folosi:
#in /etc/postfix/file1 se specifica IP-uri individuale mynetworks=hash:/etc/postfix/file1
#in /etc/postfix/file1 se poate folosi CIDR (Classless Interdomain Routing) notation
mynetworks=cidr:/etc/postfix/file2
Filtre si restrictii
Important
Restrictiile Postfix sunt concepte foarte avansate care pot fi folosite si customizate doar
dupa o intelegere foarte buna a protocolului SMTP si mai ales a etapelor implicate in
comunicatia SMTP dintre client si server.
Primul auto test pentru verificarea cunostintelor legate de SMTP este trimiterea unui e mail
folosind telnet.
Va recomand parcurgerea acestei sectiuni doar dupa buna intelegere a protocolului SMTP.
Restrictiile permit serverului de e-mail sa accepte sau sa rejecteze mesaje inspectand
comunicatia SMTP care are loc intre acesta si client.
Nota
Termenul restrictie se refera la a nu permite o anumita actiune. Pentru Postfix o rescrictie
poate sa insemne exact opusul si anume adminul poate defini o restrictie folosita pentru a
permite anumite mesaje.
Fiecare restrictie SMTP se refera la un stagiu din comunicatie SMTP.
Restriction Triggers
Sunt "empty boxes" de care se ataseaza restrictiile.
Fiecare trigger se refera la un stagiu din comunicatia SMTP.
1. smtpd_client_restrictions
Acest trigger se executa in functie de IP sau hostname-ului clientului
2. smtpd_helo_restrictions
Acest trigger se executa in functie de valoarea parametrului HELO/EHLO, client IP sau
client hostname
3. smtpd_sender_restrictions
Acest trigger se executa in functie de sender envelope
4. smtpd_recipient_restrictions
Acest trigger se executa in functie de recipient envelope, sender envelope, HELO/EHLO si
IP/Hostname client. Default Postfix permite orice recipient pentru clientii din parametrul
mynetworks, relay_domains si mydomains. Astfel Postfix nu este un open relay.
5. smtpd_data_restrictions
6. smtpd_etrn_restrictions
Acest trigger restrictioneaza clientii care incearca sa faca flush la coada serverului.
Restrictii Postfix
Restrictii se ataseaza de un trigger.
1. Generic restrictions
Nu verifica nimic in dialogul smtp doar executa o comanda
Acestea sunt:
a) permit
b) defer
c) reject
d) warn_if_eject
2. Switchable restrictions
Aceste restrictii se activeaza/dezactiveaza, iar odata activate verifica anumite conditii
Acestea sunt:
a) smtpd_helo_required - clientii sunt obligati sa trimita valoarea parametrului
HELO/EHLO prin care se indetifica la inceputul sesiunii SMTP
b) strict_rfc821_envelopes - aceasta restrictie ajusteaza toleranta Postfix la erorile din
MAIL FROM si RCPT TO.
c) disable_vrfy_command - disables recipient address verification
3. Customizable Restrictions
Aceste restrictii sunt formate dintr-o cheie(filtru) si o valoare (actiunea de intreprins daca
filtrul returneaza true).
Sintaxa unei restrictii
restriction_trigger = conditional_restriction, customizable_restriction \
maptype:/path/to/the/map, general restriction
sau
restriction_trigger = conditional_restriction customizable_restriction
maptype:/path/to/the/map, general restriction
Pentru testa restrictiile fara aplicarea lor imediata se foloseste restrictia generica
warn_if_reject care doar scrie in loguri:
Exemplu:
smtpd_sender_restrictions = warn_if_reject reject_unknown_sender_domain
Postfix vine default cu o serie de restrictie pentru a nu deveni un OpenRelay.
Pentru vizualiza restrictiile default pt. fiecare trigger:
postconf -d smtpd_recipient_restrictions
postfont -d smtpd_sender_restrictions
Exemplu: Restrict emails from unknown domains. Postfix va incerca sa rezolve domeniul
senderului.
smtpd_sender_restrictions = reject_unknown_sender_domain permit_mynetworks
reject_unauth_destination permit
Alte restrictii utile:
a) reject_non_fqdn_recipient ->recipientul trebuie sa fie fqnd (user@domeniu.com nu doar
user)
b) reject_non_fqdn_hostname ->valoarea parametrului Helo tb. sa fie fqdn
c) reject_invalid_hostname -> valoarea parametrului HELO tb. sa contine caractere valide
d) reject_non_fqdn_sender -> envelope sender trebuie sa fie fqdn
e) reject_unknown_sender_domain -> postfix realizeaza dns query pt. sender domain. F.
important pentru anti-spam
f) reject_unknown_recipient_domain
Obvious Forgeries
1. Reject clients care folosesc numele serverului la care se conecteaza in HELO
a) creare map file: /etc/postfix/helo_checks care contin variatii are propriului nume
/^crystalmind\.biz$/ 550 don't use my ip /^192\.168\.0\.13$/ 550 don't use my ip
b) in main.cf
smtpd_recipient_restrictions = check_helo_access pcre:/etc/postfix/helo_checks
2. Bogus domains
a) creare map file: /etc/postfix/bogus_mx
0.0.0.0/8 550 Mail server in broadcast domain 10.0.0.0/8 550 RFC 1918 192.168.0.0/24
550 RFC 1918 69.0.0.0/18 550 SPAM
b) in main.cf:
smtpd_recipient_restrictions = check_sender_mx_access cidr:/etc/postfix/bogus_mx
3. DNS Blacklist
In main.cf:
smtpd_recipient_restrictions = reject_rbl_client relays.ordb.org
Nota
Pentru a verifica daca un IP ( Example: 117.0.0.2) este listat in relays.ordb.org se ruleaza:
host 2.0.0.117.relays.ordb.org
Programe utilitare
Utilitare Postfix
1. postfix - Postfix control program.
Se foloseste pentru pornirea, oprirea sau recitirea fisierului de configurare main.cf. postfix
<start|stop|reload>
Exemplu: postfix start
2. mailq - afiseaza coada
[root@pc3 ~]# mailq -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient---D6D1DD65F9 741 Wed Jan 30 13:43:34 dan@crystalmind.ro paul@crystalmind.ro – 1
Kbytes in 1 Requests.
3. postcat -q QUEUE_ID - afiseaza continutul emailul din coada (envelopes + headers +
body)
QUEUE_ID este id-ul obtinut prin rularea comenzii mailq
4. postmap - creaza indexed maps din flat files
5. postlog - permite programelor externe precum scripturi sa scrie in logurile lui postfix
Exemplu: postlog testing logging ->scrie in /var/log/maillog stringul "testing logging"
6. postqueue - postfix user interface for queue management (postfix trebuie sa ruleze)
Exemplu:
postqueue -f - flush the queue, incearca sa livreze toate mesajele din coada postqueue -p afiseaza coada (echivalent cu comanda mailq). Sunt afisate toate cozile.
La afisarea cozii caracterul "*" din dreptul mesajului inseamna ca aceasta este in "active
queue", iar "!" inseamna ca mesajul este in "hold queue" si nu se mai incearca livrarea
acestuia.
postfix -s domain.com - incearca livrarea mesajelor pentru un anumit domeniu.
7. postsuper (postfix nu trebuie sa ruleze, comanda doar pt. root)
Exemplu:
postfix -h 7005DD65F9 -> plaseaza mesajul cu ID 7005DD65F9 in hold queue
postfix -H 7005DD65F9 -> incearca livrarea mesajului cu ID 7005DD65F9 din hold queue
postfix -d 7005DD65F9 -> sterge mesajul cu ID 7005DD65F9 din coada
Nota
Pentru a observa mesaje in coada se poate
maximal_queue_lifetime la o valoare foarte mare.
Exemplu:
seta
in
main.cf
parametrul
maximal_queue_lifetime 45334d
8. postconf - afiseaza valoarea parametrilor de configurare
Cu optiunea -d se afiseaza valorile default.
Exemplu:
[root@pc5 ~]# postconf -d mynetworks
mynetworks = 127.0.0.0/8 192.168.0.0/24
Fara optiunea -d se afiseaza valorile reale, de running.
Exemplu:
[root@pc5 ~]# postconf mynetworks
mynetworks = 192.168.0.0/24, 127.0.0.0/8
9. Postconf poate fi folosit si pt. modificarea fisierului main.cf
Exemplu: postconf -e "mynetworks = 127.0.0.0/8 192.168.0.0/24"
Cozi/Queues
O coada este o zona de memorie in care serverul salveaza temporar emailul inainte de a-l
livra.
Managementul cozilor este realizat de qmgr
#Queue directory este default /var/spool/postfix queue_directory = /var/spool/postfix
Fiecare coada este reprezentata de un subdirector in /var/spool/postfix
Cele mai importante cozi sunt:
1. incoming
Toate mesaje primite de postfix ajung sa fie trimise in incoming queue de catre cleanup
daemon. Cleanup daemon reprezinta ultimul stagiu de procesare a mesajelor noi. Rolul
acestuia este de a adauga headere lipsa, message rewriting precum si extragerea diferitilor
destinatari. Dupa ce acesta insereaza mesajul in incoming queue anunta queue manager ca
un mesaj nou a sosit. Mesajele din incoming queue sunt apoi mutate in active queue.
2. maildrop
Mesajele trimise folosind comanda sendmail sau mail sunt asteapta procesarea in maildrop.
Postfix poate sa nu ruleze, iar la pornire va scana si procesa toate mesajele din maildrop.
3. deferred
In aceasta coada sunt puse mesajele a coror livrare catre unul dintre recipienti nu s-a putut
realiza. Queue manager scaneaza periodic aceasta coada.
4. active
In aceasta coada ajung toate mesajele care sunt gata sa fie livrate dar nu sunt livrate in acest
moment. Mesajele ajung in active queue din incoming queue, fiind mutate de catre cleanup
daemon. Dimensiunea maxima a acestei cozi este de 20000 mesaje.
5. hold
Administratorul poate defini politici pentru verificarea headerului si body astfel incat un
email sa fie redirectionat in hold queue din procesul normal. Mesajele din aceasta coada
stau maximum_queue_lifetime dupa care sunt trimise inapoi la sender (bounced to the
sender). Comanda postsuper -r ofera o noua sansa mesajelor sa fie livrate mutandule in
maildrop queue.
6. corrupt
Mesajele corupte sunt duse in corrupt queue astfel incat administratorul sa le poate
inspecta folosind comanda postcat
Managementul Logurilor
Syslog
Prezentare generala
In Linux una dintre sarcinile cele mai frecvente ale unui administrator de sistem este de-a
verifica logurile serverelor care ruleaza. Fiecare serviciu salveaza informatii despre modul
de operare, avertismente sau erori generate in fisiere text numite loguri. Acestea se gasesc
in directorul /var/log
Pentru a putea urmarii eficient intrega activitate de pe Server, Router sau Firewall trebuie
configurat in detaliu modul (cantitatea si tipul de mesaje) de logare pentru fiecare server
care prezinta interes.
Din punct de vedere al securitatii sistemului, logurile reprezinta modalitatea prin care
adminul poate identifica incercarile de logare neautorizate sau modul prin care a fost
compromis un server sau intreg sistemul.
Syslog reprezinta standardul de forwardare si salvare a mesajelor de tip log intr-o retea IP.
Termenul Syslog se refera atat la librariile folosite de servere pentru salvarea de mesaje in
fisiere de tip log cat si la protocolul/standardul de logare din sistem.
Syslog ruleaza client server. syslogd numit daemonul syslog sau serverul syslog reprezinta
aplicatia care receptioneaza si proceseaza mesajele si ruleaza default de orice distributie de
Linux. Este pornit la butarea sistemului de catre un script de initializare din /etc/init.d
Din punct de vedere istoric Syslog a fost dezvoltat in anul 1980 de catre Eric Allman,
creatorul primului server de e-mail numit Sendmail. Scopul acestuia era de a fi folosit ca
parte integranta a serverului pentru logarea mesajelor generate de acesta.
IETF a standardizat in 2001 protocolul syslog in RFC 3164. In prezent syslog reprezinta
standardul "de facto" si "de jure" de logare folosit atat pe Unix/Linux cat si pe alte sisteme
de operare sau echipamente dedicate precum Routere sau Switch-uri Cisco.
syslogd ruleaza impreuna cu klogd (Kernel Log Daemon) pentru logarea de mesaje.
Fisierul de configurare al daemonului syslogd este /etc/syslog.conf
Nota
Pe distributiile recente de Linux (Exemplu: Fedora Core 9) syslogd a fost inlocuit cu
rsyslogd - Reliable and Extended syslogd. Acesta reprezinta o versiune imbunatatia dar
compatibila cu syslogd. Fisierul sau de configurare este /etc/rsyslog.conf
Configurare
Prima sarcina care trebuie indeplinita pentru monitorizarea logurilor este identificare
locatiei acestora. Fisierul de configurare syslog.conf stabileste locatia logurilor precum si
cantitatea si tipul de mesaje salvate.
Fiecare rand din fisierul syslog.conf reprezinta o regula de logare si este formata dintr-un
SELECTOR si o ACTIUNE. Selectorul si actiunea sunt separate de unul sau mai multe
spatii sau tab. Randurile care incepe cu #(diez) reprezinta comentarii si sunt ignorate.
Exemplu:
# Log all the mail messages. mail.info /var/log/maillog
Selectorul este mail.info, iar actiunea este /var/log/maillog
Un selector este format din 2 parti separate prin .(punct) si anume: facility si priority.
Facility reprezinta tipul de mesaj logat si poate fi: auth, authpriv, cron, daemon, kern, lpr,
mail, news, syslog, user, uucp, local0, local1, local2, local3, local4, local4, local6 si local7.
*(asterix) inseamna orice facilitate.
Prioritatea reprezinta un cod care indica cantitatea de mesaje logate. In ordine crescatoare a
prioritatii, dar in ordine descrescatoare a cantitatii de mesaje logate prioritatile sunt: debug,
info, notice, warning, warn (echivalent cu warning), err, error (echivalent cu err), crit, alert,
emerg, panic (echivalent cu emerg). Prioritatile error, warn si panic sunt considerate
invechite si nu se recomanda a mai fi folosite.
*(asterix) inseamna orice prioritate.
In momentul specificarii unei prioritati pentru o facilitate, mesajele cu prioritate mai mare
sunt de asemenea incluse.
Exemplu: auth.err include si auth.crit, autch.alert si auth.emerg
Pentru a selecta doar mesajele de o anumita prioritate si nu si pe cele cu crioritate mai mare
se foloseste semnul =(egal).
Exemplu: auth.=err selecteaza doar mesajele cu prioritatea err nu si pe cele cu prioritatea
crit, alert sau emerg.
Semnul !(semnul exclamarii) are rolul de a exclude mesajele de o anumite prioritate sau
mai mare.
Exemplu: mail.!crit va exclude mesajele cu prioritate crit, alert sau emerg.
Pentru a exclude toate mesajele pentru o facilitate se foloseste prioritatea none. Exemplu:
mail.none
Cealalta componenta pe langa SELECTOR a fiecarui rand din syslog.conf, ACTIUNEA,
stabileste termenul generic si abstract numit logfile sau locatia catre care se redirecteaza
logurile pentru o anumita facilitate si prioritate.
Un logfile poate fi:
a) fisier normal
Se specifica obligatoriu folosind calea absoluta.
Exemplu: authpriv.* /var/log/secure
Fisierul poate fi precedat de semnul -(minus) caz in care acesta nu mai este sincronizat
(salvat) dupa fiecare mesaj logat ci numai dupa ce mai multe mesaje sunt salvate intr-un
buffer. Avantajul este cresterea performante, iar dezavantajul este pierderea de informatie
in cazul unui crash.
Exemplu: authpriv.* -/var/log/secure
b) user
Mesaje de tip log pot fi redirectate la consola/terminalul la care userul este logat. Daca se
doreste trimiterea mesajelor catre mai multi useri acestia se separa cu virgula.
Exemplu: kern.crit root,admin
c) remote host
In cazul unei retele in care se gasesc mai multe servere sau echipamente ale caror loguri
trebuie urmarite este mai eficient ca acestea sa fie redirectate catre un host remote. In acest
mod avem un loc centralizat de logare.
Nota
In cazul compromiterii unui server sau a intregului sistemul una dintre primele activitati
ale Crackerului este "sa-si stearga urmele" adica sa stearga logurile referitoare la activitata
sa pentru a nu putea fi descoperit de admin. Logarea pe un sistem remote rezolva aceasta
problema fiindca stergerea logurilor de catre cracker presupune compromiterea inclusiv a
serverului pe care se logheaza.
Pentru logarea remote se foloseste semnul @ in fata actiunii.
Exemplu: authpriv.alert @192.168.0.15
d) named pipe
Logurile pot fi redirectate inclusiv catre fisiere speciale numite named pipes care anterior
trebuie create folosind comanda mkfifo.
Exemplu: kern.=debug |/usr/adm/debug
Important
Dupa fiecare modificare a fisierului /etc/syslog.conf sau /etc/rsyslog.conf in functie de
versiune, daemonul syslogd sau rsyslogd trebure restartat. Exemplu: /etc/init.d/rsyslog
restart
Fisiere standard in care se pastreaza logurile:
/var/log/messages - reprezinta fisierul principal cu loguri al sistemului in care se salveaza
informatii de la majoritatea serverelor
/var/log/wtmp - reprezinta un fisier binar care pastreaza informatii despre logarile in
sistem;
/var/log/boot.log - pastreaza informatii despre procesul de butare;
/var/log/secure - pastreaza informatii despre actiuni legate de securitate (lagare prin ssh,
comanda su etc);
/var/log/cron - pastreaza informatii despre cron daemon;
/var/log/dmesg - pastreaza informatii despre kernel si hardware;
Exemplu syslog.conf:
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none
/var/log/messages
# The authpriv file has restricted access. authpriv.* /var/log/secure
# Log all the mail messages in one place. mail.* -/var/log/maillog
# Log cron stuff cron.* /var/log/cron
# Everybody gets emergency messages *.emerg *
# Save news errors of level crit and higher in a special file. uucp,news.crit
/var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log
Detalii:
logrotate.conf este format dintr-o sectiune globala de optiuni care se refera la optiunile
nespecificate in mod express pentru fisierele log in sectiunea fiecaruia
Exemplu:
# rotate log files weekly weekly # keep 4 weeks worth of backlogs. Numarul de versiuni
pastrate rotate 4
pe langa optiunile globale pentru fiecare fisier log exista o sectiune care specifica optiunele
de rotire pentru respectivul fisier. Aceasta sectiune se poate gasi in /etc/logrotate.conf sau
intr-un fisier separat in directorul /etc/logrotate.d.
Toate fisierele din directorul /etc/logrotate.d sunt incluse in logrotate.conf
Exemplu:
/var/log/httpd/access.log { rotate 5 mail www@my.org size=100k create 0660 wwwuser
wwwuser postrotate /sbin/killall -HUP httpd endscript }
Detalii:
rotate 5 - se pastreaza 5 versiuni ale lui access.log si anume access.log.1 pana la
access.log.5;
mail www@my.org - inainte de rotire sunt trimise pe email la adresa specificata;
size=100k - fisierul este rotit in momentul in care dimensiunea sa depaseste 100k;
create 0660 wwwuser wwwgroup - imediat dupa rotire se creaza un nou fisier cu acelasi
nume cu permisiunile 0660 si avand owner si group owner pe wwwuser respectiv
wwwgroup;
postrotate - scripturile care apar intre postrotate si endscript se executa automat dupa
rotirea logurilor. In general acestea sunt scripturi care restarteaza serverul respectiv pentru
a loga in noul fisier creat;
In linux un fisier se identifica dupa numarul de inode. Dupa rotire, noul fisier creat care
reprezinta o versiune a vechiului fisier are acelasi inode number, iar serverul va continua sa
salveze informatii in el ( Exemplu: access.log.1)
Alte optiuni ce pot aparea in logrotate.conf
daily, weekly sau monthly - fisierul este rotit zilnic, saptamanal sau lunar indiferent de
dimensiune;
missingok - daca fisierul nu exista nu se raporteaza eroare;
ifempty/notifempty - roteste/nu roteste fisierul daca acesta este gol;
compress/nocompress - comprima/nu comprima fisierul de tip log;
2. Verificarea constanta a logurilor
Fiindca forma in care multe servere logheaza informatia nu este "prietenoasa" si pentru ca
volumul de informatie este extrem de mare, verificare manuala a logurilor are loc doar in
momentul in care a avut loc un eveniment deosebit sau cand informatia cautata este de
detaliu.
In general se folosesc programe numite "System log analyzers and reporters" care
genereaza un rezumat al logurilor si pe care-l formateaza intr-un mod usor de urmarit.
Logwatch este unul dintre cele mai folosite programe pentru generarea de rezumate a
logurilor.
Printre optiunile sale se afla:
trimiterea automata a rezumatului pe e-mail;
generarea de fisere raport comprimate sau nu;
flexibilitate maxima in ceea ce priveste informatiile din raport;
Nota
Logwatch este un script scris in Perl care parseaza fisierele din /var/log.
Commanda logwatch foloseste fisierul de configurare
/usr/share/logwatch/default.conf/logwatch.conf.
Optiunile din fisier pot fi suprascrise ruland logwatch cu diferite optiuni.
Printre cele mai importante optiuni sunt:
--detail -> indica gradul de detalii din raport
--logfile file -> proceseaza doar fisierul indicat ( Exemplu: /var/log/messages)
--service name -> numele serviciului ale carui loguri creaza raportul ( Exemplu: sshd,
httpd, all)
--print -> output este directionat la consola
--mailto address -> trimite raportul automat pe e-mail la adresa specificata
--range <yesterday|today|all> -> perioada care contine logurile ce creaza raportul
--logdir dir -> cauta in directorul specificat si subdirectoarele sale, fisierele log pentru
generarea raportului. Default este /var/log
Serverul POP/IMAP
Prezentare POP & IMAP
POP (Post Office Protocol) este un protocol la nivelul aplicatie care ruleaza client server.
Serverul asculta default pe portul TCP/110.
IMAP (Internet Message Access Protocol) este un protocol la nivelul aplicatie care ruleaza
client server. Serverul asculta default pe portul TCP/143.
Ambele sunt folosite pentru accesarea emailurilor aflate pe server. MUA (Thunderbird) se
conecteaza la serverul POP sau IMAP pentru a copia sau muta un email de pe server pe
client.
Fara aceste protocoale e-mailurile nu ar putea fi citite.
Comparativ cu POP, IMAP este un protocol mai modern, recomandat atunci cand se poate
alege intre ele. Principalul avantaj este ca IMAP permite citirea inbox-ului simultan de
catre mai multi useri. In cazul POP e-mailul este mutat de pe server pe client, iar in cazul
IMAP e-mailul este copiat de pe server pe client. Exista astfel o sincronizare intre server si
client.
Versiunile actuale folosite sunt POPv3 si IMAPv4.
Webmail
O alta modalitate de a accesa e-mailurile de pe un server inafara de a folosi clienti dedicati
precum Thunderbird sau Outlook Express este cu ajutorul unui Broswer (webmail).
Nota
Web based email sau Webmail reprezinta un termen care se refera la accesarea e mailurilor
de pe server folsind un Broswer.
Avantajele acestei metode este ca userul poate citi sau trimite e-mailuri de la orice
calculator conectat la Internet fara nicio configuratie suplimentara. In cazul folosirii unui
client dedicat acesta trebuie configurat cu IP-ul serverului SMPT, IP-ul serverului POP sau
IMAP etc.
Serviciile gratuite oferite de marii provideri sunt in special de tip webmail. Exemplu:
Yahoo mail, Gmail, Hotmail etc.
Unul dintre cele mai cunoscute si folosite programe webmail OpenSourse este
SquirrelMail. Acesta este scris in PHP si include suport pentru SMTP (pentru trimitere de
e-mail) si pentru IMAP (primire de e-mailuri).
O aplicatie webmail foloseste protocolul IMAP pentru accesul e-mailurile de pe server.
Pentru a instala SquirrelMail (acesta se instaleaza pe server, pe acelasi host pe care ruleaza
si serverul SMTP) trebuie ca pe server sa fie instalat:PHP
Server IMAP
Serverul Dovecot
Compilare si instalare
Instalarea prin compilare a serverului Dovecot se realizeaza in mod standard. Exemplu de
mai jos s-a realizat pe Fedora Core 9. In mod IDENTIC se compileaza si instaleaza pe
orice distributie Linux.
Pasi de urmat:
1. Download sursele ultimei versiuni Dovecot de pe site-ul producatorului www.dovecot.org.
Acestea pot fi downloadate in orice director din sistem.
Se ruleaza: wget http://www.dovecot.org/releases/1.1/dovecot-1.1.2.tar.gz
2. Verificare integritate arhiva tar.gz folosind hash-ul sau semnatura digitala (Optional dar
foarte recomandat)
3. Decomprimare si dezarhivare arhiva
Se ruleaza: tar -xzvf dovecot-1.1.2.tar.gz
4. Rularea scriptului configure care verifica sistemul si anume daca acesta contine toate
componentele necesare compilarii si instalarii serverului POP/IMAP. Dorim instalarea in
directorul /opt/dovecot astfel incat sa putem urmarii si studia toate componentele cu care
vine serverul.
Se recomanda rularea scriptului configure de catre un user neprivilegiat.
Se ruleaza: ./configure --prefix=/opt/dovecot
5. Compilare
Se recomanda compilarea oricarei aplicatii de catre un user neprivilegiat.
In urma compilarii rezulta din fisierele sursa fisiere executabile.
Se ruleaza: make
6. Instalare
Instalarea presupune doar mutarea fisierelor executabile rezultate in urma compilarii din
directorul cu surse in directorul dorit ( /opt/dovecot). Comanda poate fi executata doar de
root.
Se ruleaza: make install
Nota
In cazul in care se doreste instalarea automata din fisiere binare se ruleaza ca root yum
install dovecot sau apt-get install dovecot in functie de distributie.
Serverul se porneste executant: /etc/init.d/dovecot start. Fisierul acestuia de
configurare este /etc/dovecot.conf.
Configurare
Configurarea serverului Dovecot este relativ simpla. Acesta functioneaza aproape "out of
the box" fara nicio modificare. Fisierul de configurare este /opt/dovecot/etc/dovecot.conf in
cazul exemplul nostru si /etc/dovecot.conf in cazul instalarii automate folosind yum sau
apt-get in functie de distributie.
In directorul /opt/dovecot/etc se gasesc mai multe fisiere sample de configurare. Un fisierul
standard este dovecot-example.conf. Acesta trebuie copiat sub numele dovecot.conf in
acelasi director si editat. Fiecare directiva de configurare este comentata in mare detaliu.
Pentru a vizualiza doar directivele de configurare fara comentarii se ruleaza comanda:
egrep '(#|^$)' dovecot.conf
Detalii:
randurile care incep cu #(diez) inseamna comentarii si sunt ignorate;
fisierul este format din directive si valorile acestora separate prin semnul egal;
mai multe spatii sau tab sunt convertite intr-un singur spatiu respeciv tab;
Directive importante:
1. Specifica protocoalele pentru care serverul ofera suport. In cazul nostru acestea sunt
imap si pop3. imaps si pop3s inseamna pop/imap criptat folosind ssl/tls.
protocols = imap imaps pop3 pop3s
2. Specifica daca serverul permite autentificarea in clar. Se recomanda folosirea acestui
tip de autentificare doar daca se cripteaza cu SSL.
disable_plaintext_auth = no
3. Specifica daca foloseste ssl/tls pentru criptare. Se recomanda fiindca default IMAP si
POP sunt protocoale care comunica in clar si deci informatia poate fi captata usor. In
exemplul nostru nu folosim ssl. Daca se doreste folosirea ssl, tot ce trebuie facut este
crearea unei perechi de chei si un certiticat digital. Detalii in cursul "Advanced Linux &
Infosec" disponibil de asemenea online.
ssl_disable = yes
4. Specifica userul folosit pentru procesul de login. Acest user nu are acces la e-mailuri. Se
recomanda folosirea unui user special doar pentru Dovecot.
login_user = dovecot
5. Specifica numarul de procese care asculta pentru a prelua noi conexiuni pop/imap
login_processes_count = 3
Pentru securizare serverului urmatoarele aspecte sunt importante:
1. Criptarea informatiei dintre client si server folosind SSL/TLS.
2. Limitarea numarului de procese dovecot, memorie consumate de fiecare etc.
3. Rularea serverului in "jail". Acest lucru inseamna limitarea accesului acestuia la un
singur director in loc de intregul sistem de fisiere.
Nota
Dovecot poate folosi mai multe modalitati de autentificare a userilor. In plus acestia pot fi
useri de sistem (existenti in /etc/passwd si cu parola in /etc/shadow – cazul exemplului
nostru) sau se pot gasi intr-o baza de date MySql.
Download