Gerenciando Segredos

Crie e gerencie segredos do vault, tags de segredo e regras de segredo.

Com a importância de usar os serviços de nuvem da OCI, é importante armazenar, recuperar e gerenciar segredos em seu cofre digital. Os segredos podem ser uma senha, certificados, chaves SSH ou tokens de autenticação que você usa para estabelecer conexão com serviços e sistemas do OCI. O armazenamento de segredos no OCI Vault tem maior segurança do que armazená-los em um código ou arquivos de configuração. O aplicativo se comunica com o Gerenciamento de Segredos do OCI para recuperar o segredo e estabelecer conexão com o serviço de destino.

O Oracle Cloud Infrastructure Secret Management permite que você proteja facilmente dados confidenciais, como chaves de API, senhas e chaves de criptografia, usando segredos. Ele oferece uma solução robusta para criar, armazenar, gerenciar e acessar esses segredos com segurança. O armazenamento centralizado que ele fornece aproveita os módulos de segurança de hardware (HSMs) e o controle de acesso granular para proteger a segurança e a integridade das informações críticas. Use o OCI Secret Management para eliminar a incorporação de segredos diretamente nas aplicações e reduzir a superfície de ataque e fortalecer a segurança geral de uma aplicação.

Geração e Rotação Automáticas de Segredos

Quando um segredo é gerado, ele é atualizado periodicamente. Você pode atualizar um segredo manualmente ou definir automaticamente. A geração e rotação automáticas de segredos elimina o fardo de definir o segredo manualmente e rotacioná-lo usando scripts, mas fornece uma maneira eficiente de gerenciar segredos desde a criação, rotação e exclusão.

O recurso de geração automática de segredo suporta o uso de modelos para geração de segredo. Com a rotação automática de segredo, você pode definir um intervalo de segredo de 1 a 12 meses. O recurso se integra aos serviços Autonomous Database e Function, permitindo que você atualize um segredo usado no código do Autonomous Database ou do Functions. No OCI Functions, a rotação automática de segredos permite girar facilmente uma credencial e executar o código como parte do processo de rotação. O recurso de rotação de segredo de automação também está disponível para segredos criados manualmente.

Replicação entre Regiões de Segredos

Você pode replicar um segredo em até três regiões de destino. As réplicas são somente leitura e herdam as alterações feitas no segredo de origem. Consulte Replicando Segredos para obter mais informações.

Benefícios do uso da rotação automática de segredos

Veja a seguir os benefícios da rotação automática de segredos:
  • Segurança aprimorada: a atualização regular de seus segredos minimiza o impacto de credenciais comprometidas que levam a uma violação de dados.
  • Eficiência operacional: Automatizar tarefas manuais, como criar, girar um segredo, economiza tempo e eficiência.
  • Conformidade regulamentada: Aderir a muitos padrões que regulam a conformidade para rotação secreta e automação.
  • Erro humano reduzido: Automatizar tarefas repetitivas reduz a possibilidade de erros humanos para reforçar a segurança.

Geração de Segredo

Você pode gerar um segredo para frases-senhas, chaves SSH e bytes. Todos os segredos gerados pelo OCI Vault são compatíveis com FIPS e segurança. Você pode gerar um segredo usando a Console, a API ou a CLI do OCI. Ao gerar um segredo, você deve fornecer o contexto de segredo e definir o modelo de segredo. O contexto do segredo define o tipo e a estrutura do segredo. Com base no tipo de segredo selecionado; o Vault suporta diferentes modelos de geração de segredo.

Você pode gerar os seguintes tipos de segredo:
  • PASSPHRASE: Gere senhas com até 32 caracteres. Para senhas padrão do serviço OCI Database, o tamanho máximo de caracteres é 30.
  • SSH_KEY: Gerar pares de chaves RSA de comprimento 2048, 3072 e 4096. A chave privada é armazenada no formato PEM PKCS#8 e a chave pública é armazenada no formato X.509 PEM.
  • BYTES: Gera 512 e 1024 bytes que são segredos binários de reclamação do FIPS. Os bytes são o código base64.

Tipos de Segredo e Modelos Padrão

  • PASSPHRASE
    • Modelos suportados: SECRETS_DEFAULT_PASSWORD e DBAAS_DEFAULT_PASSWORD
    • Placeholder no modelo de segredo: %GENERATED_PASSPHRASE%
    • Exemplo: {"user": "abc", "pwd": "%GENERATED_PASSPHRASE%"}
  • SSH_KEY
    • Modelos suportados: RSA_2048, RSA_3072, RSA_4096
    • Placeholder no modelo de segredo: %GENERATED_PUBLIC_KEY%, %GENERATED_PRIVATE_KEY%
    • Exemplo: {"publicKey": "%GENERATED_PRIVATE_KEY%", "privateKey": "%GENERATED_PRIVATE_KEY%"} → {"publicKey": "-----BEGIN PUBLIC KEY-----\nBase64 encoded public key\n-----END PUBLIC KEY-----", "privateKey":"-----BEGIN PRIVATE KEY-----\nBase64 encoded private key\n-----END PRIVATE KEY-----"}
  • BYTES
    • Modelos suportados: BYTES_512, BYTES_1024
    • Placeholder no modelo de segredo: %GENERATED_BYTES%
    • Exemplo: {"host": "abc", "hostLuksKey": "%GENERATED_BYTES%"} → {"host": "abc", "hostLuksKey": "generatedbyteshere=="}

Versões de Segredo e Estados de Rotação

Saiba mais sobre versões de segredo do vault, estados de rotação e o impacto da limitação de versão de segredo.

O entendimento das versões e dos estados da rotação do segredo do vault ajuda a rastrear e gerenciar os conteúdos do segredo para ficar em conformidade com quaisquer limites, rotação ou outras regras ou regulamentos.

Para aprender conceitos básicos de segredo, incluindo versões e estados rotativos de segredo, consulte Conceitos de Gerenciamento de Chaves e Segredos. Para obter informações sobre como trabalhar com versões de segredos, consulte Gerenciando Segredos.

Funções de Rotação

As funções de rotação são responsáveis por girar os segredos no Serviço Secreto. Expanda a seção a seguir para saber mais sobre as quatro etapas em uma função de rotação e ver o código do handler de função de amostra

Etapas e detalhes da função de rotação

As funções de rotação incluíam as seguintes quatro etapas:

  1. VERIFY_CONNECTION: Verifica a conexão com o sistema de destino usando as credenciais existentes armazenadas no segredo.
  2. CREATE_PENDING_VERSION: Cria uma nova versão de segredo pendente no segredo.
  3. UPDATE_TARGET_SYSTEM: Atualiza o sistema de destino com as credenciais armazenadas na versão de segredo pendente criada na segunda etapa.
  4. PROMOTE_PENDING_VERSION: Atualiza o estado do segredo de pendente para atual.

Handler de funções:

O handler de função deve conter a lógica para chamar a etapa de rotação apropriada com base no parâmetro de etapa. Isso pode ser feito usando instruções condicionais IF ELSE ou switch case. O handler de função gerará um erro se um parâmetro de etapa inválido for fornecido.

Entrada:

O handler de função espera um único parâmetro: SecretRotationInput. O secretRotationInput é um POJO (objeto java Simplesmente antigo) que contém os parâmetros necessários para a rotação, incluindo secretId(String), step(String) e currentVersionNo(Long).

  • secretId: O identificador ou OCID do segredo
  • etapa: A etapa de rotação (Deve ser uma das seguintes: VERIFY_CONNECTION, CREATE_PENDING_VERSION, UPDATE_TARGET_SYSTEM ou PROMOTE_PENDING_VERSION)
  • currentVersionNo: O número da versão do segredo CURRENT

SecretRotationInput POJO


@Getter
@Setter
@ToString(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@AllArgsConstructor
@Builder(toBuilder = true)
public static class SecretRotationInput {
    private String step;
    private Long versionNo;
    private String secretId;
}                

Exemplo de código do handler de função:

public static class SecretRotationOutput {
    int responseCode;
    Long currentVersionNo;
    String returnMessage;
}
 
 
public SecretRotationOutput handleRequest(SecretRotationInput input) {
    switch(input.getStep()) {
        case "VERIFY_CONNECTION":
            return verifyConnection(input.getSecretId());
        case "CREATE_PENDING_VERSION":
            return createNewPendingVersion(input.getSecretId());
        case "UPDATE_TARGET_SYSTEM":
            return updateTargetSystem(input.getSecretId(), input.getVersionNo());
        case "PROMOTE_PENDING_VERSION":
            return promotePendingVersion(input.getSecretId(), input.getVersionNo());
        default:
            log.error("Secret Rotation: invalid rotation step");
            return SecretRotationOutput.builder()
                    .responseCode(400)
                    .currentVersionNo(null)
                    .returnMessage("INVALID STEP")
                    .build();
    }
}

Etapa 1: VERIFY_CONNECTION

Esta etapa verifica a conexão com o sistema de destino.

  • Entrada: Esse método espera somente o parâmetro SecretId.
  • Saída: Este método gera a saída SecretRotationOutput.
  • Lógica: A função primeiro tenta extrair a versão PENDING e verificar a conexão com ela. Isso trata o cenário de falha em que a nova tentativa anterior falhou ao promover a versão PENDING, mas a versão foi aplicada com sucesso ao sistema. Se for bem-sucedido, retorne a resposta de sucesso. Se falhar, extraia a versão atual e verifique a conexão. Se isso for bem-sucedido, retorne o código de resposta bem-sucedido juntamente com o número da versão atual. Se o erro não for bem-sucedido, retorne o erro.

Pseudocódigo para VERIFY_CONNECTION

pseudo code for verifyConnection:
    Check if "PENDING" secret version exists
        If it exist, verify connection
            If succeeds, then return success.
    Fetch the "CURRENT" secret version
    Verify connection with "CURRENT" secret version
       If succeeds, return success and the current version number in the response.
        If not, return SecretRotationOutput with appropriate error code and message.

Etapa 2: CREATE_PENDING_VERSION

Gera uma nova versão de segredo pendente.

  • Entrada: Esse método também aceita o parâmetro secretId.
  • Saída: Este método gera a saída SecretRotationOutput.
  • Lógica: Este método primeiro verifica a existência de uma versão de segredo no estado PENDING. Se não existir um, ele gerará uma nova versão de segredo PENDING. No entanto, se já existir uma, a etapa retornará a resposta de sucesso. Você também pode usar o campo de metadados do segredo para armazenar detalhes adicionais sobre a estrutura do segredo e pode usar a mesma estrutura ao criar uma nova versão do segredo. Você também pode usar o recurso de geração automática do serviço Secret para gerar automaticamente o conteúdo do segredo. A geração automática permite escrever funções mais genéricas.

Pseudocódigo para CREATE_PENDING_VERSION

pseudo code for createPendingVersion:
    Try to get the pending version
        If it succeeds, return success
        Else create a new secret version in "PENDING" state and then return success

Código de amostra:

// Constructor
public void constructorClass() {
     secretsDpClient = SecretsClient.builder()
                    .region(region)
                    .configuration(configuration)
                    .build(auth_provider);
     secretsCpClient = VaultsClient.builder()
                    .region(region)
                    .configuration(configuration)
                    .build(auth_provider);
}
 
private String createNewPassword() {
    // This method must contains the logic to generate the new secret content
}
  
private SecretRotationOutput createNewPendingVersion(SecretRotationInput input) {
    // Make sure the given secret exist
    Secret secret = secretsCpClient.getSecret(GetSecretRequest.builder()
                    .secretId(input.getSecretId())
            .build()).getSecret();
  
    // Now try to get the pending secret version, if that fails, create a new one
    try {
        GetSecretBundleRequest getSecretBundleRequest = GetSecretBundleRequest.builder()
                .secretId(input.getSecretId())
                .stage(GetSecretBundleRequest.Stage.Pending)
                .build();
        secretsDpClient.getSecretBundle(getSecretBundleRequest);
        return SecretRotationOutput.builder()
                .responseCode(200)
                .returnMessage("Successfully retrieved the pending secret version")
                .build();
    } catch (BmcException bmc) {
        // Create a new pending version
        UpdateSecretDetails updateSecretDetails = secret.getIsAutoGenerationEnabled() ? UpdateSecretDetails.builder()
                .secretContent(Base64SecretContentDetails.builder()
                        .stage(SecretContentDetails.Stage.Pending)
                        .build())
                .build() : UpdateSecretDetails.builder()
                .secretContent(Base64SecretContentDetails.builder()
                        .content(createNewPassword())
                        .stage(SecretContentDetails.Stage.Pending)
                        .build())
                .build();
        secretsCpClient.updateSecret(UpdateSecretRequest.builder()
                .secretId(input.getSecretId())
                .updateSecretDetails(updateSecretDetails)
                .build()).getSecret();
        log.info("Successfully added a new version with 'PENDING' stage for secretId {}", input.getSecretId());
        return SecretRotationOutput.builder()
                .responseCode(200)
                .returnMessage("Pending version created successfully")
                .currentVersionNo(input.getVersionNo())
                .build();
    }
}

Etapa 3: UPDATE_TARGET_SYSTEM

Define o segredo pendente no sistema de destino.

  • Entrada: Este método aceita currentVersionNo e secretId.
  • Saída: Este método também gera a saída SecretRotationOutput.
  • Lógica: Este método tenta primeiro fazer log-in no sistema de destino com a versão do segredo PENDING e retorna com sucesso. Isso também trata o cenário de falha em que a nova tentativa anterior falhou ao promover a versão pendente, mas a versão foi aplicada com sucesso ao sistema. Se isso falhar, ele tentará fazer log-in com a versão do segredo CURRENT. Se a versão do segredo atual for bem-sucedida, ela definirá a senha PENDING como a senha do usuário no sistema de destino.

Pseudocódigo para UPDATE_TARGET_SYSTEM

Pseudo code for updateTargetSystem:
    Fetch the "PENDING" secret version
    Check the connection with Pending version
        It it works return success and the pending version number in the response
    Fetch the "CURRENT" secret version
    Check the connection with it
        If it works
            Update the target system with "PENDING" version
            Verify that target system is updated.
               if yes then return success and the pending version number in the response 
            else return the appropriate error code and the error message
        If not, return SecretRotationOutput with appropriate error code and message.

Código de amostra:

private SecretRotationOutput updateTargetSystem(String secretId, Long currentVersionNo) {
    // Get the pending secret version
    SecretBundle pendingSecretBundle = secretsDpClient.getSecretBundle(GetSecretBundleRequest.builder()
                    .secretId(secretId)
                    .stage(GetSecretBundleRequest.Stage.Pending)
            .build()).getSecretBundle();
  
    // First try to login with the pending secret, if it succeeds, return
    Connection conn = getConnection(pendingSecretBundle);
    if(conn) {
        log.info("Updated the target system with pending version");
        return SecretRotationOutput.builder()
                    .responseCode(200)
                    .returnMessage("Successfully update target service")
                    .currentVersionNo(pendingSecretBundle.getVersionNumber())
                    .build();
    }
  
    SecretBundle currentSecretBundle = secretsDpClient.getSecretBundle(GetSecretBundleRequest.builder()
                    .versionNumber(currentVersionNo)
                    .secretId(secretId)
            .build()).getSecretBundle();
  
    conn = getConnection(currentSecretBundle);
    if(conn) {
        // Write logic to update the target system and check the connection with the updated password
    } else {
        log.error("Unable to log into system using the current version");
        return SecretRotationOutput.builder()
                .returnMessage("Unable to log into system using the current version")
                .responseCode(400)
                .build();
    }
}

Etapa 4: PROMOTE_PENDING_VERSION

Finalize a rotação marcando o segredo pendente como atual.

  • Entrada: Este método aceita currentVersionNo e secretId.
  • Saída: Este método também gera a saída SecretRotationOutput.
  • Lógica: Chame o serviço de Segredo para promover a versão PENDING para CURRENT. UpdateRequest deve especificar qual versão precisa ser promovida para CURRENT.

Pseudocódigo para PROMOTE_PENDING_VERSION

pseudo code for promotePendingVersion:
    Make updateSecret Api call to promote the specified version to "CURRENT"

Código de amostra:

private SecretRotationOutput promotePendingVersion(String secretId, Long versionNo) {
    try {
        Secret secret = secretsCpClient.updateSecret(UpdateSecretRequest.builder()
                .secretId(secretId)
                .updateSecretDetails(UpdateSecretDetails.builder()
                        .currentVersionNumber(versionNo)
                        .build())
                .opcRequestId(UUID.randomUUID().toString())
                .build()).getSecret();
        log.info("Successfully promoted the version number {} to 'CURRENT'", versionNo);
        return SecretRotationOutput.builder()
                .responseCode(200)
                .currentVersionNo(secret.getCurrentVersionNumber())
                .returnMessage("Successfully promoted the pending version")
                .build();
    } catch (BmcException bmc) {
        log.error("Fail to promote the pending version. SecretId: {}, pendingVersionNo: {}. {}", secretId, versionNo, bmc.getMessage());
        return SecretRotationOutput.builder()
                .returnMessage(bmc.getMessage())
                .responseCode(bmc.getStatusCode())
                .build();
    }
}

Estados de Rotação

As versões de segredo podem ter mais de um estado de rotação por vez. Quando existe apenas uma versão de segredo, como quando você cria um segredo pela primeira vez, a versão do segredo é marcada automaticamente como atual e mais recente. A versão mais recente de um segredo contém o conteúdo do segredo que foi submetido a upload pela última vez para o vault. Se você precisar descobrir qual versão do segredo tem material secreto carregado mais recentemente, poderá usar o status "mais recente" para fazer isso.

Ao fazer upload do novo conteúdo do segredo para rotação de segredo, você pode marcar a versão do segredo como pendente. Isso permite fazer upload do material secreto para o vault sem colocá-lo imediatamente em uso ativo. Você pode continuar usando a versão do segredo atual até estar pronto para promover uma versão do segredo pendente para o status atual. Isso normalmente acontece após você ter rotacionado as credenciais no recurso ou serviço de destino primeiro. Observe que você precisa considerar os efeitos da rotação de segredo em aplicativos e recursos que dependem do segredo. A alteração da versão do segredo atual pode impedir que um aplicativo ou recurso que precise dele recupere a versão esperada do segredo do vault.

As versões secretas também podem ser marcadas como anteriores. Isso permite fazer rollback facilmente de um segredo para uma versão anterior. Talvez você precise fazer isso quando um segredo for rotacionado por engano ou ao restaurar um backup de um recurso que precisa ser retomado usando uma versão de segredo mais antiga. Uma versão de segredo marcada como anterior é a versão que foi marcada como atual diretamente antes da rotação mais recente. Para fazer rollback para uma versão anterior, atualize o segredo para especificar o número da versão de segredo que você deseja.

Desde que uma versão de segredo não tenha sido excluída, você poderá atualizar o segredo para usar essa versão de segredo anterior. Quando você atualiza o segredo, o número de versão do segredo selecionado é marcado como atual. Isso tem o mesmo efeito que promover uma versão do segredo para o atual.

Você só pode excluir versões de segredo que foram marcadas como obsoletas. Uma versão obscura de segredo é aquela que não foi marcada como atual, pendente ou anterior. Isso ajuda a evitar circunstâncias nas quais você pode excluir uma versão secreta que precisará posteriormente (por exemplo, ao restaurar um banco de dados cujo backup você fez antes). Uma versão secreta marcada como qualquer outra que não seja obsoleta pode ser marcada como atual para retorná-la ao uso ativo.

Limitação de Versão

Os limites de versões de segredo se aplicam às versões de um segredo que estão em uso e às versões obsoletas, inclusive aquelas que foram programadas para exclusão. Para obter informações sobre limites no número de versões de um segredo específico e para versões de segredo em uma tenancy, consulte Limites de Serviço.

Política Obrigatória do Serviço IAM

Para usar o Oracle Cloud Infrastructure, um administrador deve ser membro de um grupo ao qual foi concedido acesso de segurança em uma política por um administrador da tenancy. Esse acesso será necessário se você estiver usando a Console ou a API REST com um SDK, uma CLI ou outra ferramenta. Se você receber uma mensagem informando que não tem permissão ou está não autorizado, verifique com o administrador da tenancy qual tipo de acesso você tem e qual compartimento seu acesso funciona.

Para administradores:

Se você for iniciante em políticas, consulte Gerenciando Domínios de Identidades e Políticas Comuns.

Marcando Segredos com Tag

Aplique tags aos recursos para ajudar a organizá-los de acordo com as necessidades da sua empresa. Você pode aplicar tags ao criar um recurso e pode atualizar um recurso posteriormente para adicionar, revisar ou remover tags. Para obter informações gerais sobre a aplicação de tags, consulte Tags de Recursos.

Recursos do Serviço Monitoring

Você pode monitorar a integridade, a capacidade e o desempenho dos recursos do Oracle Cloud Infrastructure usando métricas, alarmes e notificações. Para obter mais informações, consulte os serviços Monitoring e Notifications.

Mover Recursos para Outro Compartimento

Você pode mover segredos de um compartimento para outro. Depois de mover um segredo para um novo compartimento, as políticas configuradas para o compartimento serão aplicadas imediatamente e afetarão o acesso ao segredo e às versões de segredo. Mover um segredo não afeta o acesso ao vault ao qual um segredo está associado. Da mesma forma, você pode mover um vault de um compartimento para outro independentemente de mover qualquer um de seus segredos. Para obter mais informações, consulte Gerenciando Compartimentos.