デバイスのセキュリティ監査ができる「AWS IoT Device Defender」が一般提供開始になりました!!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

まいど、大阪の市田です。
2017年のre:Inventで発表されていた新サービス「AWS IoT Device Defender」が先日、遂にGAになりました!!

AWS IoT Device Defender – 一般提供開始

AWS IoT Device Defenderとは

簡単に言うと、IoTデバイスに対するセキュリティソリューションとなるサービスです。
例えば、決められたポリシー通りにデバイスが設定されているか監査することができたり、通常時とは異なるデバイスの異常動作を検知するといった事ができます。

AWSでは他にも、デバイスの状態を管理できる「Device Shadow」や、大量なデバイスのグループ・ポリシー管理・リモート管理等が可能な「IoT Device Management」などがあります。
今回はこれらに加えて、セキュリティ面での管理機能が新たに使えるようになりました。

監査してみる

早速試してみたいと思います。今回は取り急ぎの動作確認として、デバイス証明書の監査をしてみたいと思います。(デバイス側の監査については、別エントリーとして改めて紹介させていただきます!)

デバイス証明書については下記の項目をチェックできます。

  • 「有効期限が30日以内、または期限切れ」
  • 「複数デバイスによる証明書の共有」
  • 「無効になった証明書の有効性」

今回はわざと「有効期限が10日以内」の証明書を用意して「有効期限が30日以内、または期限切れ」のチェックで検知できるようにしてみました。
なお、下記のドキュメントにあるように「有効期限が30日以内、または期限切れ」は「ACTIVE」または「PENDING_TRANSFER」のデバイス証明書に適用されます。

Audit - AWS IoT Device Defender

「有効期限が10日以内」の証明書の登録手順については、今回は割愛させていただきますが、下記のように登録してみました。
このブログを書いているのが「2018年8月6日」なので、このデバイス証明書の有効期限は後10日ということになります。

1-testcert

この状態で監査を行ってみます。監査は「スケジュール実行」と「オンデマンド実行」が可能なので、今回は手動でチェックしてみます。

初めて監査を実行する場合は、下記のようにAWS IoTのマネジメントコンソールのメニューから「防御」> 「監査」とクリックして、「監査の使用開始」をクリックしてください。

20-first-audit

「次へ」をクリックして進めます。

21-first-audit2

次の「アクセス権限の確認」も「次へ」をクリックして進めてください。監査に必要な権限を持ったIAM Roleとして「AWSIoTDeviceDefenderAudit」が作成されます。

22-first-audit3

ちなみに権限は同名のAWS管理ポリシーがアタッチされます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetLoggingOptions",
                "iot:GetV2LoggingOptions",
                "iot:ListCACertificates",
                "iot:ListCertificates",
                "iot:DescribeCACertificate",
                "iot:DescribeCertificate",
                "iot:ListPolicies",
                "iot:GetPolicy",
                "iot:GetEffectivePolicies",
                "cognito-identity:GetIdentityPoolRoles",
                "iam:ListRolePolicies",
                "iam:ListAttachedRolePolicies",
                "iam:GetPolicy",
                "iam:GetPolicyVersion",
                "iam:GetRolePolicy"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

信頼関係は以下です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "iot.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

次の画面では、チェックする項目を選択します。一番上の「チェック項目」にチェックを入れると全項目を選択できるので、この状態で「次へ」をクリックします。

23-first-audit4

SNSの設定では、「有効」にすると「監査で非準拠の項目があればSNSトピックにアラートを送る」ことができます。
通知用のトピックは後で作ることにして、今回は「無効」のまま「有効化」をクリックします。

24-first-audit5

準備が整ったので、次の画面で「最初の監査を作成」をクリックしましょう。

25-make-first-audit

次の画面でスケジュールを設定できるので、ここで「監査を今すぐ実行」を選択して「作成」をクリックします。

26-new-audit

監査が開始されるとステータスが「進行中」になります。監査項目の選択によっては時間がかかる場合があるのでしばらく待機します。

27-still-audit

監査結果はコンソールの「防御」 > 「監査」 > 「結果」から確認することができます。それぞれの結果をクリックすると、監査結果の詳細を見ることができます。

30-result

最新の結果を確認した内容が下記になります。デバイス証明書の中に「有効期限が10日以内」のものがある為、非準拠として検知できていることが分かります。

31-result-non-complience

非準拠の項目「デバイス証明書の有効期限が切れます」をクリックすると更に詳細を確認できます。「非準拠の理由」として「証明書の有効期限が近づいている」というメッセージを確認できますね。

証明書ID「134554eb〜」は冒頭で登録した証明書のIDなので、確かに「有効期限」で監査できていることが分かります。

32-expired-device-certification

証明書IDをクリックすると証明書の「コンプライアンス違反」の項目に移動することができます。これはコンソールの「証明書」メニューから見れるものと同じものです。
(複数あるのは私が複数回チェックを実行した為です。)

33-expired-device-cert-list

非準拠の項目があった時にSNSで通知したい場合はSNS設定を有効にします。そのためには下記の2点を予め作成しておきましょう。

  • 通知先として指定するSNSトピック
  • 下記の権限を持ったIAM Role
    • Resourceには通知したいSNSトピックのARNを記載してください。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "<sns-topic-arn>"
        }
    ]
}

信頼関係は下記のとおりです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "iot.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

SNSトピックとIAM Roleが作成できたら、マネジメントコンソールから「防御」 > 「設定」をクリックしてSNSアラートの項目で「編集」をクリックします

34-sns-config

SNSアラートを「有効」にして、作成した「SNSトピック」と「IAM Role」を選択して「更新」をクリックします。

35-sns-defender

SNS通知の設定は以上です。監査時に異常を検知したら指定トピックに下記のようなメッセージ(JSONフォーマット)が通知されます。(異常検知の項目だけ抜粋しています)

{"checkName":"DEVICE_CERTIFICATE_EXPIRING_CHECK","checkRunStatus":"COMPLETED_NON_COMPLIANT","nonCompliantResourcesCount":1,"totalResourcesCount":10},

「DEVICE_CERTIFICATE_EXPIRING_CHECK」という項目(checkName)で、非準拠の項目数「nonCompliantResourcesCount」が「1つ見つかった」ということが通知されていますね。

最後に

今回はオンデマンドでチェックしてみましたが、スケジュール監査で「定期的にチェック、異常時には通知」といった仕組も簡単に実現できるようになりました。
また、冒頭で紹介したように「デバイス側の状態や挙動」に対してもチェックできる機能があるので、次はデバイス視点で試してみたいと思います。

以上になります。