Jak używać zaszyfrowanych haseł w skryptach Bash
Opublikowany: 2022-01-29Jeśli jesteś zmuszony użyć skryptu Linuksa, aby połączyć się z zasobem chronionym hasłem, prawdopodobnie czujesz się nieswojo z umieszczeniem tego hasła w skrypcie. OpenSSL rozwiązuje ten problem za Ciebie.
Hasła i skrypty
Umieszczanie haseł w skryptach powłoki nie jest dobrym pomysłem. W rzeczywistości to naprawdę zły pomysł. Jeśli skrypt wpadnie w niepowołane ręce, każdy, kto go przeczyta, może zobaczyć, jakie jest hasło. Ale jeśli jesteś zmuszony użyć skryptu, co jeszcze możesz zrobić?
Możesz wprowadzić hasło ręcznie, gdy proces osiągnie ten punkt, ale jeśli skrypt ma działać bez nadzoru, to nie zadziała. Na szczęście istnieje alternatywa dla zakodowania haseł w skrypcie na stałe. Wbrew intuicji używa innego hasła, aby to osiągnąć, wraz z pewnym silnym szyfrowaniem.
W naszym przykładowym scenariuszu musimy nawiązać zdalne połączenie z komputerem Fedora Linux z naszego komputera Ubuntu. Użyjemy skryptu powłoki Bash do nawiązania połączenia SSH z komputerem Fedory. Skrypt musi działać bez nadzoru i nie chcemy umieszczać w skrypcie hasła do konta zdalnego. W tym przypadku nie możemy użyć kluczy SSH, ponieważ udajemy, że nie mamy żadnej kontroli ani uprawnień administratora nad komputerem Fedory.
Wykorzystamy dobrze znany zestaw narzędzi OpenSSL do obsługi szyfrowania oraz narzędzie o nazwie sshpass
, aby wprowadzić hasło do polecenia SSH.
POWIĄZANE: Jak tworzyć i instalować klucze SSH z powłoki systemu Linux
Instalowanie OpenSSL i sshpass
Ponieważ wiele innych narzędzi do szyfrowania i zabezpieczeń korzysta z OpenSSL, może on już być zainstalowany na Twoim komputerze. Jeśli jednak tak nie jest, instalacja zajmuje tylko chwilę.
W Ubuntu wpisz to polecenie:
sudo apt dostać openssl
Aby zainstalować sshpass
, użyj tego polecenia:
sudo apt zainstaluj sshpass
W Fedorze musisz wpisać:
sudo dnf zainstaluj openssl
Polecenie do zainstalowania sshpass
to:
sudo dnf zainstaluj sshpass
W Manjaro Linux możemy zainstalować OpenSSL za pomocą:
sudo pacman -Sy openssl
Na koniec, aby zainstalować sshpass
, użyj tego polecenia:
sudo pacman -Sy sshpass
Szyfrowanie w wierszu poleceń
Zanim przejdziemy do używania polecenia openssl
ze skryptami, zapoznajmy się z nim, używając go w wierszu poleceń. Załóżmy, że hasło do konta na zdalnym komputerze to rusty!herring.pitshaft
. Zaszyfrujemy to hasło za pomocą openssl
.
Kiedy to robimy, musimy podać hasło szyfrowania. Hasło szyfrowania jest używane w procesach szyfrowania i deszyfrowania. W poleceniu openssl
jest wiele parametrów i opcji. Za chwilę przyjrzymy się każdemu z nich.
echo 'zardzewiały!śledź.wałek' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass hasło:'wybierz.twoje.hasło'
Używamy echo
, aby wysłać hasło do konta zdalnego przez potok i do polecenia openssl
.
Parametry openssl
to:
- enc -aes-256-cbc : Typ kodowania. Używamy szyfru z kluczem 256-bitowym Advanced Encryption Standard z łańcuchem bloków szyfru.
- -md sha512 : Typ skrótu wiadomości (hash). Używamy algorytmu kryptograficznego SHA512.
- -a : Mówi
openssl
, aby zastosował kodowanie base-64 po fazie szyfrowania i przed fazą odszyfrowywania. - -pbkdf2 : Korzystanie z funkcji wyprowadzania klucza opartego na hasłach 2 (PBKDF2) znacznie utrudnia odgadnięcie hasła przez atak typu brute force. PBKDF2 wymaga wielu obliczeń do wykonania szyfrowania. Osoba atakująca musiałaby zreplikować wszystkie te obliczenia.
- -iter 100000 : Ustawia liczbę obliczeń, których użyje PBKDF2.
- -salt : Użycie losowo zastosowanej wartości soli powoduje, że zaszyfrowane wyjście jest za każdym razem inne, nawet jeśli zwykły tekst jest taki sam.
- -pass pass:'pick.your.password' : hasło, którego będziemy potrzebować do odszyfrowania zaszyfrowanego hasła zdalnego. Zastąp
pick.your.password
solidnym, wybranym przez siebie hasłem.
Zaszyfrowana wersja naszego hasła rusty!herring.pitshaft
jest zapisywana w oknie terminala.
Aby to odszyfrować, musimy przekazać ten zaszyfrowany ciąg do openssl
z tymi samymi parametrami, których użyliśmy do zaszyfrowania, ale dodając opcję -d
(odszyfruj).
echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass hasło:'wybierz.twoje.hasło'
Ciąg jest odszyfrowywany, a nasz oryginalny tekst — hasło do zdalnego konta użytkownika — jest zapisywany w oknie terminala.
To dowodzi, że możemy bezpiecznie zaszyfrować nasze hasło do konta użytkownika zdalnego. Możemy go również odszyfrować, gdy tego potrzebujemy, za pomocą hasła, które podaliśmy w fazie szyfrowania.
Ale czy to faktycznie poprawia naszą sytuację? Jeśli potrzebujemy hasła szyfrowania do odszyfrowania hasła do konta zdalnego, na pewno hasło odszyfrowania będzie musiało znajdować się w skrypcie? Cóż, tak. Ale zaszyfrowane hasło do zdalnego konta użytkownika będzie przechowywane w innym, ukrytym pliku. Uprawnienia do pliku uniemożliwią dostęp do niego każdemu oprócz Ciebie i oczywiście użytkownika root systemu.
Aby wysłać dane wyjściowe z polecenia szyfrowania do pliku, możemy użyć przekierowania. Plik nazywa się „.secret_vault.txt”. Zmieniliśmy hasło szyfrowania na bardziej niezawodne.
echo 'zardzewiały!śledź.wałek' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt
Nic się nie dzieje, ale hasło jest szyfrowane i wysyłane do pliku „.secret_vault.txt”.
Możemy sprawdzić, czy zadziałało, odszyfrowując hasło w ukrytym pliku. Zauważ, że używamy tu cat
, a nie echo
.
kot .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass hasło:'secret#vault!password'
Hasło zostało pomyślnie odszyfrowane z danych w pliku. Użyjemy chmod
do zmiany uprawnień do tego pliku, aby nikt inny nie miał do niego dostępu.
chmod 600 .secret_vault.txt
ls -l .secret_vault.txt
Użycie maski uprawnień 600 usuwa wszelki dostęp dla wszystkich innych niż właściciel pliku. Możemy teraz przejść do pisania naszego skryptu.
POWIĄZANE: Jak korzystać z polecenia chmod w systemie Linux
Używanie OpenSSL w skrypcie
Nasz skrypt jest dość prosty:
#!/kosz/bash # nazwa zdalnego konta REMOTE_USER=geek # hasło do zdalnego konta REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password') # komputer zdalny REMOTE_LINUX=fedora-34.local # połącz się ze zdalnym komputerem i umieść znacznik czasu w pliku o nazwie script.log sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands echo $USER "-" $(data) >> /home/$REMOTE_USER/script.log _zdalne_polecenia
- Ustawiamy zmienną o nazwie
REMOTE_USER
na „geek”. - Następnie ustawiamy zmienną o nazwie
REMOTE_PASSWD
na wartość odszyfrowanego hasła pobranego z pliku „.secret_vault.txt”, używając tego samego polecenia, którego użyliśmy przed chwilą. - Lokalizacja komputera zdalnego jest przechowywana w zmiennej o nazwie
REMOTE_LINUX
.
Mając te informacje, możemy użyć polecenia ssh
, aby połączyć się ze zdalnym komputerem.
- Polecenie
sshpass
jest pierwszym poleceniem w linii połączenia. Używamy go z opcją-p
(hasło). Pozwala nam to określić hasło, które powinno zostać wysłane do poleceniassh
. - Używamy opcji
-T
(wyłącz alokację pseudoterminalu) zssh
, ponieważ nie musimy mieć przydzielonego nam pseudo-TTY na zdalnym komputerze.
Używamy krótkiego dokumentu, aby przekazać polecenie do zdalnego komputera. Wszystko pomiędzy dwoma ciągami _remote_commands
jest wysyłane jako instrukcje do sesji użytkownika na komputerze zdalnym — w tym przypadku jest to pojedynczy wiersz skryptu Bash.
Polecenie wysłane do komputera zdalnego po prostu rejestruje nazwę konta użytkownika i znacznik czasu w pliku o nazwie „script.log”.
Skopiuj i wklej skrypt do edytora i zapisz go w pliku o nazwie „go-remote.sh”. Pamiętaj, aby zmienić szczegóły, aby odzwierciedlały adres własnego komputera zdalnego, konta użytkownika zdalnego i hasło do konta zdalnego.
Użyj chmod
, aby skrypt był wykonywalny.
chmod +x go-remote.sh
Pozostało tylko to wypróbować. Odpalmy nasz scenariusz.
./go-remote.sh
Ponieważ nasz skrypt jest minimalistycznym szablonem dla skryptu nienadzorowanego, terminal nie wysyła żadnych danych wyjściowych. Ale jeśli sprawdzimy plik „script.log” na komputerze Fedory, zobaczymy, że połączenia zdalne zostały pomyślnie nawiązane, a plik „script.log” został zaktualizowany sygnaturami czasowymi.
kot skrypt.log
Twoje hasło jest prywatne
Hasło do konta zdalnego nie jest zapisane w skrypcie.
I chociaż hasło odszyfrowania znajduje się w skrypcie, nikt inny nie może uzyskać dostępu do twojego pliku „.secret_vault.txt” w celu odszyfrowania go i odzyskania hasła do konta zdalnego.