Gestión de secretos

Cree y gestione secretos de almacén, etiquetas secretas y reglas secretas.

Debido a la importancia de utilizar los servicios en la nube de OCI, es importante almacenar, recuperar y gestionar secretos en su almacén digital. Los secretos pueden ser una contraseña, certificados, claves SSH o tokens de autenticación que utilice para conectarse a los servicios y sistemas de OCI. El almacenamiento de secretos en OCI Vault tiene una mayor seguridad que su almacenamiento en un código o archivos de configuración. La aplicación se comunica con OCI Secret Management para recuperar el secreto y conectarse al servicio de destino.

Oracle Cloud Infrastructure Secret Management te permite proteger sin esfuerzo datos confidenciales, como claves de API, contraseñas y claves de cifrado, mediante el uso de secretos. Ofrece una solución sólida para crear, almacenar, gestionar y acceder a estos secretos de forma segura. El almacenamiento centralizado que proporciona aprovecha los módulos de seguridad de hardware (HSM) y el control de acceso granular para salvaguardar la seguridad e integridad de la información crítica. Utiliza OCI Secret Management para eliminar la incorporación de secretos directamente en las aplicaciones, reducir la superficie de ataque y reforzar la seguridad general de una aplicación.

Generación y rotación automática de secretos

Cuando se genera un secreto, se actualiza periódicamente. Puede actualizar un secreto manualmente o definirlo automáticamente. La generación y rotación automáticas de secretos elimina la carga de configurar el secreto manualmente y rotarlo mediante scripts, pero en su lugar, proporciona una forma eficiente de gestionar los secretos desde la creación, la rotación y la eliminación.

La función de generación automática de secretos admite el uso de plantillas para la generación de secretos. Con la rotación secreta automática, puede establecer un intervalo secreto de 1 a 12 meses. La función se integra con los servicios de Autonomous Database y Function, lo que le permite actualizar un secreto utilizado en el código de Autonomous Database o Functions. En OCI Functions, la rotación automática de secretos le permite rotar fácilmente una credencial y un código de ejecución como parte del proceso de rotación. La función de rotación de secretos de automatización también está disponible para secretos creados manualmente.

Replicación entre regiones de secretos

Puede replicar un secreto en hasta tres regiones de destino. Las réplicas son de solo lectura y heredan los cambios realizados en el secreto de origen. Consulte Replicación de secretos para obtener más información.

Ventajas de utilizar la rotación automática de secretos

Los siguientes son los beneficios de la rotación automática de secretos:
  • Seguridad mejorada: la actualización regular de sus secretos minimiza el impacto de las credenciales comprometidas que conducen a una violación de datos.
  • Eficiencia operativa: la automatización de tareas manuales, como la creación y rotación de un secreto, ahorra tiempo y eficiencia.
  • Cumplimiento regulado: cumpla con muchos estándares que regulan el cumplimiento de la rotación secreta y la automatización.
  • Reducción de errores humanos: la automatización de tareas repetitivas reduce la posibilidad de errores humanos para reforzar la seguridad.

Generación de secretos

Puede generar un secreto para frases de contraseña, claves SSH y bytes. Todos los secretos que genera OCI Vault son compatibles con FIPS y seguridad. Puede generar un secreto mediante la consola, la API o la CLI de OCI. Al generar un secreto, debe proporcionar el contexto secreto y definir la plantilla secreta. El contexto del secreto define el tipo y la estructura del secreto. Según el tipo de secreto que seleccione; Vault soporta diferentes plantillas de generación de secretos.

Puede generar los siguientes tipos de secretos:
  • PASSPHRASE: genera contraseñas de hasta 32 caracteres de longitud. Para las contraseñas por defecto del servicio OCI Database, la longitud máxima de caracteres es 30.
  • SSH_KEY: genera pares de claves RSA de longitud 2048, 3072 y 4096. La clave privada se almacena en el formato PKCS#8 PEM y la clave pública se almacena en el formato X.509 PEM.
  • BYTES: genera 512 y 1024 bytes que son secretos binarios de quejas de FIPS. Los bytes son código base64.

Tipos de secretos y plantillas por defecto

  • PASSPHRASE
    • Plantillas soportadas: SECRETS_DEFAULT_PASSWORD y DBAAS_DEFAULT_PASSWORD
    • Marcador de posición en la plantilla secreta: %GENERATED_PASSPHRASE%
    • Ejemplo: {"user": "abc", "pwd": "%GENERATED_PASSPHRASE%"}
  • SSH_KEY
    • Plantillas soportadas: RSA_2048, RSA_3072, RSA_4096
    • Marcador de posición en la plantilla secreta: %GENERATED_PUBLIC_KEY%, %GENERATED_PRIVATE_KEY%
    • Ejemplo: {"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
    • Plantillas soportadas: BYTES_512, BYTES_1024
    • Marcador de posición en plantilla secreta: %GENERATED_BYTES%
    • Ejemplo: {"host": "abc", "hostLuksKey": "%GENERATED_BYTES%"} → {"host": "abc", "hostLuksKey": "generatedbyteshere=="}

Versiones del secreto y estados de rotación

Obtenga información sobre las versiones del secreto de almacén, los estados de rotación y el impacto de la limitación de la versión del secreto.

Comprender las versiones del secreto de almacén y los estados de rotación le permitirá realizar un seguimiento y gestionar el contenido del secreto con el fin de cumplir los límites, la rotación u otras reglas o regulaciones.

Para obtener información sobre los conceptos básicos de secretos, incluidas las versiones y los estados de rotación del secreto, consulte Conceptos de gestión de claves y secretos. Para obtener información sobre cómo trabajar con versiones del secreto, consulte Gestión de secretos.

Funciones de rotación

Las funciones de rotación son responsables de rotar los secretos en el Servicio Secreto. Amplíe la siguiente sección para obtener más información sobre los cuatro pasos de una función de rotación y ver un código de manejador de funciones de ejemplo

Pasos y detalles de la función de rotación

Las funciones de rotación incluyen los siguientes cuatro pasos:

  1. VERIFY_CONNECTION: verifica la conexión al sistema de destino mediante las credenciales existentes almacenadas en el secreto.
  2. CREATE_PENDING_VERSION: crea una nueva versión de secreto pendiente en el secreto.
  3. UPDATE_TARGET_SYSTEM: actualiza el sistema de destino con las credenciales almacenadas en la versión de secreto pendiente creada en el segundo paso.
  4. PROMOTE_PENDING_VERSION: actualiza el estado del secreto de pendiente a actual.

Manejador de funciones:

El manejador de funciones debe contener la lógica para llamar al paso de rotación adecuado en función del parámetro de paso. Esto se puede lograr mediante el uso de sentencias condicionales IF ELSE o cambiar de caso. El manejador de funciones genera un error si se proporciona un parámetro de paso no válido.

Entrada:

El manejador de funciones espera un único parámetro: SecretRotationInput. secretRotationInput es un POJO (objeto java sin formato) que contiene los parámetros necesarios para la rotación, incluidos secretId(cadena), paso(cadena) y currentVersionNo(largo).

  • secretId: identificador de secreto u OCID
  • Paso: paso de rotación (debe ser uno de VERIFY_CONNECTION, CREATE_PENDING_VERSION, UPDATE_TARGET_SYSTEM o PROMOTE_PENDING_VERSION)
  • currentVersionNo: número de la versión del secreto 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;
}                

Código de controlador de función de ejemplo:

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();
    }
}

Paso 1: VERIFY_CONNECTION

Este paso verifica la conexión con el sistema de destino.

  • Entrada: este método espera solo el parámetro SecretId.
  • Salida: este método genera la salida SecretRotationOutput.
  • Lógica: la función primero intenta recuperar la versión PENDING y verificar la conexión con ella. Esto maneja el escenario de fallo en el que el reintento anterior no pudo ascender la versión PENDING, pero la versión se ha aplicado correctamente al sistema. Si se realiza correctamente, devuelva la respuesta correcta. Si falla, recupere la versión actual y compruebe la conexión. Si se realiza correctamente, devuelva el código de respuesta correcto junto con el número de versión actual. Si no se realiza correctamente, devuelva el error.

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.

Paso 2: CREATE_PENDING_VERSION

Genera una nueva versión de secreto pendiente.

  • Entrada: este método también acepta el parámetro secretId.
  • Salida: este método genera la salida SecretRotationOutput.
  • Lógica: este método primero comprueba la existencia de una versión del secreto en estado PENDING. Si no existe uno, genera una nueva versión del secreto PENDING. Sin embargo, si ya existe uno, el paso devuelve la respuesta correcta. También puede utilizar el campo de metadatos del secreto para almacenar detalles adicionales sobre la estructura del secreto y puede utilizar la misma estructura al crear una nueva versión del secreto. También puede utilizar la función de generación automática del servicio secreto para generar automáticamente el contenido secreto. La generación automática le permite escribir funciones más 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 ejemplo:

// 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();
    }
}

Paso 3: UPDATE_TARGET_SYSTEM

Define el secreto pendiente en el sistema de destino.

  • Entrada: este método acepta currentVersionNo y secretId.
  • Salida: este método también genera la salida SecretRotationOutput.
  • Lógica: este método primero intenta conectarse al sistema de destino con la versión del secreto PENDING y vuelve cuando se realiza correctamente. Esto también gestiona el escenario de fallo en el que el reintento anterior no pudo ascender la versión pendiente, pero la versión se ha aplicado correctamente al sistema. Si esto falla, intenta conectarse con la versión del secreto CURRENT. Si la versión del secreto actual se realiza correctamente, define la contraseña PENDING como la contraseña de usuario en el 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 ejemplo:

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();
    }
}

Paso 4: PROMOTE_PENDING_VERSION

Finalice la rotación marcando el secreto pendiente como actual.

  • Entrada: este método acepta currentVersionNo y secretId.
  • Salida: este método también genera la salida SecretRotationOutput.
  • Lógica: llame al servicio secreto para promocionar la versión PENDING a CURRENT. UpdateRequest debe especificar qué versión se debe promocionar a 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 ejemplo:

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 rotación

Las versiones del secreto pueden tener más de un estado de rotación a la vez. Cuando solo existe una versión de secreto, como, por ejemplo, la primera vez que se crea un secreto, la versión de secreto se marca automáticamente como actual y última. La versión más recientes de un secreto contiene el contenido del secreto que se cargó finalmente en el almacén, en caso de que desee realizar un seguimiento. Si necesita encontrar qué versión del secreto tiene el material del secreto cargado más recientemente, puede utilizar el estado "último" para hacerlo.

Al cargar el nuevo contenido del secreto para la rotación del secreto, puede marcar la versión del secreto como pendiente. Esto le permite cargar el material secreto en el almacén sin ponerlo inmediatamente en uso activo. Puede continuar usando la versión de secreto actual hasta que esté listo para asentar una versión de secreto pendiente al estado actual. Esto ocurre normalmente después de rotar las credenciales en el recurso o servicio de destino en primer lugar. Tenga en cuenta que debe tener en cuenta los efectos de la rotación de secretos en las aplicaciones y los recursos que dependen del secreto. Al cambiar qué versión de secreto es actual, se podría evitar que una aplicación o recurso que lo necesita recupere la versión de secreto esperada del almacén.

Las versiones secretas también se pueden marcar como anteriores. Esto le permite revertir fácilmente un secreto a una versión anterior. Puede que tenga que hacerlo cuando un secreto se rota por error o cuando se restaura una copia de seguridad de un recurso que necesita reanudarse utilizando una versión de secreto anterior. Una versión del secreto marcada como anterior es la versión que se marcó como actual directamente antes de la rotación más reciente. Para volver a una versión anterior, actualice el secreto para especificar el número de versión del secreto que desee.

Siempre que no se haya suprimido una versión del secreto, puede actualizar el secreto para utilizar dicha versión anterior. Al actualizar el secreto, el número del secreto que selecciona se marca como actual. Tiene el mismo efecto, que ascender una versión de secreto a actual.

Solo puede suprimir versiones de secreto que se han marcado como en desuso. Una versión del secreto en desuso es aquella que no se ha marcado como actual, pendiente o anterior. Esto ayuda a evitar circunstancias en las cuales pueda suprimir una versión de secreto que necesite posteriormente (por ejemplo, al restaurar una base de información de la cual ha realizado una copia de seguridad anteriormente) Una versión del secreto marcada con cualquier otra alternativa que no sea en desuso se puede marcar como actual para devolverla al uso activo.

Limitación de la versión

Los límites de las versiones del secreto se aplican tanto a las versiones del secreto que están en uso como a las versiones en desuso, incluidas las que se han programado para suprimirse. Para obtener información sobre los límites del número de versiones para un secreto concreto y para versiones de un secreto en un arrendamiento, consulte Límites de servicios.

Política de IAM necesaria

Para utilizar Oracle Cloud Infrastructure, un administrador debe ser miembro de un grupo al que se le haya otorgado acceso de seguridad en una política por parte de un administrador de arrendamiento. Este acceso es necesario tanto si utiliza la Consola como la API de REST con un SDK, una CLI u otra herramienta. Si recibe un mensaje que indique que no tiene permiso o no está autorizado, verifique con su administrador de arrendamiento el tipo de acceso y el compartimento en el que funciona su acceso.

Para administradores:

Si no está familiarizado con las políticas, consulte Gestión de dominios de identidad y Políticas comunes.

Etiquetado de secretos

Puede aplicar etiquetas a los recursos para facilitar su organización según las necesidades de su negocio. Puede aplicar etiquetas al crear un recurso y actualizar un recurso más tarde para agregar, revisar o eliminar etiquetas. Para obtener información general sobre la aplicación de etiquetas, consulte Etiquetas de recursos.

Supervisión de recursos

Puede supervisar el estado, la capacidad y el rendimiento de los recursos de Oracle Cloud Infrastructure mediante métricas, alarmas y notificaciones. Para obtener más información, consulte Supervisión y Notificaciones.

Movimiento de recursos a otro compartimento

Puede mover secretos de un compartimento a otro. Después de mover un secreto a un nuevo compartimento, las políticas configuradas para el compartimento se aplican inmediatamente y afectan al acceso al secreto y a las versiones del secreto. Mover un secreto no afecta al acceso al almacén al que está asociado. De forma similar, puede mover un almacén de un compartimento a otro sin que sus secretos se muevan. Para obtener más información, consulte Gestión de compartimentos.