Jak korzystać z pęku kluczy Mac OS X z kluczami SSH?

140

Rozumiem, że od czasu Mac OS X Leopard Keychain obsługuje przechowywanie kluczy SSH. Czy ktoś mógłby wyjaśnić, jak ta funkcja powinna działać.

Mam wygenerowane klucze RSA przechowywane w moim katalogu ~ / .ssh do uzyskiwania dostępu do różnych serwerów. Nie mam ustawionych haseł na tych kluczach. Obecnie, aby zalogować się do tych serwerów, używam następujących poleceń w terminalu:

eval `ssh-agent`
ssh-add ~ / .ssh / some_key_rsa
ssh użytkownik @ serwer

(Napisałem kilka funkcji Bash, aby to ułatwić).

Czy jest lepszy sposób na zrobienie tego za pomocą pęku kluczy?

John Topley
źródło

Odpowiedzi:

16

Aby działało, $SSH_AUTH_SOCKnależy wskazać zmienną środowiskową /tmp/launch-xxxxxx/Listeners. Powinno to odbywać się automatycznie po zalogowaniu. Odbiornik w tym gnieździe mówi protokół ssh-agent.

Twoje skrypty bash uruchamiają własnego agenta ssh (ortograficznie ssh-agent, nie ssh_agent) i zastępują istniejące ssh-agent, skonfigurowane dla Ciebie podczas logowania.

Poza tym sednem pęku kluczy jest przechowywanie haseł do kluczy ssh, ale mówisz, że nie masz ustawionych haseł na tych kluczach, więc nie jestem pewien, czego oczekujesz od integracji z pękiem kluczy.

Wreszcie, po pierwszym zalogowaniu prawdopodobnie nie zobaczysz procesu ssh-agent. Proces ten zostanie uruchomiony automatycznie przez uruchomienie usług za pierwszym razem, gdy coś spróbuje odczytać to gniazdo /tmp.

Rudedog
źródło
1
Dzięki. Więc nadal będę musiał uruchomić, ssh-addaby dodać moje tożsamości RSA do domyślnego agenta ssh uruchomionego przy logowaniu?
John Topley,
Nie musisz uruchamiać ssh-add; ssh-agent zapyta o hasło klucza przy pierwszym uruchomieniu ssh.
Rudedog
3
Pyta mnie o hasło przy każdym uruchomieniu ssh. Chodzi o to, że nie chcę wprowadzać żadnych haseł.
John Topley,
1
Co monituje o hasło? Zaczynam podejrzewać, że to zdalny serwer podpowiada ci, co stawia twoje stwierdzenie, że twoje klucze nie mają haseł w lepszej perspektywie. Jeśli chcesz pominąć hasło na zdalnym serwerze, musisz dodać swój klucz publiczny $HOME/.ssh/authorized_keysna tym serwerze. Agent ssh + keychain w systemie Mac OS służy wyłącznie do przechowywania hasła dla lokalnych kluczy ssh; nie ma na celu wysyłania zdalnych haseł przez istniejące połączenia ssh.
Rudedog
1
służy ssh -vdo diagnozowania tego, co robi ssh. użyj także sshd -p 8900 -vpo stronie serwera i ssh -v remote:8900zdiagnozuj, co robi sshd.
Rudedog,
252

Od wydania systemu Leopard OS X ssh-agent jest ściślej zintegrowany z Keychain. Możliwe jest bezpieczne przechowywanie haseł wszystkich kluczy SSH w pęku kluczy, z którego ssh-agent odczyta je podczas uruchamiania. Najważniejsze jest to, że łatwo jest zabezpieczyć klucze hasłami, ale nigdy nie trzeba wpisywać hasła, aby ich użyć! Oto jak:

Dodaj hasło do każdego klucza ssh do pęku kluczy: (opcja -k ładuje tylko zwykłe klucze prywatne, pomija certyfikaty)

ssh-add -K [path/to/private SSH key]

(uwaga, że ​​to wielka litera K)

Po każdym ponownym uruchomieniu komputera Mac wszystkie klucze SSH w pęku kluczy zostaną automatycznie załadowane. Powinieneś być w stanie zobaczyć klucze w aplikacji Dostęp do pęku kluczy, a także z wiersza poleceń za pośrednictwem:

ssh-add -l
jeffmcc
źródło
ssh-add -lnie wyświetla żadnych kluczy podczas zdalnego łączenia (gdzie nie ustawiono $ DISPLAY). Aby skorzystać z pęku kluczy, należy zastosować specjalne sztuczki (np. W superuser.com/questions/141044/… )
Ether
2
developer.apple.com/library/mac/documentation/Darwin/Reference/… Potrzebujesz także opcji -K do przechowywania haseł w pęku kluczy.
Neeme Praks,
5
Jeśli zainstalowano inną wersję SSH za pośrednictwem systemu pakietów, takiego jak Homebrew, konieczne jest użycie ścieżki bezwzględnej, takiej jak /usr/bin/ssh-add.
Ludovic Kuty
1
Co ciekawe, w moim systemie macOS Sierra nie pyta o hasło po ponownym uruchomieniu, ale ssh-add -lzwraca „Agent nie ma tożsamości”. ( ps auxobejmuje /usr/bin/ssh-agent -l).
Halil Özgür
4
W przypadku systemu macOS Sierra sytuacja się zmieniła. Zobacz github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel
79

Począwszy od systemu macOS Sierra , ssh-agent nie ładuje już automatycznie załadowanych wcześniej kluczy ssh po zalogowaniu się na swoje konto. Jest to celowe ze strony Apple, chcieli oni ponownie dostosować do głównego nurtu implementacji OpenSSH . [1]


Jak wyjaśniono tutaj , jest to zalecana metoda od macOS 10.12.2 :

  1. Dodaj następujące wiersze do ~/.ssh/configpliku:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Każdy klucz dodany do ssh-agent za pomocą ssh-add /path/to/your/private/key/id_rsapolecenia zostanie automatycznie dodany do pęku kluczy i powinien zostać automatycznie załadowany po ponownym uruchomieniu.


Poniższe informacje są nieaktualne (przechowywane w celach informacyjnych).

Aby powrócić do poprzedniego zachowania, ssh-add -Apo zalogowaniu należy uruchomić polecenie (które automatycznie ładuje wszystkie klucze ssh, które mają frazę kluczową). Aby to zrobić, wykonaj następujące kroki:

  1. Najpierw dodaj wszystkie klucze, które chcesz automatycznie załadować do ssh-agent za pomocą ssh-add -K /absolute/path/to/your/private/key/id_rsapolecenia. -KArgumentem zapewnia, że klucz pass-fraza zostanie dodany do pęku kluczy na MacOS . Upewnij się, że używasz bezwzględnej ścieżki do klucza. Użycie ścieżki względnej sprawi, że automatycznie uruchamiany skrypt nie znajdzie klucza.

  2. Upewnij się, że podczas wpisywania wszystkie klucze są wyświetlane jako dodane ssh-add -A.

  3. Utwórz plik o nazwie com.yourusername.ssh-add.plistw ~/Library/LaunchAgents/z poniższej treści. Pliki Plist, takie jak ten, są używane launchddo uruchamiania skryptów podczas logowania. [2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. Powiedzieć launchd, aby załadować plik plist właśnie utworzony przez wykonanie: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

I powinieneś być gotowy.

Ricardo Sanchez-Saez
źródło
33

Jest prostszy sposób niż odpowiedź Ricardo na utrwalenie hasła między sesjami / restartami komputera Mac z systemem 10.12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Uwaga: zmień ścieżkę do miejsca, w którym znajduje się klucz id_rsa.
  2. ssh-add -A
  3. Utwórz (lub edytuj, jeśli istnieje) następujący ~/.ssh/configplik:

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    Teraz hasło jest zapamiętywane między restartami!

Firma Apple celowo zmieniła zachowanie ssh-agent w systemie macOS 10.12 Sierra, aby nie ładować automatycznie poprzednich kluczy SSH, jak zauważono w tej dyskusji na temat OpenRadar , Twittera i uwagi technicznej od Apple . Powyższe rozwiązanie naśladuje stare zachowanie El Capitan i zapamiętuje hasło.

ChrisJF
źródło
2
Niesamowite, działa jak urok, imho dużo czystsze niż inne i rozwiązane we właściwym miejscu :)
GerardJP
10

Uwaga: w przypadku systemu macOS Sierra zapoznaj się z najnowszą odpowiedzią autorstwa ChrisJF .

[Odpowiedź Jeffa McCarrella] [2] jest poprawna, z tą różnicą, że polecenie dodania hasła zawiera myślnik zamiast myślnika, tzn. –KZamiast -Kpowoduje wyświetlenie komunikatu –K: No such file or directory. Powinien brzmieć:

ssh-add -K [path/to/private SSH key]
simonair
źródło
2
Powinien to być komentarz do odpowiedzi, do której się odnosisz, a nie świeża odpowiedź. Mówimy tutaj o bezpieczeństwie. Można zasugerować, że powinieneś ostrożnie pisać, a nie ślepo kopiować i wklejaćssh-add -K
Phil_1984_
1
Używam łącznika z K, rozumiem illegal option -- K. Mała k jest wymieniona jako opcja.
Sam Dutton,
Dzięki za opinie. Właśnie sprawdziłem na macOS Sierra: -Ktj. Dash-capital-K jest nadal ważny
simonair
6

Podejrzewam, że nie używasz domyślnego sshpolecenia. Czy sshzainstalowałeś przez porty? Spróbuj which sshsprawdzić, którego sshpolecenia używasz.

Zwykle powinien wyświetlać okno dialogowe z prośbą o podanie hasła, jeśli nie jest już zapisane w pęku kluczy.

Olly
źródło
Nie używam portów.
John Topley,
Dzięki za informację :) Miałem problemy, ponieważ korzystałem z OpenSSH z Homebrew.
ggustafsson
6

Miałem podobny problem podczas próby logowania za pomocą certyfikatu ssh klienta. W tym konkretnym przypadku chodziło o dostęp do repozytorium git. To była sytuacja:

  • Klucz został zapisany w ~/.ssh/
  • Klucz prywatny ma hasło.
  • Hasło jest przechowywane w pęku kluczy logowania OS X. ~/Library/Keychains/login.keychain
  • Połączenie było następujące: mój Mac ->zdalny ->serwer mac git / ssh
  • Mac OS X 10.8.5

Kiedy połączyłem się ze zdalnym komputerem Mac za pomocą zdalnego pulpitu, nie miałem problemu. Jednak podczas łączenia się z SSH do zdalnego komputera Mac byłem proszony o hasło ssh za każdym razem. Poniższe kroki rozwiązały to dla mnie.

  1. security unlock-keychainHasło jest przechowywane w pęku kluczy logowania. To odblokowuje i umożliwia ssh-agentowi dostęp do niego.
  2. eval `ssh-agent -s`Uruchamia ssh-agent w celu użycia powłoki. Otrzyma hasło z pęku kluczy i użyje go do odblokowania prywatnego klucza ssh.
  3. Nawiąż połączenie ssh / git i wykonaj moją pracę.
  4. eval `ssh-agent -k` Zabij działającego agenta ssh.
  5. security lock-keychain Zablokuj brelok ponownie.
orkoden
źródło
1
Aby # 2 działało dla mnie w aliasie, musiałem użyć eval \$(ssh-agent)Per Re: zdalnego logowania i pęku kluczy . Gdy nie znajduje się w aliasie eval $(ssh-agent)( bez ukośnika $ ).
Travis,
4

Zobacz też:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

... dodając tę ​​notatkę, ponieważ zażądano więcej szczegółów: polecenie „bezpieczeństwo” może importować klucze (i inne rzeczy) bezpośrednio do pęku kluczy. Zaletą jest to, że w przeciwieństwie do ssh-add, możesz określić pęku kluczy. Umożliwia to importowanie bezpośrednio do systemu pęku kluczy („bezpieczeństwo człowieka”, aby dowiedzieć się, jak to zrobić)

Xaphod
źródło
1
Czy możesz podać nieco więcej szczegółów tej odpowiedzi? Dzięki.
Matthew Williams
1

Najlepsze rozwiązanie przeznaczone dla Apple (od macOS 10.12.2) jest opisane tutaj

Więc po prostu wykonaj następujące czynności:

echo „UseKeychain yes” >> ~ / .ssh / config

Ben
źródło
1
Korzystanie >>jest zagrożone, jeśli wprowadzisz polecenie wiele razy. Lepiej wykonaj ręczną edycję pliku, jak opisano w odpowiedzi ChrisJF .
Cœur
Tak, właśnie tam
Ben