Differences

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

Link to this comparison view

gsr:laboratoare:laborator-08 [2016/10/06 15:55]
george.milescu
gsr:laboratoare:laborator-08 [2016/12/14 20:46] (current)
alexandru.carp [Generarea și semnarea unui certificat]
Line 1: Line 1:
 ====== Laborator 08: Securitate: PKI și X.509 ====== ====== Laborator 08: Securitate: PKI și X.509 ======
-/* 
-===== Demo: Inspectarea configurației cron ===== 
  
-<​note>​ +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 task-urile ​de ''​cron''​folositi masina virtuala din ''​/mnt/sda5/gsr/''​ + 
-</​note>​+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ă. 
 + 
 +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. 
 +===== Investigarea unui certificat =====
  
-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 sistemuluiLiniile de configurare urmează sintaxa crontab așa cum este exemplificată [[http://​techie-experience.blogspot.ro/​2012/​10/​crontab.html|aici]].+În [[http://elf.cs.pub.ro/gsr/res/laboratoare/lab-10.zip|arhiva de sarcini a laboratorului]] există un certificat în fișierul ''​houdini.cs.pub.ro.crt-roedunet''​.
  
-Pentru a vedea configurația pentru utilizatorul curent ​folosim comanda<​code>​ +Vrem să afișăm informații despre acest fișier: identificator,​ semnatar, data expirării, cheia publică. Pentru aceasta ​folosim comanda<​code>​ 
-crontab ​-l+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 inspecand directorul ​''​Maildir/​new/​''​+Î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 =====+Apoi creați cheia privată folosind acest nume<​code>​ 
 +openssl genrsa -out dorel.ixlabs.key 2048 
 +</​code>​
  
-Pentru a verifica funcționarea NTP (//Network Time Protocol//) o soluție este instalarea utilitarului ''​ntpdate''​. Dacă nu-l aveți instalat, instalați-l ​folosind ​comanda<​code>​ +După ce am generat cheia o putem investiga ​folosind ​comenzi precum<​code>​ 
-sudo apt-get install ntpdate+openssl rsa -in dorel.ixlabs.key -noout -text 
 +openssl rsa -in dorel.ixlabs.key -noout ​-modulus
 </​code>​ </​code>​
  
-Aveți două utilitare pe care le puteți folosi interschimbabil pentru actualizarea timpului sistemului: ''​ntpdate'' ​care primește ca argument un server NTP, și ''​nptdate-debian'' ​care folosește serverele configurate în ''​/​etc/​default/​ntpdate'' ​(directiva ​''​NTPSERVERS''​).+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>​
  
-===== Configurare server NTPSincronizare sisteme =====+Acum avem CSR-ul pe care să îl trimitem către CA pentru semnare.
  
-Instalați, dacă nu este instalat serverul ''​NTP''​ prin intermediul pachetului ''​ntp''​Serverul va porni automat și veți putea verifica faptul că ascultă conexiuni pe portul ​''​123'' ​UDP folosind comanda<​code>​ +Vom simula CA-ul pe un sistem din laborator. Veți copia CSR-ul pe sistemul în cauză pentru semnarePentru aceasta folosiți ''​SSH'' ​cu o comandă de forma:<​code>​ 
-sudo netstat ​-ulpn+scp dorel.ixlabs student@<​adresa-IP-CA>:​certs/​
 </​code>​ </​code>​
 +unde ''<​adresa-IP-CA>''​ este adresa IP a CA-ului indicată pe tablă.
  
-Discutați cu 2-3 colegi ​și aflați adrese IP stațiilor pe care aceștia lucrează și adăugați configurare pentru serverul NTP în fișierul ''/​etc/​ntp.conf''​. După un timp se va crea un mesh de comunicare între serverele NTP din sala de laborator.+Apoi mergeți la asistent pentru a solicita semnarea certificatului ​și spuneți care este certificatul vostru.
  
-<note tip> +După ce este semnat certificatul,​ copiați-l înapoi folosind tot ''​SSH''​. Copiațși certificatul CA-ului. 
-Pentru a investiga la orice moment informații despre funcționarea serverului NTP și peer-ii cu care acesta comunică puteți folosi ​una dintre ​comenzile ​de mai jos<​code>​ + 
-ntpq -p +===== Verificarea unui certificat și a cheii private ===== 
-ntpq -pn+ 
 +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) ș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>​ </​code>​
-</​note>​ 
  
-<note tip> +Dacă cele două rezultate corespund înseamnă că certificatul este valid șeste corepunzător cheii privateAcum poate fi folosit într-o configurare pe un servere care să asigure o conexiune TLS.
-Informații despre configurarea NTP găsițîn link-urile de mai jos: +
-  * http://www.debianadmin.com/​ntp-server-and-client-configuration-in-debian.html +
-  * http://​www.tecmint.com/​install-and-configure-ntp-server-client-in-debian/​ +
-</​note>​+
  
 +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 =====
  
gsr/laboratoare/laborator-08.1475758548.txt.gz · Last modified: 2016/10/06 15:55 by george.milescu
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