Zarządzanie wpisami tajnymi w Spring Cloud Azure

Konstrukcja Spring Cloud Azure PropertySource, która przechowuje klucze tajne zapisane w usłudze Azure Key Vault Secrets.

Konfiguracja zależności

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-starter-keyvault-secrets</artifactId>
</dependency>

Wskazówka

Udostępniamy również spring-cloud-azure-starter-keyvault do obsługi wszystkich funkcji usługi Key Vault. Jeśli zdecydujesz się go użyć, spring.cloud.azure.keyvault.enable jest właściwością do skonfigurowania, a wartość domyślna to true. Następnie możesz użyć spring.cloud.azure.keyvault.<keyvault-service>.enable, aby wyłączyć niepotrzebne usługi.

Podstawowe użycie

Jeśli chcesz uwierzytelnić się za pomocą client-id i client-secret, wymagane są następujące właściwości:

Właściwości konfiguracji

spring:
  cloud:
    azure:
      keyvault:
        secret:
          property-sources:
            - name: key-vault-property-source-1
              endpoint: ${ENDPOINT_1}
            - name: key-vault-property-source-2
              endpoint: ${ENDPOINT_2}

Kod Java

@SpringBootApplication
public class SampleApplication implements CommandLineRunner {

    @Value("${sampleProperty1}")
    private String sampleProperty1;
    @Value("${sampleProperty2}")
    private String sampleProperty2;
    @Value("${samplePropertyInMultipleKeyVault}")
    private String samplePropertyInMultipleKeyVault;

    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }

    public void run(String[] args) {
        System.out.println("sampleProperty1: " + sampleProperty1);
        System.out.println("sampleProperty2: " + sampleProperty2);
        System.out.println("samplePropertyInMultipleKeyVault: " + samplePropertyInMultipleKeyVault);
    }
}

Zaawansowane użycie

Znaki specjalne w nazwie właściwości

Nazwy wpisów tajnych w usłudze Key Vault obsługują tylko znaki wymienione w [0-9a-zA-Z-]. Aby uzyskać więcej informacji, zobacz sekcję Nazwa magazynu i nazwa obiektu w artykule Omówienie kluczy, wpisów tajnych i certyfikatów usługi Azure Key Vault. Jeśli nazwa właściwości zawiera inne znaki, możesz użyć obejść opisanych w poniższych sekcjach.

Użyj - zamiast . w nazwach sekretów

Znak . nie jest obsługiwany w nazwach wpisów tajnych. Jeśli aplikacja ma nazwę właściwości zawierającą ., taką jak spring.datasource.url, zastąp . na - podczas zapisywania wpisu tajnego w usłudze Azure Key Vault. Na przykład zapisz spring-datasource-url w usłudze Azure Key Vault. W aplikacji nadal można użyć spring.datasource.url, aby pobrać wartość właściwości.

Uwaga

Ta metoda nie może spełnić wymagań, takich jak spring.datasource-url. Po zapisaniu spring-datasource-url w usłudze Key Vault do pobierania wartości właściwości są obsługiwane tylko spring.datasource.url i spring-datasource-url, natomiast spring.datasource-url nie jest obsługiwane. Aby obsłużyć ten przypadek, zobacz sekcję Używanie symboli zastępczych właściwości.

Użyj symboli zastępczych dla właściwości

Załóżmy na przykład, że ustawiasz tę właściwość w pliku application.properties:

property.with.special.character__=${propertyWithoutSpecialCharacter}

Aplikacja pobierze nazwę klucza propertyWithoutSpecialCharacter i przypisze jej wartość do property.with.special.character__.

Uwzględniana wielkość liter

Aby włączyć tryb uwzględniający wielkość liter, można ustawić następującą właściwość:

spring.cloud.azure.keyvault.secret.property-sources[].case-sensitive=true

Nie pobieraj wszystkich wpisów tajnych z usługi Key Vault

Jeśli masz zapisanych 1000 sekretów w usłudze Key Vault i chcesz użyć tylko 3 z nich. Możesz wyświetlić listę 3 tajnych nazw za pomocą spring.cloud.azure.keyvault.secret.property-sources[].secret-keys.

Ustawianie interwału odświeżania

Domyślnie wpisy tajne w KeyVaultPropertySource będą odświeżane co 30 minut. Czas można skonfigurować przez spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval. Na przykład: spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval=60m oznacza odświeżanie co 60 minut. Ustaw wartość 0, aby wyłączyć automatyczne odświeżanie.

Priorytet źródła właściwości

Jeśli klucz istnieje w wielu źródłach właściwości, o tym, która wartość zostanie zastosowana, decyduje priorytet.

  • Jeśli na liście SystemEnvironmentPropertySource nie ma PropertySource, KeyVaultPropertySource będzie mieć najwyższy priorytet.
  • Jeśli na liście PropertySource znajduje się SystemEnvironmentPropertySource, wówczas SystemEnvironmentPropertySource mają wyższy priorytet niż KeyVaultPropertySource, co oznacza, że możesz użyć zmiennej środowiskowej, aby nadpisać wartość klucza tajnego w usłudze Key Vault w aplikacji.
  • Jeśli na liście PropertySource znajduje się wiele źródeł właściwości magazynu kluczy, kolejność definicji jest kolejnością priorytetu. W powyższym przykładzie key-vault-property-source-1 ma wyższy priorytet niż key-vault-property-source-2.

Konfigurowanie poświadczeń tokenu dla źródła właściwości Key Vault

Jeśli musisz użyć określonego poświadczenia tokenowego dla usługi Key Vault PropertySource, możesz zarejestrować bean TokenCredential w ConfigurableBootstrapContext dla KeyVaultEnvironmentPostProcessor; ta funkcja jest dostępna od wersji Spring Cloud Azure 5.16.0. Oto przykład użycia AzureCliCredential:

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(PropertySourceApplication.class);
    application.addBootstrapRegistryInitializer(registry -> 
            registry.register(TokenCredential.class, context -> new AzureCliCredentialBuilder().build()));

    application.run(args);
}

Wszystkie konfigurowalne właściwości

Własność Wartość domyślna Opis
spring.cloud.azure.keyvault.secret.property-source-enabled prawdziwy Określa, czy włączyć źródło właściwości Key Vault.
spring.cloud.azure.keyvault.secret.property-sources[].name Nazwa tego źródła właściwości.
spring.cloud.azure.keyvault.secret.property-sources[].endpoint Punkt końcowy usługi Azure Key Vault.
spring.cloud.azure.keyvault.secret.property-sources[].case-sensitive fałszywy Określa, czy klucze tajne rozróżniają wielkość liter.
spring.cloud.azure.keyvault.secret.property-sources[].secret-keys Klucze tajne obsługiwane przez to źródło właściwości. Wszystkie klucze są pobierane, jeśli brakuje tej właściwości.
spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval 30 m Interwał czasowy odświeżania wszystkich wpisów tajnych usługi Key Vault.
spring.cloud.azure.keyvault.secret.property-sources[].service-version Wersja usługi tajnej używana podczas tworzenia żądań interfejsu API.
spring.cloud.azure.keyvault.secret.property-sources[].client Właściwości dotyczące klienta.
spring.cloud.azure.keyvault.secret.property-sources[].credential Właściwości powiązane z poświadczeniami.
spring.cloud.azure.keyvault.secret.property-sources[].profile Właściwości powiązane z profilem.
spring.cloud.azure.keyvault.secret.property-sources[].proxy Właściwości powiązane z serwerem proxy.
spring.cloud.azure.keyvault.secret.property-sources[].retry Ponów próbę powiązanych właściwości.

Próbki

Zobacz przykłady w witrynie spring-cloud-azure-starter-keyvault-secrets GitHub.