注意:

仅使用事件规则和 Python 函数为 OCI 计算实例自动将实例元数据服务更新到版本 2

简介

确保云环境的安全性和一致性是现代企业的首要任务。在 Oracle Cloud Infrastructure (OCI) 中,实例元数据服务 (Instance Metadata Service,IMDS) 提供特定于实例的关键信息,并强制使用版本 2 (IMDSv2) 通过要求基于会话的验证来增强安全性。在所有 OCI 计算实例中自动升级到 IMDSv2 是保持此安全标准并减少手动开销的有效方法。

本教程演示如何使用 OCI 事件服务规则和 OCI 函数构建自动化、事件驱动的工作流,以强制执行 IMDSv2 更新。通过利用基于 Python 的自动化,您将创建和配置必要的 OCI 资源(例如动态组、事件规则和无服务器功能),以无缝确保符合此增强的安全协议。

目标

更新实例 IMDS

先决条件

任务 1:创建动态组

定义动态组以允许函数访问目标实例。要使用其他 OCI 服务,您的函数必须属于动态组。

ALL {resource.type = 'fnfunc'}

指定匹配规则时,建议将区间中的所有函数与以下项进行匹配:

ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxx'}

动态组

任务 2:定义 OCI IAM 策略

创建一个允许动态组管理计算实例的新策略。我们将授予对特定区间中实例的管理访问权限。

Allow dynamic-group dmg-for-functions to manage instance-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage functions-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to use virtual-network-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage instances in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to read repos in compartment Compartment-Name

策略

任务 3:创建和部署 OCI 函数

创建、部署和调用用于 IMDS 更新的函数。

  1. 在 OCI 控制台中创建应用程序。

    登录到 OCI 控制台,导航到 Developer Services(开发人员服务)Functions(函数)并单击 Applications(应用程序)。为 OCI Functions 选择适当的区域,然后单击创建应用程序

    OCI 函数

  2. 为函数部署设置环境,在 OCI Cloud Shell 或 OCI Compute 实例(运行 Oracle Linux 8)或您计划创建和部署函数的任何系统上执行以下设置。

  3. 登录到 OCI Cloud Shell 或 OCI Compute 实例,并访问要在其中创建函数的 OCI Cloud Shell 或 OCI Compute 实例。设置 OCI 函数 CLI 的上下文以指定将部署函数的区域。

    fn use context <region-name>
    Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
    
  4. 使用区间 ID 更新上下文。运行以下命令以设置应用程序将驻留的区间。

    fn update context oracle.compartment-id <compartment-ocid>
    
  5. 设置 OCI 注册表。输入唯一的资料档案库名称前缀以区分函数映像。运行以下命令以更新注册表。

    fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>
    Example: ap-hyderabad-1.ocir.io/namespace/prefix.
    
  6. 在您的用户配置文件下从 OCI 控制台生成验证令牌,然后运行以下命令以使用验证令牌登录到容器注册表。

    docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
    
  7. 通过列出应用程序确认应用程序设置正确。请运行以下命令列出应用程序。

    fn list apps
    
  8. 使用 Python 运行时创建一个名为 imdsupdate 的新函数并初始化该函数。

    fn init --runtime python imdsupdate
    
  9. 运行以下命令以导航到创建的目录。

    cd imdsupdate
    
  10. 运行 ls 命令以列出生成的文件。

    ls
    

任务 4:更新 Python 函数代码

  1. 在目录中打开和编辑生成的 Python 文件(例如 func.py),并将以下 python 代码添加到逻辑的函数文件中。

    import io
    import json
    import logging
    from fdk import response
    import oci
    
    
    def handler(ctx, data: io.BytesIO = None):
        try:
            # Authenticate using Instance Principals
            signer = oci.auth.signers.get_resource_principals_signer()
            body = json.loads(data.getvalue())
            logging.getLogger().info("Event body: " + str(body))
    
            # Extract Required Details From Event Rule
            instance_id = body["data"]["resourceId"]  # Instance OCID
            action_type = body["eventType"]
    
            logging.getLogger().info("Action type: " + action_type)
    
            # Proceed only if instance creation event
            if action_type == "com.oraclecloud.computeapi.launchinstance.end":
                compute_client = oci.core.ComputeClient(config={}, signer=signer)
                update_instance_imds(compute_client, instance_id)
    
        except (Exception, ValueError) as ex:
            logging.getLogger().error("Error: " + str(ex))
            return response.Response(
                ctx,
                response_data=json.dumps({"message": "Error: " + str(ex)}),
                headers={"Content-Type": "application/json"},
            )
    
        return response.Response(
            ctx,
            response_data=json.dumps({"message": "Function executed successfully"}),
            headers={"Content-Type": "application/json"},
        )
    
    
    def update_instance_imds(compute_client, instance_id):
        """
        Updates the instance metadata service (IMDS) configuration to disable legacy endpoints.
        """
        try:
            # Fetch instance details
            instance_details = compute_client.get_instance(instance_id).data
    
            # Update instance configuration
            update_details = oci.core.models.UpdateInstanceDetails(
                instance_options=oci.core.models.InstanceOptions(
                    are_legacy_imds_endpoints_disabled=True  # Disable legacy endpoints
                )
            )
            response = compute_client.update_instance(instance_id, update_details)
    
            logging.getLogger().info(
                f"Successfully updated IMDS for instance {instance_id}: {response.data}"
            )
    
        except Exception as ex:
            logging.getLogger().error("Failed to update IMDS: " + str(ex))
            raise
    
  2. 更新 requirements.txt 文件。

    fdk>=0.1.86
    oci==2.138.0
    
  3. 运行以下命令以将函数部署到创建的应用程序。

    fn -v deploy --app <application-name>
    Example: fn -v deploy --app functionpyth.
    

这些步骤可确保创建、部署和调用该函数,以便在 OCI 中自动执行 IMDS 版本更新。

功能代码更新

任务 5:定义事件规则

使用 OCI 事件服务检测何时创建新的 OCI 计算实例。

要配置事件规则,请输入以下信息。

事件规则

任务 6:验证实例 IMDS 值

启动新实例以触发事件规则并验证实例元数据服务配置。虚拟机 (Virtual Machine,VM) 创建完成后,它将自动将 IMDS 值设置为仅版本 2。

这些配置特定于区域和区间。如果要调用其他区间中的同一函数,请在该区间中创建事件规则并设置用于触发此函数的规则。

通过完成这些任务,您将自动为特定区间中的 OCI 计算实例将 IMDS 版本更新到 v2。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心