Gerir segredos encriptados em aplicações de Tecido de Serviço

Este guia acompanha-o através dos passos de gestão de segredos numa aplicação de Tecido de Serviço. Segredos podem ser qualquer informação sensível, como cadeias de ligação de armazenamento, palavras-passe ou outros valores que não devem ser tratados em texto simples.

A utilização de segredos encriptados numa aplicação de Tecido de Serviço envolve três etapas:

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

Crie um certificado de encriptação e criptografe segredos

A criação de um certificado de encriptação e a sua utilização 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 base-64 para uso numa aplicação. Esta cadeia codificada base-64 pode ser especificada como um parâmetro encriptado na Settings.xml de um serviço ou como uma variável de ambiente encriptado na ServiceManifest.xml de um serviço.

Especifique um parâmetro encriptado no ficheiro de configuração Settings.xml do seu serviço com o IsEncrypted atributo definido para 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 ServiceManifest.xml do seu serviço com o Type atributo definido para 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 Service Fabric especificando um certificado no manifesto de inscrição. Adicione um elemento SecretsCertificate à ApplicationManifest.xml e inclua a impressão digital 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 encontrará o certificado de correspondência e concederá a identidade que o pedido 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 reencaminho as permissões em conformidade. Para detetar alterações nos certificados declarados pelo nome comum, o Service Fabric executa uma tarefa periódica que encontra todos os certificados correspondentes e compara-o com uma lista de impressões digitais em cache. Quando uma nova impressão digital é detetada, significa que um certificado por esse sujeito foi renovado. A tarefa é executado uma vez por minuto em cada nó do cluster.

Embora o SecretsCertificate permita declarações baseadas no assunto, note que as definições encriptadas estão ligadas ao par de chaves que foi usado para encriptar a definição no cliente. Deve certificar-se de que o certificado de encriptação original (ou equivalente) corresponde à declaração baseada no assunto e que está instalado, incluindo a sua chave privada correspondente, em cada nó do cluster que possa acolher a aplicação. Todos os certificados válidos pelo tempo que correspondem à declaração baseada no assunto e construídos a partir do mesmo par chave que o certificado de encriptação original são considerados equivalentes.

Injetar segredos de aplicação em instâncias de aplicação

Idealmente, a implantação em diferentes ambientes deve ser o mais automatizada possível. Isto pode ser realizado executando encriptação secreta em um ambiente de construção e fornecendo os segredos encriptados como parâmetros ao criar instâncias de aplicação.

Utilize parâmetros dominantes em Settings.xml

O ficheiro de configuração Settings.xml permite parâmetros sobrepúveis que podem ser fornecidos no tempo de 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 anular os valores em Settings.xml, declare um parâmetro de sobreposiçã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 aplicação ao criar uma instância da aplicação. A criação de uma instância de aplicação pode ser escrita usando o PowerShell, ou escrito em C#, para facilitar a integração num processo de construçã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="}

Utilizando C#, os parâmetros de aplicação são especificados em comoApplicationDescription: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 ambientais permitem uma desencriptação fácil de valores encriptados. Uma vez que o string encriptado contém informações sobre o certificado utilizado para encriptação, não é necessário especificar manualmente o certificado. O certificado só precisa de ser instalado no nó onde o serviço está a funcionar.

// 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