Jaki jest najmniej bezpieczny sposób przechowywania hasła używanego przez skrypt?

13

Mam skrypt Bash, który automatycznie uwierzytelnia się w usłudze przy użyciu mojej nazwy użytkownika i hasła. Poświadczenia są obecnie przechowywane w skrypcie jako zwykły tekst.

Jakie środki ostrożności należy podjąć, aby jak najbezpieczniej przechowywać te poświadczenia, jednocześnie umożliwiając dostęp do skryptu?

Wyjaśnienia:

  • Rozumiem, że jeśli to możliwe, należy zastosować inne metody uwierzytelnienia. Nadal chcę wiedzieć, co zrobić, jeśli uwierzytelnianie za pomocą hasła jest jedyną opcją.
  • Brak przechowywania hasła w ogóle nie jest tutaj akceptowalną odpowiedzią. Pytam o przypadek, w którym skrypt musi mieć nienadzorowany dostęp do hasła.
ændrük
źródło
2
może nie przechowywać kodu dostępu do poświadczeń?
Thomas Ward
Czy nie zadziałałoby uzyskanie dostępu do GNOME Keyring lub czegoś podobnego?
Firefeather
Być może byłoby miło, gdybyś mógł przechowywać go jako skrót kryptograficzny (taki jak SHA-1).
Anonimowy
ROT13 zasłoniłby go, ale NIE zabezpieczyłby go w żaden sposób.
Anonimowy
@Anonimowy Jeśli hasło jest przechowywane jako kryptograficzny skrót, jak zaleca się jego odzyskanie?
ændrük

Odpowiedzi:

8

Jakiego rodzaju usługi? Niektóre usługi mają inne metody uwierzytelniania, np. Klucze SSH dla SSH w połączeniu z agentem SSH.

Przechowuję hasło oddzielnie od skryptu i upewniam się, że wszystkie składniki ścieżki mają ustawione odpowiednie uprawnienia. Na przykład, upewnij się, że w ścieżce /path/to/file, /, /pathi /path/tosą własnością użytkownika ufasz ( root) i że nie są to zapisywalny przez kogoś, kto nie jest dozwolone, aby zobaczyć pliki. Wreszcie zalecane uprawnienia fileto 600 lub 400.

Że filemógłby wyglądać następująco:

PASSWORD='something that you cannot remember'

W swoim skrypcie użyj poniższego kodu, aby zaimportować zmienną:

. /path/to/file

Co do skryptu, upewnij się, że nie zawiera on dziur, które mogą pozwolić atakującym na wykonanie kodu w kontekście skryptu (np. Niekontrolowane środowisko, w którym może być ustawiona dowolna $PATHzmienna lub nieprawidłowe użycie innych plików (np. Pozyskiwanie pliku do zapisu na świecie) .

Jeśli chodzi o faktyczną ochronę hasła, nie możesz. Musi być jakoś dostępny dla innej usługi. Alternatywnie możesz zaszyfrować plik / skrypt zawierający hasło za pomocą, openssllub gpgmusisz wprowadzić hasło przed odblokowaniem poświadczeń. Jest to szczególnie przydatne, jeśli hasło do usługi jest trudne do zapamiętania.

Lekensteyn
źródło
14

Zamiast zakodować hasło w pliku, przechowuj hasło w osobnym pliku i chroń plik ( chmod 700lub chmod 500), aby tylko autoryzowani użytkownicy mieli do niego dostęp.

Pobierz hasło za pomocą cat /dir/to/file/with/.passwordzamiast odczytywać plik i przechowywać jego zawartość w zmiennej.

Rinzwind
źródło
Niektóre narzędzia mają nawet opcję odczytu hasła z pliku właśnie z tego powodu, na przykład gpg --passphrase-file.
2
... i uczyń go plikiem .dotfile (/dir/to/file/with/.password)
knb
2
chmod 400dla plików (tylko do odczytu). Oczywiście musisz zabezpieczyć wiodące katalogi (700 lub 500, a nawet 100, jeśli jesteś paranoikiem). Zauważ, że 400 (lub 500 dla katalogów) jest wystarczające, inne tryby (100) można uznać za bezpieczeństwo poprzez zaciemnienie , podobnie jak ukrywanie pliku przez umieszczenie kropki przed nazwą.
Lekensteyn
1

Wiem, że to stare pytanie, ale zmierzyłem się z tym podobnym problemem i użyłem breloczka do kluczy Ubuntu, aby go rozwiązać. Oto rozwiązanie dla Ubuntu 18.04LTS Otwórz terminal Zapisz keyring set {{service}} {{username}} na przykład, jeśli używasz tego do logowania do szkoły:

keyring set school mohamed

Zostaniesz zalogowany w celu wprowadzenia hasła. Wprowadź hasło. Teraz wprowadzone hasło jest przechowywane w breloku Ubuntu.

Aby uzyskać to hasło, napisz w terminalu:

keyring get school mohamed

aby użyć tego w kontekście skryptu:

password=$(keyring get school mohamed)

Teraz hasło jest zgodne z wcześniej wprowadzonym hasłem.

Mohamed Ashref
źródło