Differences

This shows you the differences between two versions of the page.

Link to this comparison view

gsr:laboratoare:laborator-08 [2015/12/10 15:17]
razvan.deaconescu [Configurare cron cu standard output]
gsr:laboratoare:laborator-08 [2016/12/14 20:46] (current)
alexandru.carp [Generarea și semnarea unui certificat]
Line 1: Line 1:
-====== Laborator 08: Servicii diverse ​======+====== Laborator 08: Securitate: PKI și X.509 ======
  
-===== Demo: Inspectarea configurației cron =====+TLS (//​Transport Layer Security//) reprezintă modul în care un canal TCP nesigur este securizat. TLS asigură un canal sigur (criptat) de comunicare între client și server. În general serverul își validează identitatea folosind un certificat care apoi este folosit și pentru stabilirea cheilor de criptare ale conexiunii.
  
-Pentru a vedea configurația ''​cron''​ a sistemului inspectăm configurațiile din fișierele/​directoarele ''/​etc/​cron*''​. Fișierele ''/​etc/​cron.d/​*'' ​și fișierul ''/​etc/​crontab''​ conțin configurații standard ''​cron''​ la nivelul sistemului. Liniile de configurare urmează sintaxa crontab așa cum este exemplificată [[http://​techie-experience.blogspot.ro/​2012/​10/​crontab.html|aici]].+Un certificat cuprinde o cheie publică, datele de identificare ale serverului ​și o semnătură care să garanteze asocierea între acea identitate ​și cheia publică aferentă.
  
-Pentru ​vedea configurația pentru utilizatorul curent ​folosim comanda<​code>​ +Un certificat este valid dacă este semnat de o autoritate de certificare (CA: //​Certificate Authority//​). Această entitate este considerată de încredere de clientul comunicației,​ iar clientul are acces la certificatul acestei autorități. Cu certificatul acestei autorități,​ clientul poate verifica semnătura certificatului serverului și, astfel, să se asigure de identitatea serverului. 
-crontab ​-l+===== Investigarea unui certificat ===== 
 + 
 +În [[http://​elf.cs.pub.ro/​gsr/​res/​laboratoare/​lab-10.zip|arhiva de sarcini ​laboratorului]] există un certificat în fișierul ''​houdini.cs.pub.ro.crt-roedunet''​. 
 + 
 +Vrem să afișăm informații despre acest fișier: identificator,​ semnatar, data expirării, cheia publică. Pentru aceasta ​folosim comanda<​code>​ 
 +openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout ​-text
 </​code>​ </​code>​
  
-Dacă suntem autentificați ca utilizator privilegiat,​ putem vizualiza configurația ''​cron'' ​pentru un utilizator dat putem folosi comanda<​code>​ +Parcurgeți output-ul comenzii și aflați informații despre certificat precum: 
-crontab ​-u <​username> ​-l+  * Semnatarul (issuer) 
 +  * Intervalul de validitate 
 +  * Modulul și exponentul 
 +  * Subiectul (CN: Common Name) 
 +  * Extensii ale certificatului 
 +  * Cheia publică 
 +  * Semnătura 
 + 
 +Putem afișa informații punctuale despre certificat solicitând infomații punctuale (doar anumite câmpuri) folosind comanda ​''​openssl'' ​cu opțiunile aferente:<​code>​ 
 +openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -pubkey 
 +openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -startdate 
 +openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -enddate 
 +openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -dates 
 +openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -issuer 
 +openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout -subject 
 +openssl x509 -in houdini.cs.pub.ro.crt-roedunet -noout ​-modulus
 </​code>​ </​code>​
-unde ''<​username>''​ este numele utilizatorului a cărui configurație dorim să o afișăm. 
  
-Pentru a afla job-urile cron active per utilizator putem inspecta, ca utilizator privilegiat,​ directorul ​de spooling ''​/var/spool/cron/''​<​code>​ +===== Verificarea unui certificat ===== 
-sudo tree /var/​spool/​cron/+ 
 +Vrem să verificăm faptul că un certificat este semnat valid și că avem acces corect la certificatul CA-ului (sau lanțul ​de certificate ale CA-ului -- //certificate chain//). De obicei, serverul este configurat să trimită certificatele intermediare clientului pentru ca acesta să poată avea acces la întreg lanțul de certificate. 
 + 
 +Verificăm certificatul de mai sus folosind comanda<​code>​ 
 +openssl verify -CAfile ../../terena-ca-chain-2.pem security.cs.pub.ro.crt-roedunet
 </​code>​ </​code>​
 +Certificatul apare expirat, dar din punctul de vedere al semnării este valid.
  
-În subdirectorul ​''​/​var/​spool/​cron/​crontabs/​'' ​se găsesc job-urile cron active ​(marcate per utilizator). +Pentru certificatele ​''​open-source.cs.pub.ro.crt-roedunet'' ​și ''​security.cs.pub.ro.crt-roedunet''​ verificați care este certificate chain-ul aferent cu care au fost generate. Adica vedeți care dintre cele două fișiere de tip chain (''​terena-ca-chain.pem''​ și ''​terena-ca-chain-2.pem''​ sunt cele corespunzătoare.
-===== Configurare cron cu standard output =====+
  
-Dacă dorim să avem un job care să ruleze periodic vom crea o intrare în crontab-ul utilizatorului curent.+Urmăriți ce conțin fișierele de tip chain folosind comanda ''​cat''​.
  
-Următorul exercițiu este didactic, ​ca să putem urmări comportamentul ​''​cron''​.+Pentru a face dump la informațiile dintr-un fișier de tip bundle (cum sunt ''​terena-ca-chain.pem''​ și ''​terene-ca-chain-2.pem''​) nu avem suport implicit în ''​openssl''​. Putem însă folosi comanda ​''​keytool'' ​din suita Java, așa cum este indicat [[http://​serverfault.com/​questions/​590870/​how-to-view-all-ssl-certificates-in-a-bundle|aici]]. Folosiți ''​keytool''​ pentru a afișa informații despre certificatele de tip bundle.
  
-Comanda de mai jos este folosită pentru a afișnumărul de procese ​și thread-uri curente ​la nivelul sistemului:<​code>​ +===== Conectarea sigură la un server ===== 
-/bin/echo "Num processes$(ps -e --no-header | wc -l), num threads$(ps -eL --no-header | wc -l)"+ 
 +Pentru ​testa conectarea sigură la un server ​și interogarea acestuia (similar comenzii ''​netcat''​),​ vom folosi comanda ''​openssl s_client''​ care realizează un tunel sigur TLS. 
 + 
 +Astfel, pentru a ne conecta ​la Google în modul simplu, vom folosi comanda<​code>​ 
 +nc google.com 80 
 +GET HTTP/1.0 
 + 
 +HTTP/1.0 302 Found 
 +Locationhttp://​www.google.ro/?​gws_rd=cr&​ei=i2qOVpSiAuLnyQPYkaO4AQ 
 +Cache-Control: private 
 +[...]
 </​code>​ </​code>​
 +în vreme ce pentru a ne conecta în mod sigur folosim comanda<​code>​
 +openssl s_client -connect google.com:​443
 +CONNECTED(00000003)
 +depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
 +verify return:1
 +depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
 +verify return:1
 +depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
 +verify return:1
 +depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = *.google.com
 +verify return:1
 +---
 +Certificate chain
 + 0 s:/​C=US/​ST=California/​L=Mountain View/​O=Google Inc/​CN=*.google.com
 +   ​i:/​C=US/​O=Google Inc/​CN=Google Internet Authority G2
 + 1 s:/​C=US/​O=Google Inc/​CN=Google Internet Authority G2
 +   ​i:/​C=US/​O=GeoTrust Inc./​CN=GeoTrust Global CA
 + 2 s:/​C=US/​O=GeoTrust Inc./​CN=GeoTrust Global CA
 +   ​i:/​C=US/​O=Equifax/​OU=Equifax Secure Certificate Authority
 +---
 +Server certificate
 +-----BEGIN CERTIFICATE-----
 +MIIHqTCCBpGgAwIBAgIILjRo+RchlW0wDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
 +[...]
 +---
 +GET / HTTP/1.0
  
-Folosim calea completă către comanda ''​echo''​ pentru că nu știm cum arată variabila ''​PATH''​ în mediul în care rulează ''​cron''​.+HTTP/1.0 302 Found 
 +Location: https://​www.google.ro/?​gws_rd=cr&​ei=pWqOVq7vEcO8ygOarIi4DQ 
 +Cache-Control:​ private 
 +[...] 
 +</​code>​
  
-Adăugați comanda de mai sus să ruleze la fiecare două minute prin alterarea crontab-ului utilizatorului ​''​student''​. După adăugare urmăriți spool-ul cron în ''/​var/​spool/​cron/​crontabs/​student''​.+Observăm că în cazul conexiunii sigure, am primit și informații despre certificatul ​''​google.com''​, conexiunea este acum sigură, dar rezultatul este același (am obținut aceeașpagină).
  
-În urma funcționării corecteveți primi un e-mail către utilizatorul ​''​student''​ cu output-ul ​comenzii.+Pentru a valida siguranța conexiunii putemîntr-o consolă distinctă, să capturăm traficul folosind ​''​tcpdump''​ cu ajutorul ​comenzii ​de mai jos:<​code>​ 
 +sudo tcpdump -i eth0 -n -A host google.com and tcp port 80 or tcp port 443 
 +</​code>​
  
-<​note ​tip+<​note ​important
-Puteți verifica e-mail-ul primit folosind comanda ​''​mail''​.+Înlocuiți ''​eth0'' ​cu interfața activă a sistemului.
 </​note>​ </​note>​
  
-<note tip> +Dacă reluăm comenzile de mai sus vom vedea că putem vizualiza cererea și răspunsul HTTP pentru conexiunea plain text (folosind ​''​netcat''​) dar nu șpentru cererea și răspunsul HTTPS pentru conexiunea sigură.
-Pentru crearea intrării în crontab-ul utilizatorului ​''​student'' ​urmărițindicațiile de [[http://​techie-experience.blogspot.ro/​2012/​10/​crontab.html|aici]]. +
-</​note>​+
  
-===== Alte configurări cron =====+Puteți valida faptul că o conexiune este sigură sau nu și prin folosirea comenzii ''​wget'':<​code>​ 
 +wget http://​google.com 
 +wgets http://​google.com 
 +</​code>​
  
-Actualizați comanda ​''​cron'' ​de mai sus astfel încât output-ul comenzii să nu mai fie livrat prin e-mail ci să fie adăugat într-un fișier dat. Output-ul să conțină și data la care a fost rulată comanda.+Folosiți ''​openssl s_client'' ​pentru a obține pagina acestui laborator, adică folosiți URL-ul https://​ocw.cs.pub.ro/​courses/​gsr/​laboratoare/​laborator-08. Observați că se face redirectarea acelei adrese către adresa fără HTTPS. 
 +===== Investigarea unui certificat ​la distanță =====
  
-Instalați pachetul ​''​debsums''​. Urmăriți ce configurări ​de cron sunt adăugate la instalarea pachetului.+După cum am observat mai sus, conectarea cu ''​openssl s_client'' ​permite obținerea certificatelor ​de la distanță. Putem astfel obține un certificat ​la distanță folosind comanda<​code>​ 
 +echo | openssl s_client -connect open-source.cs.pub.ro:443 
 +</​code>​
  
-<note tip> +Observăm că am obținut certificatul pentru ''​koala.cs.pub.ro''​ întrucât serverul folosește virtual hosting. Ca să activăm suportul de SNI, atunci folosim opțiunea ''​-servername'':​<​code>​ 
-Urmăriți conținutului unui pachet instalat folosind comanda<​code>​ +echo | openssl s_client ​-connect open-source.cs.pub.ro:​443 ​-servername open-source.cs.pub.ro 
-dpkg -L <nume-pachet>​ +</code>
-</code +
-unde ''<​nume-pachet>''​ este numele pachetului+
-</note>+
  
-===== Configurare serviciu cron de pornire client Bittorrent =====+Pentru a obține doar certificatul aferent serverului ​de la distanță (''​open-source.cs.pub.ro''​) folosim comanda<​code>​ 
 +echo | openssl s_client -connect open-source.cs.pub.ro:​443 -servername open-source.cs.pub.ro 2> /dev/null | sed -ne '/​-BEGIN CERTIFICATE-/,/​-END CERTIFICATE-/​p'​ 
 +</​code>​
  
-Instalați un client de Bittorrent care funcționează în linia de comandă, precum ​''​transmission-cli''​ sau ''​bittorrent''​ sau ''​bittornado''​ și porniți-l în background (folosind ''​nohup''​) ca să descarce un anumit conținut BittorrentGăsiți un fișier ''​.torrrent'' ​pe Internet și descărcați-l.+Apoi, ca să investigămdirect certificatul folosim comanda ​''​openssl x509''​. Dacă ne interesează doar subiectul ​și datele vom folosi comanda<​code>​ 
 +echo | openssl s_client ​-connect open-source.cs.pub.ro:​443 -servername open-source.cs.pub.ro 2> /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/​-END CERTIFICATE-/​p' ​| openssl x509 -noout -subject -dates 
 +</​code>​
  
-Apoi creați un script care să verifice dacă este pornit clientul Bittorrent pentru acel fișier ''​.torrent''​ și dacă nu este pornit să-l repornească.+Realizați același lucru și pentru server-ul de cursuri (''​cs.curs.pub.ro''​) pentru serverul ''​systems.cs.pub.ro''​ și pentru un alt server la alegere. Observați dacă sunt valide, care este issuer-ul și care este data de expirare. 
 +===== Generarea și semnarea unui certificat =====
  
-Plasați script-ul în crontab cu verificare la 10 minute+Dorim să trecem prin toți pașii de generare, obținere și folosire a unui certificat. Adică: 
-===== Gestionare client ​de BitTorrent folosind supervisord =====+  * Alegem fiecare un nume de domeniu. 
 +  * Vom genera o cheie privată și o cerere de semnare (CSR: //​certificate signing request//​). 
 +  * Vom solicita crearea unui certificat pe baza CSR-ului către un CA. În cazul nostru va fi vorba de un sistem din laborator care semnează
 +  * Vom obține ​de la CA certificatul semnat.
  
-Folosiți [[http://​supervisord.org/​|supervisord]] ​pentru a porni și gestiona clientul BitTorrent de mai sus.+Pentru început fiecare dintre voi alege un nume de domeniu care să fie ''<​nume>​.ixlabs''​. Discutați în prealabil cu asistentul ce nume să alegeți pentru a fi siguri că nu apar conflicte. ''<​nume>''​ poate fi prenumele vostru, o poreclă sau alt nume care vă place vouă.
  
-<note tip> +Mai jos vom folosi numele ''​dorel.ixlabs''​ pe care să îl înlocuiți voi cu numele vostru.
-Urmăriți exemplele de configurare din link-urile de mai jos: +
-  * https://www.digitalocean.com/​community/​tutorials/​how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps +
-  * https://​serversforhackers.com/​monitoring-processes-with-supervisord +
-</​note>​ +
-===== Funcționarea NTP =====+
  
-===== Configurare server NTPSincronizare sisteme =====+Apoi creați cheia privată folosind acest nume<​code>​ 
 +openssl genrsa -out dorel.ixlabs.key 2048 
 +</​code>​
  
 +După ce am generat cheia o putem investiga folosind comenzi precum<​code>​
 +openssl rsa -in dorel.ixlabs.key -noout -text
 +openssl rsa -in dorel.ixlabs.key -noout -modulus
 +</​code>​
 +
 +Având cheia generată, acum putem genera CSR-ul aferent:<​code>​
 +openssl req -new -key dorel.ixlabs.key -out dorel.ixlabs.csr
 +</​code>​
 +Folosiți ca
 +  * Organizational Name: ''​Ixia''​
 +  * Organizational Unit Name: ''​Development''​
 +  * Common Name: folosiți numele vostru de domeniu
 +Lăsați goale (dați ''​Enter''​) pentru ''​Challenge assword''​ și ''​Optional Company Name''​.
 +
 +Apoi putem investiga CSR-ul folosind comanda<​code>​
 +openssl req -in dorel.ixlabs.csr -noout -text
 +</​code>​
 +
 +Acum avem CSR-ul pe care să îl trimitem către CA pentru semnare.
 +
 +Vom simula CA-ul pe un sistem din laborator. Veți copia CSR-ul pe sistemul în cauză pentru semnare. Pentru aceasta folosiți ''​SSH''​ cu o comandă de forma:<​code>​
 +scp dorel.ixlabs student@<​adresa-IP-CA>:​certs/​
 +</​code>​
 +unde ''<​adresa-IP-CA>''​ este adresa IP a CA-ului indicată pe tablă.
 +
 +Apoi mergeți la asistent pentru a solicita semnarea certificatului și spuneți care este certificatul vostru.
 +
 +După ce este semnat certificatul,​ copiați-l înapoi folosind tot ''​SSH''​. Copiați și certificatul CA-ului.
 +
 +===== Verificarea unui certificat și a cheii private =====
 +
 +Pentru a verifica faptul că certificatul obținut (să spunem că este ''​dorel.ixlabs.crt''​) va trebui să comparăm modulul său (al cheii publice) și modulul cheii private.
 +
 +Pentru aceasta putem folosi comenzile<​code>​
 +openssl rsa -in dorel.ixlabs.key -noout -modulus | md5sum
 +openssl x509 -in dorel.ixlabs.crt -noout -modulus | md5sum
 +</​code>​
 +
 +Dacă cele două rezultate corespund înseamnă că certificatul este valid și este corepunzător cheii private. Acum poate fi folosit într-o configurare pe un servere care să asigure o conexiune TLS.
 +
 +Realizați verificarea certificatului pentru ''​houdini.cs.pub.ro''​ și a cheii private aferente folosind comenzi similare celor de mai sus.
 +
 +/*
 ===== Demo: Funcționarea dhclient ===== ===== Demo: Funcționarea dhclient =====
 +
 +Clientul de DHCP este reprezentat în Linux de comanda ''​dhclient''​. La o rulare a comenzii ''​dhclient''​ este interogat serverul DHCP pentru transmiterea unei adrese.
 +
 +Pentru a testa această funcționalitate,​ vom dezactiva configurația curentă și apoi vom face o nouă configurație.
 +
 +Pentru dezactivare identificăm interfața activă prin rularea comenzii<​code>​
 +ip a s
 +</​code>​
 +Interfața activă este cea care are adresa IP din rețeaua ''​172.16.4.0/​24''​.
 +
 +Apoi dezactivăm configurația interfeței:<​code>​
 +sudo ip a f dev <​interface>​
 +</​code>​
 +unde ''<​interface>''​ este numele interfeței.
 +
 +Apoi solicităm o nouă adresă IP pentru interfață folosind comanda<​code>​
 +sudo dhclient <​interface>​
 +</​code>​
 +unde ''<​interface>''​ este numele interfeței.
 +
 +Putem urmări în ''/​var/​log/​syslog''​ mesajele afișate de clientul ''​DHCP''​.
 +
 +Dacă dorim să dăm release la configurație,​ putem folosi comanda<​code>​
 +sudo dhclient -r <​interace>​
 +</​code>​
 +unde ''<​interface>''​ este numele interfeței.
  
 ===== Verificare configurare server de DHCP ===== ===== Verificare configurare server de DHCP =====
 +
 +<​note>​
 +Dacă ați deschis mașina virtuală ''​GSR Debian'',​ închideți-o și ștergeți-o (împreună cu fișierele aferente) din VirtualBox. Din ''/​mnt/​sda5/​gsr/''​ în VirtualBox deschideți aplicația ''​DHCP-Appliance.ova''​. Aplicația are două mașini virtuale.
 +
 +Întâi porniți mașina virtuală ''​GSR Debian''​ care este serverul de DHCP și după ce a bootat, porniți mașina virtuală ''​GSR Debian 2''​ care este clientul de DHCP.
 +</​note>​
 +
 +Urmăriți adresele IP pe interfața ''​eth2''​ a fiecărei mașini virtuale. Urmăriți în fișierul ''/​etc/​network/​interface''​ configurația pentru interfața ''​eth2''​ a fiecărei mașini virtuale.
 +
 +Urmăriți configurația serverului de DHCP în ''/​etc/​default/​isc-dhcp-server''​ și în ''/​etc/​dhcp/​dhcpd.conf''​. Verificați că serverul este pornit și ascultă conexiuni pe portul ''​68''​ UDP.
 +
 +Urmăriți în fișierele de tip jurnal de pe fiecare sistem (''/​var/​log/​syslog''​) mesaje afișate de clientul și serverul DHCP.
 +
 +Folosiți, pe client, comenzile<​code>​
 +sudo ifdown eth2
 +sudo ifup eth2
 +</​code>​
 +pentru dezactivarea și reactivarea interfeței și, deci pentru reinterogarea serverului DHCP, care duce la conduce la generarea de noi mesaje de jurnalizare.
  
 ===== Configurare server de DHCP ===== ===== Configurare server de DHCP =====
  
 +Modificați configurația serverului ''​DHCP''​ astfel încât acesta să furnizeze adrese în subnet-ul ''​1.1.1.0/​24'',​ în range-ul ''​1.1.1.2-1.1.1.50''​. Adresa IP a serverului DHCP pe interfața ''​eth2''​ trebuie să fie ''​1.1.1.1''​.
 +
 +<note tip>
 +Va trebui ca pe serverul DHCP să modificați și configurația interfeței ''​eth2''​ în fișierul ''/​etc/​network/​interfaces''​.
 +
 +Pentru aceasta, dezactivați interfața:<​code>​
 +sudo ip link set dev eth2 down
 +sudo ip add flush dev eth2
 +</​code>​
 +faceți modificarea în fișierul ''/​etc/​network/​interfaces''​ și apoi refaceți configurația<​code>​
 +sudo ifup eth2
 +</​code>​
 +</​note>​
  
-/* 
  
 <note important>​ <note important>​
Line 860: Line 1030:
  
 */ */
 +
gsr/laboratoare/laborator-08.1449753429.txt.gz · Last modified: 2015/12/10 15:17 by razvan.deaconescu
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