AWS SSO ❤️ Terraform

W jednym z poprzednich wpisów (Zarządzanie tożsamością w AWS) Łukasz pisał o różnych metodach zarządzania dostępami oraz użytkownikami w AWS. Jedną ze wspomnianych metod jest wykorzystanie AWS Single Sing-On jako sposobu na dostęp do AWS.

3 minuty czytania

Czym jest AWS Single Sing-On (SSO)?

W taki sposób na co dzień pracujemy na naszych kontach AWS, bardzo często wykorzystujemy to również w projektach naszych klientów.

Mam tutaj na myśli przede wszystkim dostęp do konsoli graficznej AWS.

Na początku roku otrzymaliśmy również nową wersję AWS CLI. Jedną z kluczowych nowości, jakie przynosi nowa wersja CLI, jest właśnie możliwość uwierzytelnienia działań z wykorzystaniem AWS SSO.

Rozwiązanie znacząco podnosi komfort oraz usprawnia pracę w środowisku, które wymaga od nas częstej zmiany konta i gdzie nie chcemy jednocześnie operować na IAM User’ach oraz kluczach.

A co z innymi narzędziami?

W przypadku logowania do konsoli oraz uwierzytelnienia dla komend AWS CLI, ten sposób logowania działa bardzo dobrze. Problem pojawia się jednak przy pracy z narzędziami tzw. „trzecimi” – w tym przypadku jest to Terraform.

Ponieważ często korzystamy z tego narzędzia w projektach naszych klientów, potrzebne było jakieś rozwiązanie.

Patrząc na to, co dzieje się w oficjalnym repo, temat jest jeszcze „rozgrzebany”.

AWS Single Sing-ON + Terraform

Postanowiłem zatem poszukać jakiegoś rozwiązania. Teraz pokażę Ci, jak w kilku krokach wygenerować parę kluczy, które będzie można wykorzystać przy pracy z Terraform.

Zacznijmy od zalogowania się (przy założeniu, że robisz to po raz pierwszy) z poziomu AWS CLI do naszego konta AWS. W tym celu wywołuję komendę, która pozwoli mi skonfigurowac CLI do pracy z kontem AWS korzystając właśnie z AWS SSO. W terminalu wpisuję:

– aws configure sso

Następnie wypełniam dane, które są wymagane do potwierdzenia mojej tożsamości oraz dodatkowe parametry, jak np. domyślny region, w którym pracuję:

– SSO start URL : https://****.awsapps.com/start (tutaj URL do naszego AWS SSO),

– SSO Region : eu-west-1 (chodzi o wskazanie regionu, w którym skonfigurowane jest nasz SSO),

– potwierdzenie Single Sign-On w przeglądarce,

– powrót do konsoli CLI,

– wybranie z listy środowiska (konta AWS), do którego chcemy uzyskać dostęp,

– CLI default client Region : eu-west-1 (tutaj wybieramy nasz domyślny region, w którym pracujemy na co dzień),

– CLI default output format : json (tutaj kto co lubi),

– CLI profile name : default.

Zakładam, że skoro korzystasz z AWS SSO, to znaczy, że masz więcej niż jedno konto AWS. W tym kroku po prostu podajesz nazwę profilu (tutaj akurat przykład „domyślny”). Mając więcej kont AWS warto jakoś rozróżniać profile, aby wiedzieć, do którego się w danym momencie odwołujesz.

Czas na Terraform

W tym celu przygotowałem skrypt (plik do pobrania), którego zadaniem jest wygenerować dla nas plik credentials na podstawie roli, jaką uzyskaliśmy podczas uwierzytelniania SSO.

Skrypt uwzględnia podanie profilu jako parametru, w przeciwnym razie będzie poszukiwał tego tzw. „default”:

if [ -z "$1" ];
then
  echo "No aws cli profile name provided (default profile will be used). You can add the name after space: aws_credentials profilename"
  profile=${VARIABLE:-default}
else
  profile=$1
fi
role_arn=$(aws iam list-roles --profile $profile | grep /aws-reserved/sso.amazonaws.com/ | grep arn:aws | sed -r 's/^.{20}//' | sed -r 's/.{2}$//')
user_name=$(git config user.name | sed 's/[^A-Za-z0-9+=,.@-]/-/g')
request_credentials() {
  credentials=$(
    aws sts assume-role 
      --profile $profile 
      --role-arn $role_arn 
      --role-session-name $user_name
  )
}
request_credentials

if [ $? -ne 0 ]; then
  aws sso login --profile "$profile"

  if [ $? -ne 0 ]; then
    exit 1
  fi

  request_credentials
fi

access_key_id=$(echo $credentials | perl -n -e'/"AccessKeyId": "([^,]+)"/ && print $1')
secret_key_id=$(echo $credentials | perl -n -e'/"SecretAccessKey": "([^,]+)"/ && print $1')
session_token=$(echo $credentials | perl -n -e'/"SessionToken": "([^,]+)"/ && print $1')

aws configure set --profile "$profile" aws_access_key_id "$access_key_id"
aws configure set --profile "$profile" aws_secret_access_key "$secret_key_id"
aws configure set --profile "$profile" aws_session_token "$session_token"

Wywołuję skrypt używając polecenia:

./aws_credentials.sh <opcjonalnie nazwa profilu>

Po poprawnym wykonaniu możemy podejrzeć zawartość utworzonego pliku credentials korzystając z poniższego polecenia (dotyczy do systemów Mac OS/Linux):

cat ~/.aws/credentials

Z tak wygenerowanymi kluczami sprawdzam, jak zachowuje się Terraform:

Jak widać jest dużo lepiej. ?

Podsumowując

AWS SSO, zwłaszcza w integracji z AWS CLI, to wciąż nowe podejście do zapewnienia dostępu do AWS.

W momencie, kiedy pojawia się potrzeba skorzystania z narzędzi, które bazowały na dotychczasowym podejściu IAM Users, pary kluczy itp., trzeba szukać jakichś alternatywnych rozwiązań.

W powyższym wpisie podzieliłem się z Tobą moim szybkim pomysłem i rozwiązaniem problemu z Terraform. Mam nadzieję, że okaże się przydatny. ?