sshpass - gdy nie pozwalają wrzucić klucza
Powody, dla którego organizacje zabraniają używania metody klucza publicznego do logowania są dla mnie niejasne. To przecież bezpieczniejsza metoda autentykacji niż hasło typu swinia123. No ale nie zrozumiesz.
Standardowo napisanie jakiejkolwiek automatyzacji czy skryptu, który będzie zdalnie logował się na docelowe serwery mija się z celem. Gdy dojdzie do wywołania komendy ssh, program przerwie wykonywanie i zapyta użytkownika o hasło. Nie ma opcji podania mu tego hasła wcześniej. Z pomocą przychodzi program sshpass. Ponieważ ssh czeka tylko i wyłącznie na interakcję użytkownika, sshpass symuluje zachowanie klawiatury i wstrzykuje hasło podane mu w inny sposób.
Instalacja#
Źródło do skompilowania znaleźć można na stronie projektu 1. Paczkę znaleźć można również w oficjalnych repozytoriach. Na Debianie zainstalujesz ją więc komendą:
sudo apt-get install sshpass
Używanie#
Opis użytkowania. Może i krótki ale przydatny:
Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
-f filename Take password to use from file
-d number Use number as file descriptor for getting password
-p password Provide password as argument (security unwise)
-e Password is passed as env-var "SSHPASS"
With no parameters - password will be taken from stdin
-P prompt Which string should sshpass search for to detect a password prompt
-v Be verbose about what you're doing
-h Show help (this screen)
-V Print version information
At most one of -f, -d, -p or -e should be used
sshpass może odczytać hasło z pliku, deskryptora pliku, hasło podane jako argument, hasło podane jako zmienna środowiskowa SSHPASS, albo po prostu pobrane ze strumienia wejścia. Chyba najbezpieczniejszą opcją jest utworzenie pliku z hasłem i nadanie mu odpowiednich uprawnień (np 0400).
Przykłady użycia#
- Utworzenie nie rzucającego się w oczy pliku
to_nie_hasloz hasłem i użycie go do logowania:
$ echo 'swinia123’ > to_nie_haslo
$ chmod 0400 to_nie_haslo
$ sshpass -f to_nie_haslo ssh wieprzu@server1.chlewik.com
- Podanie hasła jako argument:
$ sshpass -p swinia123 ssh wieprzu@server1.chlewik.com
- Podanie hasła jako strumień wejścia:
$ echo 'swinia123’ | sshpass ssh wieprzu@server1.chlewik.com
- Wrzucenie pliku na server do /tmp/ za pomocą scp:
$ sshpass -p swinia123 scp szynka.txt wieprzu@server1.chlewik.com:/tmp/
Uwaga, używanie sshpass nie jest uważane za do końca bezpiecznie. Komenda echo z pierwszego przykładu, będzie widoczna w historii, aby tego uniknąć hasło można wpisać do pliku edytorem tekstu np. vim lub nano. Hasło wpisane jako argument, może zostać zapisane w historii. Hasło zapisane w pliku, może zostać przez kogoś odczytane, gdy uprawnienia pliku są za duże. Lepiej używać tego z głową i usuwać je po zakończonej pracy.
Podsumowanie#
Dzięki sshpass jesteśmy w stanie sprawnie tworzyć automatyzację łączącą się to zdalnych serwerów, nawet nie mając wrzuconych na nie kluczy. Czemu korporacje nie zgadzają się na klucze? Może powodem jest to, że łatwiej zablokować konto czy zmienić hasło w AD, niż usunąć klucz na każdym serwerze? W razie gdyby pracownik z jakiegoś powodu chciał dokonać rzeczy niedozwolonych, bo ma już dosyć korporacji. Kto ich tam wie.
Strona projektu: https://sourceforge.net/projects/sshpass/ ↩︎