Terraform jako generator haseł dla dotneta

Hasła, hasełka, dostępy, konekszon 🩳(mam tylko takie stringi w ikonach) i inne sekrety to (dla mnie) zawsze był koszmar, gdzie to trzymać, jak to zapisać, żeby działało – a żeby nikt się nie dowiedział, że hasło to:

https://youtu.be/a6iW-8xPw3k

Jak?! JAk?! JAK?!

Opowiem jak ja się z tym wszystkim oswoiłem przy pomocy

  • terraform
  • azure key vault
  • net core app settings

Z waszą pomocą powstaje ja, kapitan planeta 🌍 !

Składniki

Dlaczego tak? Bo terraform postawi mi aplikację (w tym przykładzie tylko azure key vault) w azure oraz wygeneruje hasła dla mojej aplikacji, nagrałem kiedyś najlepszy tutorial do terraform, to tak w ramach wprowadzenia do technologii, dostępny o pod tym linkiem: https://youtu.be/3gzl-74yZ5g

Następnie mamy AKV to miejsce, gdzie przechowujemy sekrety, certyfikaty i klucze – ja skupię się tylko na sekretach.

I wreszcie aplikacja dotnet core tutaj zakręcę się na prostej aplikacji konsolowej i do niej wepniemy dane z AKV i udostępnimy jako kolejny source w IConfiguration.

Do dzieła – wymagania

Aby móc wyklikać i uruchomić przykład należy mieć konto na azure i móc stworzyć Azure Key Vault. To, co pokaże i opiszę z poziomu terraform, można także zrobić ręcznie i hasła wygenerować ręcznie. Ja chce zrobić to automatycznie – jestę leniwy.

Do dzieła – do dzieła właściwe

Stworzyłem konsolowy projekt w moim aktualnie ulubionym IDE – R#

W folderze z *.csproj / *.sln – zależy jak sobie chcesz to w gicie ułożyć – tak odpalasz linię poleceń.

Startujesz z terraform init – jeśli go nie masz ściągniesz z https://www.terraform.io

To powinno powiedzieć, że próbujesz inicjalizować terraform w pustym katalogu (folderze). Rozwiązaniem tego jest dodanie pliku (ów) z informacją o tym co chcemy zrobić – ja pójdę w pliki.

Terraform initialized in an empty directory!
The directory has no Terraform configuration files. You may begin working
with Terraform immediately by creating Terraform configuration files.

Terraform

Azure Key Vault

Jadąc od góry

  1. Deklaruję kilka zmiennych, aby się nie powtarzać,
    1. potrzebuje właściciela, któremu przypiszę wszystkie uprawnienia dla AKV, aby w miarę potrzeb mógł coś ręcznie zrobić (kwestia gustu, można to pominąć) – warto pamiętać, aby dać komuś admina.
    2. Następnie lokalizacja moich zasobów
    3. Nazwa grupy
    4. Informacja o tym gdzie w azure to będzie tworzone, jaki tenant i jaka subskrypcja
  2. Następnie informacja o tym, jaka wersji samego terraform ma być, jak póki co działam na 2.36
    1. plus drobny tuning dla AKV.
  3. Dalej tworzę resource grupę
  4. Sam key vault, w niej warto zwrócić uwagę na dwie rzeczy:
    1. access policy – gdzie właścicielowi subskrypcji (to ja!) nadaje pełne prawa,
    2. natomiast za komentowany przykład do nadania tylko odczytu do wcześniej stworzonej aplikacji.

Czas na wrzucenie sekretów do AKV

I znowu od góry

  1. Deklaracja
  2. Nazwa
  3. Id Key Vault, do którego chce zapisać sekrety
  4. Wartość wpisu – gdzie on? Skąd ten wynik (result)

O tutaj:

  1. Ustaliłem tylko długość hasła – można kilka rzeczy dograć, ale w tym blogowym przypadku to wystarczy

Terraform init v2

Teraz po uruchomieniu terraform init konsola powinna wypluć coś takiego:

Initializing the backend…

Initializing provider plugins…
– Using previously-installed hashicorp/azurerm v2.36.0
– Finding latest version of hashicorp/random…
– Installing hashicorp/random v3.0.1…
– Installed hashicorp/random v3.0.1 (signed by HashiCorp)

Stanowość

Ważne, aby uruchomić terraform init po wrzuceniu wszystkich plików .tf. Sam terraform jest stanowy, także gdy zrobi się init – a potem doda nowego providera (np. random provider) terraform zamarudzi i trzeba ponownie uruchomić inicjalizacje – które jest bezpieczna i można tym kręcić dowolnie.

Po zakończeniu operacji init w folderze powinien pojawić się kolejny: .terraform, w którym znajdzie się odpowiedni .exe dla naszego środowiska

Do tej pory można było offline teraz, aby kontynuować należy zalogować się do azure. Ja korzystam z az cli, loguje się az login, następnie wybieram i ustawiam jako aktywne swoje konto/subskrypcje przez az account set -s xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Na początku trochę wkurza, ale później człowiek się przyzwyczaja i to robi robotę.

Terraform apply

Teraz można także uruchomić terraform plan – wynikiem operacji jest opis-lista rzeczy, który się wydarzą podczas terra-formowania azure. Plan nic nie zrobi, tylko napisze co chciałby zrobić – ostatecznie plan i samo wykonanie może się odrobinę różnić (uroki softu, ale to na kiedy indziej).

terraform apply <enter>
yes <enter>

Jeśli stworzenie AKV nie przejdzie, to zmień nazwę, AKV musi być globalnie unikalny – tak jak ja 🦄

Najlepsze w tf jest to że, nawet jeśli coś nie zadziała od razu i trzeba/chcesz coś naprawić – tak od zera, to lecisz terraform destroy i terraform apply – cyk! Nie zawsze tak trzeba, ale można.

Po zakończeniu operacji i zobaczeniu zielonej radosnej wiadomości na portalu możesz zobaczyć coś takiego:

Teraz aplikacja

  1. Usingi, namespace, klasa
  2. Następnie książkowy token provider oraz klient KeyVaulta
  3. Stworzenie boba budowniczego dla konfiguracji oraz przypięcie AKV jako jednego z providerów konfiguracji. AKV jest publiczny, url służy do odczytu danych z AKV.
  4. Potem już klasycznie instancja settings i przypięcie ich do odpowiedniej sekcji
  5. Następnie popisy konsolowe
  6. Prosta definicja klasy settings
  7. I na koniec, aby uprościć lista nugetów wykorzystana w przykładzie.

Czemu to działa ⁉

To działa, ponieważ jestem (ja! Jarek – jarek@codeblast.pl) zalogowany do swojego konta na azure. Aplikacja działa w moim kontekście, dlatego mam dostęp do AKV. Jeśli będziesz uruchamiać inną aplikację, albo będzie ona działać np. z azure musisz się upewnić, że nadałeś jej odpowiednie uprawnienia. Możesz to zrobić ręcznie:

  • Access control (IAM)
  • Access policies

Lub automatycznie, dlatego zostawiłem ten zakomentowany kawałek konfiguracji w terrasecret.tf (weź się przewiń do góry) gdzie nadawałem uprawnia get/list dla obiektu w tenancie (object/tenant)

Inspiracja

Przykład jest oparty o produkcyjna już aplikację ITAN (isthereanynews.com), nad którą pracuje w czasie wolnym. ITAN to raczkujący czytnik RSSów z planami i ambicjami. Możesz śledzić tagi #isthereanynews na tym blogu, Twitterze czy odwiedzić stronę.

Zostaw komentarz i trzymaj się dobrze.

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.