Chcę komunikować się między kilkoma komputerami w mojej sieci (statyczny Ethernet) za pośrednictwem SSH. Aby to zrobić, muszę uruchamiać ssh-add za każdym razem, gdy loguję się na konkretnej maszynie, jak mogę to zrobić, aby została skonfigurowana raz i nie pytała mnie o hasło przy każdym logowaniu lub ponownym uruchomieniu moja maszyna?
Wiem, że istnieje sposób, aby dodać kilka wierszy do bash_profile
pliku, ale nadal muszę wpisywać hasło przy każdym ponownym uruchomieniu / zalogowaniu się na konkretnej maszynie.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Odpowiedzi:
Jest to typowy przykład kompromisu między bezpieczeństwem a wygodą. Na szczęście istnieje wiele opcji. Najbardziej odpowiednie rozwiązanie zależy od scenariusza użytkowania i pożądanego poziomu bezpieczeństwa.
klucz ssh z hasłem, nie
ssh-agent
Teraz hasło należy wprowadzić za każdym razem, gdy klucz jest używany do uwierzytelnienia. Chociaż jest to najlepsza opcja z punktu widzenia bezpieczeństwa, oferuje najgorszą użyteczność. Może to również prowadzić do wybierania słabego hasła w celu zmniejszenia obciążenia wielokrotnym wprowadzaniem go.
ssh-key z hasłem, z
ssh-agent
Dodanie następującego polecenia
~/.bash_profile
spowoduje automatyczne uruchomieniessh-agent
i załadowanie kluczy ssh podczas logowania:Teraz hasło należy wprowadzić przy każdym logowaniu. Chociaż jest to nieco lepsze z punktu widzenia użyteczności, ma tę wadę, że
ssh-agent
monituje o hasło, niezależnie od tego, czy klucz ma zostać użyty, czy nie podczas sesji logowania. Każde nowe logowanie powoduje także pojawienie się odrębnejssh-agent
instancji, która pozostaje uruchomiona z dodanymi kluczami w pamięci nawet po wylogowaniu, chyba że zostanie wyraźnie zabita.Aby zabić
ssh_agent
przy wylogowaniu, dodaj następujące elementy do~/.bash_logout
lub następujące do
~/.bash_profile
Utworzenia wielu
ssh-agent
instancji można uniknąć, tworząc trwałe gniazdo komunikacyjne z agentem w stałej lokalizacji w systemie plików, na przykład w odpowiedzi Collina Andersona . Jest to poprawa w stosunku do odradzania wielu instancji agentów, chyba że jawnie zabity odszyfrowany klucz nadal pozostaje w pamięci po wylogowaniu.Na komputerach agenci ssh wchodzący w skład środowiska pulpitu, tacy jak agent SSH Gnome Keyring , mogą być lepszym podejściem, ponieważ zazwyczaj można je poprosić o podanie hasła przy pierwszym użyciu klucza ssh podczas sesji logowania i przechowuj odszyfrowany klucz prywatny w pamięci do końca sesji.
ssh-key z hasłem, z
ssh-ident
ssh-ident
to narzędzie, które może zarządzaćssh-agent
w Twoim imieniu i ładować tożsamości w razie potrzeby. Dodaje klucze tylko raz, gdy są potrzebne, niezależnie od liczby terminali, sesji ssh lub logowania, które wymagają dostępu dossh-agent
. Może także dodawać i używać innego agenta i innego zestawu kluczy w zależności od podłączonego hosta lub katalogu, z którego ssh jest wywoływany. Umożliwia to izolowanie kluczy podczas korzystania z przekazywania agenta na różnych hostach. Pozwala także na korzystanie z wielu kont w witrynach takich jak GitHub.Aby włączyć
ssh-ident
, zainstaluj i dodaj następujący alias do~/bash_profile
:ssh-key z hasłem, z
keychain
keychain
to małe narzędzie, które zarządzassh-agent
w Twoim imieniu i pozwalassh-agent
pozostać uruchomionym po zakończeniu sesji logowania. Przy kolejnych logowaniachkeychain
połączy się z istniejącąssh-agent
instancją. W praktyce oznacza to, że hasło należy wprowadzić tylko podczas pierwszego logowania po ponownym uruchomieniu. Przy kolejnych logowaniachssh-agent
używany jest niezaszyfrowany klucz z istniejącej instancji. Może to być również przydatne do zezwalania na uwierzytelnianie RSA / DSAcron
bez hasła w zadaniach bez kluczy SSH bez hasła.Aby włączyć
keychain
, zainstaluj i dodaj coś takiego~/.bash_profile
:Z punktu widzenia bezpieczeństwa
ssh-ident
ikeychain
są gorsze niżssh-agent
przypadki ograniczone do czasu trwania konkretnej sesji, ale oferują wysoki poziom wygody. Aby poprawić bezpieczeństwokeychain
, niektóre osoby dodają--clear
opcję do swojego~/.bash_profile
wywołania pęku kluczy. W ten sposób hasła muszą zostać ponownie wprowadzone przy logowaniu, jak wyżej, alecron
zadania nadal będą miały dostęp do niezaszyfrowanych kluczy po wylogowaniu użytkownika. Stronakeychain
wiki zawiera więcej informacji i przykładów.klucz ssh bez hasła
Z punktu widzenia bezpieczeństwa jest to najgorsza opcja, ponieważ klucz prywatny jest całkowicie niechroniony na wypadek jego ujawnienia. Jest to jednak jedyny sposób, aby upewnić się, że hasło nie musi być ponownie wprowadzone po ponownym uruchomieniu.
ssh-key z hasłem, z
ssh-agent
, przekazywanie hasła dossh-add
skryptuChociaż przekazywanie hasła do
ssh-add
skryptu może wydawać się prostym pomysłem , na przykładecho "passphrase\n" | ssh-add
nie jest to tak proste, jak się wydaje, ponieważssh-add
nie odczytuje hasłastdin
, ale otwiera się/dev/tty
bezpośrednio do odczytu .Można to obejść za
expect
pomocą narzędzia do automatyzacji interaktywnych aplikacji. Poniżej znajduje się przykład skryptu, który dodaje klucz ssh przy użyciu hasła zapisanego w skrypcie:Zwróć uwagę, że ponieważ hasło jest przechowywane w skrypcie w postaci zwykłego tekstu, z punktu widzenia bezpieczeństwa nie jest to wcale lepsze niż posiadanie klucza SSH bez hasła. Jeśli ma być zastosowane to podejście, ważne jest, aby upewnić się, że
expect
skrypt zawierający hasło ma ustawione odpowiednie uprawnienia, dzięki czemu jest czytelny, zapisywalny i uruchamiany tylko przez właściciela klucza.źródło
ssh-agent
fragment kodu,~/.bash_profile
jak wyjaśniono w odpowiedzi. Możesz zajrzeć dokeychain
narzędzia. Zekeychain
trzeba wprowadzić hasło pierwszego logowania po ponownym uruchomieniu komputera, ale na kolejnych logowańkeychain
będzie podłączyć do istniejącejssh-agent
instancji z odszyfrowane kluczem w pamięci. Oprócz tego istnieje możliwość wygenerowania klucza ssh bez hasła, ale nie jest to oczywiście zalecane.ssh-add
ze skryptu. Przyczynaecho "pass\n" | ssh-add
nie działa,ssh-add
ponieważ nie odczytuje hasłastdin
, ale otwiera się/dev/tty
bezpośrednio do odczytu. Zaktualizowano odpowiedź, aby uwzględnić obejście tego problemu, używając narzędzia o nazwieexpect
.gssapi-with-mic
. Jest to zwykle używane w większych sieciach, ale oczywiście, jeśli interesujesz się tym, warto rozważyć.Dodaj to do swojego
~/.bashrc
, a następnie wyloguj się i zaloguj ponownie, aby zastosować.Powinno to monitować o podanie hasła tylko przy pierwszym logowaniu po każdym ponownym uruchomieniu. Będzie używać tego samego
ssh-agent
tak długo, jak długo będzie działać.źródło
ssh-add -l
zwraca kod wyjścia 0, gdy agent ma tożsamość, i 1, gdy nie ma, dzięki czemu możesz wyciąć grep z ostatniego polecenia i użyćssh-add -l > '/dev/null' || ssh-add
Nie jest ściśle związany z pytaniem PO, ale może być przydatny dla innych: ponieważ 7.2.0 ssh (1) ma opcję, która pozwala dodać klucz do ssh-agent przy pierwszym uwierzytelnieniu; opcja jest
AddKeysToAgent
i może być ustawionyyes
,no
,ask
, lubconfirm
, systemowy lub na personal.ssh/config
pliku.Odniesienie: https://www.openssh.com/txt/release-7.2
źródło
.ssh/config
pliku: dotyczy to na przykładssh
wszystkiego, co korzysta zssh
niegoscp
, i można to zrobić dla każdego hosta.ssh-agent
buforuje różne odblokowane klucze ssh, dzięki czemu możesz mieć klucze ssh chronione hasłem, ale bez konieczności wpisywania ich za każdym razem.Aby buforować odblokowane klucze, oczywiście trzeba je odblokować. Aby odblokować klucze, które są zablokowane hasłem, oczywiście musi znać te hasła.
Każda metoda, która nie wymaga autoryzacji od człowieka (np. „Wpisanie hasła”) nie tylko spowoduje, że twój system nie będzie bezpieczny; sprawi to, że cały cel ssh-agent będzie bez znaczenia.
Powiedziawszy to wszystko, możesz po prostu użyć kluczy ssh, które nie są chronione hasłem (naciśnij, Entergdy zostaniesz poproszony o hasło podczas generowania klucza). Ponieważ nie ma żadnego hasła,
ssh-agent
nie trzeba go prosić o (nie) buforowanie.źródło
Oto obejście umożliwiające zautomatyzowanie hasła SSH.
Utwórz skrypt jednowierszowy, który wypisze hasło na standardowe wyjście, np .:
Ważne: upewnij się, że skopiujesz wiodące miejsce, aby zapobiec przechowywaniu hasła w historii .
I użyj jednej z poniższych metod.
przy użyciu standardowego podejścia do wprowadzania danych:
lub nazwane podejście rurowe :
Utwórz nazwany potok (możesz także spróbować podstawienia procesu ):
Uruchom
ssh-add
, określając program użyty do uwierzytelnienia:Zobacz:
man ssh-add
więcej informacji na tematSSH_ASKPASS
.źródło
echo my_passphrase
duża dziura w bezpieczeństwie. Najpierw po wpisaniu hasła hasło jest jawnym tekstem w pliku historii używanej powłoki. A argumenty drugiego wiersza poleceń są czytelne na świecie w Unix (ps -ef
). Nigdy nie umieszczaj haseł w argumentach wiersza poleceń!ps
wyjściu. Plik historii jest i tak zwykle możliwy do odczytania tylko przez właściciela, ale wiersze poleceń są czytelne dla wszystkich użytkowników w systemie.Nie polecam ci ssh-add (który musi otworzyć ssh-agent) przy logowaniu. Wynika to z faktu, że nie można kontrolować, kiedy kończy się sekcja ssh-agent, i może stwarzać zagrożenie bezpieczeństwa, gdy nie trzeba używać plików kluczy w jednej sekcji logowania.
Radzę raczej napisać skrypt, który otworzy podpowłokę sekcji ssh-agenta, z automatycznie dodanymi wszystkimi plikami kluczy, i będzie wywoływany, gdy zajdzie potrzeba użycia ssh. Jeśli możesz to przyjąć, czytaj dalej.
Masz dwie możliwości:
Usuń wszystkie hasła do swoich kluczy, które mają słabe bezpieczeństwo w przypadku kradzieży plików kluczy. (dlatego nie jest zalecane )
Użyj tego samego hasła dla swoich kluczy. Wówczas
ssh-add keyfile1 keyfile2 ...
wystarczy wpisać hasło tylko raz, dla każdej sekcji.W obu przypadkach możesz napisać taki plik skryptu „ssh_keys_section.sh” jak poniżej:
Uwagi:
ssh-keygen -p -f keyfile
/path/to/yourterminal &
(zależy od systemu operacyjnego)źródło
/path/to/yourterminal &
==>mintty &
źródło
Kiedyś używałem skryptu wspomnianego przez steampower, teraz zrobiłem poniżej, ponieważ nie pozostawia plików leżących wokół.
Działa
zsh
tylko z powłoką.źródło
Uznanie tutaj: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
To rozwiązanie jest również zalecane tutaj: http://mah.everybody.org/docs/ssh
źródło
Rozwiązanie jednokrotnego logowania dla SSH może mnie do tego doprowadzić
pam_ssh
.Zgodnie z tym artykułem koncepcja jest następująca:
Nie sprawdziłem, czy to faktycznie zadziała.
źródło
Dodaj to do swojego
~/.bashrc
pliku:źródło
Aby dodać (możliwie bez hasła) klucz i upewnić się, że
ssh-add
nie będzie monitował o hasło, bez względu na wszystko, nawet jeśli działa pod X :Status wyjścia wskazuje na sukces lub porażkę.
źródło
Jeśli prowadzisz konika morskiego jako menedżera haseł ... Który prawdopodobnie jesteś; D
Innym rozwiązaniem, które osiąga cel, którego szukasz, jest po prostu dodanie kluczy ssh do konika morskiego w celu automatycznego odblokowania po zalogowaniu. Główną zaletą tego jest to, że nigdy nie musisz wprowadzać hasła do kluczy po zalogowaniu przez gdm, ani przy logowaniu się, nawet jeśli klucze mają hasło. Wymaga to zarówno klucza prywatnego, jak i klucza publicznego. MUSZĄ także przestrzegać konwencji nazewnictwa dla konika morskiego. Domyślne jest akceptowalne (id_rsa dla klucza prywatnego i id_rsa.pub dla klucza publicznego ... Naprawdę wszystko, co jest nazwa_prywatna i nazwa_prywatna.pub )
Aby dodać ci klucz ssh do konika morskiego w celu automatycznego odblokowania po zalogowaniu; (na fedora25 nie jestem pewien, gdzie ścieżka znajduje się na innych dystrybucjach, chociaż najprawdopodobniej jest bardzo podobna)
Dla mnie tak było
(konik morski automatycznie przyjmie, że klucz publiczny w moim przypadku to id_rsa.pub)
Po wykonaniu polecenia konik morski otworzy słodkie małe pole hasła gtk, aby wprowadzić hasło do klucza prywatnego. lub po prostu pozostaw puste, jeśli klucz został wygenerowany bez hasła.
Konik morski nie wyświetli monitu, jeśli wszystko pójdzie dobrze. Musisz spróbować ssh na maszynie docelowej. Następnie konik morski wyświetli monit o odblokowanie klucza za pomocą hasła graficznego (TO JEST TYLKO ZDARZYŁO SIĘ RAZ), ale tym razem powinien on wyglądać nieco inaczej; P (jest to również część, w której konik morski robi konika morskiego, aby dodać magię ssh ) i zaoferuj OPCJĘ, aby odblokować klucz po zalogowaniu, musisz zaznaczyć tę opcję, aby osiągnąć cel.
Tylko dlatego, że nie przeczytałem wszystkich odpowiedzi, zalecam cofnięcie tego, co wszyscy powiedzieli ci, aby zrobić z ssh-add przed spróbowaniem tej odpowiedzi. W przeciwnym razie może to spowodować, że coś złego stanie się z kluczami, idk.
źródło
Oto ostateczny skrypt.
Zaktualizuj $ PASSW, a następnie skopiuj i wklej go w swoim terminalu
źródło
Najlepszym sposobem, jaki jestem świadomy, jest użycie skryptu logowania PAM, który dostosowałem z poprzedniej pracy, ponieważ nie mogłem znaleźć satysfakcjonującej odpowiedzi na to pytanie.
Twoje hasło jest przechowywane w postaci zaszyfrowanej hasłem systemowym i dużą funkcją pochodną. Podczas logowania hasło systemowe służy do odszyfrowania hasła i dodania go do agenta.
https://github.com/capocasa/systemd-user-pam-ssh
Przewagą nad każdym innym przedstawionym rozwiązaniem jest to, że łączy w sobie bezpieczeństwo równoważne z ręcznym uruchamianiem ssh-add podczas rozruchu przy zerowym wysiłku. Nie wymaga żadnych dodatkowych narzędzi i ma jedną dodatkową zależność, która jest już domyślnie zainstalowana w większości systemów (OpenSSL).
źródło
Moja konfiguracja w systemie macOS jest następująca (w
.zshrc
lub.bash_profile
dla osób korzystających z bash):|| [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]
Jest to konieczne ze względu na MacOS domyślną wartością jest/private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners
. W przeciwnym razie kompleksowa odpowiedź @Thomas Nyman nie powiedzie się, ponieważ$SSH_AUTH_SOCK
zawsze jest ustawiona na coś.Następnie w
.zlogout
(lub.bash_logout
dla ludzi bash):Testowane na macOS Mojave 10.14.5
źródło