Remarques :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction au niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeur pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. A la fin de l'exercice, remplacez ces valeurs par des valeurs propres à votre environnement cloud.
Activation de la rotation automatique des informations d'identification Oracle Cloud Infrastructure Identity and Access Management
Introduction
Ce tutoriel permet de faire pivoter automatiquement les informations d'identification Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) qui sont la clé d'API, le jeton d'authentification, les clés secrètes client et les mots de passe de connexion à la console OCI. Il est basé sur la résolution des problèmes Oracle Cloud Guard et sur le service OCI Notifications. Il comble également l'écart des règles de répondeur par défaut pour effectuer la rotation des informations d'identification OCI IAM.
Oracle Cloud Guard détecte les problèmes en fonction des règles définies dans les stratégies. Une fois qu'une règle est satisfaite, elle crée un problème.
Il s'agit d'une meilleure pratique en matière de sécurité et recommandée par le banc d'essai du Center for Internet Security Oracle Cloud Infrastructure Foundations (CIS OCI Foundations) pour effectuer la rotation des informations d'identification tous les 90 jours.
Remarque : cette solution a été testée pour un domaine d'identité par défaut.
Objectifs
-
Effectuez la rotation du jeton d'authentification Oracle Cloud Infrastructure (OCI), de la clé d'API, de la clé secrète client et du mot de passe de la console OCI via l'automatisation en résolvant le problème Oracle Cloud Guard. Les problèmes Oracle Cloud Guard suivants sont utilisés pour la rotation automatique des informations d'identification OCI IAM.
- La clé d'API est trop ancienne
- Le jeton d'authentification IAM est trop ancien
- La clé secrète client IAM est trop ancienne
- Le mot de passe est trop ancien
Prérequis
L'administrateur OCI IAM doit créer les éléments suivants :
-
Groupe dynamique et stratégies permettant à OCI Functions d'appeler, de résoudre le problème et d'envoyer une notification par courriel.
-
Groupe dynamique : créez un groupe dynamique pour le compartiment de la fonction. Pour plus d'informations, reportez-vous à Création d'un groupe dynamique.
# Replace OCID for function compartment All {resource.type = 'fnfunc', resource.compartment.id = '<function-compartment>'} Example: All {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaaaanovmfmmnonjjyxeq4jyghszj2eczlrkgj5svnxrt...'}
-
Stratégies : créez des stratégies pour affecter un groupe dynamique à une fonction. Pour plus d'informations, reportez-vous à Introduction aux stratégies.
# Replace dynamic-group-name, function-compartment and OCID of vault secret for OCI function Allow dynamic-group <dynamic-group-name> to inspect compartments in tenancy Allow dynamic-group <dynamic-group-name> to inspect users in tenancy Allow dynamic-group <dynamic-group-name> to manage users in tenancy where any {request.permission = 'USER_UPDATE', request.permission = 'USER_AUTHTOKEN_SET', request.permission = 'USER_AUTHTOKEN_REMOVE', request.permission = 'USER_SECRETKEY_ADD', request.permission = 'USER_SECRETKEY_REMOVE', request.permission = 'USER_UIPASS_SET', request.permission = 'USER_APIKEY_ADD', request.permission = 'USER_APIKEY_REMOVE'} Allow dynamic-group <dynamic-group-name> to read repos in compartment <function-compartment> Allow dynamic-group <dynamic-group-name> to use secret-family in compartment <vault-compartment> where target.secret.id='<ocid of OCI vault secret to store rotated OCI secrets>' Allow dynamic-group <dynamic-group-name> to use ons-topics in tenancy
-
-
Compartiment, groupe et stratégies : permet au développeur de créer des clés secrètes et de déployer la fonction.
# Replace group-name as per your tenancy Allow group <group-name> to manage repos in compartment <function-compartment> Allow group <group-name> to manage vaults in compartment <function-compartment> Allow group <group-name> to manage keys in compartment <function-compartment> Allow group <group-name> to manage secret-family in compartment <function-compartment> Allow group <group-name> to manage functions-family in compartment <function-compartment> Allow group <group-name> to use cloud-shell in tenancy Allow group <group-name> to use virtual-network-family in compartment <network-compartment> Allow group <group-name> to read objectstorage-namespaces in tenancy
-
Rubrique Notifications OCI permettant à l'équipe SecOps de recevoir des notifications par courriel.
-
Clés secrètes Oracle Cloud Infrastructure Secrets in Vault pour stocker les informations d'identification OCI IAM modifiées créées par l'automatisation.
Remarque : assurez-vous d'avoir copié les informations d'identification OCI IAM existantes pour les clés secrètes Oracle Cloud Infrastructure Secrets in Vault avant d'exécuter cette automatisation pour la première fois.
Tâche 1 : créer et déployer des fonctions OCI
-
Connectez-vous à la console OCI et cliquez sur Cloud Shell dans la barre de navigation supérieure.
Remarque : vous pouvez également utiliser votre propre outil IDE pour créer et déployer une fonction.
-
Créez une fonction à l'aide de l'interface de ligne de commande du projet Fn à partir de cloud shell. Pour plus d'informations, reportez-vous à Création, déploiement et appel d'une fonction HelloWorld.
fn init --runtime python <function-name> Example: fn init --runtime python rotatecred-func
-
Passez au répertoire que vous venez de créer.
-
Créez une application pour déployer la fonction à l'aide de la commande suivante.
# Specify the OCID of subnet fn create app <app-name> --annotation oracle.com/oci/subnetIds='["<subnet OCID>"]' Example: fn create app rotatecredapp --annotation oracle.com/oci/subnetIds='["ocid1.subnet.oc1.ap-mumbai-1.aaaaaaaabitp32dkyox37qa3tk3evl2nxivwb....."]'
-
Copiez et collez le script suivant dans
func.py
en écrasant le contenu existant.# python script for auto rotation of OCI IAM credentials import io import json import logging import oci import base64 from fdk import response from Cryptodome.PublicKey import RSA # Get Resource Principal Credentials signer = oci.auth.signers.get_resource_principals_signer() # Initialize client identity_client = oci.identity.IdentityClient(config={}, signer=signer) onsclient = oci.ons.NotificationDataPlaneClient(config={}, signer=signer) vault_client = oci.vault.VaultsClient(config={}, signer=signer) # Get tenancy id and name tenancy_data = identity_client.get_tenancy(tenancy_id=signer.tenancy_id).data t_name = str(tenancy_data.name) t_id = signer.tenancy_id # Get secret OCID from comments def get_secret_ocids(comments_items,find_name): secret_ocid = "" for comment in comments_items: if comment.split(":")[0] == find_name: secret_ocid = comment.split(":")[1] return secret_ocid # Function to store secret in OCI vault def update_secret(vault_client,secret_id,new_value): # Base64 encode new_token_ascii = new_value.encode("ascii") base64_bytes = base64.b64encode(new_token_ascii) base64_string = base64_bytes.decode("ascii") # Create new version of secret vault_client.update_secret(secret_id=secret_id,update_secret_details=oci.vault.models.UpdateSecretDetails(secret_content=oci.vault.models.Base64SecretContentDetails(content_type="BASE64", content=base64_string))) def handler(ctx, data: io.BytesIO=None): try: cfg = ctx.Config() ons_topic = cfg["ons_topic"] body = json.loads(data.getvalue()) # Get common parameters values e_time = str(body["eventTime"]).lstrip() problem_name = str(body["data"]["additionalDetails"]["problemName"]).lstrip() status = "NOT RESOLVED" resource_name = str(body["data"]["resourceName"]).lstrip() user_ocid = str(body["data"]["additionalDetails"]["problemAdditionalDetails"]["User OCID"]).lstrip() target_resource_name = str(body["data"]["additionalDetails"]["resourceName"]).lstrip() target_resource_id = str(body["data"]["additionalDetails"]["resourceId"]).lstrip() risk_level = str(body["data"]["additionalDetails"]["riskLevel"]).lstrip() comments = str(body["data"]["additionalDetails"]["problemAdditionalDetails"]["comments"]).lstrip() comments_items = comments.split(",") additional_details = "\r\r\nAction : Closure comments was not in required format hence, no action by automation." try: # Check Problem Type if problem_name == "PASSWORD_TOO_OLD": identity_client.create_or_reset_ui_password(user_id=user_ocid) additional_details = "\r\r\nAction : Your password has been reset by the System Administrator as per password policy rotation. Please set new password by clicking on forgot password from OCI console. " status = "RESOLVED" elif problem_name == "AUTH_TOKEN_TOO_OLD": auth_secret_ocid = get_secret_ocids(comments_items,"auth_secret_ocid") if auth_secret_ocid != "": # Delete existing auth token identity_client.delete_auth_token(user_id=user_ocid, auth_token_id=target_resource_id) # Create new auth token create_auth_token_response = identity_client.create_auth_token( create_auth_token_details=oci.identity.models.CreateAuthTokenDetails(description=target_resource_name),user_id=user_ocid).data new_value = create_auth_token_response.token # Store new auth token in vault secret update_secret(vault_client,auth_secret_ocid,new_value) additional_details = '\r\nAuth Token - Secret OCID : ' + auth_secret_ocid status = "RESOLVED" elif problem_name == "SECRET_KEY_TOO_OLD": access_id_secret_ocid = get_secret_ocids(comments_items, "accesskey_secret_ocid") secret_key_secret_ocid = get_secret_ocids(comments_items, "secretkey_secret_ocid") if access_id_secret_ocid != "" and secret_key_secret_ocid != "": # Delete existing customer secrete key delete_secret_key_response = identity_client.delete_customer_secret_key(user_ocid, target_resource_id).data # Create new customer secret key create_customer_secret_key_response = identity_client.create_customer_secret_key(create_customer_secret_key_details=oci.identity.models.CreateCustomerSecretKeyDetails(display_name=target_resource_name),user_id=user_ocid).data new_secret_key = str(create_customer_secret_key_response.key) new_access_key_id = str(create_customer_secret_key_response.id) # Store new customer secret key in vault secret update_secret(vault_client,secret_key_secret_ocid,new_secret_key) update_secret(vault_client,access_id_secret_ocid,new_access_key_id) additional_details = '\r\nAccess Key - Secret OCID : ' + access_id_secret_ocid + \ '\r\nSecret Key - Secret OCID : ' + secret_key_secret_ocid status = "RESOLVED" elif problem_name == "API_KEY_TOO_OLD": key_fingerprint = target_resource_id.split("/")[2] api_secret_ocid = get_secret_ocids(comments_items,"api_secret_ocid") if api_secret_ocid != "": key = RSA.generate(2048) key_private = key.exportKey() pubkey = key.publickey() key_public = pubkey.exportKey() # Delete existing API key delete_api_key_response = identity_client.delete_api_key(user_id=user_ocid,fingerprint=key_fingerprint) # Upload new public API key in OCI for the user upload_api_key_response = identity_client.upload_api_key(user_id=user_ocid, create_api_key_details=oci.identity.models.CreateApiKeyDetails( key=key_public.decode())) # Store content of new private key in vault secret update_secret(vault_client,api_secret_ocid,key_private.decode()) additional_details = '\r\nSecret OCID for private API key : ' + api_secret_ocid status = "RESOLVED" except Exception as e: additional_details = '\r\r\n Error: '+ str(e) # Message Body Customization, it can be updated as per need line_head = 'Oracle Cloud Notification' + '\n=====================' message_body = line_head + \ '\r\r\nProblem Name : ' + problem_name + \ '\r\r\nRisk Level : ' + risk_level + \ '\r\nEvent Time : ' + e_time + \ '\r\nTenancy Name : ' + t_name + \ '\r\nTenancy ID : ' + t_id + \ '\r\r\nAdditional Details : ' + '\n-------------------------' \ '\r\nResource Name : ' + target_resource_name + \ '\r\nResource ID : ' + target_resource_id + \ '\r\nResource User OCID : ' + user_ocid + ' ' + additional_details # Message Title message_title = 'Problem : ' + resource_name + ' | ' + status +' by automation ' # Message Detail message_details = oci.ons.models.MessageDetails(body=message_body, title=message_title) # Publish message to ONS onsclient.publish_message(ons_topic, message_details) except (Exception, ValueError) as ex: logging.getLogger().info('error parsing json payload: ' + str(ex)) return response.Response(ctx, response_data=json.dumps({"message": "success"}),headers={"Content-Type": "application/json"})
-
Mettez à jour
requirements.txt
comme indiqué ci-dessous.fdk>=0.1.59 oci pycryptodomex
-
Exécutez la commande suivante pour déployer la fonction.
fn -v deploy --app <app-name> Example: fn -v deploy --app rotatecredapp
-
Exécutez la commande suivante pour ajouter une configuration de fonction pour la clé et la valeur de configuration.
ons_topic
: utilisez l'identificateur Oracle Cloud (OCID) du sujet de notification pour recevoir la notification par courriel.
fn config function <app-name> <function-name> <config-key> <config-value> Example: fn config function rotatecredapp rotatecred-func ons_topic ocid1.onstopic.oc1.ap-mumbai-1.aaaaaaaau3onlufcfz.......kae26637zovwd7q
Tâche 2 : créer une règle d'événement
-
Accédez à la console OCI et cliquez sur Observation et gestion.
-
Sous Service d'événements, cliquez sur Règles et Créer une règle.
-
Sur la page Créer une règle, entrez le nom de la règle et la description de l'action de la règle.
-
Dans la section Conditions de règle, entrez les informations suivantes pour indiquer le type d'événement et l'action à déclencher pour la fonction.
- Configuration :
Event Type
. - Nom de service :
Cloud Guard
. - Type d'événement :
Remediated-Problem
. - Nom d'attribut :
ProblemRecommendation
. - Valeurs d'attribut :
Rotate IAM Console password regularly, at least every 90 days.
,Rotate IAM Auth token regularly, at least every 90 days.
,Rotate IAM Customer secret keys regularly, at least every 90 days.
,Rotate API keys regularly, at least every 90 days
.
L'image suivante est un exemple d'événement de résolution de problème Oracle Cloud Guard.
- Configuration :
Tâche 3 : résoudre le problème lié à Oracle Cloud Guard
-
Accédez à la console OCI et cliquez sur Identité et sécurité.
-
Sous Cloud Guard, cliquez sur Problèmes.
-
Cliquez sur l'un des problèmes pris en charge pour la rotation automatique.
-
Cliquez sur Marquer comme résolu et entrez les informations suivantes dans la section Commentaire selon le format suivant. Vous pouvez ajouter des informations supplémentaires conformément au processus de votre organisation, ainsi que les informations suivantes, séparées par des virgules (,).
-
La clé secrète client IAM est trop ancienne.
accesskey_secret_ocid:<OCID of access key secret>,secretkey_secret_ocid:<OCID of secret key secret>,<additional comments>
-
La clé d'API est trop ancienne.
api_secret_ocid:<OCID of api key secret>,<additional comments>
-
Le jeton d'authentification IAM est trop ancien.
auth_secret_ocid:<OCID of auth token secret>,<additional comments>
-
Le mot de passe est trop ancien.
Remarque :
- Aucune information requise à inclure dans les commentaires pour ce problème.
- Le mot de passe doit être réinitialisé par l'utilisateur individuel en cliquant sur Mot de passe oublié lors de la prochaine connexion. L'utilisateur doit disposer d'une adresse électronique valide pour recevoir les notifications par courriel.
-
Tâche 4 : validation des nouvelles informations d'identification OCI IAM et notification par courriel
Vous recevrez un courriel de résolution des problèmes avec des détails sur l'OCID de clé secrète faisant l'objet d'une rotation et des informations supplémentaires.
Liens connexes
Remerciements
-
Auteur - Dipesh Kumar Rathod (architecte cloud principal principal, infrastructure)
-
Contributeur - Bhanu Prakash Lohumi (ingénieur cloud senior, infrastructure)
Ressources de formation supplémentaires
Parcourez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, rendez-vous sur education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.
Enable Auto Rotation of Oracle Cloud Infrastructure Identity and Access Management Credentials
F93264-01
February 2024
Copyright © 2024, Oracle and/or its affiliates.