This shows you the differences between two versions of the page.
rl:labs:08:contents:10 [2020/08/30 13:14] iulia.florea |
rl:labs:08:contents:10 [2024/10/29 14:41] (current) eduard.dumistracel [10. [10p] Tunel SSH invers] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 10. [10p] Problemă la conectarea SSH folosind chei ==== | + | ==== 10. [10p] Tunel SSH invers ==== |
- | 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> | + | Sunt situații în care dorim ca o stație să fie accesibilă din exterior, dar este dificil să obținem un port în gateway (pentru //port forwarding//): fie din rațiuni administrative, fie din motive de securitate. Pentru a permite totuși o conexiune din exterior, se poate crea un tunel SSH invers. Tunel SSH invers înseamnă următorii pași: |
- | student@red:~$ ssh -l ana host | + | * se creează o conexiune SSH de la o stație cu adresă IP privată la un server extern cu adresă IP publică, |
- | ana@host's password: | + | * se deschide un port pe serverul cu adresă IP publică |
+ | * traficul către acel port este tunelat prin conexiunea SSH către stația cu adresă IP privată | ||
- | </code> | + | Dorim să permitem conectarea la stația ''red'' din Internet pe SSH. Vom crea o conexiune SSH "directă" de la stația ''red'' la contul vostru de pe ''fep.grid.pub.ro''. Prin această conexiune veți tunela invers traficul SSH către ''red'' permițând conexiunea din exterior. |
- | 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> | + | Pentru început, de pe stația ''red'' creăm o conexiune SSH directă către contul de pe ''fep.grid.pub.ro'' (identic cu cel de pe ''cs.curs.pub.ro''): |
- | student@red:~$ cat ~/.ssh/id_rsa.pub | + | <code bash> |
- | ssh-rsa AAAAB3NzaC1yc[...] student@red | + | root@red:~# ssh -l $USERNAME fep.grid.pub.ro -R 100XY:localhost:22 |
- | + | ||
- | student@red:~$ ssh -l ana host "cat ~/.ssh/authorized_keys" | + | |
- | ana@host's password: | + | |
- | ssh-rsa AAAAB3NzaC1yc[...] student@red | + | |
- | </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> | + | |
- | student@red:~$ ssh -vvv -l ana host | + | |
[...] | [...] | ||
- | debug3: remaining preferred: ,password | + | $USERNAME@fep.grid.pub.ro's password: |
- | debug3: authmethod_is_enabled password | + | Last login: Mon Sep 9 09:55:37 2013 from 141.85.225.214 |
- | debug1: Next authentication method: password | + | [$USERNAME@fep-62-2 ~]$ ss -tln | grep 100XY |
- | ana@host's password: | + | tcp 0 0 127.0.0.1:100XY 0.0.0.0:* LISTEN |
- | </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. | + | tcp 0 0 ::1:100XY :::* LISTEN |
+ | </code> unde ''$USERNAME'' este numele contului de pe ''fep.grid.pub.ro''/''cs.curs.pub.ro'', iar ''XY'' este un identificator numeric unic al stației din laborator (dacă nu aveți pe monitorul stației din laborator un identificator discutați cu asistentul). Introduceți parola corespunzătoare contului vostru de pe ''fep.grid.pub.ro''/''cs.curs.pub.ro''. | ||
- | 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> | + | Observăm că se deschide portul ''100XY'' pe ''fep.grid.pub.ro''. Acest port va fi folosit pentru tunelul invers care ne va duce pe stația ''red''. |
- | 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:". | + | Argumentul ''-R 100XY:localhost:22'' transmis comenzii ''ssh'' are următoarea semnificație: |
+ | * ''100XY'' - portul de pe server pe care se vor asculta conexiuni care vor fi tunelate invers; | ||
+ | * ''localhost'' - stația către care vor fi trimise pachetele primite prin tunel (chiar stația locală); | ||
+ | * ''22'' - portul către care vor fi trimise pachetele primite prin tunel (adică portul SSH local). | ||
- | <note tip> | + | După ce alți colegi rulează comenzile similare vă veți putea conecta pe stația ''red'' a acestora folosind portul deschis de ei; discutați cu alți colegi ca să vă spună ce port au deschis. Pentru aceasta, veți folosi stația fizică și vă veți conecta pe contul de pe ''fep.grid.pub.ro''. |
- | Problema este la directorul ''.ssh/'' din directorul home al utilizatorului ''ana''. | + | |
- | </note> | + | |
- | <note tip> | + | <note important> |
- | Folosiți comanda<code bash> | + | Pe ''fep.grid.pub.ro'' rulează un load balancer pentru SSH. Din acest motiv este posibil să intrați pe "celălalt" sistem. Verificați că numele de host din prompt corespunde cu cel pe care l-ați folosit inițial la crearea tunelului: adică ambele să fie ''fep-62-2'' sau ''fep-62-1''. Pentru siguranță folosim și comanda ''ss'':<code bash> |
- | ls -ld <director> | + | [$USERNAME_COLEG@fep-62-2 ~]$ ss -tln | grep 100ZT |
- | </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. | + | tcp 0 0 127.0.0.1:100ZT 0.0.0.0:* LISTEN |
+ | tcp 0 0 ::1:100ZT :::* LISTEN | ||
+ | </code> | ||
+ | În output-ul comenzii de mai sus ''100ZT'' este portul deschis de coleg. | ||
</note> | </note> | ||
- | <hidden> | + | După conectarea colegului la ''fep'', realizăm o conexiune prin tunelul SSH pe portul ''100ZT'' deschis de coleg:<code bash> |
- | <solution> | + | [$USERNAME_COLEG@fep-62-2 ~]$ ssh -l student localhost -p 100ZT |
- | Mesajul complet este<code> | + | Warning: Permanently added '[localhost]:100ZT' (RSA) to the list of known hosts. |
- | Authentication refused: bad ownership or modes for directory /home/ana/.ssh | + | root@localhost's password: |
+ | [...] | ||
+ | root@red:~# | ||
</code> | </code> | ||
- | Sunt permisiuni nepotrivite pe directorul ''/home/ana/.ssh''. Investigăm permisiunile:<code bash> | + | În cadrul conexiunii ni se cere parola utilizatorului ''root'' de pe stația ''red'' (adică parola ''student''). |
- | root@host:~# ls -ld /home/ana/.ssh/ | + | |
- | drwxrwxrwx 2 ana ana 4096 Sep 18 2013 /home/ana/.ssh/ | + | |
- | </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 final ați accesat stația ''red'' a colegului, o stația cu adresă IP privată inaccesibilă din exterior. Pentru aceasta ați folosit o altă stație (care ar putea fi din altă rețea) pentru a se conecta la ''fep.grid.pub.ro'' și de acolo la ''red'' prin intermediul tunelului invers creat inițial. |
- | + | ||
- | <hidden> | + | |
- | <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> | + | |
- | 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''. | + | Creați un fișier pe stația ''red'' proaspăt accesată, iar colegul poate verifica faptul că, într-adevăr, ați accesat container-ul său prin tunelul SSH invers pe care l-a creat anterior. |