Jak używać zaszyfrowanych haseł w skryptach Bash

Opublikowany: 2022-01-29
Laptop Linux w stylu Ubuntu.
fatmawati achmad zaenuri/Shutterstock.com

Jeś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.

Zaszyfrowane hasło zapisane 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' 

Reklama

Ciąg jest odszyfrowywany, a nasz oryginalny tekst — hasło do zdalnego konta użytkownika — jest zapisywany w oknie terminala.

Odszyfrowane hasło zapisane 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' 

Reklama

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 polecenia ssh .
  • Używamy opcji -T (wyłącz alokację pseudoterminalu) z ssh , ponieważ nie musimy mieć przydzielonego nam pseudo-TTY na zdalnym komputerze.
Jak korzystać z „Tutaj dokumentów” w Bash w systemie Linux
POWIĄZANE Jak korzystać z „Tutaj dokumentów” w Bash w systemie Linux

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 

Reklama

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.