Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Ten artykuł przedstawia dobre praktyki dotyczące ochrony tajemnic 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 tajnych, ale może być konieczne umieszczenie danych poufnych w potokach, takich jak klucze API, aby je przechowywać.
Ten artykuł jest częścią serii, która ułatwia implementowanie środków zabezpieczeń dla usługi Azure Pipelines. Aby uzyskać więcej informacji, zobacz Secure Azure Pipelines.
Wymagania wstępne
| Kategoria | Wymagania |
|---|---|
| Azure DevOps | — Zaimplementuj zalecenia zawarte w Zabezpiecz swoje Azure DevOps oraz Zabezpiecz Azure Pipelines. — Podstawowa wiedza na temat języka YAML i usługi Azure Pipelines. Aby uzyskać więcej informacji, zobacz Utwórz swój pierwszy potok. |
| Uprawnienia | - Aby zmodyfikować uprawnienia potoków: Członek grupy Administratorzy projektu. - Aby zmodyfikować uprawnienia organizacji: członek grupy Administratorzy kolekcji projektów. |
Użyj innej metody
Wpisy tajne stanowią nieodłączne zagrożenia bezpieczeństwa, więc najlepiej nie używać ich w ogóle. Zamiast zarządzać tajnymi danymi w zmiennych lub ujawniać je w konfiguracji potoku, sprawdź, czy potok może użyć jednej z tych innych metod, aby wykonać zadanie.
- Skonfiguruj połączenia usług , aby bezpiecznie łączyć się z platformą Azure lub innymi usługami, takimi jak GitHub lub Docker. Aby uzyskać więcej informacji, zobacz Nawiązywanie połączenia z platformą Azure za pomocą połączenia usługi Azure Resource Manager.
- Użyj tożsamości zarządzanych , aby umożliwić aplikacjom i usługom uwierzytelnianie za pomocą usług platformy Azure bez użycia jawnych poświadczeń.
- Użyj zadania interfejsu wiersza polecenia platformy Azure z opcją
addSpnToEnvironmentw potoku, aby uzyskać dostęp do szczegółów pryncypałów usługi bez jawnego przekazywania wpisów tajnych.
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 azure-pipelines.yml . Możesz użyć zmiennych tajnych dla informacji prywatnych, takich jak hasła, identyfikatory i inne dane identyfikujące, których nie chcesz ujawniać. Zmienne tajne są szyfrowane, więc można ich używać w potokach bez uwidaczniania ich wartości.
- Najlepiej bezpiecznie zarządzać zmiennymi tajnymi w usłudze Azure Key Vault. Można również ustawić zmienne sekretne w interfejsie definicji potoku lub w grupie zmiennych.
- Nie używaj polecenia rejestrowania, aby ustawić zmienną tajną, ponieważ każdy, kto ma dostęp do potoku, może również wyświetlić tę zmienną.
- Nigdy nie wysyłaj wpisów tajnych jako danych wyjściowych i nie przekazuj wpisów tajnych w wierszu polecenia. Zamiast tego najlepiej przypisać tajne dane do zmiennych środowiskowych.
- 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.
Aby dowiedzieć się więcej na temat ustawiania zmiennych tajnych, zobacz Ustaw zmienne tajne.
Ograniczanie dostępu do zmiennych tajnych
Aby ograniczyć dostęp do tajnych danych w usłudze Azure DevOps, postępuj zgodnie z jedną z następujących praktyk:
- Przechowuj swoje tajemnice w Azure Key Vault. Korzystając z Azure Key Vault, możesz użyć kontroli dostępu opartej na rolach Azure, aby ograniczyć dostęp do sekretu lub grupy sekretów.
- Ustaw tajne zmienne w UI potoku. Te zmienne są ograniczone do potoku, w którym są ustawione, więc są widoczne tylko dla użytkowników tego potoku.
- Ustaw tajne w grupach zmiennych. Grupy zmiennych są zgodne z modelem zabezpieczeń biblioteki , dzięki czemu możesz kontrolować, kto może uzyskiwać dostęp do elementów lub tworzyć je.
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 formatu danych wyjściowych None, a jeśli chcesz pobrać tajny element z wywołania interfejsu wiersza polecenia platformy Azure, pobierz informacje o zabezpieczeniach ze zmiennej tajnej.
Nie używaj danych strukturalnych jako wpisów tajnych
Unikaj używania formatów danych strukturalnych, takich jak JSON, XML lub YAML, aby zabezpieczać wartości tajnych, w tym znaków kontrolnych, takich jak powrót karetki \r i znak nowej linii \n. Zamiast tego należy utworzyć poszczególne wpisy tajne dla każdej poufnej wartości. To podejście zapewnia lepszą dokładność redagowania i minimalizuje ryzyko nieumyślnego ujawnienia poufnych danych.
Audyt użycia tajnych danych
Aby przeprowadzić inspekcję sposobu używania tajemnic przez potoki, postępuj zgodnie z następującymi najlepszymi praktykami:
Sprawdź kod źródłowy repozytorium, które hostuje pipeline. Aby upewnić się, że sekrety są poprawnie obsługiwane, sprawdź wszystkie zadania używane przez potok danych. Sprawdź, czy wpisy tajne nie są przypadkowo wysyłane do niezamierzonych hostów lub jawnie drukowane w celu rejestrowania danych wyjściowych.
Po przetestowaniu prawidłowych i nieprawidłowych danych wejściowych wyświetl dzienniki działania 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:
- Okresowo przeglądaj tajemnice zarejestrowane w potokach. Upewnij się, że są one nadal niezbędne i usuń wszystkie, które nie są już potrzebne. Ta praktyka pomaga zmniejszyć bałagan i potencjalne zagrożenia bezpieczeństwa.
- Upewnij się, że konfiguracja i bezpieczna obsługa wpisów tajnych połączenia usługi.
- Zachowaj krótki czas trwania osobistego tokenu dostępu (PAT) i wybierz minimalne wymagane uprawnienia.
- Regularnie aktualizuj tajemnice, aby zminimalizować czas, w którym naruszona tajemnica może zostać wykorzystana. Okresowe zmienianie danych tajnych zwiększa bezpieczeństwo.
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 i zapisz ten skrypt w osobnym, bezpiecznym repozytorium. Następnie możesz odwołać się do szablonu i przekazać zmienną tajną z usługi Azure Key Vault, grupy zmiennych lub interfejsu użytkownika potoków w języku YAML jako parametr. 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 sekrety są dostępne tylko dla określonej gałęzi repozytorium, można użyć kombinacji polityk gałęzi, uprawnień do grup zmiennych i wstawiania zadań warunkowych.
Wymuszanie zasad weryfikacji kompilacji , które zezwalają na kompilacje tylko z określonej gałęzi. Następnie użyj uprawnień grupy zmiennych, aby upewnić się, że tylko autoryzowane potoki mogą uzyskiwać dostęp do tajnych danych przechowywanych w grupie zmiennych. Na koniec użyj warunku w potoku, aby upewnić się, że tylko wypchnięcie do wyznaczonej gałęzi może odwoływać się do grupy zmiennych.
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