Amazon Web Services ブログ

AWS IoT Device Defender カスタムメトリクスを使用して、デバイスメトリクスの異常を検出し、セキュリティの状態を改善する方法

この記事は Eknath VenkataramaniRyan Dsouza によって投稿された How to detect anomalies in device metrics and improve your security posture using AWS IoT Device Defender custom metrics を翻訳したものです。

はじめに

IoT アプリケーションとデバイスは多様であり、公益事業、農業、製造、鉱業、家庭用電化製品などの業界全体で使用されています。IoT デバイスの指数関数的増加と脅威の増大は、IoT セキュリティが最初から考慮され、ソリューションに組み込まれている必要があることを意味します。

AWS IoT Device Defender は、IoT デバイスのフリートを保護するのに役立つサービスであり、IoT デバイスを大規模に監査および監視するために使用できます。デフォルトで、このサービスでは、接続パターンの変化、許可されていないエンドポイントまたは想定されていないエンドポイントと通信するデバイス、インバウンドおよびアウトバウンドのデバイストラフィックパターンの変化など、17 のネットワーク関連のメトリクスを監視できます。これらのメトリクスを活用して、IoT デバイスのフリートの監視方法を学ぶことができます。

しかし、デバイスフリートまたはユースケースごとのメトリクスを監視する必要がある際はどうでしょうか?例えば、Wi-Fi ゲートウェイに接続されているデバイスの数、バッテリーの充電レベル、またはデバイスが接続しているドメインなどのセキュリティ関連のメトリクス、デバイスで実行中のアプリケーションまたはプロセスの変更、デバイスの構成の変更、リモートログイン、またはその他のアプリケーション固有の動作の検出などです。

このブログでは、IoT アプリケーションに固有のセキュリティメトリクスの監視に関する手順を学習します。IoT 管理者は、セキュリティプロファイルを設定して、カスタムメトリクスに基づいてデバイスの予想される動作を定義し、動作パターンを監視し、デバイスが予想される動作に違反したときにアラートを受信することができます。AWS IoT Device Defender のカスタムメトリクスは、デバイスフリートまたはユースケースに固有の運用上の正常性とセキュリティのメトリクスを監視する柔軟性を提供し、問題にタイムリーに対応できるようにします。AWS IoT Core に接続するデバイスでの設定と使用は簡単で、IoT デバイスとシステムのセキュリティの状態を改善するのに役立ちます。デバイスの状態を理解することは、IoT システムの信頼性、セキュリティ、正常性、およびパフォーマンスを確保するために重要です。デバイスの監視により、開発チームと運用チームが問題に対応するために必要な情報を提供できます。事前定義された一連のメトリクスとカスタムメトリクスを使用して、IoT システムの状態を理解するのに役立ちます。では、IoT デバイスで実行されているプロセスの変更を監視するためのサンプルカスタムメトリクスを作成する方法を説明します。

ソリューション概要とユースケース

この記事では、以下を想定します

  1. Linux ベースのデバイスを構築しています。このデバイスを mything1 とします
  2. デバイスですべてのビジネスオペレーションを実行するアプリケーション myapp を作成しました

myapp はネットワークを介して通信しているため、myapp の動作を監視することが重要であることがわかりました。プロセスの振る舞いの観点から、myapp が子プロセスを起動してはならないことを知っています。たとえば、権限のないユーザーによって制御されて任意のコマンドを実行するシェルや、デバイスのコンピューティングリソースを使用して暗号通貨をマイニングするためのクリプトマイナーなどの子プロセスの起動は、よくあるセキュリティの侵害のサインです。このコンテキストを念頭に置いて、myapp によって起動された子プロセスの数を監視するソリューションを構築し、myapp が新しいプロセスを起動したときに AWS IoT Device Defender からアラートを受信します。

ソリューションの前提条件

  1. AWS account
  2. AWS IoT クイックコネクトガイドを使用して、モノの登録、ポリシーの適用、証明書の添付アタッチ、サンプルデバイスエージェントのダウンロードを行うことができます。上記のガイドのステップ2 で、AWS IoT Device SDK に Python SDK を選択します。
  3. AWS IoT Device Defender Agent SDK (Python)
  4. Firefox や Chrome などの最新のブラウザを搭載したコンピュータ
  5. Linux の基本的な理解(ディレクトリの作成、ファイルのアクセス許可の設定など)とプログラミング(コードのコンパイル)

注:既存の AWS IoT Device Defender Agent SDK のどこにコードを追加する必要があるかを示すコードのスクリーンショットがあります

ソリューションのアーキテクチャ

ソリューションの手順

クラウド側の変更

  1. myapp の子プロセスの数を表すカスタムメトリクスを作成します。

a. 左メニューの Defend > Detect > Metrics に移動します。

b. Create custom metric をクリックします。

c. Name に値を設定し、Type には number を指定します。

d. カスタムメトリクスの作成が成功します。

2. セキュリティプロファイルを作成します。

a. 左側のメニューの Detect の中に含まれている Security Profiles から Security profiles セクションに移動します。

b. Create Security Profiles で、Create Rule-based anomaly Detect profile をクリックします。

c. myapp は子プロセスを起動してはならないことがわかっているため、メトリクスを次のように選択して、期待される動作を定義する必要があります。 myapp の子プロセスの数と期待される値を0以下に設定します。

d. また、Additional Metrics to retain ドロップダウンをクリックして、カスタムメトリクスを追加します。

e. Next をクリックします。Alert target セクションはデフォルトのまま進みます。

f. Next をクリックします。このルールがフリート全体に期待される場合は、セキュリティプロファイルをすべてのモノに添付します。このプロファイルを適用するために特定のモノグループを選択するオプションもあることに注意してください。

g. Next をクリックします。 Save をクリックしてすべての設定を再確認し、Continue をクリックします。

h. Security Profiles ページには、新しく作成したセキュリティプロファイルが一覧表示されます。

3. まず、正しいリージョンにいることを確認してください。次に、AWS IoT ポリシーページで IoT ポリシーを更新して、Device Defender メトリクスが mything1 のみのプレフィックスが付いたものに対してのみ権限をスコープすることを許可するようにします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:eu-west-1:111122223333:topic/$aws/things/mything1/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Subscribe"
      ],
      "Resource": [
        "arn:aws:iot:eu-west-1:111122223333:topicfilter/$aws/things/mything1/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:eu-west-1:111122223333:client/mything1"
      ]
    }
  ]
}

デバイス側の変更

1. Github からサンプルエージェントをダウンロードします。

git clone https://github.com/aws-samples/aws-iot-device-defender-agent-sdk-python.git

2. サンプルエージェントの構造

a. collector.py は以下の役割を持っているモジュールです

ⅰ. 関心のあるメトリクスを収集します。この場合は、myapp の子プロセスの数です。メトリクスの収集は、コマンドライン引数 -i で定義された間隔で行われることに注意してください。

ⅱ. 収集されたメトリクスを、metrics.py モジュールを使用して AWS IoT Device Defender Detect に必要な形式でフォーマットします。metrics.pytags.py モジュールを使用して、AWS IoT Device Defender Detect に送信されるメトリクス名を指定します。

b. agent.py は、AWS IoT との通信に使用される collectorawsiot SDK を組み合わせた高レベルのモジュールです。

3. tags.py を変更して、Tags クラスのプロパティとして新しいメトリクスを含めます。

@property
def num_child_processes(self):
    return "num_child_procs_myap

4. num_child_processes を含めるように metrics.py を変更します。

a. コンストラクター関数(init)を更新して、デフォルト値を設定します: self.num_child_processes = []

b. Metrics クラスのメンバー関数を作成して、ネットワーク経由で送信するためのメトリクスを設定します

def add_num_child_processes(self, num_child_processes): 
    self.num_child_processes = {"number": num_child_processes}

c. 最後に、メトリクスをメンバー関数_v1_metrics で以前に指定された Tag プロパティに変換します。

if self.num_child_processes: 
    report[t.custom_metrics] = {t.num_child_processes: [self.num_child_processes] }

5. collector.py を更新して、myapp の子プロセスの数を見つけるために必要な関数を含めます。

a. ここでは 2 つの関数を使用します。

ⅰ. 1つ目は、myapp 自体を表すプロセスオブジェクトを見つけるための関数です。この関数は、Collector クラスの外部で定義する必要があります

def find_process(process_name):
    # Return the first process object 
    # which matches `process_name` exactly
    for proc in ps.process_iter():
        if process_name == proc.name():
            return proc

ⅱ. もう 1 つは、myapp の子プロセスを見つけるための Collector クラスの staticmethod メンバー関数です。:

@staticmethod
def get_num_child_processes(metrics):
    process_name = "myapp"
    my_process = find_process(process_name)
    num_child_processes = 0
    if my_process:
        num_child_processes = len(my_process.children(recursive=True))
    metrics.add_num_child_processes(num_child_processes)

b. メンバー関数 collect_metrics で、custom_metrics が有効になっている場合に get_num_child_processes を呼び出す行を追加します

if self._use_custom_metrics:
    self.get_num_child_processes(metrics_current)

6. パッケージをインストールします:pip install ./aws-iot-device-defender-agent-sdk-python --upgrade

7. collector.py モジュールを個別に実行してテストし、エラーがないことを確認します。

a. コマンドライン引数を渡したことに注意してください。-cm をでカスタムメトリクスの収集を有効にします。

b. 現在のシェルのコピーを作成し、名前を myapp に変更して、フェイクの myapp を作成します。

 ⅰ.  cp `which sh` ./myapp

 ⅱ.  myapp を起動します ./myapp

 ⅲ. ユーザー入力を待機するcat のような長時間実行プロセスを起動します:cat

8. agent.py を実行して、-cm(カスタムメトリクスを有効にするため)に加えて、必要なパラメーターを使用して myapp によって生成されたプロセスの数を継続的に監視します。

python aws-iot-device-defender-agent-sdk-python/AWSIoTDeviceDefenderAgentSDK/agent.py -f json -e <your-endpoint> -r <root_cert_path> -c <cert_path> -k <private_key_path> -cm -id mything1

9. Things ページの DefenderMetrics タブに移動すると、myapp の子プロセスの数をすぐに確認できるようになります(正しい AWS リージョンにいることを再確認してください)。

10. また、違反があった場合に生成されたアラームを確認できるはずです。

まとめ

この記事では、ルールベースのセキュリティプロファイルを作成して AWS IoT Device Defender でカスタムメトリクスを定義する方法と、この情報をデバイスから AWS IoT Device Defender に送信するためにサンプルエージェントで必要な変更を示しました。これで、デバイスフリートまたはユースケースに固有の独自のカスタムメトリクスの作成を開始し、アラートを取得し、問題を調査し、軽減アクションを実行できます。 AWS IoT Device Defender の組み込みの緩和アクションを使用して、モノのグループへの追加、デフォルトのポリシーバージョンの置き換え、デバイス証明書の更新などのアラートの緩和手順を実行できます。

もっと学ぶために

著者について

Eknath Venkataramani は、AWS IoT チームのセキュリティエンジニアです。彼は現在、IoT の顧客のセキュリティを容易にする新しい IoT 機能を特定して設計することにより、複数の AWS IoT サービスリリースの保護を支援することに注力しています。
Ryan DsouzaRyan Dsouza は、AWS の IoT のプリンシパルソリューションアーキテクトです。ニューヨーク市に拠点を置く Ryan は、AWS の機能の幅と深さを使用して、より安全でスケーラブルで革新的なソリューションを設計、開発、運用し、測定可能なビジネス成果を実現できるよう支援します。 Ryan は、デジタルプラットフォーム、スマート製造、エネルギー管理、建築および産業自動化、さまざまな業界にわたる OT/IIoT セキュリティで25年以上の経験があります。 AWS の前は、Ryan はAccenture 、SIEMENS 、General Electric 、IBM 、および AECOM に勤務し、デジタルトランスフォーメーションイニシアチブで顧客にサービスを提供していました。

この記事はソリューションアーキテクトの戸塚が翻訳しました。