Gestion des clés secrètes

Créer et gérer des clés secrètes de chambre forte, des marqueurs de clé secrète et des règles de clé secrète.

Compte tenu de l'importance d'utiliser les services en nuage OCI, il est important de stocker, d'extraire et de gérer les clés secrètes dans sa chambre forte numérique. Les clés secrètes peuvent être un mot de passe, des certificats, des clés SSH ou des jetons d'authentification que vous utilisez pour vous connecter aux services et aux systèmes OCI. Le stockage des clés secrètes dans le service de chambre forte OCI est plus sécurisé que leur stockage dans un code ou des fichiers de configuration. L'application communique avec le service de gestion des clés secrètes OCI pour extraire la clé secrète et se connecter au service cible.

Le service de gestion des clés secrètes d'Oracle Cloud Infrastructure vous permet de protéger sans effort les données sensibles telles que les clés d'API, les mots de passe et les clés de chiffrement à l'aide de clés secrètes. Il offre une solution robuste pour créer, stocker, gérer et accéder à ces secrets en toute sécurité. Le stockage centralisé qu'il fournit tire parti des modules de sécurité matériels (HSM) et du contrôle d'accès granulaire pour protéger la sécurité et l'intégrité des informations critiques. Utilisez OCI Secret Management pour éliminer l'intégration de clés secrètes directement dans les applications et réduire la surface d'attaque et renforcer la sécurité globale d'une application.

Génération et rotation automatiques de clés secrètes

Lorsqu'une clé secrète est générée, elle est mise à jour périodiquement. Vous pouvez mettre à jour une clé secrète manuellement ou la définir automatiquement. La génération et la rotation automatiques des clés secrètes allège le fardeau de la définition manuelle de la clé secrète et de sa rotation à l'aide de scripts, mais fournissent plutôt un moyen efficace de gérer les clés secrètes à partir de la création, de la rotation et de la suppression.

La fonction de génération automatique de clé secrète prend en charge l'utilisation de modèles pour la génération de clé secrète. Avec la rotation automatique des clés secrètes, vous pouvez définir un intervalle de clé secrète de 1 à 12 mois. La fonction s'intègre aux services Autonomous Database et Function, ce qui vous permet de mettre à jour une clé secrète utilisée dans le code Autonomous Database ou Functions. Dans le service des fonctions pour OCI, la rotation automatique des clés secrètes vous permet de faire pivoter facilement des données d'identification et d'exécuter du code dans le cadre du processus de rotation. La fonction de rotation des clés secrètes d'automatisation est également disponible pour les clés secrètes créées manuellement.

Réplication inter-région des clés secrètes

Vous pouvez répliquer une clé secrète dans jusqu'à trois régions de destination. Les répliques sont en lecture seule et héritent des modifications apportées à la clé secrète source. Pour plus d'informations, voir Réplication de clés secrètes.

Avantages de la rotation automatique des clés secrètes

Voici les avantages de la rotation automatique des clés secrètes :
  • Sécurité renforcée : La mise à jour régulière de vos secrets minimise l'impact des informations d'identification compromises menant à une violation de données.
  • Efficacité opérationnelle : L'automatisation des tâches manuelles telles que la création et la rotation d'une clé secrète permet d'économiser du temps et de l'efficacité.
  • Conformité réglementée : Adhérez à de nombreuses normes qui réglementent la conformité pour la rotation secrète et l'automatisation.
  • Réduction des erreurs humaines : L'automatisation des tâches répétitives réduit la possibilité d'erreurs humaines pour renforcer la sécurité.

Génération de clés secrètes

Vous pouvez générer une clé secrète pour les phrases secrètes, les clés SSH et les octets. Toutes les clés secrètes générées par le service de chambre forte pour OCI sont conformes à FIPS et à la sécurité. Vous pouvez générer une clé secrète à l'aide de la console, de l'API ou de l'interface de ligne de commande OCI. Lorsque vous générez une clé secrète, vous devez fournir le contexte de clé secrète et définir le modèle de clé secrète. Le contexte de clé secrète définit le type et la structure de clé secrète. Selon le type de clé secrète que vous sélectionnez; le service de chambre forte prend en charge différents modèles de génération de clé secrète.

Vous pouvez générer les types de clé secrète suivants :
  • PASSPHRASE : Générer des mots de passe d'une longueur maximale de 32 caractères. Pour les mots de passe par défaut du service de base de données OCI, la longueur maximale des caractères est de 30.
  • SSH_KEY : Générer des paires de clés RSA de longueur 2048, 3072 et 4096. La clé privée est stockée dans le format PKCS#8 PEM et la clé publique est stockée dans le format X.509 PEM.
  • BYTES : Générez 512 et 1024 octets qui sont une clé secrète binaire de plainte FIPS. Les octets sont du code base64.

Types de clé secrète et modèles par défaut

  • PASSPHRASE
    • Modèles pris en charge : SECRETS_DEFAULT_PASSWORD et DBAAS_DEFAULT_PASSWORD
    • Paramètre fictif dans le modèle de clé secrète : %GENERATED_PASSPHRASE%
    • Exemple : {"user": "abc", "pwd": "%GENERATED_PASSPHRASE%"}
  • SSH_KEY
    • Modèles pris en charge : RSA_2048, RSA_3072, RSA_4096
    • Paramètre fictif dans le modèle de clé secrète : %GENERATED_PUBLIC_KEY%, %GENERATED_PRIVATE_KEY%
    • Exemple : {"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
    • Modèles pris en charge : BYTES_512, BYTES_1024
    • Paramètre fictif dans le modèle de clé secrète : %GENERATED_BYTES%
    • Exemple : {"host": "abc", "hostLuksKey": "%GENERATED_BYTES%"} → {"host": "abc", "hostLuksKey": "generatedbyteshere=="}

Versions de clé secrète et états de rotation

Découvrez les versions de clé secrète de la chambre forte, les états de rotation et l'incidence de la limitation de la version de clé secrète.

La compréhension des versions de clé secrète de chambre forte et des états de rotation vous aide à suivre et à gérer le contenu des clés secrètes pour garantir le respect des limites, des règles de rotation ou autres, ou des réglementations.

Pour connaître les concepts de base relatifs aux clés secrètes, y compris les versions de clé secrète et les états de rotation, voir Concepts relatifs à la gestion des clés et des clés secrètes. Pour plus d'informations sur l'utilisation des versions de clé secrète, voir Gestion des clés secrètes.

Fonctions de rotation

Les fonctions de rotation sont responsables de la rotation des secrets dans le service secret. Développez la section suivante pour en savoir plus sur les quatre étapes d'une fonction de rotation et pour voir un exemple de code de gestionnaire de fonctions

Étapes et détails de la fonction de rotation

Les fonctions de rotation comprenaient les quatre étapes suivantes :

  1. VERIFY_CONNECTION : Vérifie la connexion au système cible à l'aide des données d'identification existantes stockées dans la clé secrète.
  2. CREATE_PENDING_VERSION : Crée une nouvelle version de clé secrète en attente dans la clé secrète.
  3. UPDATE_TARGET_SYSTEM : Met à jour le système cible avec les données d'identification stockées dans la version de clé secrète en attente créée à la deuxième étape.
  4. PROMOTE_PENDING_VERSION : Met à jour l'état de la clé secrète de En attente à Courant.

Programme de traitement de fonctions :

Le gestionnaire de fonctions doit contenir la logique d'appel de l'étape de rotation appropriée en fonction du paramètre d'étape. Pour ce faire, utilisez des instructions conditionnelles IF ELSE ou changez de cas. Le programme de traitement de fonctions génère une erreur si un paramètre d'étape non valide est fourni.

Entrée :

Le programme de traitement de fonctions attend un seul paramètre : SecretRotationInput. secretRotationInput est un objet POJO (Java ordinaire) contenant les paramètres requis pour la rotation, notamment secretId(String), step(String) et currentVersionNo(Long).

  • secretId : Identificateur ou OCID de la clé secrète
  • étape : Étape de rotation (doit être l'une des suivantes : VERIFY_CONNECTION, CREATE_PENDING_VERSION, UPDATE_TARGET_SYSTEM ou PROMOTE_PENDING_VERSION)
  • currentVersionNo : Numéro de la version de clé secrète 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;
}                

Exemple de code de programme de traitement de fonction :

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

Étape 1 : VERIFY_CONNECTION

Cette étape vérifie la connexion au système cible.

  • Entrée : Cette méthode attend uniquement le paramètre SecretId.
  • Sortie : Cette méthode affiche la sortie SecretRotationOutput.
  • Logique : La fonction tente d'abord d'extraire la version PENDING et de vérifier la connexion avec celle-ci. Cela gère le scénario d'échec où la nouvelle tentative précédente n'a pas réussi à promouvoir la version PENDING, mais où la version a été appliquée au système. S'il réussit, renvoyez la réponse de réussite. En cas d'échec, extrayez la version courante et vérifiez la connexion. Si cela réussit, renvoyez le code de réponse de réussite avec le numéro de version courant. Si elle ne réussit pas, renvoyez l'erreur.

Pseudo-code pour 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.

Étape 2 : CREATE_PENDING_VERSION

Génère une nouvelle version de clé secrète en attente.

  • Entrée : Cette méthode accepte également le paramètre secretId.
  • Sortie : Cette méthode affiche la sortie SecretRotationOutput.
  • Logique : Cette méthode vérifie d'abord l'existence d'une version de clé secrète à l'état PENDING. S'il n'en existe pas, il génère une nouvelle version de clé secrète PENDING. Toutefois, s'il en existe déjà une, l'étape renvoie la réponse de réussite. Vous pouvez également utiliser le champ de métadonnées de clé secrète pour stocker des détails supplémentaires sur la structure de clé secrète et utiliser la même structure lors de la création d'une nouvelle version de clé secrète. Vous pouvez également utiliser la fonction de génération automatique du service de clé secrète pour générer automatiquement le contenu de la clé secrète. La génération automatique vous permet d'écrire des fonctions plus génériques.

Pseudo-code pour 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

Exemple de code :

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

Étape 3 : UPDATE_TARGET_SYSTEM

Définit la clé secrète en attente dans le système cible.

  • Entrée : Cette méthode accepte les valeurs currentVersionNo et secretId.
  • Sortie : Cette méthode affiche également SecretRotationOutput.
  • Logique : Cette méthode tente d'abord de se connecter au système cible avec la version de clé secrète PENDING et retourne avec succès. Cela gère également le scénario d'échec où la nouvelle tentative précédente n'a pas réussi à promouvoir la version en attente, mais où la version a été appliquée avec succès au système. Si cela échoue, il tente de se connecter avec la version de clé secrète CURRENT. Si la version de clé secrète courante réussit, elle définit le mot de passe PENDING comme mot de passe d'utilisateur dans le système cible.

Pseudo-code pour 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.

Exemple de code :

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

Étape 4 : PROMOTE_PENDING_VERSION

Terminez la rotation en marquant la clé secrète en attente comme courante.

  • Entrée : Cette méthode accepte les valeurs currentVersionNo et secretId.
  • Sortie : Cette méthode affiche également SecretRotationOutput.
  • Logic : Appelez le service de clé secrète pour promouvoir la version PENDING vers CURRENT. UpdateRequest doit spécifier quelle version doit être promue en CURRENT.

Pseudo-code pour PROMOTE_PENDING_VERSION

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

Exemple de code :

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

États de rotation

Les versions de clé secrète peuvent avoir plusieurs états de rotation à la fois. Lorsqu'il existe une seule version de clé secrète, par exemple lors de la première création d'une clé secrète, cette version est automatiquement marquée comme courante et la plus récente. La version la plus récente d'une clé secrète contient le dernier contenu de clé secrète chargé dans la chambre forte. Si vous devez trouver quelle version de clé secrète a le matériel de clé secrète le plus récemment chargé, vous pouvez utiliser le statut "dernier" pour ce faire.

Lors du chargement du nouveau contenu de clé secrète pour la rotation des clés secrètes, vous pouvez marquer la version de clé secrète comme en attente. Cela vous permet de charger le matériel de clé secrète dans la chambre forte sans l'utiliser immédiatement. Vous pouvez continuer à utiliser la version de clé secrète courante jusqu'à ce que vous soyez prêt à promouvoir la version de clé secrète en attente au statut courant. Cela se produit généralement une fois que vous avez effectué la rotation des données d'identification sur la ressource ou le service cible. Notez que vous devez tenir compte des effets de la rotation de clé secrète sur les applications et les ressources qui s'appuient sur la clé secrète. La modification de la version de clé secrète courante pourrait empêcher une application ou une ressource qui en a besoin d'extraire la version de clé secrète attendue de la chambre forte.

Les versions de clé secrète peuvent également être marquées comme précédentes. Cela vous permet de repositionner facilement une clé secrète à une version précédente. Vous devrez peut-être effectuer cette opération lorsqu'une clé secrète fait l'objet d'une rotation par erreur ou lors de la restauration d'une sauvegarde d'une ressource qui doit reprendre à l'aide d'une ancienne version de clé secrète. Une version de clé secrète marquée comme précédente est la version qui a été marquée comme courante directement avant la dernière rotation. Pour revenir à une version précédente, vous devez mettre à jour la clé secrète pour indiquer le numéro de version de clé secrète souhaité.

Tant qu'une version de clé secrète n'a pas été supprimée, vous pouvez mettre à jour la clé secrète pour utiliser cette version précédente. Lorsque vous mettez à jour la clé secrète, le numéro de version de clé secrète sélectionné est marqué courant. Ceci a le même effet que la promotion d'une version de clé secrète à l'heure courante.

Vous ne pouvez supprimer que les versions de clé secrète marquées comme obsolètes. Une version de clé secrète obsolète est une version qui n'est pas marquée comme courante, en attente ou précédente. Cela permet d'éviter les situations où vous pourriez supprimer une version de clé secrète dont vous aurez besoin ultérieurement (par exemple, lors de la restauration d'une base de données sauvegardée auparavant). Une version de clé secrète qui n'est pas obsolète peut être marquée comme courante pour redevenir active.

Limite de version

Les limites des versions de clé secrète s'appliquent à la fois aux versions en cours d'utilisation et aux versions obsolètes, y compris à celles qui ont été programmées pour suppression. Pour plus d'informations sur les limites concernant le nombre de versions pour une clé secrète particulière et pour les versions de clé secrète dans une location, voir Limites de service.

Politique GIA requise

Pour utiliser Oracle Cloud Infrastructure, un administrateur doit être membre d'un groupe auquel l'accès de sécurité est accordé dans une politique par un administrateur de location. Cet accès est requis que vous utilisiez la console ou l'API REST avec une trousse SDK, l'interface de ligne de commande ou un autre outil. Si vous obtenez un message indiquant que vous ne disposez pas de l'autorisation requise, vérifiez auprès de l'administrateur de la location quel type d'accès vous avez et dans quel compartiment votre accès fonctionne.

Pour les administrateurs :

Pour en savoir plus sur les politiques, voir Gestion des domaines d'identité et Politiques communes.

Marquage des clés secrètes

Appliquer des marqueurs aux ressources afin de les organiser en fonction des besoins de l'entreprise. Vous pouvez appliquer des marqueurs lorsque vous créez une ressource, et vous pouvez mettre à jour une ressource plus tard pour ajouter, réviser ou supprimer des marqueurs. Pour des informations générales sur l'application de marqueurs, voir Marqueurs de ressource.

Surveillance des ressources

Vous pouvez surveiller l'état, la capacité et la performance des ressources Oracle Cloud Infrastructure à l'aide de mesures, d'alarmes et d'avis. Pour plus d'informations, voir Surveillance et Avis.

Déplacement de ressources vers un autre compartiment

Vous pouvez déplacer des clés secrètes d'un compartiment à un autre. Après avoir déplacé une clé secrète vers un nouveau compartiment, les politiques configurées pour le compartiment s'appliquent immédiatement et ont une incidence sur l'accès à la clé secrète et aux versions de clé secrète. Le déplacement d'une clé secrète n'a pas d'incidence sur l'accès à la chambre forte à laquelle la clé secrète est associée. De même, vous pouvez déplacer une chambre forte d'un compartiment à un autre indépendamment du déplacement d'une de ses clés secrètes. Pour plus d'informations, voir Gestion des compartiments.