W jaki sposób klucze publiczne są „wysyłane” na serwery i w jaki sposób klucze prywatne są „wykorzystywane” do SSH?

11

Istnieją dwie maszyny Linux, A i B. Skrypty działa na muszą być w stanie zalogować się na B. więc generuje klucz publiczny (prawdopodobnie ssh-keygen-generated id_rsa.pub), a następnie korzysta z odpowiedniego klucza prywatnego (ponownie, prawdopodobnie id_rsa), aby to połączenie SSH.

Jeśli cokolwiek, co powiedziałem powyżej, jest nieprawidłowe lub wprowadzane w błąd, zacznij od poprawienia mnie!

Zakładając, że mniej więcej celuję:

  • W jaki sposób A „daje” B swój klucz publiczny ( id_rsa.pub)? Czy to musi być proces ręczny, czy może być zautomatyzowany? Jeśli ręczny, jaki jest proces? Jeśli jest zautomatyzowane, jakie jest polecenie? Kiedy B „dostaje” ten klucz publiczny, dokąd idzie lub jest przechowywany?
  • Podczas inicjowania połączenia SSH z B, w jaki sposób A „używa” swojego klucza prywatnego ( id_rsa) jako części tego połączenia?
użytkownik3178622
źródło
3
Dlaczego zdanie negatywne bez wyjaśnienia? Pokazuje badania, jest SSCCE i, o ile mi wiadomo, nie jest duplikatem. Jeśli nie zgadzasz się i uważasz, że to duplikat, podaj link do pytania, które uważasz za duplikat!
user3178622,
Chociaż nie głosowałem i nie sądzę, by to pytanie było w jakikolwiek sposób złe, być może stos bezpieczeństwa informacji byłby bardziej odpowiednim miejscem.
MC10,
3
Nie oddałem głosu, ale rozumiem, dlaczego ktoś to zrobił. Jest to powszechnie stosowana metoda logowania, choć zgadzam się, że wyniki wyszukiwania Google są zaśmiecone sposobem, w jaki działają, a nie jak działają artykuły. Można znaleźć informacje, których szukasz.
Tyson,
5
Pojęcie SSCCE nie ma zastosowania do pytań, które nie dotyczą kodu.
Scott,
2
Nie duplikat, ale powiązany: superuser.com/questions/383732/how-does-ssh-encryption-work . Może odpowiedzieć na drugą część pytania (w jaki sposób wykorzystywane są klucze prywatne)
Jay

Odpowiedzi:

5

ssh-keygengeneruje zarówno klucze publiczne, jak i prywatne, które początkowo znajdują się tylko lokalnie. Przekazywanie klucza publicznego innemu hostowi jest czymś, co użytkownik musiałby zrobić ręcznie, albo wysyłając go komuś odpowiedzialnemu za serwer B, albo jeśli masz konto z hasłem, możesz się zalogować i umieścić go tam. Aby umożliwić logowanie bez hasła do serwera B, musisz dodać swój klucz publiczny do pliku ~ / .ssh / Author_keys na serwerze B (jeden klucz publiczny w linii, w tym pliku może znajdować się dowolna liczba kluczy). Istnieje polecenie linux ssh-copy-id, które skopiuje dla ciebie identyfikator i umieści go w pliku.

Domyślnie ssh użyje pliku ~ / .ssh / id_XXX jako klucza prywatnego. XXX może być rsa, dsa lub dowolnym protokołem, dla którego wygenerowano klucz. IIRC, dsa jest stary i nie należy go używać. Jeśli chcesz użyć innego klucza prywatnego, możesz podać go w poleceniu ssh za pomocą -i. Tak długo, jak używany klucz prywatny pasuje do klucza publicznego na zdalnej maszynie (w pliku uprawnione_ klucze dla konta użytkownika, na które się logujesz), nie musisz podawać hasła.

BamaPookie
źródło
Dzięki @BamaPookie - kilka następnych: (1) kiedy ssh-keygenjest uruchomiony, wspominasz, że dwa klucze „znajdują się tylko lokalnie”? Gdzie?!? Jak w jakim folderze mogę nawigować i zobaczyć id_rsa.pubi id_rsa? (2) Myślałem, że ssh-addto polecenie dodania klucza publicznego authorized_keys, nie? Jaka jest różnica między ssh-copy-idi ssh-add? Dzięki jeszcze raz!
user3178622,
2
@ user3178622 re '1' Nie mam go przede mną, ale wygląda na to, że ~/.ssh/id_rsa re '2', ssh-add nie służy do dodawania do kluczy autoryzowanych, lecz do dodawania do pęku kluczy. Nie korzystałem z ssh -dodał jednak. ssh-add polega na tym, że nie musisz wprowadzać frazy za każdym razem, gdy używasz klucza wymagającego frazy. Więc jeśli twoje klucze ssh nie wymagają hasła, to chyba nie ma powodu, aby używać ssh-add i myślę, że nadal będziesz musiał użyć ssh-copy-id lub wykonać ręczne kopiowanie klucza publicznego do authorized_keys
barlop
2
ssh-keygen zapyta, gdzie zapisać plik, ale domyślna lokalizacja to ~ / .ssh / ssh-copy-id kopiuje klucz publiczny do zdalnego hosta. ssh-add dodaje klucz prywatny do twojego lokalnego klucza. Dodanie klucza prywatnego do lokalnego klucza oznacza, że ​​będzie on domyślnie sprawdzany podczas próby połączenia ssh (to znaczy bez konieczności podawania go za pomocą -i).
BamaPookie,
1
@BamaPookie Gdzie piszesz „Dodanie klucza prywatnego do lokalnego klucza oznacza, że ​​będzie on domyślnie sprawdzany podczas próby połączenia ssh (to znaczy bez konieczności podawania go za pomocą -i).” <--- Warto to wyjaśnić Myślę, że masz na myśli, że zmienia domyślny wybrany klucz prywatny, tak że zamiast id_rsa, pochodzi on z kluczy. (Oczywiście bez ssh-add nadal nie musisz określać klucza prywatnego za pomocą -i, nadal będzie miał wartość domyślną, po prostu inną wartość domyślną).
barlop,
3

Istnieją dwie maszyny Linux, A i B. Skrypty działające na A muszą mieć możliwość SSH do B. Tak więc A generuje klucz publiczny (prawdopodobnie wygenerowany przez ssh-keygen id_rsa.pub), a następnie używa odpowiedniego klucza prywatnego ( ponownie, prawdopodobnie id_rsa), aby nawiązać połączenie SSH.

Jeśli cokolwiek, co powiedziałem powyżej, jest nieprawidłowe lub wprowadzane w błąd, zacznij od poprawienia mnie!

Zakładając, że mniej więcej celuję:

Tak

ale B potrzebuje klucza publicznego A, aby był wymieniony w pliku autoryzowanych kluczy B, aby A mógł połączyć się z B

możesz także usunąć id_rsa.pub i ssh do B i nadal będzie działać, ponieważ klucz publiczny jest generowany na nowo przy każdym połączeniu ssh i nie jest przechowywany w żadnym id_rsa.pub

W jaki sposób A „daje” B swój klucz publiczny (id_rsa.pub)? Czy to musi być proces ręczny, czy może być zautomatyzowany? Jeśli ręczny, jaki jest proces? Jeśli jest zautomatyzowane, jakie jest polecenie?

instrukcja - coś w stylu

od-

cat ~/.ssh/id_rsa.pub | ssh USER@HOST "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

lub nawet bardziej ręcznie, aby złamać polecenie

$ cat id_rsa.pub | ssh user@host 'cat>~/a.a'

następnie na B, upewnij się, że ~ / .ssh istnieje, a następnie wykonaj cat a.a >> ~/.ssh/authorized_keys

i możesz cat autoryzowane klucze B przed i po, aby upewnić się, że klucz jest na liście.

Lub możesz wysłać wiadomość e-mail z id_rsa.pub na konto e-mail, a następnie z B, B może sprawdzić wiadomość e-mail i dołączyć zawartość pliku id_rsa.pub do swojego pliku autoryzowanych_kluczy

automatycznie

Komenda ssh-copy-id

Musisz mieć możliwość ssh, więc potrzebujesz dostępu do hasła

Zamiast robić ssh użytkownik @ host, robisz ssh-copy-id użytkownik @ host i pojawia się monit o hasło, wpisujesz je, jesteś w, skopiuje klucz publiczny. I następnym razem, gdy zrobisz ssh użytkownik @ host, użyje klucza.

Kiedy B „dostaje” ten klucz publiczny, dokąd idzie lub jest przechowywany?

B's ~ / .ssh / Author_keys

Podczas inicjowania połączenia SSH z B, w jaki sposób A „używa” swojego klucza prywatnego (id_rsa) jako części tego połączenia?

no cóż, niewiele wiem na ten temat, od czubka głowy, ale wszystko, co jest zaszyfrowane jednym kluczem, można odszyfrować drugim kluczem, a identyfikacja siebie różni się nieco od wysyłania danych ... i może być coś także o klucz tymczasowy.

barlop
źródło
Dzięki @barlop! Proszę zobaczyć moje pytania pod odpowiedzią BamaPookie; Mam do ciebie te same pytania!
user3178622,