Gerenciar segredos criptografados em aplicativos do Service Fabric

Este guia orienta você pelas etapas de gerenciamento de segredos em um aplicativo do Service Fabric. Os segredos podem ser qualquer informação confidencial, como cadeias de conexão de armazenamento, senhas ou outros valores que não devem ser manipulados em texto sem formatação.

O uso de segredos criptografados em um aplicativo do Service Fabric envolve três etapas:

  • Configure um certificado de criptografia e criptografe segredos.
  • Especifique segredos criptografados em um aplicativo.
  • Desencriptar segredos encriptados do código de serviço.

Configurar um certificado de criptografia e criptografar segredos

Configurar um certificado de criptografia e usá-lo para criptografar segredos varia entre Windows e Linux.

Especificar segredos criptografados em um aplicativo

A etapa anterior descreve como criptografar um segredo com um certificado e produzir uma cadeia de caracteres codificada em base 64 para uso em um aplicativo. Essa cadeia de caracteres codificada em base 64 pode ser especificada como um parâmetro criptografado no Settings.xml de um serviço ou como uma variável de ambiente criptografado no ServiceManifest.xml de um serviço.

Especifique um parâmetro criptografado no arquivo de configuração de 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 criptografado no arquivo ServiceManifest.xml do 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 em seu aplicativo do Service Fabric especificando um certificado no manifesto do aplicativo. Adicione um elemento SecretsCertificate ao ApplicationManifest.xml e inclua a impressão digital do certificado desejado.

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

Nota

Ao ativar um aplicativo que especifica um SecretsCertificate, o Service Fabric localizará o certificado correspondente e concederá a identidade que o aplicativo está executando com permissões totais para a chave privada do certificado. O Service Fabric também monitorará o certificado em busca de alterações e reaplicará as permissões de acordo. Para detetar alterações em certificados declarados por nome comum, o Service Fabric executa uma tarefa periódica que localiza todos os certificados correspondentes e a compara com uma lista em cache de impressões digitais. Quando uma nova impressão digital é detetada, significa que um certificado desse assunto foi renovado. A tarefa é executada uma vez por minuto em cada nó do cluster.

Embora o SecretsCertificate permita declarações baseadas em assunto, observe que as configurações criptografadas estão vinculadas ao par de chaves que foi usado para criptografar a configuração no cliente. Você deve garantir que o certificado de criptografia original (ou equivalente) corresponda à declaração baseada em assunto e que ele esteja instalado, incluindo sua chave privada correspondente, em cada nó do cluster que possa hospedar o aplicativo. Todos os certificados válidos por tempo correspondentes à declaração baseada em assunto e construídos a partir do mesmo par de chaves que o certificado de criptografia original são considerados equivalentes.

Injetar segredos de aplicativos em instâncias de aplicativos

Idealmente, a implantação em diferentes ambientes deve ser o mais automatizada possível. Isso pode ser feito executando criptografia secreta em um ambiente de compilação e fornecendo os segredos criptografados como parâmetros ao criar instâncias de aplicativo.

Use parâmetros substituíveis no Settings.xml

O arquivo de configuração Settings.xml permite parâmetros substituíveis que podem ser fornecidos no momento da criação do aplicativo. Use 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 em 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 aplicativo ao criar uma instância do aplicativo. A criação de uma instância de aplicativo pode ser executada por script usando o PowerShell ou escrita em C#, para facilitar a integração em um 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="}

Usando C#, os parâmetros do aplicativo são especificados em um ApplicationDescription como :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. Como a cadeia de caracteres criptografada contém informações sobre o certificado usado para criptografia, não é necessário especificar manualmente o certificado. O certificado só precisa ser instalado no nó em que o serviço está sendo executado.

// 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");

Próximos passos