Używaj ról IAM, aby łączyć akcje GitHub z akcjami w AWS

17 maja 2023

Uzywaj rol IAM, aby łaczyc akcje GitHub z akcjami w AWS

Czy kiedykolwiek chciałeś zainicjować zmianę na koncie Amazon Web Services (AWS) po aktualizacji repozytorium GitHub lub wdrożyć aktualizacje w aplikacji AWS po scaleniu zatwierdzenia bez korzystania z dostępu użytkownika AWS Identity and Access Management (IAM) Klucze? Jeśli skonfigurujesz dostawcę tożsamości (IdP) OpenID Connect Connect (OIDC) w ramach konta AWS, możesz używać ról IAM i poświadczeń krótkoterminowych, co eliminuje konieczność stosowania kluczy dostępu użytkownika IAM.

Na podstawie tego artykułu autorzy przeprowadzą Cię przez kroki potrzebne do skonfigurowania określonego repozytorium GitHub, aby przyjąć indywidualną rolę na koncie AWS w celu wprowadzenia zmian. Dowiesz się, jak utworzyć zaufane połączenie OIDC, którego zakres obejmuje indywidualne repozytorium GitHub oraz jak zamapować repozytorium na rolę IAM na koncie. Utworzysz połączenie OIDC, rolę IAM i relację zaufania na dwa sposoby: za pomocą konsoli zarządzania AWS oraz za pomocą interfejsu wiersza poleceń AWS (AWS CLI).

Ten post koncentruje się na tworzeniu dostawcy tożsamości IAM OIDC dla GitHub i pokazuje, jak autoryzować dostęp do konta AWS z określonej gałęzi i repozytorium. Dostawców tożsamości OIDC można używać w przepływach pracy obsługujących standard OpenID Connect, takich jak Google lub Salesforce.

Warunki wstępne

Aby nadążyć za czynnościami omawianymi w artykule, należy spełnić następujące wymagania wstępne:

Omówienie rozwiązania

GitHub to zewnętrzny dostawca niezależny od AWS. Aby używać GitHub jako dostawcy tożsamości OIDC, musisz wykonać cztery kroki, aby uzyskać dostęp do zasobów AWS z repozytorium GitHub. Następnie, w piątym i ostatnim kroku, użyjesz AWS CloudTrail do audytu roli, którą utworzyłeś i wykorzystałeś w krokach 1-4.

  1. Utwórz dostawcę OIDC na swoim koncie AWS. Jest to relacja zaufania, która umożliwia GitHubowi uwierzytelnienie i uzyskanie uprawnień do wykonywania działań na Twoim koncie.
  2. Utwórz rolę IAM na swoim koncie. Następnie określisz zakres relacji zaufania roli IAM do zamierzonych części Twojej organizacji GitHub, repozytorium i gałęzi, aby GitHub mógł przyjąć i wykonać określone działania.
  3. Przypisz minimalny poziom uprawnień do roli.
  4. Utwórz plik przepływu pracy GitHub Actions w swoim repozytorium, który może wywoływać akcje na Twoim koncie.
  5. Audytuj użycie roli za pomocą dzienników Amazon CloudTrail.

Utwórz dostawcę OIDC na swoim koncie

Pierwszym krokiem w tym procesie jest utworzenie dostawcy OIDC, którego użyjesz w zasadach zaufania dla roli IAM używanej w tej akcji.

Aby utworzyć dostawcę OIDC dla GitHub (konsola):
  1. Otwórz konsolę IAM.
  2. W lewym menu nawigacyjnym wybierz opcję Dostawcy tożsamości.
  3. W okienku Dostawcy tożsamości wybierz Dodaj dostawcę.
  4. Jako Typ dostawcy wybierz OpenID Connect.
  5. W polu Adres URL dostawcy wprowadź adres URL dostawcy tożsamości GitHub OIDC dla tego rozwiązania: https://token.actions.GitHubusercontent.com.
  6. Wybierz Uzyskaj odcisk kciuka, aby zweryfikować certyfikat serwera dostawcy tożsamości. Aby dowiedzieć się więcej o odciskach palców OIDC, zobacz Uzyskiwanie odcisku palca dla dostawcy tożsamości OpenID Connect.
  7. W polu Odbiorcy wpisz sts.amazonaws.com. Umożliwi to wywołanie interfejsu API AWS Security Token Service (AWS STS) przez tego dostawcę tożsamości.
  8. (Opcjonalnie) W przypadku opcji Dodaj tagi możesz dodać pary klucz-wartość, które pomogą Ci zidentyfikować i uporządkować dostawców tożsamości. Aby dowiedzieć się więcej o oznaczaniu dostawców tożsamości IAM OIDC, zobacz Tagowanie dostawców tożsamości OpenID Connect (OIDC).
  9. Sprawdź wprowadzone informacje. Twoja konsola powinna być zgodna ze zrzutem ekranu na rysunku nr 1. Po weryfikacji wybierz opcję Dodaj dostawcę.

Uwaga: każdy dostawca jest w relacji jeden do jednego z zewnętrznym dostawcą tożsamości. Jeśli chcesz dodać więcej dostawców tożsamości do swojego konta, możesz powtórzyć ten proces.

Uzywaj rol IAM

  1. Po powrocie do strony Dostawcy tożsamości zobaczysz swojego nowego dostawcę tożsamości, jak pokazano na rysunku nr 2. Wybierz swojego dostawcę, aby wyświetlić jego właściwości i zanotuj nazwę zasobu Amazon (ARN).W dalszej części tego postu użyjesz ARN.ARN będzie wyglądać podobnie do następującego:

arn:aws:iam::111122223333:oidc-provider/token.actions.GitHubusercontent.com

Uzywaj rol IAM

Aby utworzyć dostawcę OIDC dla GitHub (AWS CLI):

Możesz dodać GitHub jako dostawcę tożsamości na swoim koncie za pomocą jednego polecenia AWS CLI. Poniższy kod wykona poprzednie kroki opisane dla konsoli, z tymi samymi wynikami. Dla wartości – thumbprint-list użyjesz odcisku palca OIDC GitHub 938fd4d98bab03faadb97b34396831e3780aea1.

aws iam create-open-id-connect-provider --url 
"https://token.actions.GitHubusercontent.com" --thumbprint-list 
"6938fd4d98bab03faadb97b34396831e3780aea1" --client-id-list 
'sts.amazonaws.com'

Aby dowiedzieć się więcej o odcisku palca usługi GitHub, zobacz Akcje usługi GitHub – aktualizacja wdrożeń opartych na OIDC w AWS. W momencie publikacji ten odcisk palca jest prawidłowy.

Obie powyższe metody dodadzą dostawcę tożsamości do Twojego konta. Dostawcę można wyświetlić na stronie Dostawcy tożsamości w konsoli IAM.

Krok 2: Utwórz rolę IAM i określ zakres zasad zaufania

Rolę IAM można utworzyć za pomocą konsoli IAM lub interfejsu AWS CLI. Jeśli zdecydujesz się utworzyć rolę IAM za pomocą AWS CLI, przed utworzeniem roli określisz zakres zasad relacji zaufania.

Procedura tworzenia roli IAM i ustalania zakresu polityki zaufania pochodzi z Podręcznika użytkownika AWS Identity and Access Management User Guide. Aby uzyskać szczegółowe instrukcje dotyczące konfigurowania roli, How to Configure a Role for GitHub OIDC Identity Provider.

Aby utworzyć rolę IAM (konsola IAM):
  1. W konsoli IAM na ekranie Dostawcy tożsamości wybierz przycisk Przypisz rolę dla nowo utworzonego dostawcy tożsamości.Uzywaj ról IAM
  2. W polu Przypisz rolę dla wybierz Utwórz nową rolę, a następnie wybierz Dalej, jak pokazano na poniższym rysunku.Uzywaj rol IAM
  3. Strona Utwórz rolę zawiera kilka opcji. Tożsamość internetowa jest już wybrana jako zaufana jednostka, a pole Dostawca tożsamości jest wypełnione Twoim dostawcą tożsamości. Na liście Odbiorcy wybierz sts.amazonaws.com, a następnie wybierz Dalej.
  4. Na stronie Uprawnienia wybierz Dalej. W przypadku tej wersji demonstracyjnej nie dodasz uprawnień do roli.

Jeśli chcesz przetestować inne działania, takie jak operacje AWS CodeBuild, możesz dodać uprawnienia zgodnie z tymi postami na blogu: Complete CI/CD with AWS CodeCommit, AWS CodeBuild, AWS CodeDeploy, and AWS CodePipeline or Techniques for writing least privilege IAM policies.

(Opcjonalnie) Na stronie Tagi dodaj tagi do tej nowej roli, a następnie wybierz Dalej: Review.

  1.  Na stronie Utwórz rolę dodaj nazwę roli. W tym pokazie wprowadź GitHubAction-AssumeRoleWithAction. Opcjonalnie dodaj opis.
  2.  Aby utworzyć rolę, wybierz Utwórz rolę.

Następnie ograniczysz zasady zaufania roli IAM do pojedynczej organizacji GitHub, repozytorium i oddziału.

Aby określić zakres zasad zaufania (konsola IAM)

  1. W konsoli IAM otwórz nowo utworzoną rolę i wybierz Edytuj relację zaufania.
  2. Na stronie Edytuj zasady zaufania zmodyfikuj zasady zaufania, aby umożliwić Twojej unikalnej organizacji GitHub, repozytorium i oddziałowi przejęcie roli. Ten przykład ufa organizacji GitHub , repozytorium o nazwie i gałęzi o nazwie . Zaktualizuj Federated ARN za pomocą skopiowanej wcześniej ARN dostawcy tożsamości GitHub.
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "<arn:aws:iam::111122223333:oidc-provider/token.actions.githubusercontent.com>"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringEquals": {
                        "token.actions.githubusercontent.com:sub": "repo: <aws-samples/EXAMPLEREPO>:ref:refs/heads/",
                        "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                    }
                }
            }
        ]
    }

Aby utworzyć rolę (AWS CLI)  

W interfejsie CLI platformy AWS użyj pokazanej powyżej przykładowej zasady zaufania dla konsoli. Ta zasada ma na celu ograniczenie dostępu do określonej organizacji, repozytorium i oddziału GitHub.

  1. Utwórz i zapisz plik JSON z przykładową polityką na komputerze lokalnym pod nazwą trustpolicyforGitHubOIDC.json.
  2. Uruchom następujące polecenie, aby utworzyć rolę

 

aws iam create-role --role-name GitHubAction-AssumeRoleWithAction --assume-role-policy-document file://C:\policies\trustpolicyforGitHubOIDC.json

Aby uzyskać więcej informacji na temat tworzenia roli OIDC za pomocą AWS CLI, zobacz Creating a role for federated access (AWS CLI).

Krok 3: Przypisz minimalny poziom uprawnień do roli

W tym przykładzie nie dodasz uprawnień do roli IAM, ale przyjmiesz rolę i wywołasz STS GetCallerIdentity, aby zademonstrować akcję GitHub, która przyjmie rolę AWS.

Jeśli chcesz wykonywać dodatkowe działania na swoim koncie, możesz dodać uprawnienia do utworzonej roli GitHubAction-AssumeRoleWithAction. Typowe działania dla przepływów pracy obejmują wywoływanie funkcji AWS Lambda lub przesyłanie plików do zasobnika Amazon Simple Storage Service (Amazon S3). Aby uzyskać więcej informacji na temat używania IAM do stosowania uprawnień, zobacz Zasady i uprawnienia w IAM.

Jeśli chcesz przeprowadzić test, możesz dodać uprawnienia zgodnie z tymi postami na blogu: Complete CI/CD with AWS CodeCommit, AWS CodeBuild, AWS CodeDeploy, and AWS CodePipeline lub Techniques for writing least privilege IAM policies.

Krok 4: Utwórz akcję GitHub, aby wywołać AWS CLI

Akcje usługi GitHub są zdefiniowane jako metody, których można używać do automatyzacji, dostosowywania i uruchamiania przepływów pracy tworzenia oprogramowania w usłudze GitHub. Utworzona akcja usługi GitHub zostanie uwierzytelniona na Twoim koncie jako rola utworzona w kroku 2: Utwórz rolę IAM i określ zakres zasad zaufania.

Aby utworzyć akcję GitHub w celu wywołania interfejsu AWS CLI:
  1. Utwórz podstawowy plik przepływu pracy, taki jak main.yml, w katalogu .github/workflows swojego repozytorium. Ten przykładowy przepływ pracy przyjmie rolę GitHubAction-AssumeRoleWithAction w celu wykonania akcji aws sts get-caller-identity. Twoje repozytorium może mieć wiele przepływów pracy, z których każdy wykonuje inny zestaw zadań. Po uwierzytelnieniu usługi GitHub w roli z przepływem pracy możesz używać poleceń AWS CLI na swoim koncie.
  2. Wklej następujący przykładowy przepływ pracy do pliku.

 

# This is a basic workflow to help you get started with Actions
name:Connect to an AWS role from a GitHub repository

# Controls when the action will run. Invokes the workflow on push events but only for the main branch
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

env:
  
  AWS_REGION : <"us-east-1"> #Change to reflect your Region

# Permission can be added at job level or workflow level    
permissions:
      id-token: write   # This is required for requesting the JWT
      contents: read    # This is required for actions/checkout
jobs:
  AssumeRoleAndCallIdentity:
    runs-on: ubuntu-latest
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v3
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v1.7.0
        with:
          role-to-assume: <arn:aws:iam::111122223333:role/GitHubAction-AssumeRoleWithAction> #change to reflect your IAM role’s ARN
          role-session-name: GitHub_to_AWS_via_FederatedOIDC
          aws-region: ${{ env.AWS_REGION }}
      # Hello from AWS: WhoAmI
      - name: Sts GetCallerIdentity
        run: |
          aws sts get-caller-identity  

3.Zmodyfikuj przepływ pracy, aby odzwierciedlał informacje o koncie AWS:
  • AWS_REGION: Wprowadź region AWS dla zasobów AWS.
  • role-to-assume: zamień ARN na ARN utworzonej wcześniej roli AWS GitHubAction.

Rysunek 5 przedstawia etapy przepływu pracy, w których GitHub wykonuje następujące czynności:

• Uwierzytelnia się w roli IAM z dostawcą tożsamości OIDC w regionie, który został zdefiniowany w pliku przepływu pracy w kroku konfiguracji poświadczeń aws.

• Wywołania aws sts get-caller-identity w kroku Hello from AWS. WhoAmI… Run AWS CLI sts GetCallerIdentity.

Uzywaj rol IAM

Krok 5: Audyt użycia roli: Zapytanie o dzienniki CloudTrail

Ostatnim krokiem jest przejrzenie dzienników AWS CloudTrail na koncie w celu przeprowadzenia audytu wykorzystania tej roli.

Aby wyświetlić dzienniki zdarzeń dla akcji GitHub:

  1. W konsoli zarządzania AWS otwórz CloudTrail i wybierz Historia zdarzeń.
  2. Na liście Atrybuty wyszukiwania wybierz Źródło zdarzenia.
  3. W pasku wyszukiwania wpisz sts.amazonaws.com.Uzywaj rol IAM
  4. Powinieneś zobaczyć zdarzenia GetCallerIdentity i AssumeRoleWithWebIdentity, jak pokazano na rysunku nr 6. Zdarzenie GetCallerIdentity to Hello z AWS. krok w pliku przepływu pracy GitHub. To zdarzenie pokazuje przepływ pracy, który wywołuje aws sts get-caller-identity. Zdarzenie AssumeRoleWithWebIdentity pokazuje uwierzytelnianie usługi GitHub i przyjmowanie Twojej roli IAM GitHubAction-AssumeRoleWithAction.

Możesz także przeglądać jedno zdarzenie na raz.

Aby wyświetlić zdarzenie AWS CLI GetCallerIdentity:
  1. Na liście Atrybuty wyszukiwania wybierz Nazwa użytkownika.
  2. W pasku wyszukiwania wpisz nazwę-roli-sesji, zdefiniowaną w pliku workflow w Twoim repozytorium. To nie jest nazwa roli IAM, ponieważ ta nazwa-sesji-roli jest zdefiniowana w wierszu 30 przykładowego przepływu pracy. W przykładzie przepływu pracy dla tego wpisu na blogu nazwa-sesji-roli to GitHub_to_AWS_via_FederatedOIDC.
  3. Możesz teraz zobaczyć pierwsze zdarzenie w historii CloudTrail.Uzywaj rol IAM
Aby wyświetlić zdarzenie AssumeRoleWithWebIdentity
  1. Na liście Atrybuty wyszukiwania wybierz Nazwa użytkownika.
  2. W pasku wyszukiwania wprowadź organizację GitHub, repozytorium i oddział zdefiniowane w zasadach zaufania roli IAM. W przedstawionym wcześniej przykładzie nazwa użytkownika to repo:aws-samples/PRZYKŁAD:ref:refs/heads/main.
  3. Możesz teraz zobaczyć pojedyncze wydarzenie w historii CloudTrail.Uzywaj rol IAM

Wnioski

Gdy używasz ról IAM z dostawcami tożsamości OIDC, masz zaufany sposób zapewniania dostępu do zasobów AWS. GitHub i inni dostawcy OIDC mogą generować tymczasowe poświadczenia bezpieczeństwa, aby aktualizować zasoby i infrastrukturę na Twoich kontach.

Na podstawie tego artykułu nauczyłeś się, jak korzystać z dostępu federacyjnego, aby przejąć rolę w AWS bezpośrednio z pliku akcji przepływu pracy w repozytorium GitHub. Dzięki temu nowemu dostawcy tożsamości możesz zacząć usuwać klucze dostępu AWS z użytkowników IAM i korzystać z poświadczeń krótkoterminowych.

Po zapoznaniu się z tym artykułem autorzy zalecają przestrzeganie dyrektywy AWS Well Architected Security Pillar IAM w celu korzystania z programowego dostępu do usług AWS przy użyciu poświadczeń tymczasowych i z ograniczonymi uprawnieniami. Jeśli wdrażasz role federacyjne IAM zamiast kluczy dostępu użytkownika AWS, postępujesz zgodnie z tymi wytycznymi i wystawiasz tokeny przez usługę tokenu zabezpieczającego AWS. Jeśli chcesz podzielić się swoją opinią na temat tego posta, zostaw komentarz poniżej i daj nam znać, w jaki sposób chciałbyś rozszerzyć przepływy pracy OIDC, aby pomóc Twoim potrzebom IAM.

Jeśli masz uwagi dotyczące tego artykułu, zostaw je w sekcji Komentarze poniżej. Jeśli masz pytania dotyczące tego artykułu, skontaktuj się z pomocą techniczną AWS.

Źródło: AWS

 

 

Case Studies
Referencje

Hostersi wsparli nas na każdym etapie projektowania i budowy infrastruktury. Finansowanie, które pomogli pozyskać nam od AWS, pozwoliło przetestować szereg różnych rozwiązań i wybrać konfigurację, która najlepiej odpowiada potrzebom naszej aplikacji. Hostersi stworzyli dla nas infrastrukturę „szytą na miarę”, którą dzięki programowi wsparcia startupów, pozyskaliśmy niemal bezkosztowo.

Wojciech Mróz
CEO & Co-founder Pagaspot
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.