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
- 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.
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
eDBAAS_DEFAULT_PASSWORD
- Placeholder no modelo de segredo:
%GENERATED_PASSPHRASE%
- Exemplo:
{"user": "abc", "pwd": "%GENERATED_PASSPHRASE%"}
- Modelos suportados:
-
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-----"}
- Modelos suportados:
BYTES
- Modelos suportados:
BYTES_512
,BYTES_1024
- Placeholder no modelo de segredo:
%GENERATED_BYTES%
- Exemplo:
{"host": "abc", "hostLuksKey": "%GENERATED_BYTES%"} → {"host": "abc", "hostLuksKey": "generatedbyteshere=="}
- Modelos suportados:
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
As funções de rotação incluíam as seguintes quatro etapas:
VERIFY_CONNECTION
: Verifica a conexão com o sistema de destino usando as credenciais existentes armazenadas no segredo.CREATE_PENDING_VERSION
: Cria uma nova versão de segredo pendente no segredo.UPDATE_TARGET_SYSTEM
: Atualiza o sistema de destino com as credenciais armazenadas na versão de segredo pendente criada na segunda etapa.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
ouPROMOTE_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ãoPENDING
, 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 segredoPENDING
. 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
esecretId
. - 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 segredoCURRENT
. Se a versão do segredo atual for bem-sucedida, ela definirá a senhaPENDING
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
esecretId
. - 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
paraCURRENT
.UpdateRequest
deve especificar qual versão precisa ser promovida paraCURRENT
.
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.
Antes de Começar
Antes de começar, recomendamos que você primeiro leia Regras de Segredos Versões de Segredos e Estados de Rotação para entender melhor as implicações de trabalhar com regras, versões de segredos e estados de rotação da versão do segredo.
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:
- A política Permitir que administradores de segurança gerenciem vaults, chaves e segredos permite que o grupo especificado faça tudo com vaults, chaves e segredos.
- A política Criar uma política para ativar chaves de criptografia permite que o grupo especificado faça tudo com segredos em um vault específico.
- A política Permitir que os usuários leiam, atualizem e rotacionam todos os segredos permite que o grupo especificado leia, atualize e rotacione todos os segredos em qualquer vault da tenancy.
- Para obter mais informações sobre permissões ou se você precisar gravar políticas mais restritivas para segredos, consulte Detalhes do Serviço Vault.
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.