Jak używać klucza prywatnego SSH do logowania bez wprowadzania hasła za każdym razem w systemie Mac OS X Lion?

23

Używam Mac OS X Lion i loguję zdalnych hostów przez SSH każdego dnia. Pomimo faktu, że używam pary kluczy SSH do zdalnego uwierzytelniania i nie muszę zmotoryzować frazy logowania każdego hosta, nadal bardzo denerwujące jest to, że terminal prosi o podanie hasła dostępu do mojego prywatnego klucza SSH.

Myślę, że ze względów bezpieczeństwa konieczne jest hasło dostępu do prywatnego klucza SSH. Czy istnieje sposób, który sprawia, że ​​terminal pyta o frazę tylko raz podczas uruchamiania, a następnie zapamiętuje ją i automatycznie używa mojego klucza prywatnego w późniejszych sesjach SSH?

Istnieje skrypt o nazwie, keychainktóry działa dobrze w Gentoo Linux. Ale nigdy nie wymyśliłem tego na Mac OS X Lion. Co więcej, istnieje tak wiele zastraszające terminy, takie jak ssh-agent, ssh-add. Po przeczytaniu różnych materiałów na temat tych zestawów narzędzi SSH i przeprowadzeniu sfrustrowanych eksperymentów stałem się bardziej zdezorientowany.

Dlatego przyszedłem do StackExchange, szukając porady na następujące pytania.

  1. Jakie są ssh-agent, ssh-add, keychain, Keychain Access.appi jak współdziałają one ze sobą?
  2. Jak mogę wprowadzić hasło dla mojego klucza prywatnego SSH raz podczas logowania i używać go swobodnie przy późniejszym tworzeniu sesji SSH?
  3. Errr ... Co jest nie tak Keychain Access.app? Nie przechowuje wyrażenia SSH tak jak wcześniej.

Wymieniam to, co tutaj zrobiłem. Mam nadzieję, że istnieją wskazówki na temat kroków, które przegapiłem.

Krok 1. Utwórz parę kluczy SSH na moim komputerze Mac.

$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.

Krok 2. Skopiuj mój klucz publiczny SSH na zdalny host. Na przykład kopiuję klucz do localhost, Mac.

$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase

Krok 3. Następnie spróbuj połączyć się ze zdalnym hostem (tutaj host lokalny), poprzez uwierzytelnianie parą kluczy SSH.

$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa': 
# Enter my SSH passphrase, not the login password.

Krok 4. Wyloguj się ze zdalnego hosta i spróbuj połączyć się z nim ponownie. Cholera, terminal znów prosi o zwrot SSH.

Często zadawane pytanie brzmi: „Czy ssh-agent działa dobrze na komputerze Mac?”. Szczerze mówiąc, nie mam pojęcia, co się dzieje z tymi rzeczami. Tutaj pokaż niektóre wyniki biegania.

$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent  # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ??         0:00.03 ssh-agent
26899 ??         0:00.02 ssh-agent

Wszelkie opinie są mile widziane. Dzięki!

Jianwen W.
źródło
Związane . Możliwe, że możesz dostosować przyjętą odpowiedź do swojego przypadku użycia.
Daniel Beck

Odpowiedzi:

12

ssh-agentto kawałek, który chcesz zacząć, ponieważ robi dokładnie to, o co pytasz. Agent działa jako demon, a kiedy „dodasz” do niego klucz prywatny, zapamiętuje ten klucz i automatycznie przekazuje go do pilota sshdpodczas pierwszego połączenia. ( ssh-addto po prostu polecenie uruchamiane w celu ręcznego dodania klucza prywatnego ssh-agent).

W systemie OS X od Leoparda nie powinno się nigdy uruchamiać ssh-agentani ssh-addręcznie. Powinno to „po prostu się zdarzyć”, gdy próbujesz połączyć się z serwerem. Raz na klucz, wyświetli się okno dialogowe hasła interfejsu użytkownika, które (między innymi) pozwoli ci automatycznie dodać klucz do, ssh-agentwięc nigdy więcej nie pojawi się monit.

Jest to obsługiwane przez launchdkonfigurację, która nasłuchuje połączeń w $SSH_AUTH_SOCKgnieździe i automatycznie uruchamia się, ssh-agentgdy najpierw będzie to konieczne; po tym ssh-agentmonituje o podanie poświadczeń tylko wtedy, gdy trzeba otworzyć nowy klucz.

Jeśli to nie działa, upewnij się, że masz prawidłowy launchdplik konfiguracyjny:

/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

Jeśli z jakiegoś powodu to nadal nie działa, oto „stary” sposób ręcznego działania:

http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html

Jest też ta aplikacja, z której przestałem korzystać od czasu pojawienia się Leoparda, ale zasadniczo zrobiłem to samo w poprzednich wersjach Mac OS X:

http://www.sshkeychain.org/

KutuluMike
źródło
4
Dzięki, Michael Edenfield. Zorientowałem się, co się dzieje, a teraz ssh-login-without-passsphrase działa doskonale na Mac OS X Lion. Zrobiłem głupie rzeczy - zrobiłem dowiązanie symboliczne ~/tmpwskazujące /tmp/i uruchamiam zadanie crona do czyszczenia ~/tmpco 2 godziny, co również usunęło gniazdo ssh-agent. O rany, nienawidzę siebie.
Jianwen W.,
13

W trakcie procesu rozwiązywania „problemu”, mam googled kilka podobnych tematów i zanotować kilka uwag o tym, jak ssh-agent, ssh-add, keychain, KeyChain Access.apppracy. W końcu okazuje się, że ten problem wcale nie jest problemem, zamiast tego chodzi o mnie, a tak zwane ssh-login-without-ask-passsphrase-za każdym razem działa doskonale na komputerze Mac po wyjęciu z pudełka.

Jednak ten proces daje mi pewne doświadczenia. Zapisuję tutaj swoje notatki w nadziei, że pomogą komuś pomylić te warunki.

Dwa hasła:

  • passphrase odnosi się do wymaganej frazy podczas uzyskiwania dostępu do klucza prywatnego SSH.
  • password odnosi się do wymaganej frazy, aby zalogować się na komputerze Mac.

Teraz mogę dowiedzieć się, co zrobić te zestawy narzędzi, to znaczy ssh-agent, ssh-add, keychain, Keychain Access.appna Mac.

  • ssh-agentjest kluczową usługą umożliwiającą używanie klucza prywatnego SSH bez wpisywania hasła SSH. ssh-agentdziała w ten sposób. Najpierw przechowuje lub buforuje klucz prywatny SSH w pamięci głównej. Następnie, w późniejszym czasie tej sesji, gdy prywatny klucz SSH SSH jest potrzebny do zdalnego uwierzytelnienia, ssh-agentznajdzie Twój klucz prywatny w pamięci głównej i przekaże go zdalnemu procesowi. Jedyną szansą na wpisanie hasła SSH jest to, że ssh-agentpoczątkowo dodawany jest klucz prywatny .
  • ssh-addjest częścią ssh-agentkolekcji, która pomaga zarządzać kluczami SSH w ssh-agent. Używamy ssh-addpolecenia, aby wyświetlić, dodać, usunąć klucze prywatne w breloku ssh-agent. Następnie ssh-addkomunikuje się z ssh-agentserwisem w celu wykonania zadań.
  • keychainjest skryptem do znalezienia ssh-agentusługi (jeśli nie istnieje, uruchom nowy) i wywołania, ssh-addaby dodać klucze prywatne SSH. keychainma prosty i bezpośredni pomysł, działający dobrze w systemie Linux, gdzie ssh-agent zwykle nie uruchamia się automatycznie.
  • Keychain Access.appwydaje się być najbardziej skomplikowanym elementem. Jest to uniwersalna usługa przechowywania tokenów w systemie Mac OS X. Przechowuje różne tokeny, takie jak hasła, certyfikaty i in., I służy jako agent tokenów dla aplikacji, które żądają tokenów. W naszym przypadku klucza prywatnego SSH najpierw uwzględnia żądanie dostępu do klucza prywatnego SSH i wyświetla okno z prośbą o zapisanie hasła klucza SSH, które jest rodzajem tokena, w Keychain Access.appbreloku. Następnym razem, gdy chcesz użyć kluczy prywatnych do uwierzytelnienia, ponownie Keychain Access.apppojawi się okno z pytaniem, czy przyznać uprawnienia. Po otrzymaniu dużego „tak” keychain Access.appdodaje swój prywatny klucz do ssh-agentpamięci.

Dwie rzeczy zasługują na uwagę:

  1. Mac OS X Lion automatycznie uruchamia ssh-agentusługę podczas uruchamiania, nasłuchując na gnieździe poniżej /tmp.
  2. Keychain Access.appprzechowuje twoje hasło SSH, dzięki czemu może dodać Twój klucz prywatny ssh-agentbez przerywania ci. Tak, nie musisz wpisywać frazy SSH, ale musisz wpisać hasło logowania do konta Mac, aby nadać uprawnienia podczas tworzenia tego wpisu po raz pierwszy.

Podsumowując, SSH-login-bez-pytania-hasło powinno działać na Mac OS X od razu po wyjęciu z pudełka.

Jianwen W.
źródło
1

W przypadku, gdy inne rozwiązania tutaj nie działają dla ludzi, następujące działały dla mnie.

Dla każdego klucza prywatnego w katalogu ~ / .ssh upewnij się, że odpowiedni klucz publiczny jest również obecny. Upewnij się, że klucz publiczny jest nazwany dokładnie tak samo jak klucz prywatny, ale z .pubna końcu. Jeśli masz już odpowiedni klucz publiczny, spróbuj go ponownie wygenerować.

Jeśli chcesz ponownie utworzyć klucze publiczne, możesz to zrobić z łatwością: -

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

zastępując my_keyczymkolwiek, jak nazywa się twój klucz.

Następnie MacOS zapamiętuje hasło klucza w pęku kluczy, tak jak powinno.

Uwaga - wpisanie hasła i zapisanie go pęku kluczy jest teraz jednorazową czynnością (nie raz na sesję logowania zgodnie z życzeniem OP), ale przy założeniu, że logowanie do Maca jest chronione hasłem, wówczas twoje hasło jest chronione tym hasłem logowania. Ponadto to rozwiązanie nie ma dla mnie sensu ... klucz publiczny nie powinien być wymagany oprócz klucza prywatnego, ale z jakiegoś powodu MacOSX tego wymaga.

(pierwotnie od odpowiedzi na podobne pytanie na Apple Stack Exchange)

Rowatt
źródło
1

Jedyną rzeczą, o której rzadko wspominam podczas konfigurowania ~/.sshfolderu, jest ograniczenie uprawnień do katalogu.

Aby włączyć ssh, aby uniknąć pytania o hasło, zawsze musiałem ustawić uprawnienia do katalogu domowego użytkownika 700, a także ~/.sshuprawnienia do folderu 700.

W przeciwnym razie nadal prosi mnie o hasło, nawet jeśli wszystkie klucze zostały wygenerowane i poprawnie skopiowane. W dziennikach uwierzytelniania generowany jest komunikat o błędzie, ale w większości przypadków jest to niewidoczne dla użytkownika końcowego.

Don Wood
źródło
0

Inną rzeczą, którą mogłeś wypróbować, byłoby zastąpienie ssh-copy-idczegoś takiego k="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2".

Lri
źródło
0

Ta odpowiedź nieco nie stanowi rozwiązania tego pytania; jednak jest bardzo blisko (skończyłem na tym pytaniu, szukając rozwiązania mojego problemu).

Robię też dużo SSH do zdalnych serwerów na moim komputerze Mac, jak opisano w tym pytaniu, jednak Keychain Access.appaplikacja zapisała hasło i nie muszę go wpisywać za każdym razem, gdy potrzebuję klucza do uwierzytelnienia na serwerze SSH.

Jednak włączyłem serwer SSH na moim komputerze Mac, aby móc się z nim połączyć zdalnie. Gdy zdalnie zalogowałem się na moim Macu, hasło zawsze było pytane, kiedy chciałem SSH na innym hoście.

Znalazłem rozwiązanie, które pozwala zapisać hasło dla bieżącej sesji. Myślałem, że to może być przydatne dla kogoś, stąd ten post / odpowiedź.

Benoit Duffez
źródło
Moje podobne rozwiązanie
zapisałem
0

Zastanawiam się nad tym problemem. ssh działa na każdej maszynie w naszym dziale Z WYJĄTKIEM dla jabłek (MacBooki i iMacs nie ma znaczenia). W końcu zmęczyło mnie pisanie haseł i postanowiłem to debugować.

Poszedłem do mojego iMaca i wyłączyłem sshd w panelu preferencji udostępniania. Następnie suu do rootowania i wpisałem „/ usr / sbin / sshd -d”, aby uruchomić sshd w trybie debugowania. Następnie spróbowałem ssh na tym komputerze i natychmiast spróbowałem użyć protokołu 2, który wydaje się, że wszystko działa dobrze, ale sshd natychmiast poinformował, że nie może znaleźć „uprawnionych_kluczy”. Miałem plik autoryzowanego_kluczy2, który wszystkie moje Linux-y, solaris, ty-name-it unix akceptują dobrze. Po prostu skopiowałem klucze autoryzowane2 do kluczy autoryzowanych i BOOM. Działa idealnie teraz.

Dlaczego * klucze zamiast * klucze2 są nieznane. Szczególnie, gdy os x jest całkiem zadowolony ze znanego hosta2.

W każdym razie teraz wszystkie nasze skrzynki z jabłkami mogą być zalogowane lub wykonane na nich zdalne polecenia bez tego przeklętego hasła: monit ...

Bob Hyatt
źródło