#はじめに
AWS IoT Device Defenderはデバイス管理にセキュリティ上の問題がないかの監査、そして、デバイスの動作に異常がないか検知をしてくれるサービスです。公式ドキュメントでは以下の通り紹介されています。
AWS IoT Device Defender は、デバイスの設定の監査、異常動作の検出を目的とした接続デバイスのモニタリング、セキュリティリスクの軽減を行うことができるセキュリティサービスです。また、このサービスでは、AWS IoT デバイスのフリートでセキュリティポリシーを維持し、デバイスが侵害された場合にはすばやく応答することができます。
引用元:AWS IoT Device Defender
今回は、AWS IoT Device Defenderの監査と検知をそれぞれ触ってみたので、その手順と結果をまとめます。
#1 監査(Audit)
監査ではアカウントやデバイスの設定がセキュリティ上のベストプラクティスに則っているかをチェックしてくれます。
実行は都度実行(オンデマンド監査)とスケジュール実行(スケジュールによる監査)が可能です。
##1-1 監査を有効化する
まだ監査を使っていない場合は、監査を有効化します。
1.AWS IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 の順にクリック
2.「監査の開始方法」をクリック
3.「次へ」をクリック
4.監査実行用のロール作成が求められるので、ロールがない場合は「作成」をクリックし、任意の名前をつけてロールを作成する
5.「管理ポリシーがアタッチされています」と表示されたら「次へ」をクリック
※「▶アクセス許可」、「▶信頼関係」をクリックすることで、それぞれで設定が必要な権限を確認できる
6.監査でチェックする項目を選択し、「次へ」をクリック
※チェック名横の「?」をクリックすると、チェック内容の詳細が表示される
7.いったんSNSは「無効」のまま「監査を有効化する」をクリック
8.スケジュールされた監査が作成される
9.ここまでの手順完了後に左メニューの「防御」の下に「設定」、「監査」の下にもいくつかメニューが追加される
##1-2 SNS通知の設定
SNSを有効化して非準拠(=監査のチェック要件を満たさないこと)の際に通知が来るようにします。
###トピックの作成
1.SNSトピックを作成するため、Amazon SNSのマネージメントコンソールを開き、左のメニューから トピック をクリック
2.「トピックの作成」をクリック
3.以下の通りトピックを作成
- タイプ:スタンダード
- 名前:任意
- その他:※デフォルトとした
4.「サブスクリプションの作成」をクリック
5.宛先情報を以下の通り設定し、「サブスクリプションの作成」をクリック
- トピックARN:※紐づけるSNSトピック。上記手順でこの画面に遷移していれば入力されている
- プロトコル:Eメール
- エンドポイント:※宛先メールアドレス
6.AWSから以下のメールが届くので「Confirm subscription」をクリック
7.以下の通り表示される
8.SNSのサブスクリプションが「確認済み」になっていることを確認する
###SNS通知用のIAMロール作成
1.IAMのマネジメントコンソールで左のメニューからロール > 「ロールの作成」の順にクリック
2.AWSサービスの IoT > IoT を選択して、「次のステップ:アクセス権限」をクリック
3.「次のステップ:タグ」をクリック
4.「次のステップ:確認」をクリック
5.任意のロール名を入力して、「ロールの作成」をクリック
6.IAMのマネジメントコンソールで左のメニューからポリシー > 「ポリシーの作成」をクリック
7.JSONタブで以下の通り入力し、「次のステップ:タグ」をクリック
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "作成したトピックのARN"
}
]
}
8.「次のステップ:確認」をクリック
9.任意のポリシー名を入力して、「ポリシーの作成」をクリック
10.作成されたポリシーの詳細画面でポリシーの使用状況タブ > アタッチ の順にクリック
11.作成したポリシーを選択して、「アタッチ」をクリック
###IoT Device Defenderのアラームとしてトピックを設定
1.AWS IoT Coreのマネジメントコンソールに戻り、左のメニューから 防御 > 設定 の順にクリック
2.SNSアラートの「編集」をクリック
3.以下の通り設定し、「更新」する
- 有効
- トピック:※先ほど作成したトピック
- ロール:※先ほど作成したロール
##1-3 オンデマンド監査の実行
オンデマンド監査で監査を即時実行し、結果を確認します。
1.AWS IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 > 結果 > 作成 の順にクリック
2.今回は簡易に「IoTポリシーが過度に許容されている」のみを選択し、繰り返しを「今すぐ監査を実行(1回)」として「作成」をクリック
3.監査が作成されるので、名前をクリック
4.非準拠となっているチェック項目をクリック
5.非準拠となっている理由と対象が表示される
※対象ポリシーの「コンプライアンス違反」にもこの監査レポートへのリンクが表示される
6.SNSの通知先として指定したアドレスにメッセージが届いていることを確認する
通知内容は以下の通り
{"accountId":"xxxxxxxxxxxx","taskId":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","taskStatus":"COMPLETED","taskType":"ON_DEMAND_AUDIT_TASK","failedChecksCount":0,"canceledChecksCount":0,"nonCompliantChecksCount":1,"compliantChecksCount":0,"totalChecksCount":1,"taskStartTime":1617271927087,"auditDetails":[{"checkName":"IOT_POLICY_OVERLY_PERMISSIVE_CHECK","checkRunStatus":"COMPLETED_NON_COMPLIANT","nonCompliantResourcesCount":4,"totalResourcesCount":4,"suppressedNonCompliantResourceCount":0}]}
##1-4 監査結果の抑制(サプレッション)
監査結果の抑制を使うことで、テストデバイスや破損しているデバイスなど、監査の際に非準拠となることが想定済みのデバイスをレポートに含めないようにすることができます。
参考:結果のサプレッションの監査
###抑制を作成
今回は「IoTポリシーが過度に許容されている」の監査時にポリシー「group-policy」の結果を無期限で抑制します。
※事前に安全性 > ポリシー > 対象のポリシー でポリシーARNを控えておく
1.AWS IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 > 検索結果の抑制 の順にクリック
2.「作成」をクリック
3.以下の通り選択し、「作成」をクリック
- 監査チェック:IoTポリシーが過度に許容されている
- リソースID:group-policy ※対象のポリシー名
- ポリシーバージョンID:1 ※対象とするポリシーのバージョン
- 抑制期間:無期限に
- 説明:※任意
4.監査結果の抑制の一覧に作成した抑制が表示される
###抑制した結果を確認する
1.再度、「1-3 オンデマンド監査の実行」の通りにオンデマンド監査を行う
2.監査結果を確認すると、抑制したポリシーは非準拠に含まれず、「抑制された結果」として表示される
また、通知内容にも抑制された結果が存在することが表示される
※suppressedNonCompliantResourceCountに含まれる
{"accountId":"xxxxxxxxxxxx","taskId":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","taskStatus":"COMPLETED","taskType":"ON_DEMAND_AUDIT_TASK","failedChecksCount":0,"canceledChecksCount":0,"nonCompliantChecksCount":1,"compliantChecksCount":0,"totalChecksCount":1,"taskStartTime":1617328519278,"auditDetails":[{"checkName":"IOT_POLICY_OVERLY_PERMISSIVE_CHECK","checkRunStatus":"COMPLETED_NON_COMPLIANT","nonCompliantResourcesCount":3,"totalResourcesCount":4,"suppressedNonCompliantResourceCount":1}]}
###抑制の変更
1.AWS IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 > 検索結果の抑制 の順にクリック
2.対象の抑制を選択して アクション > 編集 の順にクリック
3.抑制期間を変更して「保存」をクリック
###抑制の削除
1.AWS IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 > 検索結果の抑制 の順にクリック
2.対象の抑制を選択して アクション > 削除 の順にクリック
3.「削除」と入力して「削除」をクリック
※モーダルの説明文は「delete」となっているが、入力欄のplaceholderの通り「削除」と入力するのが正しい
###結果から抑制を作成
1.AWS IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 > 結果 > 対象の結果 の順にクリック
2.非準拠となっているチェック項目をクリック
3.抑制したい対象をチェックして 検索を非表示にする > 非表示期間 をクリック
4.内容を確認して「抑制を有効化」をクリック
5.AWS IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 > 検索結果の抑制 の順にクリックすると、作成した抑制が表示される
#2 検知(Detect)
検知では、セキュリティプロファイルで定義した動作をデバイス、グループに割り当てることで、異常を検出することができます。
##2-1 セキュリティプロファイルの作成
1.AWS IoT Coreのマネジメントコンソールで左のメニューから 防御 > 検出 > セキュリティプロファイル の順にクリック
2.セキュリティプロファイルを作成 > ルールに基づいた異常検出プロファイル作成 をクリック
3.今回は以下の通りセキュリティプロファイルを設定し、「次へ」をクリック
- 名前:※任意の名前
- メトリクス:送信されたメッセージ
- タイプをチェック:絶対値
- 演算子:未満
- 値:180
- 期間:5分
- アラームへのデータポイント:1 ※デフォルト
- クリアするデータポイント:1 ※デフォルト
メトリクスの「送信されたメッセージ」は、一定期間内にデバイスから送信されたメッセージを検出対象とする。
上記の場合、5分間に180以上のメッセージが送信された場合はアラームが発生する。
参考:クラウド側メトリクス
また、アラームへのデータポイント、クリアするデータポイントはいずれも、アラームの発生・クリアまでの評価回数を示している。
例えば上記の場合、アラームへのデータポイントが1であれば、1度の違反でアラームが発生する。
参考:Behaviors
※今回は指定していないが、オプションのディメンションを設定することで特定のトピックのみを検出対象にできる
4.アラートのターゲットを設定して「次へ」をクリック
※今回は「1-2 SNS通知の設定」で作成したものを流用する
5.アタッチ先を指定して「次へ」をクリック
6.内容を確認して「保存」をクリック
7.「保存」が「続行」に変わるので再度クリックし、セキュリティプロファイルが作成されたことを確認する
##2-2 動作確認とその結果
AWS IoT Device SDK for Pythonの basicPubSub.py
を利用して検出が働くことを確認します。
basicPubSub.py
の利用に関しては以下の記事をご参照ください。
参考:AWS IoT Device SDK for Pythonを使ってRaspberryPiとAWS IoTをつないでみる
1.basicPubSub.py
を実行する
※毎秒メッセージを送り続ける(=5分間で300のメッセージのため、先ほど作成したセキュリティプロファイルのルールに違反)
python basicPubSub.py --endpoint [エンドポイントのURL] --rootCA [ルート証明書] --cert [デバイス証明書] --key [秘密鍵]
2.数分後、IoT Coreのマネジメントコンソールで左のメニューから 防御 > 検出 > アラーム の順にクリック
3.以下の通り、違反の検出と検出内容が表示される
4.以下の通り、通知が届くことも確認する
{"violationEventTime":1617578700000,"thingName":"basicPubSub","behavior":{"criteria":{"consecutiveDatapointsToClear":1,"value":{"count":180},"durationSeconds":300,"consecutiveDatapointsToAlarm":1,"comparisonOperator":"less-than"},"name":"test","metric":"aws:num-messages-sent"},"violationEventType":"in-alarm","metricValue":{"count":261},"violationId":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","securityProfileName":"test-scurity-profile"}
5.basicPubSub.py
を Ctrl + C
で停止する
6.数分後、手順3で確認したアラームがクリアされる
7.あわせて、以下の通りアラームがクリアされたことが通知される
{"violationEventTime":1617579600000,"thingName":"basicPubSub","behavior":{"criteria":{"consecutiveDatapointsToClear":1,"value":{"count":180},"durationSeconds":300,"consecutiveDatapointsToAlarm":1,"comparisonOperator":"less-than"},"name":"test","metric":"aws:num-messages-sent"},"violationEventType":"alarm-cleared","metricValue":{"count":8},"violationId":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","securityProfileName":"test-scurity-profile"}
#3 軽減アクション
監査、検出で発生したアラームに対するアクションを作成・実行することができます。
今回は監査の結果、「IoT ポリシーが過度に許容されている」でアラームが出たポリシーを非有効化するアクションを作成、実行します。
##3-1 軽減アクションの作成
1.IoT Coreのマネジメントコンソールで左のメニューから 防御 > 軽減アクション の順にクリック
2.「作成」をクリック
3.以下の通り設定
※監査結果毎、また、検知によって実行可能な軽減アクションが異なるので注意
参考:緩和アクション
- アクション名:※任意のアクション名
- アクションタイプ:デフォルトのポリシーバージョンを置き換え(軽減の監査のみ)
- パラメータ:空白のポリシー
4.アクションタイプ選択後、ロールの作成 をクリックし軽減アクション用のロールを作成する
5.以下の通り設定したら、「保存」をクリック
##3-2 軽減アクションの実行
「1-3 オンデマンド監査の実行」での結果を利用して、軽減アクションの動きを確認します。
1.IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 > 結果 の順にクリック
2.対象の監査結果名をクリック
3.非準拠のチェックで「IoT ポリシーが過度に許容されている」をクリック
4.軽減アクションの対象とするポリシーを選択して、「緩和アクションを開始」をクリック
5.任意のタスク名を入力し、先ほど作成した軽減アクションを選択して「確認」をクリック
6.アクションタスクが作成され、成功することを確認する
##3-3 軽減アクションの結果確認
軽減アクションの実行結果を確認します。
手順4からは、対象にしたポリシーが軽減アクションの結果、空白のポリシーとなっていることを確認します。
1.IoT Coreのマネジメントコンソールで左のメニューから 防御 > 監査 > アクションタスク の順にクリック
※検知結果に対して軽減アクションを実行した場合は、防御 > 検知 > アクションタスク の順
2.対象のアクションタスク名をクリック
3.以下の通り、実行結果が確認できる
※「表示」をクリックすると実行の履歴が確認できる
4.IoT Coreのマネジメントコンソールで左のメニューから 安全性 > ポリシー の順にクリック
5.軽減アクションの実行対象にしたポリシー名をクリック
6.以下の通り、すべてのアクションが拒否されるポリシーに変わっていることが確認できる
{
"Id": "CreateBy-AWSIoTDeviceDefenderAudit.REPLACE_DEFAULT_POLICY_VERSION.BLANK_POLICY",
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:NonExistentOperation",
"Resource": "*"
}
]
}
なお、軽減アクションが「デフォルトのポリシーバージョンを置き換え(軽減の監査のみ)」である通り、バージョンタブを見ると以前のポリシーがバージョン1として残っている
デフォルトにすることで、軽減アクション実行前のポリシーを利用することができる
#4 おわりに
以上、IoT Device Defenderの監査と検知を試してみました。
いずれも膨大なデバイスを管理するうえでは役立つと思います。
#5 参考文献(文中で登場していないもの)