亚马逊AWS官方博客

针对常见物联网安全事件的持续检测和监控解决方案

近几年来,随着物联网技术的不断成熟和相关国家政策的驱动,大量物联网行业创新应用得到了快速发展。从消费端智能家居,智能单品的爆发式增长,到企业端在智能制造,智慧交通,公共安全和医疗领域等不断创新,整个物联网的市场规模在迅速扩展。然而,随之而来的问题便是越来越多的物联网信息安全事件不断频发。由于物联网设备的一些先天限制,比如要求设备低功耗,体积小,成本低,通常企业选择的物联网模组芯片安全性能不高,因此这些物联网设备都容易成为黑客的攻击对象。作者根据近几年频发的物联网安全事件总结出常见的物联网设备异常行为如下:

一、DDOS 攻击。设备被控制并对服务器进行DDOS攻击,设备发送大量异常数据到服务器,结果导致设备本身无法正常工作以及服务器瘫痪。

二、设备证书泄露以及滥用,设备证书不唯一,设备证书共享导致的安全问题。另外IOT 权限设置过于宽泛,黑客可以利用以上漏洞来控制设备并造成数据泄露。

三、设备离线问题。黑客通过扫描默认密码或者弱密码进入设备,删除设备防火墙或者磁盘分区,导致大量设备“变砖”,无法正常工作,造成企业和个人的生命财产安全损失。

亚马逊云科技推出了众多原生的物联网服务来满足不同客户对于物联网设备上云的需求。其中Amazon IoT Core是最主要的连接服务,它能帮助客户将海量设备连接上云;Amazon IoT Device Defender 是一项针对物联网设备的安全服务,客户可以借助此服务审核设备的安全配置,检测异常行为,从而降低安全风险;此外,亚马逊云还提供了常见的消息通知服务和日志分析监控服务帮助客户实现对云中安全事件的持续检测和监控。

在这篇博文中,作者将介绍如何通过集成亚马逊云相关服务来实现企业对于以上物联网安全事件的持续检测和监控。主要内容包含以下几个方面:

一、针对物联网设备DDOS攻击的持续检测和监控解决方案

二、针对物联网设备证书安全和权限问题的持续检测和监控解决方案

三、针对物联网设备生命周期事件的持续检测和监控解决方案

关于Amazon IoT Device Defender Audit/Detect

Amazon IoT Device Defender推出Audit(审计)功能,它能够从设备和客户账户层面来审计相关的安全配置和权限是否满足安全规范。比如Audit能够帮助检查设备证书是否唯一,是否存在证书共享问题,IoT policy权限是否设置过高,设备证书是否快过期等问题。您可以定期或者按要求来启动Audit。

当前,IoT Device Defender Audit配置了预先定义好的审计检查项,您可以通过启动Audit功能来完成对所有审计项的检查。具体审计列表请查看以下官方文档:

https://docs.aws.amazon.com/iot/latest/developerguide/device-defender-audit-checks.html

Amazon IoT Device Defender推出Detect功能帮助客户发现设备产生的异常行为。它通过检测设备行为来帮助客户发现设备是否存在被入侵的倾向。Detect定义了cloud-side metrics和device-side metrics来帮助客户检测云中和设备端的异常现象,比如:

  • 设备连接状态的异常
  • 设备是否尝试连接未授权的端口
  • 设备收到和发出的数据量大小异常

客户可以创建一个security profiles将需要检测的metrics包含其中,然后集成Amazon CloudWatch和Amazon SNS服务。这样,一旦设备有异常行为发生,相关的报警事件就可以第一时间通知到客户。详细说明请查看以下官方文档:

https://docs.aws.amazon.com/iot/latest/developerguide/device-defender-detect.html

解决方案架构综述

此解决方案在设备侧利用IoT SDK(亚马逊云提供embedded C, C++,java,python等SDK)将客户的物联网设备,比如传感器,机器,家电产品等连接到Amazon IoT Core服务中,这样设备便能够连接上云。接下来IoT Device Defender服务会对从设备产生的运行数据和日志进行审计和检测并将结果发送到Amazon CloudWatch中。客户可以在CloudWatch中查看到对应的审计日志并做初步分析,同时您还可以针对特定的Metric创建Alarm,定义报警规则以及下一步的触发对象,比如Amazon SNS服务。在SNS中,您可以配置SNS的通知对象为lambda函数,并在lambda中对数据进行预处理并将结果推送到Amazon OpenSearch服务。最终,我们通过OpenSearch服务来实时分析和可视化日志事件。当中,我们通过Amazon Secrets Manager服务来存储OpenSearch服务相关的验证密钥。通过这样的方式,我们就可以对物联网设备产生的异常事件和安全配置问题进行持续检测和监控。

先决条件

  • 您在本地有demo硬件,并且安装了对应的IoT Device SDK,而且设备可以成功连接上Amazon IoT Core并上报数据。
  • 如果没有达到以上条件,可以通过以下方式在Amazon EC2中建立虚拟设备,并将设备连接上云。以下提供C++和embedded C的SDK

https://github.com/awslabs/aws-iot-device-client

https://github.com/aws/aws-iot-device-sdk-embedded-C

  • 在设备端完成device-side metric相关SDK配置工作,具体的配置方式请参考以下官方文档

https://docs.aws.amazon.com/iot/latest/developerguide/detect-device-side-metrics.html#DetectMetricsMessages

演练操作步骤

本演练操作包含三个部分:

  • 创建Amazon IoT Core和Device Defender相关资源,完成对物联网设备的审计和异常行为检测。包括DDOS攻击,设备证书安全相关事件和生命周期事件。
  • 创建Amazon SNS,Amazon CloudWatch,Amazon Lambda相关资源,从而建立对设备安全事件的持续监控和响应。
  • 创建Amazon OpenSearch等相关资源,完成对设备安全事件的实时分析和可视化监控。

创建Amazon IoT Core和Device Defender相关资源,完成对物联网设备的审计和异常行为检测。包括DDOS攻击,设备证书安全相关事件和生命周期事件。

针对前文提到的三类物联网设备安全事件(DDOS攻击,设备证书安全和权限配置问题,设备变砖离线问题),我们可以通过Amazon IoT Core和Device Defender来持续检测。

首先,我们来创建对于设备证书安全和权限配置的检测。本文提供相应的CloudFormation代码帮助快速部署相应资源。首先我们部署本解决方案需要用到的IAM资源。我们打开Amazon CloudFormation Console,创建Stack并导入如下CloudFormation代码:

AWSTemplateFormatVersion: "2010-09-09"
Description: ""
Resources:
    IAMRole:
        Type: "AWS::IAM::Role"
        Properties:
            Path: "/"
            RoleName: "aod_iot_defender_SNS"
            AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
            MaxSessionDuration: 3600
            ManagedPolicyArns: 
              - "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderAddThingsToThingGroupMitigationAction"
              - "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderEnableIoTLoggingMitigationAction"
              - "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderReplaceDefaultPolicyMitigationAction"
              - "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderUpdateCACertMitigationAction"
              - "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderUpdateDeviceCertMitigationAction"
              - "arn:aws:iam::aws:policy/service-role/AWSIoTDeviceDefenderPublishFindingsToSNSMitigationAction"
            Description: "Provides AWS IoT Device Defender write access to IoT and related resources for execution of Mitigation Actions."
    IAMRole2:
        Type: "AWS::IAM::Role"
        Properties:
            Path: "/"
            RoleName: "iot_device_connect_status_to_SNS_role"
            AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
            MaxSessionDuration: 3600
            Policies:
              - PolicyName: iot-device-connect-status-policy
                PolicyDocument:
                  Version: "2012-10-17"
                  Statement:
                    - Effect: Allow
                      Action: 'sns:Publish'
                      Resource: !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:SNS_test"
    IAMRole3:
        Type: "AWS::IAM::Role"
        Properties:
            Path: "/service-role/"
            RoleName: "iot-logs-to-OpenSearch-aod-test-role-g373dnli"
            AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
            MaxSessionDuration: 3600
            ManagedPolicyArns: 
              - !Sub "arn:aws:iam::${AWS::AccountId}:policy/service-role/AWSLambdaBasicExecutionRole-5ca5e513-45ed-4ad0-9250-aa0ed765f5a9"
              - 'arn:aws:iam::aws:policy/AmazonOpenSearchServiceFullAccess'
              - 'arn:aws:iam::aws:policy/SecretsManagerReadWrite'

由上,我们启动了3个IAM role,后面的资源部署会用到以上IAM资源,用户可以根据自己的情况自定义Role Name。

接下来我们启动Amazon IoT Device Defender Audit功能。我们打开Amazon CloudFormation Console,创建Stack并导入如下CloudFormation代码:

AWSTemplateFormatVersion: "2010-09-09"
Description: ""
Resources:
    IoTScheduledAudit:
        Type: "AWS::IoT::ScheduledAudit"
        Properties:
            ScheduledAuditName: "Aod_IoT_device_defender_audit"
            Frequency: "DAILY"
            TargetCheckNames: 
              - "AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK"
              - "CA_CERTIFICATE_EXPIRING_CHECK"
              - "CA_CERTIFICATE_KEY_QUALITY_CHECK"
              - "CONFLICTING_CLIENT_IDS_CHECK"
              - "DEVICE_CERTIFICATE_EXPIRING_CHECK"
              - "DEVICE_CERTIFICATE_KEY_QUALITY_CHECK"
              - "DEVICE_CERTIFICATE_SHARED_CHECK"
              - "INTERMEDIATE_CA_REVOKED_FOR_ACTIVE_DEVICE_CERTIFICATES_CHECK"
              - "IOT_POLICY_OVERLY_PERMISSIVE_CHECK"
              - "IOT_ROLE_ALIAS_ALLOWS_ACCESS_TO_UNUSED_SERVICES_CHECK"
              - "IOT_ROLE_ALIAS_OVERLY_PERMISSIVE_CHECK"
              - "LOGGING_DISABLED_CHECK"
              - "REVOKED_CA_CERTIFICATE_STILL_ACTIVE_CHECK"
              - "REVOKED_DEVICE_CERTIFICATE_STILL_ACTIVE_CHECK"
              - "UNAUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK"

当部署成功后,我们可以在Amazon IoT Core Console-Audit中看到daily的审计结果,如下图所示,其中5条审计规则报警,其中包括IoT policy overly permissive和CA certificate expiring等问题。

点击对应的Check Name可以看到哪些IoT资源违反了审计规则,如下图所示。


另外,我们还可以看到其他9项合规的审计,如果未来有相关资源违规也会被持续检测到,如下图所示:

以上,我们完成了对于设备证书安全和权限配置的审计工作。

针对设备DDOS攻击,我们需要启动Amazon IoT Device Defender Detect来进行device side metric的检测。在本文中,我们通过开启对于设备端Packets in/out以及Bytes in/out的异常行为来检测设备是否发起DDOS攻击。同样,作者提供CloudFormation代码如下:

AWSTemplateFormatVersion: "2010-09-09"
Description: ""
Resources:
    IoTSecurityProfile:
        Type: "AWS::IoT::SecurityProfile"
        Properties:
            SecurityProfileName: "aod_demo"
            TargetArns: 
              - "arn:aws:iot:us-west-2:xxxxxxxxxxxx:all/things"
            Behaviors: 
              - 
                Name: "Bytes_in"
                Metric: "aws:all-bytes-in"
                Criteria: 
                    ComparisonOperator: "greater-than"
                    ConsecutiveDatapointsToAlarm: 1
                    ConsecutiveDatapointsToClear: 1
                    DurationSeconds: 300
                    Value: 
                        Count: 500
              - 
                Name: "Bytes_out"
                Metric: "aws:all-bytes-out"
                Criteria: 
                    ComparisonOperator: "greater-than"
                    ConsecutiveDatapointsToAlarm: 1
                    ConsecutiveDatapointsToClear: 1
                    DurationSeconds: 300
                    Value: 
                        Count: 500
              - 
                Name: "Packets_in"
                Metric: "aws:all-packets-in"
                Criteria: 
                    ComparisonOperator: "greater-than"
                    ConsecutiveDatapointsToAlarm: 1
                    ConsecutiveDatapointsToClear: 1
                    DurationSeconds: 300
                    Value: 
                        Count: 5
              - 
                Name: "Packets_out"
                Metric: "aws:all-packets-out"
                Criteria: 
                    ComparisonOperator: "greater-than"
                    ConsecutiveDatapointsToAlarm: 1
                    ConsecutiveDatapointsToClear: 1
                    DurationSeconds: 300
                    Value: 
                        Count: 5
            AlertTargets: 
                SNS: 
                    AlertTargetArn: 'arn:aws:sns:us-west-2:xxxxxxxxxxxx:SNS_test'
                    RoleArn: 'arn:aws:iam::xxxxxxxxxxxx:role/aod_iot_defender_SNS'

打开CloudFormation console,导入以上yaml文件,创建stack,成功之后我们可以在IoT Console-Security-Detect-Security Profiles中看到创建的Metrics监控事件。从以上CloudFormation中我们创建了Bytes in/out事件,定义当5分钟内设备端接受或者发出的数据量大于500 Bytes便报警;同时创建Packets in/out事件,定义当5分钟内设备接受或者发出的数据包数量大于5时报警。您可以根据自己的业务情况来定义DDOS攻击的判断条件。如下图所示,在console中相关的事件已经被云端检测到。


接下来,我们将创建针对于设备变砖离线事件的检测。Amazon IoT Core会将设备的生命周期事件发送到云端,我们可以利用这些生命周期事件来知道设备现在处于什么连接状态。比如针对于设备的Connect/Disconnect事件,我们可以通过以下默认的两个MQTT topic来进行监听:

  • $aws/events/presence/connected/clientId
  • $aws/events/presence/disconnected/clientId

作者将建立一个Iot Rule对以上topic来进行监听,同时将事件消息发送到SNS服务。同样,提供Cloudformation代码如下:

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyTopicRule:
    Type: AWS::IoT::TopicRule
    Properties:
      RuleName:
        'device_connection_aod'
      TopicRulePayload:
        Sql: SELECT * FROM '$aws/events/presence/+/demo_device'
        Actions:
        - Sns:
              RoleArn: 'arn:aws:iam::xxxxxxxxxxxx:role/iot_device_connect_status_to_SNS_role'
              TargetArn: !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:SNS_test"

通过CloudFormation来启动以上资源,成功后你可以在IoT Console中订阅到设备的上下线状态事件,如下图所示:

以上我们便完成了对于三类物联网设备安全事件(DDOS攻击,设备证书安全和权限配置问题,设备变砖离线问题)的持续检测。

创建Amazon SNS,Amazon CloudWatch,Amazon Lambda相关资源,从而建立对设备安全事件的持续监控和响应。

基于前文,我们完成了安全事件的审计和持续检测,接下来,我们需要对检测事件进行分析并将结果推送给消费者,从而完成对事件的持续监控和响应。首先,我们定义Amazon CloudWatch Alarm功能,将IoT Metrics作为监控对象,当检测到来自IoT Device Defender Audit和Detect的Metrics超过某个阈值时,向SNS发送报警。提供CloudFormation代码如下:

AWSTemplateFormatVersion: "2010-09-09"
Description: ""
Resources:
    CloudWatchAlarm:
        Type: "AWS::CloudWatch::Alarm"
        Properties:
            AlarmName: "Audit-IOT-POLICY-OVERLY-PERMISSIVE-Alarm"
            ActionsEnabled: true
            AlarmActions: 
              - !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:SNS_test"
            MetricName: "NonCompliantResources"
            Namespace: "AWS/IoT"
            Statistic: "Average"
            Dimensions: 
              - 
                Name: "CheckName"
                Value: "IOT_POLICY_OVERLY_PERMISSIVE_CHECK"
              - 
                Name: "ScheduledAuditName"
                Value: "Aod_IoT_device_defender_audit_test"
            Period: 86400
            EvaluationPeriods: 1
            DatapointsToAlarm: 1
            Threshold: 10
            ComparisonOperator: "GreaterThanThreshold"
            TreatMissingData: "missing"

    CloudWatchAlarm2:
        Type: "AWS::CloudWatch::Alarm"
        Properties:
            AlarmName: "device-side-bytes-out-alarm"
            ActionsEnabled: true
            AlarmActions: 
              - !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:SNS_test"
            MetricName: "BehaviorEvaluationCompleted"
            Namespace: "AWS/IoT"
            Statistic: "Average"
            Dimensions: 
              - 
                Name: "BehaviorName"
                Value: "Bytes_out"
              - 
                Name: "SecurityProfileName"
                Value: "aod_demo"
            Period: 300
            EvaluationPeriods: 1
            DatapointsToAlarm: 1
            Threshold: 5
            ComparisonOperator: "GreaterThanThreshold"
            TreatMissingData: "missing"

    CloudWatchAlarm3:
        Type: "AWS::CloudWatch::Alarm"
        Properties:
            AlarmName: "device-side-packets-out-aod"
            ActionsEnabled: true
            AlarmActions: 
              - !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:SNS_test"
            MetricName: "Violations"
            Namespace: "AWS/IoT"
            Statistic: "Average"
            Dimensions: 
              - 
                Name: "BehaviorName"
                Value: "Packets_out"
              - 
                Name: "SecurityProfileName"
                Value: "aod_demo"
            Period: 300
            EvaluationPeriods: 1
            DatapointsToAlarm: 1
            Threshold: 5
            ComparisonOperator: "GreaterThanThreshold"
            TreatMissingData: "missing"

由上,我们定义当IOT_POLICY_OVERLY_PERMISSIVE_CHECK在24小时内超过10个资源违规时产生报警并发送到SNS服务;Bytes out/Packets out在5分钟内触发超过5次时产生报警并发送到SNS服务。

接下来,我们创建SNS服务,接受以上报警并将消息发送给lambda。提供以下CloudFormation代码:

AWSTemplateFormatVersion: "2010-09-09"
Description: ""
Resources:
    SNSTopic:
        Type: "AWS::SNS::Topic"
        Properties:
            DisplayName: ""
            TopicName: "SNS_test"
            KmsMasterKeyId: "alias/aws/sns"

最后,我们创建Lambda函数,lambda函数会接受从SNS发来的数据,并将数据推送给Amazon OpenSearch服务进行实时分析和可视化展示。提供CloudFormation代码如下:

AWSTemplateFormatVersion: "2010-09-09"
Description: ""
Resources:
    LambdaFunction:
        Type: "AWS::Lambda::Function"
        Properties:
            Description: ""
            FunctionName: "iot-logs-to-OpenSearch-aod-test"
            Handler: "sample.handler"
            Architectures: 
              - "x86_64"
            Code: 
                S3Bucket: "aod-iot-device-client"
                S3Key: "iot-logs-to-OpenSearch-aod-test-9e7975a0-a071-4026-9c1c-91f520f80d9b.zip"
            MemorySize: 128
            Role: !Sub "arn:aws:iam::${AWS::AccountId}:role/service-role/iot-logs-to-OpenSearch-aod-test-role-g373dnli "
            Runtime: "python3.7"
            Timeout: 3
            TracingConfig: 
                Mode: "PassThrough"
            EphemeralStorage: 
                Size: 512

其中您需要将lambda代码打包成zip格式,放在S3 bucket中。

将lambda中关键代码展示如下,在lambda handler中定义message为来自event[‘Records’] [‘Sns’]消息,并将message组成document,并通过requests.post发送给OpenSearch endpoint url。

def handler(event, context):
    for record in event['Records']:
        message = record['Sns']
        document = {"message": message }
        r = requests.post(url, auth=HTTPBasicAuth(account, pwd), json=document, headers=headers)
return event

其中url = host + ‘/’ + index + ‘/’ + type;host为 OpenSearch endpoint url;index客户可以自定义string类型比如 ‘iot-metric-cloudwatch-index’;type = ‘_doc’;account和pwd为OpenSearch Dashboard账号和密码。下文会介绍Amazon OpenSearch和 Amazon Secret Manager相关资源创建。

以上,当设备安全事件(DDOS攻击,设备证书安全和权限配置问题,设备变砖离线问题)发生时, 事件就会被Amazon IoT Core持续监测到,并且通过集成Amazon CloudWatch,Amazon SNS服务发送到Lambda函数进行持续监控和响应。

创建Amazon OpenSearch等相关资源,完成对设备安全事件的实时分析和可视化监控。

接下来,我们将完成本解决方案的最后一步,即创建Amazon OpenSearch和Amazon Secrets Manager相关服务。首先,我们根据以下官方文档创建OpenSearch endpoint:

https://docs.aws.amazon.com/opensearch-service/latest/developerguide/gsg.html

其中我们选择enable Fine-grained access control,并设置Master user通过账号和密码方式认证登录。这里的账号和密码便是上文lambda中的account和pwd。我们将account和pwd通过Amazon Secret Manager服务进行管理,这样密钥就不会以明文方式暴露在代码中,从而提高安全性。Amazon Secret Manager相关CloudFormation代码如下:

AWSTemplateFormatVersion: "2010-09-09"
Description: ""
Resources:
    SecretsManagerSecret:
        Type: "AWS::SecretsManager::Secret"
        Properties:
            Name: "ES_Kibana_credential-aod"
            SecretString: "{\"es_account\":\"xxx\",\"es_pwd\":\"xxx\"}"

通过以上步骤,我们创建了Amazon OpenSearch和 Amazon Secret Manager相关服务。打开OpenSearch Console,并点击创建的DashBoard url。点击Discover并搜索相应的关键字如“over-permission”,我们看到如下界面:

以上,相应的安全事件都已经存储到OpenSearch服务。接下来,我们可以在OpenSearch中建立一些Dashboard从而对不同的物联网安全事件进行实时的可视化监控。比如作者建立了一些简单的Dashboard如下:

总结

在本文中,作者介绍了几种当前主要物联网安全事件的行为模式,包括DDOS攻击,设备证书安全和权限配置问题,设备离线问题。针对这些问题,作者结合了亚马逊云物联网相关服务(主要是Amazon IoT Device Defender服务)提供了对应的检测和审计方案;同时作者结合了亚马逊云其他相关消息推送,日志监控服务搭建了针对事件的持续监控和响应方案;最后作者介绍了Amazon OpenSearch服务帮助搭建完整的日志事件实时分析和可视化方案。通过本文的介绍,客户可以建立基于亚马逊云相关服务的针对物联网安全事件的持续检测,监控和可视化分析方案,从而帮助客户建立物联网安全事件响应机制,降低潜在安全风险,减少企业损失。

本篇作者

杨阳

亚马逊云科技专业服务团队物联网应用架构师。负责基于Amazon IoT的解决方案咨询,架构与交付,深度参与过智慧工厂、智能家居等行业IoT解决方案的咨询与交付。进入Amazon之前在消费电子产品和制造业拥有丰富的物联网项目开发和管理经验。