This shows you the differences between two versions of the page.
rl:labs:08:contents:02 [2020/09/13 07:06] iulia.florea |
rl:labs:08:contents:02 [2023/11/05 12:54] (current) vlad_iulius.nastase |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 2. [10p] Problemă la conectarea SSH folosind chei ==== | + | ==== 02. [10p] Format de pachete la translatare ==== |
- | Din contul utilizatorului ''student'' de pe stația ''red'' conectați-vă la utilizatorul ''ana'' de pe stația ''host'' prin SSH prin rularea comenzii<code bash> | + | Ne propunem să analizăm antetul IP al pachetelor ce sunt generate de stațiile ''red'', ''green'' și ''blue'' și au ca destinație o rețea din Internet. Pentru acest lucru vom folosi utilitarul de captură ''tcpdump''. |
- | student@red:~$ ssh -l ana host | + | |
- | ana@host's password: | + | |
+ | Pe stația ''red'' pornim comanda ''ping'' către ''8.8.8.8.'':<code bash> | ||
+ | root@red:~# ping 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_req=1 ttl=127 time=42.0 ms | ||
+ | [...] | ||
</code> | </code> | ||
- | Observați că vi se cere parola. Folosiți ''Ctrl+c'' pentru a anula promptul de parolă și a reveni la shell-ul inițial. | ||
- | Afișați fișierul care conține cheia publică stocată local și cel care conține cheia publică stocată la distanță. Folosiți comenzile<code bash> | + | <note> |
- | student@red:~$ cat ~/.ssh/id_rsa.pub | + | Atunci când rulăm comanda ''tcpdump'' secvența de urmat este: |
- | ssh-rsa AAAAB3NzaC1yc[...] student@red | + | - Se rulează comanda ''tcpdump'' cu opțiunile aferente într-un terminal, activând astfel captura de pachete. Utilitarul ''tcpdump'' așteaptă acum transmiterea de pachete pe interfețele pe care ascultă. |
+ | - Într-un alt terminal se rulează o comandă specifică unui client de rețea care generează trafic. | ||
+ | - Se revine în terminalul în care rulează comanda ''tcpdump'' și se urmăresc pachetele capturate. | ||
+ | - Când nu mai este nevoie de utilitarul ''tcpdump'' se întrerupe captura de pachete folosind combinația de taste ''Ctrl+c''. | ||
+ | </note> | ||
- | student@red:~$ ssh -l ana host "cat ~/.ssh/authorized_keys" | + | Pentru a urmări traficul, pe stația ''host'' rulăm comanda<code bash> |
- | ana@host's password: | + | root@host:~# tcpdump -n -i eth0 ip dst host 8.8.8.8 |
- | ssh-rsa AAAAB3NzaC1yc[...] student@red | + | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode |
+ | listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes | ||
+ | 12:59:20.976707 IP host > 8.8.8.8: ICMP echo request, id 625, seq 6, length 64 | ||
+ | 12:59:21.977708 IP host > 8.8.8.8: ICMP echo request, id 625, seq 7, length 64 | ||
</code> | </code> | ||
- | Pentru a doua comandă introduceți parola ''student''. Observați că cele două fișiere sunt identice. În mod obișnuit conectarea SSH ar trebui să funcționeze pe bază de chei, nu ar trebui să solicite parolă. | ||
- | O primă metodă de identificare a problemelor de conectare este să rulați comanda de conectare cu opțiune de //verbosity//:<code bash> | + | <spoiler (click pentru expandare) Detalii rulare masina virtuala VMware local> |
- | student@red:~$ ssh -vvv -l ana host | + | <note important> |
- | [...] | + | După rularea comenzii de mai sus, probabil vi se va bloca terminalul. În mașina virtuală VMware apare o mini-fereastră care vă indică intrarea plăcii de rețea în modul //promiscuous//. Apăsați pe butonul ''OK'' al ferestrei pentru a debloca mașina virtuală și, astfel, terminalul. |
- | debug3: remaining preferred: ,password | + | |
- | debug3: authmethod_is_enabled password | + | |
- | debug1: Next authentication method: password | + | |
- | ana@host's password: | + | |
- | </code> Din păcate mesajele afișate nu oferă informații utile. Folosiți ''Ctrl+c'' pentru a anula promptul de parolă și a reveni la shell-ul inițial. | + | |
- | + | ||
- | Pentru identificarea problemei vrem să consultăm fișierele jurnal ale serverului de SSH de la distanță. Autentificați ca ''root'' pe stația ''host'', folosiți comanda ''tail'' pentru a urmări mesajele de jurnalizare. Comanda rulează în continuu și afișează noile mesaje din fișierul primit ca argument pe măsură ce acestea apar:<code bash> | + | |
- | root@host:~# tail -f /var/log/auth.log | + | |
- | [...] | + | |
- | Nov 14 16:48:31 host sshd[20898]: Authentication refused: bad ownership or modes for directory /home/ana/.ssh | + | |
- | Nov 14 16:49:09 host sshd[20898]: Connection closed by 192.168.1.2 [preauth] | + | |
- | </code> Pentru a genera din nou mesaje legate de problemă, pe stația ''red'' rulați, din nou, comanda de conectare SSH:<code bash> | + | |
- | ssh -l ana host | + | |
- | </code> Folosiți ''Ctrl+c'' pentru a anula promptul de parolă și a reveni la shell-ul inițial. | + | |
- | + | ||
- | Urmăriți mesajele de jurnalizare ale serverului. Urmăriți linia care începe cu "Authentication refused:". | + | |
- | + | ||
- | <note tip> | + | |
- | Problema este la directorul ''.ssh/'' din directorul home al utilizatorului ''ana''. | + | |
</note> | </note> | ||
+ | </spoiler> | ||
- | <note tip> | + | Observăm că adresa IP sursă este ''host.local'' chiar dacă stația ''red'' este cea care execută comanda ''ping'' și generează pachetele de tip ''ICMP echo request''. |
- | Folosiți comanda<code bash> | + | |
- | ls -ld <director> | + | |
- | </code> pe un director pentru a afișa permisiunile pe directorul ''<director>''. Permisiunile ar trebui să corespundă cu permisiuni pe directoarele identice deținute de alți utilizatori. | + | |
- | </note> | + | |
- | <hidden> | + | Pentru a vedea pachetele așa cum sunt generate inițial, rulăm comandă ''tcpdump'' pe interfața ''veth-red'' în loc de ''eth0'': <code bash> |
- | <solution> | + | root@host:~# tcpdump -n -i veth-red ip dst host 8.8.8.8 |
- | Mesajul complet este<code> | + | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode |
- | Authentication refused: bad ownership or modes for directory /home/ana/.ssh | + | listening on veth-red, link-type EN10MB (Ethernet), capture size 65535 bytes |
+ | 13:01:12.557692 IP red > 8.8.8.8: ICMP echo request, id 626, seq 6, length 64 | ||
+ | 13:01:13.559726 IP red > 8.8.8.8: ICMP echo request, id 626, seq 7, length 64 | ||
</code> | </code> | ||
- | Sunt permisiuni nepotrivite pe directorul ''/home/ana/.ssh''. Investigăm permisiunile:<code bash> | + | Observăm că pe interfața ''veth-red'' adresa IP sursă este adresa stației ''red'', adică așa cum este generat de la început pachetul. Motivul este reprezentat de faptul că pachetele ce intră pe intefața ''veth-red'' sunt capturate înainte de rutare, iar procesul NAT este aplicat **după rutare** (vezi [[rl:labs:09:contents:01|]]. |
- | root@host:~# ls -ld /home/ana/.ssh/ | + | |
- | drwxrwxrwx 2 ana ana 4096 Sep 18 2013 /home/ana/.ssh/ | + | Pentru a vedea modul în care se translatează traficul capturăm traficul pe toate interfețele (cele de interes sunt ''veth-red'' și ''eth0'')<code bash> |
+ | root@host:~# tcpdump -n -i any ip dst host 8.8.8.8 | ||
+ | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode | ||
+ | listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes | ||
+ | 10:23:07.632412 IP red > 8.8.8.8: ICMP echo request, id 707, seq 237, length 64 | ||
+ | 10:23:07.632430 IP host > 8.8.8.8: ICMP echo request, id 707, seq 237, length 64 | ||
+ | 10:23:08.633936 IP red > 8.8.8.8: ICMP echo request, id 707, seq 238, length 64 | ||
+ | 10:23:08.633954 IP host > 8.8.8.8: ICMP echo request, id 707, seq 238, length 64 | ||
</code> | </code> | ||
- | Permisiunile sunt prea permisive (drepturi complete). Întrucât directorul ''/home/ana/.ssh/'' conține și fișierul ce reprezintă cheia privată a utilizatorului ''ana'' (posibil chiar mai multe fișiere de cheie privată), care trebuie să rămână **privat**, trebuie permisiuni mai restrictive pe fișier. | ||
- | </solution> | ||
- | </hidden> | ||
- | Corectați problema indicată de fișierele jurnal. | + | În lista de mai sus observăm atât pachetele care sunt captuarate pe interfața ''veth-red'' (generate de stația ''red'') cât și cele capturate pe interfața ''eth0'' (translatate de stația ''host''). |
- | <hidden> | + | Capturați și pachetele de reply, care au ca **sursă** adresa ''8.8.8.8''. Folosiți șirul de argumente ''ip src host 8.8.8.8'' pentru ''tcpdump''. |
- | <solution> | + | |
- | Reducem permisiunile pe directorul ''/home/ana/.ssh/'': | + | |
- | <code bash> | + | |
- | root@host:~# chmod 755 /home/ana/.ssh/ | + | |
- | root@host:~# ls -ld /home/ana/.ssh/ | + | |
- | drwxr-xr-x 2 ana ana 4096 Sep 18 2013 /home/ana/.ssh/ | + | |
- | </code> | + | |
- | </solution> | + | |
- | </hidden> | + | |
- | După corectarea problemei, verificați funcționarea conectării SSH folosind chei publice:<code bash> | + | Repetați testele de mai sus pentru stația ''green''. |
- | student@red:~$ ssh -l ana host | + | |
- | [...] | + | |
- | ana@host:~$ | + | |
- | </code> | + | |
- | Dacă ați realizat configurația corectă atunci comanda de mai sus va conduce la conectarea SSH prin cheie publică, fără a vă fi solicitată parola de conectare pentru utilizatorul ''ana'' de pe stația ''host''. | + | <note> |
+ | Întrucât latența DNS poate fi semnificativă, recomandăm folosirea opțiunii ''-n'' a utilitarului ''tcpdump'', opțiune care dezactivează rezolvarea DNS. În exemplele de mai sus, nu am folosit opțiunea ''-n'' a utilitarului ''tcpdump'' pentru a identifica mai ușor numele stațiilor implicate în conversație. | ||
+ | </note> |