Amazon Web Services ブログ
接続されたデバイスの異常な動作をAWS IoT Device Defenderを利用して検知する
HBOの人気シリーズSilicon Valleyでは、Gilfoyleが冷蔵庫をハックして悪意あるソフトウエアが実行されるシーンが登場します。これはテレビや映画に限ったことではなく、現実世界でも実際に起きうるシナリオです。
この様に侵入された冷蔵庫は許可されていないエンドポイントにカスタマーの情報を送ることが可能です。
ネットに接続された冷蔵庫などのデバイスは、IoTアプリケーションの安全な動作を保証するために保護する必要があります。
しかし、接続されたデバイスのセキュリティを企業が管理することは難しいことです。
すべてのセキュリティ対策が施行されているにもかかわらず、Gilfoyleの様なハッカーは、繰り返し接続されたデバイスに侵入する可能性があります。 この様な出来事にタイムリーに対応するには、侵入したデバイスを検出することが不可欠です。 AWS IoT Device Defenderは、デバイス上で実行するエージェントと連携して、デバイスの異常動作を検出し、必要な処置を実行できます。
この記事では、次の内容について説明します。
- AWS IoTコアと通信するデバイスの設定
- デバイスから診断データを収集するための、AWS IoT Device Defenderエージェントのデプロイと設定
- 不正なデバイスの監視と、検出のためのクラウドリソースの作成
- デバイス上で不正なプログラムを実行して、侵入されたデバイスをシミュレートする
- 悪意のある行為にを検知して通知する方法
以下の図は、この手順でセットアップされるアーキテクチャを示しています。
デバイスのセットアップ
こちらの手順を参考にAWS IoT Coreに接続するデバイスのセットアップと認証用の証明書の生成を行ってください。
セットアップでは作成したデバイスを “MyDevice”として命名しました。モノの名前も”MyDevice”として作成しています。
生成した証明書をデバイス上にダウンロードしてください。
AWS IoT Device Defenderのインストールと設定
- “DDAgent”というディレクトリを作成し、AWS IoT Device Defender エージェントをそのディレクトリにダウンロードしてください
- モノの登録をした際に生成した証明書と秘密鍵を“DDAgent”ディレクトリに以下の名前でコピーします
- MyDevice.cert.pem
- MyDevice.private.key
- root-CA.crt
- 以下のコマンドを実行し、AWS IoT Device Defenderエージェントを実行してください
Python ./agent.py \
--endpoint "xxxxxxxxxxxx.iot.us-east-1.amazonaws.com" \
-r ./root-CA.crt -c ./MyDevice.cert.pem -k MyDevice.private.key \
-id MyDevice --format json -i 300
AWS IoT Device Defenderのエージェントが実行され、メトリックスの送信がされると以下のようなログが出力されます。
AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - Performing sync publish...
Received a new message:
{"thingName":"MyDevice","reportId":1532146181,"status":"ACCEPTED","timestamp":1532146183087}
from topic:
$aws/things/MyDevice/defender/metrics/json/accepted
異常な動作を検知するリソースを作成
必要な設定は以下になります。
- 異常値検知をするためのAWS IoT Thing Groupを作成
- 動作を定義したセキュリティープロファイルを作成し、異常を検知したときのアクションを定義し、グループもしくは全てのデバイスに紐づけします。
- AWS IoT Device Defenderが異常として検出する動作を定義します。動作はメトリックス、演算子、値の比較、期間を利用して定義することができます
- デバイスが手順2で定義した動作と一致しない動作を実行すると、警告が送信されます
異常値検知ターゲットグループ
AWS IoT Device Defender セキュリティープロファイルを関連付ける為に、“allMyDevices”という名でAWS IoT Thing Groupを作成しました。このグループには最初に作成したモノ“MyDevice”を追加します。
- マネージメントコンソールでAWS IoTのサービスを開きます
- Manageのメニューで、Groupsを選択します
- Createを選択します
- “Create a thing group”の画面で、Nameに“allMyDevices”を入力して作成します
- 作成されたGroupの詳細が表示されます
- 右上のActionsのドロップダウンから、Add a thingを選択して、”MyDevice”を選択します
アラート
“MisbehavingDevices”という名前のSNS通知を作成し、メールアドレスを追加します。
- マネージメントコンソールでSNSを開きます
- Create topicを選択します
- “MisbehavingDevices”をNameに指定します
- Create topicを選択して作成します
- 作成したトピックでCreate subscriptionを選択し、protocolにEmail、Endpointに自分のメールアドレスを入力し、Create subscriptionを選択して作成します
しばらくするとメールが届きます。メール内に書かれているリンクを開き、subscribeを完了させます。作成したSNSのトピックのARNをメモします。この値はセキュリティープロファイルの定義で利用します。
セキュリティープロファイル
次に“CheckRogueDevices”という名前でセキュリティープロファイルを作成し、先ほど作成した“allMyDevices”に関連付けます。また、作成したアラート“MisbehavingDevices”も関連付けます。
セキュリティープロファイルでは2つの動作を追加します。1つはクラウド側、もう一つはデバイス側。デバイス側の動作は、先程追加したAWS IoT Device Defenderエージェントを介して通知されます。
一つ目の動作“msgReceive”は、5分毎にデバイスから受信するメッセージが100件以下であることを監査します。この動作はデバイス側のエージェントを必要としません。2つ目の動作“bytesOut”は、5分毎にデバイスから送出されたbyte数が10,000(約10K)以下であることを監査します。この監査はAWS IoT Device Defenderのエージェントがデバイスがメトリックスを通知するため、デバイス上でエージェントを動作させる必要があります。
{
"name": "bytesOut",
"metric": "aws:all-bytes-out",
"criteria": {
"comparisonOperator": "less-than",
"value": {
"count": 10000
},
"durationSeconds": 300
}
}
AWS IoT Device Defenderのコンソールに戻り、Defendの中にあるDetect > Security profilesを開き、Createを選択します。Nameに“CheckRogueDevices”を入力し2つの動作、“msgReceive”と“bytesOut”を追加し、metric、Operator、Valueを以下の図の値を参考に登録します。
次の画面で、通知先のSNSを選択し、Roleを登録します。RoleにはAWS IoTがSNSにパブリッシュできる権限を付与したものを指定します。
不正なプログラムを実行
では、不正アクセスされたデバイスをシミュレートするために、AWS IoT Coreにランダムなパケットを送信するプログラムを実行しましょう。この不正プログラムによって生成されるトラフィックの量は、上記で作成した動作で指定した基準よりも大きく、AWS IoT Device Defender違反を生成するのに十分なものである必要があります。
不正なプログラムの抜粋はこちらになります。
# MQTT message callback
def messageReceivedCallback(client, userdata, message):
print('From topic %s, Received data %s\n' % (message.topic, message.payload))
# Connect and subscribe to AWS IoT
rogueAgent.connect()
rogueAgent.subscribe(topic, 1, messageReceivedCallback)
time.sleep(2)
# Publish to the same topic in a loop forever every 1 sec
while True:
message = {}
# Generate random 100 character string
message['message'] = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(100))
messageJson = json.dumps(message)
rogueAgent.publish(topic, messageJson, 1)
print('To topic %s: Published data: %s\n' % (topic, messageJson))
time.sleep(1)
先に作成した”DDAgent”フォルダ内にrogueAgent.pyというファイルを作成し、上記のサンプルを参考に不正な動作をするプログラムを作成します。
以下のコマンドでこの不正な動きをするプログラムを実行します。
python ./rogueAgent.py \
--endpoint "a2axmuvv63ixxq.iot.us-east-1.amazonaws.com" \
-r ./root-CA.crt -c ./MyDevice.cert.pem -k MyDevice.private.key \
-id RogueAgent
この不正なプログラムはAWS IoTにランダムなメッセージを送信し、受信します。実行すると以下のようなメッセージが確認できます。
Published to topic /rogue/agent: Published data: {"message": "411BV90X7CO4XHOU77U3QFPJZ1E9JWVIZRMF9ET1QPFO6LY14FQF4WD6XFF9F6PP7SAHPIOEM6UHY0WNKBWQEWD1K8Y1UBF60V57"}
From topic /rogue/agent, Received data {"message": "411BV90X7CO4XHOU77U3QFPJZ1E9JWVIZRMF9ET1QPFO6LY14FQF4WD6XFF9F6PP7SAHPIOEM6UHY0WNKBWQEWD1K8Y1UBF60V57"}
異常通知
5分ほど不正プログラムを実行すると、Security Profileで設定した監査の条件を満たすと、Amazon SNS経由で登録されたメールアドレスに通知が届きます。監査に違反した履歴はAWS IoT Device Defenderのコンソールから、Defend > Detect > Violationsとメニューをたどって確認することができます。
まとめ
AWS IoT Device Defenderを利用することで、デバイスの不正な動作を検知することができ、アクションを取ることができます。Silicon ValleyのGilfoyleが最先端の次世代Jetpackにハックしても、Gilfoyleの不正なエージェントが何か活動を開始したらすぐに通知を受けるため、平穏に眠ることができます。
AWS IoT Device Defenderに関する追加の情報は、AWS Summit in Chicagoのセッションで確認することができます。使い始める場合はAWS IoT Device Defenderのコンソールにサインインしましょう。
翻訳は SA 市川が担当しました。原文はこちらです。