Mike Logaciuk

Hashowanie zmiennych w Linuksie

01 May 2024

logo

Wstęp

Jeszcze do niedawna, jednym z sugerowanych rozwiązań na przechowywanie zmiennych w Linuxie w postaci np. kluczy do API - było używane czystego tekstu w .zshrc.

Dziś wiadomo, że nie jest to najlepszy pomysł.

W tej sytuacji na ratunek przychodzi Nam standardowy Unix’owy password manager o mało kreatywnej nazwie: pass.

Zależności

Pakiet instalujemy przy pomocy:

sudo apt update && sudo apt install pass -y

GPG

Na początek musimy wygenerować swój klucz GPG, którego użyjemy przy inicjalizacji credential store'u w Pass’ie:

gpg --full-generate-key

Po wybraniu stosownych opcji, prompt poprosi Nas o utworzenie hasła do nowo wygenerowanego klucza, następnie zgodnie z poniższym musimy odszukać key id.

Jeżeli klucz już posiadamy, to tylko listujemy klucze:

gpg --list-secret-keys --keyid-format=long

Potrzebny Nam id, powinien być podobny do tego:

66644X73F79...82ABD6DD8B

Pass

Następnie inicjalizujemy credentials store dla Naszych kluczy:

pass init 66644X73F79...82ABD6DD8B

Powinniśmy otrzymać informację: Password store initialized for 6644X73F79...82ABD6DD8B.

Dodawanie kluczy

Aby dodać klucz, używamy komendy:

pass insert App/Foo

Gdzie App to Nasza grupa, a Foo to nazwa aplikacji:

mkdir: created directory '/home/USER/.password-store/App'
Enter password for App/Foo:
Retype password for App/Foo:

Gdy wykonamy cat'a na nowo utworzonym pliku, dostaniemy zwrotnie zaszyfrowane hasło:

$ cat .password-store/App/Foo.gpg
J@a^%6+Y4Fq8d.,YwR0 2)f:sud <ZnXܼT e?	f̂g^WP!9Ҷ!:oǎR[pU
                                                        |m.Z	%

Odczyt kluczy

W celu odczytu, wykonujemy proste:

$ pass show App/Foo
123

Używanie kluczy w zmiennych

Jeżeli tego jeszcze nie zrobiliśmy, to zmieniamy uprawnienia do .zshrc lub .bashrc:

chmod 600 ~/.zshrc

A do pliku dodajemy przykładowo:

export Foo="$(pass show App/Foo)"

Od teraz po otworzeniu konsoli, prompt poprosi Nas o wpisanie klucza do keystore'u.

Nasz nowo zapisany klucz, możemy odczytać ze zmiennej:

echo $Foo

I użyć go do np. uruchomienia aplikacji, kontenera etc.

Uwagi

Oczywiście są inne rozwiązania jak Vault (od Hashicorp) czy Bitwarden, lecz czy dla takich celów jest sens?

Biorąc pod uwagę fakt, że do root’a mamy inne hasło niżeli do Naszego usera, a dysk mamy zaszyfrowany kluczem, a zmienne w powyższy sposób.

To aby odczytać zawartość Naszych obecnych credentiali, potrzeba by było zalogować się do Naszej aktualnej sesji.

Trochę mało realne…