You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过CDK开启AWS IoT安全审计的技术求助

如何通过AWS CDK启用IoT Device Defender安全审计?

问题描述

我尝试通过CDK栈开启AWS IoT安全审计,但两种方法均未生效:

  • 方法1:参考AuditCheckConfigurationProperty接口编写代码,但审计未启用
  • 方法2:在CDK中直接调用AWS SDK更新审计配置,同时创建SNS主题接收结果,同样未生效

预期结果:执行CDK部署后,Device Defender审计设置及设备证书过期检查处于启用状态;实际结果:IoT安全审计仍为关闭状态。


失败的方法1:仅定义配置对象,未创建CloudFormation资源

代码中仅声明了审计配置变量,但没有实际实例化CfnAccountAuditConfiguration资源,所以CloudFormation不会部署任何审计配置到AWS:

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import { aws_iot as iot } from 'aws-cdk-lib';

export class CdkIotDeviceDefenderStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const auditCheckConfigurationProperty: iot.CfnAccountAuditConfiguration.AuditCheckConfigurationProperty = {
      enabled: true,
    };

    const auditCheckConfigurationsProperty: iot.CfnAccountAuditConfiguration.AuditCheckConfigurationsProperty = {
        deviceCertificateExpiringCheck: {
            enabled: true,
        }
    };

    // 缺少关键步骤:创建CfnAccountAuditConfiguration资源
  }
}

失败的方法2:在CDK合成阶段直接调用AWS SDK

直接在CDK构造函数中调用AWS SDK存在多个问题:

  1. CDK构造函数运行在本地合成阶段,此时SNS主题等资源尚未部署,虽然代码中能获取topicArn,但实际执行SDK调用时,资源可能还不存在
  2. 异步代码在CDK合成时不会等待执行完成,调用可能在合成结束前中断
  3. 硬编码角色ARN,且catch块为空,无法排查错误
  4. 该调用是本地执行,而非部署阶段在AWS环境中执行,可能存在权限问题
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

import { IoTClient, UpdateAccountAuditConfigurationCommand } from "@aws-sdk/client-iot";

import * as sns from 'aws-cdk-lib/aws-sns';
import * as subscriptions from 'aws-cdk-lib/aws-sns-subscriptions';

export class CdkIotDeviceDefenderStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const expiredDeviceCertificateSNTopic = new sns.Topic(this, "SNSDeviceDefender", {
      displayName: 'Device Defender Expired Certificate SNS',
      fifo: false
    });

    const clientIoT = new IoTClient({ region: "us-west-2" });
    
    const auditCheckConfigParams: any = {
        roleArn: "arn:aws:iam::996242555412:role/Role_AWSIoTDeviceDefenderAudit",
        auditNotificationTargetConfigurations: {
            "SNS": {
                "targetArn": expiredDeviceCertificateSNTopic.topicArn,
                "roleArn": "arn:aws:iam::996242555412:role/Role_AWSIoTDeviceDefenderAudit",
                "enabled": true
            }
        },
        auditCheckConfigurations: {
            "DEVICE_CERTIFICATE_EXPIRING_CHECK": {
              enabled: true,
            }
        }
    };
    (async () => {
        try {
            const iotUpdateCmd = new UpdateAccountAuditConfigurationCommand(auditCheckConfigParams);
            const iotUpdateResponse = await clientIoT.send(iotUpdateCmd);
        } catch { } // 空catch无法排查错误
    })();

  }
}

正确解决方案:使用CDK原生CfnAccountAuditConfiguration资源

这是最可靠的方式,直接通过CloudFormation资源定义审计配置,同时用CDK创建所需的IAM角色(避免手动创建的权限或一致性问题):

步骤1:创建IAM角色,授予IoT Device Defender审计权限

步骤2:实例化CfnAccountAuditConfiguration,关联角色、SNS主题和审计检查项

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { aws_iot as iot, aws_iam as iam, aws_sns as sns } from 'aws-cdk-lib';

export class CdkIotDeviceDefenderStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // 1. 创建SNS主题用于接收审计通知
    const auditSnsTopic = new sns.Topic(this, "IoTDeviceDefenderAuditTopic", {
      displayName: "IoT Device Defender Audit Notifications"
    });

    // 2. 创建IAM角色,允许IoT服务调用审计相关操作并发送SNS通知
    const auditRole = new iam.Role(this, "IoTDeviceDefenderAuditRole", {
      assumedBy: new iam.ServicePrincipal("iot.amazonaws.com"),
      managedPolicies: [
        iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSIoTDeviceDefenderAudit")
      ]
    });

    // 3. 允许角色发布消息到SNS主题
    auditSnsTopic.grantPublish(auditRole);

    // 4. 创建IoT账户审计配置资源
    new iot.CfnAccountAuditConfiguration(this, "IoTAuditConfiguration", {
      roleArn: auditRole.roleArn,
      auditCheckConfigurations: {
        // 启用设备证书过期检查
        deviceCertificateExpiringCheck: {
          enabled: true
        },
        // 可添加其他需要启用的审计检查项
        // caCertificateExpiringCheck: { enabled: true },
        // deviceCertificateKeyQualityCheck: { enabled: true }
      },
      auditNotificationTargetConfigurations: {
        sns: {
          targetArn: auditSnsTopic.topicArn,
          roleArn: auditRole.roleArn,
          enabled: true
        }
      }
    });
  }
}

关键说明

  1. 必须实例化CfnAccountAuditConfiguration:这是CloudFormation的原生资源,CDK会将其转换为模板中的资源定义,部署时由CloudFormation创建/更新审计配置
  2. 用CDK管理IAM角色:避免手动创建角色带来的权限缺失或ARN硬编码问题,同时确保角色信任关系正确(允许IoT服务扮演)
  3. SNS权限配置:必须显式允许审计角色发布消息到SNS主题,否则通知无法发送
  4. 审计检查项命名:CDK中使用驼峰命名(如deviceCertificateExpiringCheck),对应AWS控制台中的DEVICE_CERTIFICATE_EXPIRING_CHECK

部署此栈后,登录AWS IoT控制台,进入Device Defender > 审计,即可看到审计已启用,且设备证书过期检查处于激活状态。

内容的提问来源于stack exchange,提问作者IgorAlves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:07:18