无法通过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存在多个问题:
- CDK构造函数运行在本地合成阶段,此时SNS主题等资源尚未部署,虽然代码中能获取
topicArn,但实际执行SDK调用时,资源可能还不存在 - 异步代码在CDK合成时不会等待执行完成,调用可能在合成结束前中断
- 硬编码角色ARN,且catch块为空,无法排查错误
- 该调用是本地执行,而非部署阶段在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 } } }); } }
关键说明
- 必须实例化
CfnAccountAuditConfiguration:这是CloudFormation的原生资源,CDK会将其转换为模板中的资源定义,部署时由CloudFormation创建/更新审计配置 - 用CDK管理IAM角色:避免手动创建角色带来的权限缺失或ARN硬编码问题,同时确保角色信任关系正确(允许IoT服务扮演)
- SNS权限配置:必须显式允许审计角色发布消息到SNS主题,否则通知无法发送
- 审计检查项命名:CDK中使用驼峰命名(如
deviceCertificateExpiringCheck),对应AWS控制台中的DEVICE_CERTIFICATE_EXPIRING_CHECK
部署此栈后,登录AWS IoT控制台,进入Device Defender > 审计,即可看到审计已启用,且设备证书过期检查处于激活状态。
内容的提问来源于stack exchange,提问作者IgorAlves
相关产品推荐
相关产品推荐

