Laborator 03 - Configurarea sistemului

Utilizatori și grupuri

În acest demo dorim să ne acomodăm cu cele mai importante comenzi utilizate atunci când lucrăm cu utilizatori și grupuri de utilizatori.

Să nu uităm de cheatsheetul pe care îl putem folosi ca să ne reamintim cele mai frecvente comenzi.

S-ar putea ca unele comenzi să nu fie instalate, folosiți sudo apt-get install <numele comenzii> pentru a le instala. Exemplu: sudo apt-get install finger.

Utilizatori privilegiați si neprivilegiați (id, finger, whoami)

În continuare, vom vedea cum putem afla informații despre utilizatori. În sistem exista cel puțin doi utilizatori: utilizatorul cu care ne-am logat (student) și utilizatorul privilegiat root.

Pentru a afla informații despre un utilizator sau pentru a verifica dacă un anumit utilizator există, putem folosi comanda finger.

student@uso:~$ finger student
Login: student                          Name: Student User
Directory: /home/student                Shell: /bin/bash
On since Sun Sep 16 15:07 (EEST) on :0 from :0 (messages off)
No mail.
No Plan.
 
student@uso:~$ finger root
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
No mail.
No Plan.

În outputul comenzii observăm informații despre utilizatorul dat ca parametru: directorul home, numele complet, shell-ul, etc.

O altă comandă utilă este id. Cum și numele sugerează, ne dă id-ul utilizatorului (uid) dar și id-urile grupurilor (gid) din care face parte utilizatorul curent.

student@uso:~$ id
uid=1000(student) gid=1000(student) groups=1000(student),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)

Pentru a vedea cu ce utilizator suntem logați, putem folosi comanda whoami.

student@uso:~$ whoami
student

Rularea comenzilor ca utilizator privilegiat (sudo)

Să presupunem că pe un sistem avem 100 de utilizatori și vrem ca toți să aibă drepturile necesare instalării de noi pachete, dar să nu poată adăuga/șterge alți utilizatori. Pe lângă faptul că ar fi foarte foarte nesigur ca 100 de persoane să știe parola contului de root, ar trebui să ne bazăm pe faptul că ei nu vor face altceva decât să instaleze pachete. Soluția acestei probleme este comanda sudo.

Această comandă permite execuția de comenzi de către utilizatori neprivilegiați cu drepturi de utilizatori privilegiați. Se poate configura ce utilizatori au drept să execute această comandă și ce comenzi pot rula ca utilizator privilegiat.

De exemplu, dacă dorim să instalăm pachetul cowsay ca utilizatorul student, vom primi o eroare de permisiune.

student@uso:~$ apt-get install cowsay
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

După cum observăm din eroarea afișată în output, nu avem drepturi să instalăm pachete. Pentru a rezolva această problemă folosim comanda sudo.

student@uso:~$ sudo apt-get install cowsay
[sudo] password for student:
student@uso:~$ cowsay "Meuh"
 ______
< Meuh >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Comanda sudo cere parola utilizatorului curent (în cazul nostru utilizatorul student), nu pe cea a utilizatorului root.

Schimbarea utilizatorului curent (su)

Pentru a schimba utilizatorul cu care suntem autentificați, folosim comanda su (switch user). Comanda lansează o sesiune nouă de terminal în contextul noului utilizator, deci pentru a reveni la utilizatorul precedent este suficient să rulăm comanda exit pentru a termina noua sesiune.

Înlănțuirea de comenzi de mai jos schimbă utilizatorul curent din student în root, verifică că acum utilizatorul logat este root, închide sesiunea utilizatorului root și revine la utilizatorul student folosind comanda exit. Întrucât nu cunoaștem parola utilizatorului root, putem folosi această comanda împreună cu comanda sudo.

student@uso:~$ sudo su root
[sudo] password for student:
root@uso:/home/student# whoami
root
root@uso:/home/student# exit
exit
student@uso:~$

De observat că atunci când schimbăm utilizatorul, nu se schimbă și directorul curent în directorul home al noului utilizator.

Gestiunea utilizatorilor (adduser/deluser)

În continuare vom crea noi utilizatori, iar ulterior îi vom șterge. Pentru aceasta, vom folosi comenzile adduser și deluser .

Cele două comenzi sunt de fapt niște scripturi wrapper scrise în Perl prezente, în general, numai pe distribuții bazate pe Debian (cum ar fi Ubuntu). Comenzile pe care le apelează ele în spate sunt useradd și userdel.

Dorim să creăm utilizatorul bogdan. Mai întâi verificăm că acesta nu există, după care îl adăugăm.

student@uso:~$ finger bogdan
finger: bogdan: no such user.
student@uso:~$ sudo adduser bogdan
Adding user `bogdan' ...
Adding new group `bogdan' (1002) ...
Adding new user `bogdan' (1002) with group `bogdan' ...
Creating home directory `/home/bogdan' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for bogdan
Enter the new value, or press ENTER for the default
        Full Name []: Bogdan
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

În outputul comenzii anterioare observăm mai multe informații utile la adăugarea unui nou utilizator:

  • se creează un nou grup cu același nume
  • se creează home-ul utilizatorului
  • directorul home va copia structura de fișiere și directoare din directorul /etc/skel
  • se cere o parolă și alte informații care sunt afișate la apelul comenzii finger.
bogdan@uso:~$ finger bogdan
Login: bogdan                           Name: Bogdan
Directory: /home/bogdan                 Shell: /bin/bash
Never logged in.
No mail.
No Plan.

După aceasta ne autentificăm ca utilizatorul bogdan. Argumentul - este folosit pentru comanda su pentru a schimba directorul curent la home-ul noului utilizator.

student@uso:~$ su - bogdan
Password:
bogdan@uso:~$ pwd
/home/bogdan
bogdan@uso:~$ whoami
bogdan

Dacă utilizatonul nu mai este necesar în sistem, îl ștergem folosind comanda deluser.

student@uso:~$ sudo deluser bogdan
Removing user `bogdan' ...
Warning: group `bogdan' has no more members.
Done.
student@uso:~$ finger bogdan
finger: bogdan: no such user.

Schimbarea parolei (passwd)

Pentru a schimba parola utilizatorului curent folosim comanda passwd, fără argumente. Înainte de introducerea unei parole noi, trebuie să validăm parola veche.

student@uso:~$ passwd
Changing password for student.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Dacă dorim schimbarea parolei altui utilizator, îi putem oferi comenzii passwd numele acestuia ca parametru.

root@uso:~# passwd student
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Gestiunea utilizatorilor

În Linux există un fișier ce stochează informații despre toți utilizatorii din sistem. Acest fișier este /etc/passwd, este un fișier text și conține o listă cu utilizatorii din sistem și informații despre fiecare din ei, cum ar fi: user ID, group ID, home directory, etc. Astfel, de fiecare dată când adăugăm un nou utilizator, se adaugă automat și o intrare în acest fișier. Pentru mai multe detalii puteți accesa pagina de Wikipedia.

student@uso:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...

Exerciții

  1. Să se creeze utilizatorii: ana, bogdan și david și să se afișeze informații utile despre aceștia (grupurile din care fac parte, directorul home, etc.).

Când schimbăm utilizatorul curent, nu se modifică și directorul curent. Pentru a ne ajunge direct în home-ul noului utilizator, folosim argumentul - pentru comanda su:

student@uso:~$ su - ana
Password: 
ana@uso:~$

Gestiunea grupurilor de utilizatori

La crearea unui utilizator, se crează în mod automat și un grup cu același nume. Dacă dorim să realizăm o organizare diferită a utilizatorilor, putem să creăm noi grupuri. Pentru crearea unui grup se folosește comanda addgroup, iar pentru ștergerea unui grup folosim delgroup.

student@uso:~$ sudo addgroup studenti
[sudo] password for student: 
Adding group `studenti' (GID 1003) ...
Done.

Pentru a adăuga un utilizator în unul sau mai multe grupuri se foloseste comanda usermod ca in exemplul de mai jos. Comanda id a fost apelată înainte și după adăugarea utilizatorului bogdan în grupul studenti pentru a verifica dacă adăugarea a funcționat.

student@uso:~$ id bogdan
uid=1002(bogdan) gid=1002(bogdan) groups=1002(bogdan)
student@uso:~$ sudo usermod bogdan -G studenti
student@uso:~$ id bogdan
uid=1002(bogdan) gid=1002(bogdan) groups=1002(bogdan),1003(studenti)

Exerciții

  1. Adăugați și utilizatorii ana și david în grupul studenti.
  2. Creați utilizatorii dan și elena și grupul asistenti și adăugați acești utilizatori în noul grup.
  3. Ștergeți grupul asistenti creat anterior și utilizatorii asociați.

Pentru ștergere folosiți comenzile deluser și delgroup urmate de numele utilizatorului, respectiv numele grupului.

Conectarea la rețea și la Internet

Pentru a parcurge această secțiune este recomandat să descărcați ultima versiune a respository-ului laboratorului. Pentru a descărca ultima versiune a repository-ului rulați comanda git pull în directorul ~/uso-lab.

Infrastructura laboratorului este bazată pe containere docker ale căror imagini vor fi generate pe propriul calculator. Dacă nu veți deja instalat Docker Engine pe sistem, scriptul ~/uso-lab/labs/03-user/lab-container/lab_prepare.sh vă va instala aplicația.

După ce ați terminat de lucrat vă recomandăm să opriți containerele rulând comanda ./lab_prepare.sh delete în directorul ~/uso-lab/labs/03-user/lab-container.

În cadrul acestei secțiuni vom învăța cum să reparăm problemele de conectivitate la rețea (sau, informal, rezolvarea problemei “nu-mi merge Internetul”). Pentru a face asta este necesar să parcurgem toate nivelurile de rețea prin care trec datele pentru a fi trimise în Internet. În continuare vom prezenta pașii pe care îi urmăm ca să verificăm funcționalitatea nivelului de rețea și cum putem să îl configurăm sumar.

Interacţiunea cu nivelul fizic

Primul nivel cu care noi interacționăm este nivelul fizic. Nivelul fizic este reprezentat de cablul UTP pentru o rețea cu fir, sau de undele radio ale unei rețele wireless. Acestea sunt mediul prin care informația este transferată.

Cablu UTP

O altă componentă a nivelului fizic este placa de rețea a sistemului. Aceasta va trimite mesaje prin mediu de transmisie, fie acesta cablu de cupru, fibră sau unde radio.

Majoritatea timpului problemele de conexiune la Internet vin de la faptul că nu este cablul de Internet conectat la placa de rețea, sau de la faptul că avem conexiune slabă la rețeaua wireless.

La nivel fizic, putem verifica conexiunea și funcționalitatea unei plăci de rețea uitându-ne la ledurile care reprezintă conexiunea la mediul fizic. Observăm în GIF-ul de mai jos cum arată ledurile unei plăci de rețea funcționale. Dacă acestea nu sunt aprinse, atunci nu vom avea conectivitate la rețea.

Investigarea nivelului fizic al rețelei

În general, în Linux fiecare placă de rețea are asociată câte o interfață de rețea.

Pentru rularea acestui demo rulați în directorul ~/uso-lab/labs/03-user/lab-container comanda ./lab_prepare.sh install fizic. Pentru a ne conecta la infrastructura pentru această secțiune vom folosi comanda ./lab_prepare.sh connect fizic

La nivelul sistemului de operare putem verifica dacă o placă de rețea este activă folosind comanda următoare:

root@fizic:~# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
293: eth0@if294: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
    link/ether 02:42:0a:0a:0a:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
297: eth1@if298: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:0b:0b:0b:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
299: eth2@if300: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:0c:0c:0c:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0

Starea fiecărei interfețe de rețea este reprezentată pe câte o linie împreună cu parametrii săi de rulare. Majoritatea informațiilor afișate de comanda de mai sus nu sunt relevante pentru noi. O opțiune relevantă este valoarea state, urmată de starea interfeței de rețea, care poate să fie UP, DOWN sau UNKNOWN.

Formatul pentru numele interfețelor diferă de la o distribuție la alta. În cadrul infrastructurii de laborator folosim containere de tip Docker în cadrul cărora numele interfețelor este de forma ethX, unde X este un număr. În funcție de distribuția pe care rulăm numele interfețelor poate să se fie într-un format diferit.

Observăm că interfața de rețea cu numele eth0 este pornită, deoarece linia asociată interfeței conține șirul de caractere state UP. În același timp observăm că interfața de rețea eth1 nu este activă deoarece pe linia sa observăm șirul de caractere state DOWN.

Pentru a porni interfața eth1 vom folosi următoarea comandă:

root@uso:~# ip link set up dev eth1

Mereu, după ce rulăm o comandă, trebuie să verificăm că s-a efectuat cu succes, folosind o metodă de verificare. În cazul de față vom folosi tot comanda ip link show:

root@fizic:~# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
293: eth0@if294: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
    link/ether 02:42:0a:0a:0a:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
297: eth1@if298: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
    link/ether 02:42:0b:0b:0b:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
299: eth2@if300: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:0c:0c:0c:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
Exercițiu - Pornirea unei interfețe

Porniți interfața de rețea eth2.

Ieșiți din docker-ul fizic folosind comanda exit.

Configurarea nivelului Internet

Identificarea adresei de Internet

Pentru rularea acestui demo rulați în directorul ~/uso-lab/labs/03-user/lab-container comanda ./lab_prepare.sh install internet. Pentru a ne conecta la infrastructura pentru această secțiune vom folosi comanda ./lab_prepare.sh connect internet

Pentru comunicare între două stații din Internet, trebuie ca cele două stații să fie conectate la Internet. Și apoi cele două stații să se poată adresa una alteia. Adică fiecare stație are nevoie de un identificator, o adresă. Cum fiecare casă din lume are o adresă cu care poate fi identificată unic, similar este necesar pentru un calculator.

Pentru identificarea stațiilor folosim o adresă numită adresa IP (Internet Protocol). Fiecare interfață de rețea are nevoie de o adresă IP să fie configurată.

Pentru a vedea adresele IP configurate pe interfețele de rețea folosim următoarea comandă:

root@internet:~# ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
195: eth0@if196: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:0a:0a:0a:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.10.10.2/24 brd 10.10.10.255 scope global eth0
       valid_lft forever preferred_lft forever
199: eth1@if200: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:0b:0b:0b:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
203: eth2@if204: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:0c:0c:0c:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0

Există două tipuri de adrese IP (IPv4 și IPv6), dar în cadrul acestui laborator vom lucra numai cu adrese de tip IPv4. Adresele IP ale interfețelor sunt scrise pe liniile care conțin inet. Adresele IPv4 sunt de forma A.B.C.D, unde A, B, C și D sunt numere cu valori între 1 si 255.

Pentru detalii despre adresele de tip IPv6 folosiți urmăriți această1) explicație.

Configurarea unei adrese IP

Există două metode pentru configurarea unei adrese IP pe o interfață:

  • configurare statică, prin care noi configurăm manual adresa IP pe interfața de rețea, implică să cunoaștem din ce rețea face parte interfața pe care vrem să o configurăm și ce adrese IP sunt libere;
  • configurare dinamică, obținută automat, care nu presupune cunoașterea informațiilor despre rețea, deoarece acestea vor fi primite automat de pe rețea.

Vom insista pe configurarea dinamică, deoarece este mai simplă. În plus, nu avem cum să aflăm informațiile despre rețea înainte de a configura interfața de rețea.

Recapitulare - Pornirea interfețelor de rețea

Faceți modificările necesare astfel încât interfața eth1 să fie în starea UP.

Configurarea IP-ului în mod dinamic

Pentru a obține o adresă IP în mod dinamic pe o interfață folosim comanda dhclient:

root@internet:~# dhclient eth1
mv: cannot move '/etc/resolv.conf.dhclient-new.35' to '/etc/resolv.conf': Device or resource busy

Linia mv: cannot move '/etc/resolv.conf.dhclient-new.35' to '/etc/resolv.conf': Device or resource busy apare mereu în containerele docker atunci când încercăm să obținem o adresă IP folosind comanda dhclient. NU este o problemă dacă aceasta apare.

Mai sus am rulat comanda pentru a obține o adresă IP pentru interfața eth1.

Comanda dhclient este bazată pe protocolul DHCP (Dynamic Host Configuration Protocol). Acesta presupune că există un server pe rețea care cunoaște ce IP-uri sunt folosite pe rețea și care poate să ofere adrese IP calculatoarelor care fac cereri pe rețea. dhclient face o cerere de rezervare a unei adrese IP către serverul DHCP de pe rețea.

Recapitulare - Afișarea adreselor IP configurate pe interfețele de rețea

Afișați adresele IP de pe toate interfețele.

Observați că am obținut o adresă IP pe interfața eth1.

Exercițiu - Configurarea dinamică a unei adrese IP

Configurați adresa IP pe interfața eth2.

Ștergerea unei configurații de rețea de pe o interfață

Pentru a șterge o adresă IP de pe o interfața folosim comanda ip address flush în felul următor:

root@internet:~# ip address flush eth1
root@internet:~# ip address show eth1
199: eth1@if200: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0b:0b:0b:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0

Putem să afișăm configurația unei singure interfețe de rețea folosind numele interfeței ca parametru pentru comanda ip address show

Exercițiu - Ștergerea configurației de rețea

Ștergeți configurația de rețea de pe interfețele eth1 și eth2.

Verificarea conectivității la o altă stație

Pentru rularea acestui demo, comenzile vor fi rulate în cadrul mașinii virtuale USO.

Pentru a verifica conexiunea dintre două stații folosim comanda ping. Această comandă trimite mesaje către o stație și așteaptă un răspuns de la ea.

Atunci când testăm conexiunea la internet, vrem să verificăm câteva aspecte, odată ce am obținut o adresă IP de la serverul DHCP:

  • verificăm dacă putem să ne conectăm la alte calculatoare din aceeași rețea
  • verificăm dacă putem să comunicăm cu stații din afara rețelei

De exemplu, dacă vrem să verificăm conectivitatea la serverul 8.8.8.8 (un server public din Internet), folosim comanda:

student@uso:~# ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=61 time=23.0 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=61 time=25.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=61 time=24.8 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=61 time=25.2 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3092ms
rtt min/avg/max/mdev = 23.051/24.731/25.707/1.020 ms

Comportamentul implicit al comenzii ping este să trimită pachete la infinit. Am folosit opțiunea -c 4 în exemplul de mai sus pentru a reduce numărul de pachete trimise la 4.

Atunci când nu pot fi trimise mesaje către stația identificată prin adresa IP, mesajul de eroare va arăta în felul următor:

student@uso:~# ping 10.10.10.10
PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data.
From 10.10.10.3 icmp_seq=1 Destination Host Unreachable
From 10.10.10.3 icmp_seq=2 Destination Host Unreachable
From 10.10.10.3 icmp_seq=3 Destination Host Unreachable
From 10.10.10.3 icmp_seq=4 Destination Host Unreachable
^C
--- 10.10.10.10 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3074ms

Pentru verificarea conectivității în interiorul rețelei trebuie să verificăm că putem să trimitem mesaje folosind utilitarul ping unui calculator din rețea.

În mod implicit comanda ping trimite mesaje de verificare a conexiunii la infinit. De data aceasta, în loc să rulăm comanda ping folosind opțiunea -c 4, am oprit rularea comenzii folosind combinația de taste Ctrl+c.

O țintă bună de testare pentru trimiterea mesajelor în rețea este (default) gateway-ul. Un gateway este un dispozitiv de rețea care se ocupă de interconectarea rețelelor și care primește mesaje de la toate stațiile din rețea pentru a le trimite în Internet.

Gateway-ul este configurat static sau dinamic, cum este configurată și adresa IP a unei interfețe.

Pentru a identifica gateway-ul, folosim comanda ip route show în felul următor:

student@uso:~# ip route show
default via 10.0.2.2 dev enp0s3 proto dhcp metric 100
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100
169.254.0.0/16 dev enp0s3 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.4 metric 101

Observăm că adresa IP a default gateway-ului este 10.0.2.2, deoarece acesta se află pe linia care conține șirul de caractere default.

Recapitulare - Afișarea adresei IP configurată pe o interfață

Aflați adresa de rețea de pe interfața enp0s3.

Adresa IP a gateway-ului și adresa IP a interfeței enp0s3 sunt foarte similare. Acest lucru se întâmplă deoarece stațiile se află în aceeași rețea.

Exercițiu - Verificarea conectivității cu gateway-ul

Verificați conexiunea cu gateway-ul folosind comanda ping.

Pentru verificarea conexiunii la Internet este bine să verificăm cu o adresă consacrată, care avem încredere că nu va avea probleme tehnice. Un astfel de exemplu este serverul oferit de Google de la adresa IP 1.1.1.1.

Exercițiu - Verificarea conectivității la Internet

Verificați conexiunea la serverul 8.8.8.8 oferit de Google folosind comanda ping.

Servicii și clienți de rețea

Dispozitivele pe care le folosim noi devin din ce în ce mai mici, mai eficiente și ieftine. Asta se întâmplă deoarece multe dintre aplicațiile care până nu de curând rulau pe calculatorul propriu s-au mutat în spațiu online. De exemplu, în loc să descărcăm filme și să le urmărim de pe calculator, folosim o aplicație cum ar fi Netflix pentru a transmite prin Internet filmul pe care vrem să îl urmărim. Un alt exemplu relevant este Google Drive, care ne permite să stocăm, să replicăm și să edităm documente într-o interfață web, în loc să le păstrăm local pe calculatorul pe care îl folosim. Toată puterea de procesare și tot spațiul de stocare s-a mutat de pe calculatorul propriu pe servere aflate în Internet.

Vom numi aceste aplicații care rulează în Internet servicii.

Un serviciu este o aplicație care oferă o funcționalitate utilizatorilor care apelează la ele. Serviciile în domeniul calculatoarelor lucrează folosind paradigma server-client. Un avantaj major al acestei abordări este că reduce puterea de calcul necesară pentru rularea aplicațiilor de către utilizatori. Aceștia au nevoie doar de o aplicație client care știe să comunice cu serverul. Astfel, aplicația client trimite o cerere către aplicația server, serverul primește cererea, procesează cererea și servește răspunsul aplicației client care a făcut cererea.

Această paradigmă poate fi observată în schema următoare:

Arhitectura client-server

Atunci când noi vrem să urmărim un film pe Netflix aplicația client Netflix de pe calculator sau smart TV va trimite o cerere de descărcare a filmului de pe serverul Netflix aflat la distanță.

Clienţi web în linia de comandă

În viață de zi cu zi aplicația pe care o folosim cel mai mult este browserul web, deoarece majoritatea aplicațiilor pe care le folosim au fost transformate în pagini web cu care noi interacționăm. Browserul web este o aplicație care execută o cerere HTTP către un server web, identificat printr-o adresă, un link, prin care face o acțiune și primește un răspuns. De exemplu, când accesăm pagina www.facebook.com se trimite o cerere către serverul HTTP, iar acesta trimite un răspuns către browser sub forma unei pagini web, în formatul HTML, pe care browserul o afișează.

Pentru interacțiunea cu serverele web putem folosi și clienți web în linie de comandă. Clienții web folosiți în linie de comandă sunt folositori atunci când nu avem acces la o interfață GUI, sau când încercăm să automatizăm un proces. De exemplu, pentru a verifica automat starea unui site avem nevoie să descărcăm pagina site-ului.

Există mai multe implementări de clienți web în linie de comandă. Vom folosi comanda wget pentru descărcarea unei pagini web.

student@uso:~$ wget elf.cs.pub.ro
--2020-10-20 23:01:02--  http://elf.cs.pub.ro/
Resolving elf.cs.pub.ro (elf.cs.pub.ro)... 141.85.227.116
Connecting to elf.cs.pub.ro (elf.cs.pub.ro)|141.85.227.116|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 168 [text/html]
Saving to: ‘index.html’

index.html                        100%[===========================================================>]     168  --.-KB/s    in 0s

2020-10-20 23:01:02 (7,61 MB/s) - ‘index.html’ saved [168/168]

student@uso:~$ cat index.html
<html>
    <head>
        <meta name="google-site-verification" content="gTsIxyV43HSJraRPl6X1A5jzGFgQ3N__hKAcuL2QsO8" />
    </head>

    <body>
        <h1>It works!</h1>
    </body>
</html>

Comanda wget primește ca parametru link-ul către pagina pe care vrem să o descărcăm.

Am folosit comanda cat pentru afișarea conținutului fișierului index.html. Fișierul index.html este fișierul descărcat în mod implicit, dacă nu descărcăm o pagină specifică.

Exercițiu - Descărcarea paginilor web

  • Deschideți într-un editor de text pagina web descărcată pentru a vedea conținutul HTML.
  • Descărcați pagina web de la adresa www.facebook.com. Afișați conținutul fișierului descărcat.

Clienții web nu sunt folosiți doar pentru accesarea paginilor web. Putem folosi clienți web pentru a descărca fișiere indiferent de tipul acestora.

  • Descărcați pagina web de la adresa http://wttr.in/. Afișați conținutul fișierului descărcat.
  • Descărcați fișierul http://elf.cs.pub.ro/uso/res/final/07-feb/heroes.csv. Ce tip de fișier este acesta?

Accesul la distanţă în linie de comandă

Pentru rularea acestui demo rulați în directorul ~/uso-lab/labs/03-user/lab-container comanda ./lab_prepare.sh install ssh. Pentru a ne conecta la infrastructura pentru această secțiune vom folosi comanda ./lab_prepare.sh connect ssh

În multe situații atunci când lucrăm cu sisteme, este necesar să rulăm aplicații pe alte stații în afara calculatorului nostru fără să avem acces fizic la stații.

Protocolul cel mai folosit pentru accesul la stații la distanță este protocolul SSH. SSH permite autentificarea la o stație pe care rulează un server SSH. Când ne conecta la o stație, trebuie să precizăm utilizatorul cu care vrem să ne logăm. Pentru autentificare introducem parola utilizatorului, sau folosim o cheie de acces la stație.

Conectarea folosind autentificare cu parolă

Pentru a rula comenzi pe o altă stație putem folosi programul SSH (Secure Shell) pentru a ne conecta la acesta în felul următor:

student@uso:~$ hostname
uso
student@uso:~$ ssh root@10.10.10.3
The authenticity of host '10.10.10.3 (10.10.10.3)' can't be established.
ECDSA key fingerprint is SHA256:I3Ybkkk7nF2FjwVHMzjkyujDnhlRlnSwPRVwUKm6OCM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.3' (ECDSA) to the list of known hosts.
root@10.10.10.3's password:
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-51-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/\*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
root@ssh:~# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@ssh:~# hostname
ssh

Unde root este numele utilizatorului și 10.10.10.3 este adresa IP, sau hostname-ul stației la care vrem să ne conectăm.

Atunci când ne conectăm la o stație, clientul SSH va încerca să autentifice stația la care ne-am conectat. Dacă ne conectăm pentru prima oară la un sistem trebuie să spunem clientului că am verificat datele clientului la care ne-am conectat.

În mod implicit protocolul SSH va folosi autentificarea cu parolă. Parola introdusă în exemplul de mai sus este parola root.

Odată ce ne-am conectat la calculator, avem acces la un shell în care rulăm comenzi ca mai sus. Putem observa că ne-am autentificat pe un calculator diferit deoarece s-a schimbat promptul terminalului de la student@uso:~$ la root@ssh:~# și s-a afișat un mesaj numit Message of the Day.

În exemplul de mai sus am rulat comanda hostname care afișează numele stației la care ne-am conectat pentru a ne asigura că ne-am conectat pe un nou calculator. Putem observa numele stației și din prompt.

Exercițiu - Conectarea la distanță
  • Autentificați-vă la stația cu adresa IP 11.11.11.3 folosind utilizatorul root și parola root.
  • Autentificați-vă la stația cu adresa IP 12.12.12.3 folosind utilizatorul student și parola student.

Observație:

Atunci când ne conectăm la o stație folosind protocolul SSH este necesar să precizăm un nume de utilizator valid. Dacă utilizatorul nu există, serverul nu va preciza faptul că utilizatorul nu există pe sistem, ci va cere parola utilizatorului, dar nu va permite autentificarea la stație. De ce serverul SSH nu specifică dacă utilizatorul exista sau nu?

Rularea unei singure comenzi prin SSH

Atunci când ne conectăm la o stație avem acces la un shell pe care putem să îl folosim, dar dacă nu este necesar putem să rulăm mai multe comenzi, sau vrem să automatizăm rularea comenzilor pe alte stații putem folosi comanda SSH în felul următor:

student@uso:~$ ssh root@10.10.10.3 ip address show
root@10.10.10.3's password:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
544: eth0@if545: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0a:0a:0a:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.10.10.3/24 brd 10.10.10.255 scope global eth0
       valid_lft forever preferred_lft forever
546: eth1@if547: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0b:0b:0b:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 11.11.11.3/24 brd 11.11.11.255 scope global eth1
       valid_lft forever preferred_lft forever
550: eth2@if551: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0c:0c:0c:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 12.12.12.3/24 brd 12.12.12.255 scope global eth2
       valid_lft forever preferred_lft forever

Am rulat comanda ip address show pentru a afișa setările de rețea pe stația de la adresa IP 10.10.10.3, autentificându-ne ca utilizatorul root.

Execițiu - Rularea unei singure comenzi prin SSH

Rulați comanda cat /etc/passwd pe stația de la IP-ul 10.10.10.3 fără să intrați în interfața în linia de comandă de pe stații. Vă veți autentifica folosind utilizatorul root și parola root.

Transferul fișierelor la distanţă

Pentru a transfera fișiere la distanță folosim scp. Comanda scp se folosește de protocolul SSH pentru transferul de date între stații, astfel ne putem folosi de modelul de autentificare de la SSH, ca în comanda de mai jos:

student@uso:~$ scp /bin/bash student@10.10.10.3:~/
student@10.10.10.3's password:
bash                                          100% 1156KB  30.5MB/s   00:00
student@uso:~$ ssh student@10.10.10.3 ls ~
student@10.10.10.3's password:
bash

Fișierul /bin/bash a fost copiat de pe stația uso pe stația de la adresa IP 10.10.10.3 în directorul home al utilizatorului student. Am rulat comanda ls ~ prin SSH pentru a verifica că s-a efectuat copierea cu succes.

Trimiterea fișierelor poate fi realizată în orice direcție:

  • încărcarea fișierelor de la client la server
  • descărcarea fișierelor de la server la client

Pentru descărcarea fișierelor de pe un server folosim comanda scp:

student@uso:~$ scp root@10.10.10.3:/etc/resolv.conf .
root@10.10.10.3's password:
resolv.conf                                   100%   38    19.3KB/s   00:00
student@uso:~$ cat resolv.conf
nameserver 127.0.0.11
options ndots:0
student@uso:~$ ssh root@10.10.10.3 cat /etc/resolv.conf
root@10.10.10.3's password:
nameserver 127.0.0.11
options ndots:0

Comanda rulată anterior a descărcat fișierul resolv.conf din directorul /etc/ de pe stația 10.10.10.3 în directorul curent (.).

Exercițiu - Copierea fișierelor la distanță

Descărcați fișierul /etc/passwd de la adresa 10.10.10.3 folosind utilizatorul student și parola student în directorul /home/student/Downloads.

Copierea directoarelor la distanță

Pentru copierea unui director folosim opțiunea -r:

student@uso:~$ scp -r ./Downloads/ root@10.10.10.3:~/
root@10.10.10.3's password:
macos.txt                                     100%   18     4.2KB/s   00:00
index.html                                    100%  168   168.4KB/s   00:00
teamviewer_15.10.5_amd64.deb                  100%   14MB  48.1MB/s   00:00

Comanda anterioară a copiat directorul Downloads și conținutul său din directorul curent în directorul home al utilizatorului root de la adresa 10.10.10.3.

Exercițiu - Copierea directoarelor la distanță

Copiați directorul /usr de pe stația de la adresa 10.10.10.3 în directorul home al utilizatorului curent. Vă veți autentifica pe stația de la distanță folosind utilizatorul root și parola root.

Conectarea folosind autentificare cu chei

În anumite scenarii ne dorim să evităm introducerea parolei pentru autentificarea la o stație la distanță. De exemplu, ne dorim să rulăm aceeași comandă pe 10 stații. Dacă am folosi autentificare bazată pe parolă ar fi nevoie să scriem într-un fișier în clar parola. Aceasta este o problema de securitate, deoarece dacă păstrăm o cheie în format text aceasta poate fi furată de cineva. O alternativă ineficientă este să scriem parola de 10 ori de mână.

Pentru a trece de această problemă putem să folosim mecanismul de autentificare cu chei. Autentificarea cu chei presupune existență a două chei pereche:

  • cheia privată: este o cheie secretă care este folosită de un client SSH pentru a se autentifica
  • cheia publică, este o cheie care este copiată pe stația unde este rulat serverul SSH. Cheia este folosită pentru identificarea clienților SSH care se conectează la server.

Cele două chei sunt legate matematic, iar posesorul cheii private să se poată autentifica pe orice sistem unde este disponibilă cheia publică. Câtă vreme posesorul cheii private este singurul care are acces la cheie, nimeni nu se va mai putea autentifica în locul său.

Pentru generarea unei perechi de chei folosim comanda ssh-keygen:

student@uso:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/student/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/student/.ssh/id_rsa
Your public key has been saved in /home/student/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:mN9IlWoU6bmSA1vvKBSAfAB/Rg9GwTaAhqZ1Kc0vfHM student@uso
The key's randomart image is:
+---[RSA 3072]----+
|=+o**o  ..       |
|+=++Oo  .. .     |
|+.o*oo....o      |
|.  o= =+Eo       |
|     Bo=S.       |
|    o ++oo       |
|   .   =o .      |
|    . . .        |
|     .           |
+----[SHA256]-----+

În procesul de generare a cheilor ni se cere și un passphrase pentru a asigura securitatea cheii private în cazul în care este pierdută, furată sau altcineva are acces accidental la ea. Desigur, uitarea passphrase-ului face cheia nefolosibilă. Așa că passphrase-ul trebuie reținut (și protejat) ca orice altă parolă. Este indicat să nu protejați cheia printr-un passphrase deoarece prezintă aceleași probleme ca folosirea unei parole.

Pentru copierea cheii publice pe o stație folosim comanda ssh-copy-id:

student@uso:~$ ssh-copy-id root@10.10.10.3
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/student/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.10.10.3's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.10.10.3'"
and check to make sure that only the key(s) you wanted were added.

Este necesar să cunoaștem parola utilizatorului pentru copierea cheii publice.

Atunci când copiem cheia publică, aceasta va fi copiată pentru un singur utilizator. Dacă vrem să ne autentificăm pe același sistem ca utilizatori diferiți fără parola, este necesar să copiem cheia publică pentru fiecare utilizator.

Exercițiu - Utilizarea cheilor SSH
  • Generați o nouă cheie SSH de tip RSA cu passphrase-ul mere.
  • Efectuați modificările necesare astfel încât să vă puteți autentifica drept utilizatorul student de pe stația 10.10.10.3 fără parolă.

Cuprins

uso/laboratoare/laborator-03.txt · Last modified: 2020/10/27 16:51 by liza_elena.babu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0