Gerir segredos encriptados em aplicações do Service Fabric

Este guia orienta-o ao longo dos passos de gestão de segredos numa aplicação do Service Fabric. Os segredos podem ser informações confidenciais, como cadeias de ligação de armazenamento, palavras-passe ou outros valores que não devem ser processados em texto simples.

A utilização de segredos encriptados numa aplicação do Service Fabric envolve três passos:

  • Configurar um certificado de encriptação e encriptar segredos.
  • Especifique segredos encriptados numa aplicação.
  • Desencriptar segredos encriptados do código de serviço.

Configurar um certificado de encriptação e encriptar segredos

Configurar um certificado de encriptação e utilizá-lo para encriptar segredos varia entre o Windows e o Linux.

Especificar segredos encriptados numa aplicação

O passo anterior descreve como encriptar um segredo com um certificado e produzir uma cadeia codificada de base 64 para utilização numa aplicação. Esta cadeia codificada de base 64 pode ser especificada como um parâmetro encriptado no Settings.xml de um serviço ou como uma variável de ambiente encriptada no ServiceManifest.xml de um serviço.

Especifique um parâmetro encriptado no ficheiro de configuração Settings.xml do serviço com o IsEncrypted atributo definido como true:

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Section Name="MySettings">
    <Parameter Name="MySecret" IsEncrypted="true" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
  </Section>
</Settings>

Especifique uma variável de ambiente encriptada no ficheiro de ServiceManifest.xml do seu serviço com o Type atributo definido como Encrypted:

<CodePackage Name="Code" Version="1.0.0">
  <EnvironmentVariables>
    <EnvironmentVariable Name="MyEnvVariable" Type="Encrypted" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
  </EnvironmentVariables>
</CodePackage>

Os segredos também devem ser incluídos na sua aplicação do Service Fabric ao especificar um certificado no manifesto da aplicação. Adicione um elemento SecretsCertificate ao ApplicationManifest.xml e inclua o thumbprint do certificado pretendido.

<ApplicationManifest … >
  ...
  <Certificates>
    <SecretsCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbrint]"/>
  </Certificates>
</ApplicationManifest>

Nota

Ao ativar uma aplicação que especifica um SecretsCertificate, o Service Fabric irá encontrar o certificado correspondente e conceder a identidade que a aplicação está a executar sob permissões completas para a chave privada do certificado. O Service Fabric também monitorizará o certificado para alterações e aplicará novamente as permissões em conformidade. Para detetar alterações de certificados declarados pelo nome comum, o Service Fabric executa uma tarefa periódica que localiza todos os certificados correspondentes e compara-os com uma lista em cache de thumbprints. Quando é detetado um novo thumbprint, significa que um certificado desse requerente foi renovado. A tarefa é executada uma vez por minuto em cada nó do cluster.

Embora o SecretsCertificate permita declarações baseadas no assunto, tenha em atenção que as definições encriptadas estão ligadas ao par de chaves que foi utilizado para encriptar a definição no cliente. Tem de garantir que o certificado de encriptação original (ou equivalente) corresponde à declaração baseada no assunto e que está instalado, incluindo a chave privada correspondente, em todos os nós do cluster que possam alojar a aplicação. Todos os certificados válidos de tempo correspondentes à declaração baseada no requerente e criados a partir do mesmo par de chaves que o certificado de encriptação original são considerados equivalentes.

Injetar segredos da aplicação em instâncias de aplicações

Idealmente, a implementação em diferentes ambientes deve ser o mais automatizada possível. Isto pode ser conseguido ao executar a encriptação secreta num ambiente de compilação e ao fornecer os segredos encriptados como parâmetros ao criar instâncias de aplicações.

Utilizar parâmetros exagerados no Settings.xml

O ficheiro de configuração Settings.xml permite parâmetros exagerados que podem ser fornecidos no momento da criação da aplicação. Utilize o MustOverride atributo em vez de fornecer um valor para um parâmetro:

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Section Name="MySettings">
    <Parameter Name="MySecret" IsEncrypted="true" Value="" MustOverride="true" />
  </Section>
</Settings>

Para substituir valores no Settings.xml, declare um parâmetro de substituição para o serviço no ApplicationManifest.xml:

<ApplicationManifest ... >
  <Parameters>
    <Parameter Name="MySecret" DefaultValue="" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateful1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides>
      <ConfigOverride Name="Config">
        <Settings>
          <Section Name="MySettings">
            <Parameter Name="MySecret" Value="[MySecret]" IsEncrypted="true" />
          </Section>
        </Settings>
      </ConfigOverride>
    </ConfigOverrides>
  </ServiceManifestImport>

Agora, o valor pode ser especificado como um parâmetro de aplicação ao criar uma instância da aplicação. A criação de uma instância de aplicação pode ser escrita com scripts com o PowerShell ou escrita em C#, para uma integração fácil num processo de compilação.

Com o PowerShell, o parâmetro é passado para o comando New-ServiceFabricApplication como uma tabela hash:

New-ServiceFabricApplication -ApplicationName fabric:/MyApp -ApplicationTypeName MyAppType -ApplicationTypeVersion 1.0.0 -ApplicationParameter @{"MySecret" = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM="}

Com C#, os parâmetros da aplicação são especificados como ApplicationDescription um NameValueCollection:

FabricClient fabricClient = new FabricClient();

NameValueCollection applicationParameters = new NameValueCollection();
applicationParameters["MySecret"] = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=";

ApplicationDescription applicationDescription = new ApplicationDescription(
    applicationName: new Uri("fabric:/MyApp"),
    applicationTypeName: "MyAppType",
    applicationTypeVersion: "1.0.0",
    applicationParameters: applicationParameters)
);

await fabricClient.ApplicationManager.CreateApplicationAsync(applicationDescription);

Desencriptar segredos encriptados do código de serviço

As APIs para aceder a parâmetros e variáveis de ambiente permitem uma desencriptação fácil de valores encriptados. Uma vez que a cadeia encriptada contém informações sobre o certificado utilizado para encriptação, não precisa de especificar manualmente o certificado. O certificado só precisa de ser instalado no nó no qual o serviço está em execução.

// Access decrypted parameters from Settings.xml
ConfigurationPackage configPackage = FabricRuntime.GetActivationContext().GetConfigurationPackageObject("Config");
bool MySecretIsEncrypted = configPackage.Settings.Sections["MySettings"].Parameters["MySecret"].IsEncrypted;
if (MySecretIsEncrypted)
{
    SecureString MySecretDecryptedValue = configPackage.Settings.Sections["MySettings"].Parameters["MySecret"].DecryptValue();
}

// Access decrypted environment variables from ServiceManifest.xml
// Note: you do not have to call any explicit API to decrypt the environment variable.
string MyEnvVariable = Environment.GetEnvironmentVariable("MyEnvVariable");

Passos seguintes