Udostępnij za pośrednictwem


Ochrona wpisów tajnych w usłudze Azure Pipelines

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Ten artykuł zawiera najlepsze rozwiązania dotyczące ochrony wpisów tajnych w usłudze Azure Pipelines. Wpis tajny to wszystko, do czego chcesz ściśle kontrolować dostęp, na przykład klucze interfejsu API, hasła, certyfikaty lub klucze kryptograficzne.

Usługa Azure Pipelines nie generuje wartości wpisów tajnych. Może jednak być konieczne dodanie wpisu tajnego do potoku w celu przechowywania poufnych danych, takich jak klucz interfejsu API. Aby dowiedzieć się więcej na temat ustawiania zmiennych tajnych, zobacz Ustawianie zmiennych tajnych.

Nie używaj wpisów tajnych, jeśli jest dostępna inna metoda

Najlepszą metodą ochrony wpisu tajnego nie jest posiadanie wpisu tajnego w pierwszej kolejności. Sprawdź, czy potok może używać innej metody niż używanie wpisu tajnego do wykonania zadania.

  • Użyj tożsamości zarządzanych:

    • Rozważ użycie tożsamości zarządzanych zamiast bezpośredniego obsługiwania wpisów tajnych.
    • Tożsamości zarządzane umożliwiają aplikacjom i usługom uwierzytelnianie zabezpieczeń za pomocą usług platformy Azure bez konieczności jawnego poświadczeń.
    • Tożsamości zarządzane można używać do uzyskiwania dostępu do innych usług platformy Azure.
  • Zadanie interfejsu wiersza polecenia platformy Azure:

Aby uzyskać więcej informacji, zobacz Używanie jednostek usługi i tożsamości zarządzanych

Używanie zmiennych tajnych

Nigdy nie przechowuj poufnych wartości jako zwykłego tekstu w pliku usługi Azure Pipelines .yml .

Zmienne tajne mogą służyć do informacji prywatnych, takich jak hasła, identyfikatory i inne dane identyfikujące, których nie chcesz ujawniać w potoku. Zalecamy ustawienie zmiennych wpisów tajnych za pomocą usługi Azure Key Vault. Można również ustawić zmienne tajne w interfejsie użytkownika lub w grupie zmiennych. Nie zalecamy używania polecenia rejestrowania w celu ustawienia zmiennej tajnej. Po ustawieniu wpisu tajnego za pomocą polecenia rejestrowania każdy, kto może uzyskać dostęp do potoku, może również zobaczyć wpis tajny.

Zmienne tajne są szyfrowane i mogą być używane w potokach bez ujawniania ich wartości. Chociaż ich wartości nie są ujawniane, nigdy nie echo wpisów tajnych jako danych wyjściowych i nie przekazują wpisów tajnych w wierszu polecenia. Zamiast tego sugerujemy mapowania wpisów tajnych na zmienne środowiskowe.

Podczas tworzenia wpisu tajnego postępuj zgodnie ze wskazówkami dotyczącymi nazewnictwa zmiennych i upewnij się, że nazwa wpisu tajnego nie ujawnia poufnych informacji.

Ograniczanie dostępu do zmiennych tajnych

Aby ograniczyć dostęp do wpisów tajnych w usłudze Azure DevOps, wykonaj następujące najlepsze rozwiązania:

  • Przechowywanie wpisów tajnych w usłudze Azure Key Vault. Za pomocą usługi Azure Key Vault można następnie użyć modelu kontroli dostępu opartego na rolach platformy Azure, aby ograniczyć dostęp do wpisu tajnego lub grupy wpisów tajnych.
  • Ustaw zmienne tajne w interfejsie użytkownika dla potoku. Zmienne tajne ustawione w interfejsie użytkownika ustawień potoku dla potoku są ograniczone do potoku, w którym są ustawione. W związku z tym można mieć wpisy tajne widoczne tylko dla użytkowników z dostępem do tego potoku.
  • Ustaw wpisy tajne w grupie zmiennych. Grupy zmiennych są zgodne z modelem zabezpieczeń biblioteki. Możesz kontrolować, kto może definiować nowe elementy w bibliotece i kto może używać istniejącego elementu.

Nie zapisuj wpisów tajnych w dziennikach

Usługa Azure Pipelines próbuje wyczyścić wpisy tajne z dzienników wszędzie tam, gdzie to możliwe, ale nie jest niezawodna. Unikaj powtarzania wpisów tajnych w konsoli, używania ich w parametrach wiersza polecenia lub rejestrowania ich w plikach. Należy zachować ostrożność podczas korzystania z poleceń interfejsu wiersza polecenia platformy Azure, które wyświetlają poufne informacje. Użyj elementu , a jeśli chcesz pobrać wpis tajny z wywołania interfejsu None output formatwiersza polecenia platformy Azure, Use none output format and retrieve security information to a secret variable.

Nie używaj danych strukturalnych jako wpisów tajnych

Unikaj używania formatów danych ustrukturyzowanych, takich jak JSON, XML lub YAML, aby hermetyzować wartości wpisów tajnych, w tym znaki kontrolne, takie jak zwrot karetki, \ri źródło danych wiersza,\n . Zamiast tego należy utworzyć poszczególne wpisy tajne dla każdej poufnej wartości. Takie podejście zapewnia lepszą dokładność redaction i minimalizuje ryzyko nieumyślnego ujawnienia poufnych danych.

Inspekcja obsługi wpisów tajnych

Aby przeprowadzić inspekcję sposobu użycia wpisów tajnych w usłudze Azure Pipelines, wykonaj następujące najlepsze rozwiązania:

  • Przejrzyj kod źródłowy: Sprawdź kod źródłowy repozytorium hostowania potoku. Aby zapewnić poprawne obsługę wpisów tajnych, sprawdź wszystkie zadania używane w potoku. Na przykład sprawdź, czy wpisy tajne nie są przypadkowo wysyłane do niezamierzonych hostów lub jawnie wydrukowane w celu uzyskania danych wyjściowych dziennika.
  • Sprawdź dzienniki uruchamiania: po przetestowaniu prawidłowych i nieprawidłowych danych wejściowych wyświetl dzienniki uruchamiania potoku. Upewnij się, że wpisy tajne są prawidłowo redagowane i nie są ujawniane. Czasami błędy w poleceniach lub narzędziach mogą przypadkowo wyciekać wpisy tajne do dzienników błędów. Podczas gdy usługa Azure Pipelines próbuje wyczyścić wpisy tajne z dzienników, przegląd ręczny jest nadal niezbędny.

Inspekcja i rotacja wpisów tajnych

Aby przeprowadzać inspekcję i obracać wpisy tajne, postępuj zgodnie z następującymi najlepszymi rozwiązaniami:

  • Przejrzyj zarejestrowane wpisy tajne: okresowo oceniaj wpisy tajne zarejestrowane w potokach. Upewnij się, że są one nadal niezbędne, i usuń wszystkie, które nie są już potrzebne, co pomaga zmniejszyć bałagan i potencjalne zagrożenia bezpieczeństwa.
  • Obracanie wpisów tajnych: Regularnie obracaj wpisy tajne, aby zminimalizować przedział czasu, w którym można wykorzystać naruszony wpis tajny. Okresowo zmieniając wpisy tajne, zwiększasz bezpieczeństwo.
  • Wybieranie właściwej metody uwierzytelniania
    • Używane typy wpisów tajnych:
      • Osobiste tokeny dostępu (PATs): te tokeny są używane do uwierzytelniania. Postępuj zgodnie z najlepszymi rozwiązaniami w zakresie zabezpieczeń podczas wybierania odpowiedniej metody uwierzytelniania. Usługi PAT można zarządzać przy użyciu interfejsu API REST.
      • Zmienne tajne: użyj zmiennych tajnych, aby bezpiecznie przechowywać poufne informacje, takie jak klucze interfejsu API, hasła lub inne poświadczenia w potoku.
      • Wpisy tajne usługi Azure Key Vault: bezpieczne przechowywanie wpisów tajnych i zarządzanie nimi za pomocą usługi Azure Key Vault.
      • Połączenia z usługami: te połączenia usług umożliwiają potokowi łączenie się z usługami zewnętrznymi (na przykład Azure, GitHub, Docker Hub). Upewnij się, że konfiguracja i bezpieczna obsługa wpisów tajnych połączenia usługi.

Korzystanie z szablonów YAML

Zamiast dołączać skrypty wbudowane z parametrami tajnymi bezpośrednio w potoku YAML, użyj szablonów. Takie podejście zwiększa bezpieczeństwo przez abstrakcja poufnych informacji z dala od głównego potoku.

Aby zaimplementować to podejście, utwórz oddzielny plik YAML dla skryptu, a następnie zapisz ten skrypt w osobnym, bezpiecznym repozytorium. Następnie możesz odwołać się do szablonu i przekazać zmienną wpisu tajnego w języku YAML jako parametr. Bezpieczna zmienna powinna pochodzić z usługi Azure Key Vault, grupy zmiennych lub interfejsu użytkownika potoku. Aby uzyskać więcej informacji na temat korzystania z szablonów, zobacz Dokumentację użycia szablonu.

Ograniczanie wpisów tajnych przy użyciu zasad gałęzi i uprawnień grupy zmiennych

Aby upewnić się, że wpisy tajne są powiązane z gałęzią main i nie są dostępne dla losowych gałęzi, możesz użyć kombinacji uprawnień grupy zmiennych, wstawiania zadań warunkowych i zasad gałęzi.

Za pomocą zasad gałęzi można wymusić zasady walidacji kompilacji, które zezwalają tylko na kompilacje z gałęzi głównej. Następnie możesz użyć uprawnień grupy zmiennych, aby upewnić się, że tylko autoryzowane potoki mają dostęp do wpisów tajnych przechowywanych w grupie zmiennych. Na koniec możesz użyć warunku w potoku, aby upewnić się, że grupa zmiennych może być przywołyana tylko przez wypchnięcie do main gałęzi.

jobs:
- job: ExampleJob
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: echo "This runs only for the main branch"
    displayName: 'Conditional Step'
  variables:
  - group: your-variable-group-name

Następne kroki