Compartilhar via


Serviço Secreto Central no Azure Service Fabric

O Serviço Secreto Central (CSS), também conhecido como Armazenamento Secreto Central, é um serviço do sistema Service Fabric destinado a proteger segredos dentro de um cluster. CSS facilita o gerenciamento de segredos para aplicações SF, eliminando a necessidade de confiar em parâmetros criptografados.

O Serviço Secreto Central é um cache secreto em cluster replicado e durável; os segredos armazenados em CSS são criptografados em repouso para um certificado de criptografia fornecido pelo cliente. O CSS fornece APIs de cliente para gerenciamento de segredos, acessíveis a entidades que se autenticam como o cluster ou a um usuário administrador de cluster. O modelo de aplicativo de tempo de execução do Service Fabric integra-se ao CSS, permitindo a declaração de parâmetros do aplicativo como referências secretas do CSS.

O CSS também é fundamental no provisionamento de segredos de aplicativos declarados como URIs secretos do KeyVault, em combinação com a Identidade Gerenciada para Aplicativos do Service Fabric implantados no Azure.

O Serviço Secreto Central não se destina a substituir um serviço de gerenciamento de segredos externos dedicado, como o Azure Key Vault.

Nota

Ao ativar o CSS em um cluster SF executando uma versão anterior à 7.1. CU3, a ativação pode falhar e deixar o CSS em um estado permanentemente não íntegro se o cluster estiver configurado para autenticação do Windows ou se EncryptionCertificateThumbprint for declarado incorretamente ou se o certificado correspondente não estiver instalado. Em ambos os casos, é aconselhável atualizar o cluster para uma versão de tempo de execução SF mais recente que a 7.1. CU3 antes de prosseguir.

Ativar o Serviço de Segredos Centrais

Para habilitar o Serviço Secreto Central, atualize a configuração do cluster conforme descrito abaixo. Recomendamos que você use um certificado de criptografia diferente do certificado de cluster. Este certificado deve ser instalado em todos os nós.

{ 
    "fabricSettings": [
        {
            "name":  "CentralSecretService",
            "parameters":  [
                {
                    "name":  "DeployedState",
                    "value":  "enabled"
                },
                {
                    "name" : "EncryptionCertificateThumbprint",
                    "value": "<thumbprint>"
                },
                {
                    "name":  "MinReplicaSetSize",
                    "value":  "1"
                },
                {
                    "name":  "TargetReplicaSetSize",
                    "value":  "3"
                }
            ]
        }
    ]
}

Nota

A definição de configuração "DeployedState", introduzida na versão 8.0 do Service Fabric, é o mecanismo preferido para ativar ou desativar o CSS, esta função era servida em versões anteriores pela definição de configuração "IsEnabled", que agora é considerada obsoleta.

Modelo secreto do Serviço Secreto Central

A API do Serviço Secreto Central expõe dois tipos: recurso secreto e versão secreta. O tipo de recurso secreto representa, conceitualmente, uma família de versões de um único segredo usado para um propósito específico; Os exemplos incluem: uma cadeia de conexão, uma senha, um certificado de ponto de extremidade. Um objeto do tipo de recurso secreto contém metadados associados a esse segredo, especificamente tipo, tipo de conteúdo e descrição. O tipo de versão secreta representa uma instância específica de seu segredo associado e armazena o texto sem formatação secreto (criptografado); Continuando com os exemplos acima, uma versão secreta contém o valor da senha atual, um objeto de certificado válido até o final do mês, etc. Após a renovação desses segredos, novas versões secretas devem ser produzidas (e adicionadas ao CSS).

Formalizando o modelo, seguem-se as regras implementadas e aplicadas na implementação do CSS:

  • Um recurso secreto pode ter zero ou mais versões
  • Toda versão secreta é filha de um recurso secreto particular; Uma versão pode ter apenas um recurso pai
  • Uma versão secreta individual pode ser excluída, sem afetar outras versões do mesmo segredo
  • A exclusão de um recurso secreto causa a exclusão de todas as suas versões
  • O valor de uma versão secreta é imutável

Declarar um recurso secreto

Você pode criar um recurso secreto usando a API REST.

Nota

Se o cluster estiver usando a autenticação do Windows sem um certificado HttpGateway, a solicitação REST será enviada pelo canal HTTP não seguro. Para habilitar o TLS para esse canal, a definição de cluster deve ser atualizada para especificar um certificado de servidor gateway http.

Para criar um supersecret recurso secreto usando a API REST, faça uma solicitação PUT para https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview. Você precisará autenticar usando um certificado de cluster ou um certificado de cliente administrador para criar um recurso secreto.

$json = '{"properties": {"kind": "inlinedValue", "contentType": "text/plain", "description": "supersecret"}}'
Invoke-WebRequest  -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview -Method PUT -CertificateThumbprint <CertThumbprint> -Body $json

Definir o valor secreto

Use o script a seguir para usar a API REST para definir o valor secreto.

$Params = '{"properties": {"value": "mysecretpassword"}}'
Invoke-WebRequest -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret/values/ver1?api-version=6.4-preview -Method PUT -Body $Params -CertificateThumbprint <ClusterCertThumbprint>

Examinar o valor secreto

Invoke-WebRequest -CertificateThumbprint <ClusterCertThumbprint> -Method POST -Uri "https:<clusterfqdn>/Resources/Secrets/supersecret/values/ver1/list_value?api-version=6.4-preview"

Use o segredo em seu aplicativo

Um aplicativo pode consumir um segredo do CSS declarando-o como uma variável de ambiente ou especificando um caminho onde o texto sem formatação secreto deve ser serializado. Siga estas etapas para fazer referência a um segredo CSS:

  1. Adicione uma seção no arquivo settings.xml com o seguinte trecho. Observe aqui que o valor está no formato {secretname:version}.
     <Section Name="testsecrets">
      <Parameter Name="TopSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/
     </Section>
  1. Importe a seção no ApplicationManifest.xml.
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
 <ConfigPackagePolicies CodePackageRef="Code">
   <ConfigPackage Name="Config" SectionName="testsecrets" EnvironmentVariableName="SecretPath" />
   </ConfigPackagePolicies>
</Policies>
</ServiceManifestImport>

Exemplo 1: Monte os segredos em um contêiner. A única alteração necessária para disponibilizar os segredos dentro do contêiner é para specify um ponto de montagem no <ConfigPackage>. O trecho a seguir é o ApplicationManifest.xml modificado.

   <ServiceManifestImport>
       <ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
       <ConfigOverrides />
       <Policies>
         <ConfigPackagePolicies CodePackageRef="Code">
           <ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="C:\secrets" EnvironmentVariableName="SecretPath" />
           <!-- Linux Container
            <ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="/mnt/secrets" EnvironmentVariableName="SecretPath" />
           -->
         </ConfigPackagePolicies>
       </Policies>
     </ServiceManifestImport>

Os segredos estão disponíveis sob o ponto de montagem dentro do seu recipiente.

Exemplo 2: Vincular um segredo a uma variável de ambiente de processo especificando Type='SecretsStoreRef. O trecho a seguir é um exemplo de como vincular a supersecret versão à variável MySuperSecret de ambiente no ServiceManifest.xmlver1.

   <EnvironmentVariables>
     <EnvironmentVariable Name="MySuperSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/>
   </EnvironmentVariables>

A variável SecretPath de ambiente apontará para o diretório onde todos os segredos estão armazenados. Cada parâmetro listado testsecrets na seção é armazenado em um arquivo separado. O aplicativo agora pode usar o segredo da seguinte maneira:

secretValue = IO.ReadFile(Path.Join(Environment.GetEnvironmentVariable("SecretPath"),  "TopSecret"))

Rotação do Certificado de Encriptação do Serviço Secreto Central

É importante notar que os certificados permanecem válidos para desencriptação após o seu termo. Neste momento, recomendamos continuar a provisionar certificados de criptografia anteriores após a rotação, para reduzir a chance de um bloqueio. Girar o certificado de criptografia CSS requer as seguintes etapas:

  1. Provisione o novo certificado para cada nó do cluster. No momento, não remova/continue provisionando o certificado de criptografia anterior.
  2. Inicie uma atualização de configuração de cluster para alterar o valor da EncryptionCertificateThumbprint impressão digital SHA-1 do novo certificado. Após a conclusão da atualização, o CSS começará a criptografar novamente seu conteúdo existente para o novo certificado de criptografia. Todos os segredos adicionados ao CSS após este ponto serão criptografados diretamente no novo certificado de criptografia. Como a convergência para ter todos os segredos protegidos pelo novo certificado é assíncrona, é importante que o certificado de criptografia anterior permaneça instalado em todos os nós e disponível para CSS.

Removendo o Serviço Secreto Central do cluster

A remoção segura do Serviço Secreto Central de um cluster requer duas atualizações. A primeira atualização desativa funcionalmente o CSS, enquanto a segunda atualização remove o serviço da definição de cluster, que inclui a exclusão permanente de seu conteúdo. Esse processo de dois estágios evita a exclusão acidental do serviço e ajuda a garantir que não haja dependências órfãs no CSS durante o processo de remoção. Este recurso está disponível a partir da versão 8.0 do SF.

Etapa 1: Atualizar CSS DeployedState para remover

Atualizar a definição de "DeployedState" = "enabled" cluster de "IsEnabled" = "true" ou para

{
    "name":  "DeployedState",
    "value":  "removing"
}

Assim que o Serviço Secreto Central entrar no estado Removingimplantado, ele rejeitará todas as chamadas de API secretas recebidas, sejam chamadas REST diretas ou por meio de ativações de serviços que incluem SecretStoreRefs ou KeyVaultReferences. Todos os aplicativos ou componentes no cluster que ainda dependem de CSS neste momento entrarão no estado de Aviso. Se isso ocorrer, a atualização para o estado Removing implantado deverá ser revertida, se essa atualização já tiver sido bem-sucedida, uma nova atualização deverá ser iniciada para alterar o CSS de volta para DeployedState = Enabled. Se o Serviço Secreto Central receber uma solicitação enquanto estiver no estado Removingimplantado, ele retornará o Código HTTP 401 (não autorizado) e se colocará em um estado de integridade de Aviso.

Etapa 2: Atualizar CSS DeployedState para desativado

Atualizar a definição de cluster de "DeployedState" = "removing" para

{
    "name":  "DeployedState",
    "value":  "disabled"
}

O Serviço Secreto Central não deve mais estar em execução no cluster e não estará presente na lista de serviços do sistema. O conteúdo do CSS está irremediavelmente perdido.

Próximos passos