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.
AWS SSO ❤️ Terraform
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. ?