Jak zautomatyzować logowanie SSH za pomocą hasła?

419

Jak zautomatyzować logowanie SSH za pomocą hasła? Konfiguruję moją testową maszynę wirtualną, więc nie jest rozważane wysokie bezpieczeństwo. SSH wybrany dla akceptowalnego bezpieczeństwa przy minimalnej konfiguracji.

dawny)

echo password | ssh id@server

To nie działa

Pamiętam, że zrobiłem to z kilkoma sztuczkami, którymi ktoś mnie prowadził, ale nie pamiętam teraz sztuczki, której użyłem ...

Eonil
źródło
2
FreeBSD nie akceptował kluczy bez hasła. Nie ulegaj pokusie. Jednak niektóre serwery Linux go zaakceptowały. Uważam, że serwer Linux został źle skonfigurowany.
Eonil
16
To ważne pytanie. Na przykład chcę zezwolić użytkownikowi na wprowadzenie hasła, a następnie zalogować się na innym komputerze, używając go. Nie mogę założyć, że klucze ssh będą dystrybuowane na wszystkich naszych komputerach. Dotychczasowe odpowiedzi nie pomagają w tej sytuacji.
dfrankow
Bardzo ważne pytanie. Potrzebuję też odpowiedzi, mój dostawca przestrzeni internetowej blokuje umieszczanie plików kluczy na serwerze, więc muszę przekazać hasło bez plików kluczy.
Radon8472,

Odpowiedzi:

382

Nie używaj hasła. Wygeneruj klucz SSH bez hasła i prześlij go na maszynę wirtualną.

Jeśli masz już klucz SSH, możesz pominąć ten krok… Po prostu naciśnij Enterklawisz i oba hasła:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

Skopiuj klucze na serwer docelowy:

$ ssh-copy-id id@server
id@server's password: 

Teraz spróbuj zalogować się do komputera za pomocą ssh 'id@server'i zalogować się :

.ssh/authorized_keys

aby upewnić się, że nie dodaliśmy dodatkowych kluczy, których się nie spodziewałeś.

Na koniec sprawdź logowanie…

$ ssh id@server

id@server:~$ 

Możesz także rozważyć użycie, ssh-agentjeśli chcesz spróbować zabezpieczyć klucze hasłem.

Cakemox
źródło
14
W końcu zdecydowałem się na użycie par kluczy. Ponieważ zdałem sobie sprawę, że to najprostszy sposób.
Eonil
9
@Eonil: Nie ulegaj pokusie używania kluczy bez hasła. Dowiedz się, jak korzystać z ssh-agent lub pageant.
user619714
119
To dobra odpowiedź, ale nie poprawna odpowiedź na pytanie.
John Hunt
74
Tego rodzaju odpowiedzi naprawdę mnie denerwują. To nie było pytanie. Nikt nie pytał, jak używać par kluczy.
Matt Fletcher
16
To nie odpowiada na pytanie. To dobra odpowiedź na zupełnie inne pytanie, ale jest okropna dla zadanego.
srchulo
594
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
weekendy
źródło
51
Tak, czasami nie możesz używać uwierzytelniania opartego na kluczach z różnych powodów .. na przykład teraz nie mogę używać keyauth na serwerze plesk, ponieważ po wyjęciu z pudełka nie jest włączony i nie mam roota.
John Hunt
17
+1! Na marginesie, sshprzed użyciem sshpassnależy raz uruchomić zwykły , aby potwierdzić odcisk palca RSA
użytkownik123444555621,
21
-1 za konieczność użycia hasła w poleceniu. Loguje to hasło .bash_historyw postaci zwykłego tekstu na twoim komputerze.
15
@MisterDood Możesz uruchomić history -rpo poleceniu, aby usunąć swoją historię. Dobra racja jednak.
NuclearPeon
20
Pro wskazówka: jeśli nie chcesz, aby określone polecenie wyświetlało się w .bash_history, poprzedź je spacją. To po prostu działa. Jednak użytkownicy tego polecenia powinni być bardziej zaniepokojeni tym, że nieuprzywilejowani użytkownicy w systemie mogą zobaczyć pełny wiersz poleceń z ps, który oczywiście zawiera hasło. Ponieważ sesje ssh są długotrwałe, jest to kwestia bezpieczeństwa.
CubicleSoft,
71

Chociaż poprawną odpowiedzią na twoje pytanie jest sshkey , istnieje bezpieczniejszy sposób - klucze SSH. Tylko trzy kroki dzieli Cię od rozwiązania:

Wygeneruj parę kluczy rsa :

# ssh-keygen

następnie skopiuj go na serwer za pomocą jednego prostego polecenia :

# ssh-copy-id userid@hostname

możesz teraz zalogować się bez hasła :

# ssh userid@hostname
lzap
źródło
1
Działa dobrze z wartościami domyślnymi. Użycie ~ / rsa4live.pub nie działało dla mnie podczas próby ssh-copy-id.
Cees Timmerman
1
Jeśli chcesz, aby te kroki działały dla różnych użytkowników, 1. ssh-keygen 2. ssh-copy-id nazir @ nazwa_hosta 3. ssh nazir @ nazwa_hosta
Venfah Nazir
2
Dla mnie to byłssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair
21
To nie jest odpowiedź na pytanie.
Steve Bennett
2
I? Odpowiedź jest powyżej, sshpass ...
Łap
40

Użyj spodziewać:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

Przykład:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost
ooshro
źródło
2
Działało, ale nie może wydrukować standardowego komputera zdalnego.
Eonil
działa dobrze, ponieważ niektóre komputery nie mogą z góry podać klucza, ponieważ adres IP jest zmieniany za każdym razem.
larrycai
4
dobrze będzie dodać również -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullkomendę ssh, aby uniknąć przyjęcia maszyny do znanych
hostów
B .. b ale muh ssh klucze ...
Damien Ó Ceallaigh
Bardziej szczegółowy przykład tego skryptu można znaleźć na stronie: linuxaria.com/howto/… Te przykłady tutaj powinny również działać ze zdalnymi poleceniami
Radon8472,
16

Może ci się to nie przydać, ale możesz to zrobić za pomocą Perla:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";
James L.
źródło
2
Podobnie, możesz zrobić z tym Ruby github.com/net-ssh/net-ssh
EnabrenTane
15

Dziwi mnie, że nikt nie wspomniał plinkz putty-toolspakietu w Ubuntu:

plink user@domain -pw mypass  [cmd]

Jest również dostępny w systemie Windows, a jego składnia jest w większości zgodna z klientem openssh.

eadmaster
źródło
W przypadku systemu Windows twoja odpowiedź jest dobra, niekoniecznie użytkownik linux / unix zwykle nie ma łącza
Radon8472,
2
jest w putty-toolspakiecie
eadmaster
10

Jednokrotne logowanie SSH jest zwykle realizowane przy użyciu uwierzytelniania za pomocą klucza publicznego i agenta uwierzytelniania. Możesz łatwo dodać testowy klucz maszyny wirtualnej do istniejącego agenta uwierzytelniania (patrz przykład poniżej). Istnieją inne metody, takie jak gssapi / kerberos, ale są one bardziej złożone.

sshpass

W sytuacjach, w których passwordjest dostępna jedyna dostępna metoda uwierzytelniania, do automatycznego wprowadzenia hasła można użyć sshpass . Proszę zwrócić szczególną uwagę na sekcję UWAGI DOTYCZĄCE BEZPIECZEŃSTWA na stronie podręcznika . We wszystkich trzech opcjach hasło jest widoczne lub przechowywane w postaci zwykłego tekstu :

Anonimowy potok (zalecany przez sshpass)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

Jest to dość kłopotliwe w bash, prawdopodobnie łatwiejsze w językach programowania. Inny proces może dołączyć się do twojego potoku / fd przed zapisaniem hasła. Okno możliwości jest dość krótkie i ograniczone do twoich procesów lub rootowania.

Zmienna środowiskowa

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

Ty i root możecie czytać zmienne środowiskowe procesu (tj. Hasło), gdy sshpass jest uruchomiony ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). Okno możliwości jest znacznie dłuższe, ale wciąż ogranicza się do własnych procesów lub rootowania, a nie innych użytkowników.

Argument wiersza polecenia (najmniej bezpieczny)

 sshpass -p my_secret_password ssh user@host

Jest to wygodne, ale mniej bezpieczne, jak opisano na stronie podręcznika. Argumenty wiersza poleceń są widoczne dla wszystkich użytkowników (np ps -ef | grep sshpass.). sshpass próbuje ukryć argument, ale nadal jest okno, w którym wszyscy użytkownicy mogą zobaczyć twoje hasło przekazywane przez argument.

Dygresja

Ustaw zmienną HISTCONTROL bash na ignorespacelub ignorebothi poprzedzaj wrażliwe polecenia spacją. Nie zostaną zapisane w historii.


Uwierzytelnianie klucza publicznego SSH

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

Hasło jest bardzo ważne. Każdy, kto w jakiś sposób uzyska plik klucza prywatnego, nie będzie mógł go użyć bez hasła.

Skonfiguruj agenta uwierzytelniania SSH

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

Połącz jak zwykle

ssh user@host

Zaletą jest to, że twój klucz prywatny jest szyfrowany i wystarczy, że wprowadzisz jego hasło tylko raz (za pomocą bezpieczniejszej metody wprowadzania).

nrolans
źródło
8

Na pewno nie chcesz używać kluczy SSH zamiast haseł? W ten sposób jest zarówno bezpieczny, jak i automatyczny.

Coops
źródło
3
Używanie kluczy SSH bez hasła jest tylko nieco bardziej bezpieczne niż używanie haseł w pliku.
Junzen
10
@yunzen Niepoprawnie. Uwierzytelnianie klucza chroni cię przed atakami mitm, nawet jeśli nie znasz klucza hosta. Osoba atakująca może podszyć się pod serwer, ale nigdy nie połączyć się z prawdziwym serwerem. Dzięki uwierzytelnianiu za pomocą hasła każdy serwer, z którym się łączysz (legalny lub nie), zobaczy hasło. Z tych powodów klucz ssh bez hasła jest znacznie bezpieczniejszy niż tylko przechowywanie hasła w pliku.
kasperd
14
To nie jest odpowiedź.
Steve Bennett
@SteveBennett Jest to taka sama jak zaakceptowana odpowiedź i została opublikowana przed nią, choć ma mniej szczegółów.
Michael Hampton
3
Powiedziałbym, że zaakceptowana odpowiedź jest przyzwoitą odpowiedzią na pytanie, które nie zostało zadane. To nie jest nic.
Steve Bennett,
4

W zależności od potrzeb automatyzacji, być może Ansible będzie dla ciebie dobrym rozwiązaniem. Może ładnie zarządzać takimi rzeczami, jak monitowanie o hasło, monitowanie o hasło sudo, różne sposoby zmiany użycia, bezpieczne używanie zaszyfrowanych tajemnic (skarbca).

Jeśli to nie jest odpowiednie, sugerowałbym oczekiwać, jak sugerowano w innej odpowiedzi.

Cameron Kerr
źródło