メインコンテンツまでスキップ

植物を安全に保つ

このレッスンの概要を示すスケッチノート

スケッチノート: Nitya Narasimhan 作。画像をクリックすると大きなバージョンが表示されます。

講義前のクイズ

講義前のクイズ

はじめに

前回のレッスンでは、土壌モニタリングIoTデバイスを作成し、それをクラウドに接続しました。しかし、ライバルの農家のハッカーがあなたのIoTデバイスを乗っ取ったらどうなるでしょうか?彼らが高い土壌水分値を送信し続けると、植物に水がまったく与えられず、または灌漑システムを常に稼働させて植物を過剰に水やりし、莫大な水道料金がかかるかもしれません。

このレッスンでは、IoTデバイスのセキュリティについて学びます。このプロジェクトの最後のレッスンでもあるため、クラウドリソースをクリーンアップし、潜在的なコストを削減する方法も学びます。

このレッスンでカバーする内容は次のとおりです:

🗑 このプロジェクトの最後のレッスンなので、このレッスンと課題を完了した後、クラウドサービスをクリーンアップすることを忘れないでください。課題を完了するためにサービスが必要になるので、まずそれを完了してください。

必要に応じて、プロジェクトのクリーンアップガイドを参照してください。

なぜIoTデバイスを保護する必要があるのか?

IoTセキュリティは、予期されたデバイスのみがクラウドIoTサービスに接続してテレメトリを送信できるようにし、クラウドサービスのみがデバイスにコマンドを送信できるようにすることを含みます。IoTデータは個人情報を含むことがあり、医療データや親密なデータを含むこともあるため、アプリケーション全体がこのデータの漏洩を防ぐためにセキュリティを考慮する必要があります。

IoTアプリケーションが安全でない場合、いくつかのリスクがあります:

  • 偽のデバイスが不正確なデータを送信し、アプリケーションが誤って応答する可能性があります。例えば、常に高い土壌水分値を送信し続けると、灌漑システムが作動せず、植物が水不足で枯れてしまうかもしれません。
  • 不正なユーザーがIoTデバイスからデータを読み取ることができ、個人情報やビジネスに重要なデータが漏洩する可能性があります。
  • ハッカーがデバイスを制御するコマンドを送信し、デバイスや接続されたハードウェアに損害を与える可能性があります。
  • IoTデバイスに接続することで、ハッカーが追加のネットワークにアクセスし、プライベートシステムにアクセスする可能性があります。
  • 悪意のあるユーザーが個人データにアクセスし、それを使って脅迫する可能性があります。

これらは現実のシナリオであり、常に発生しています。以前のレッスンでいくつかの例を紹介しましたが、ここにさらにいくつかの例を示します:

✅ 調査を行う: IoTハッキングやIoTデータの漏洩の例をさらに検索し、特にインターネット接続された歯ブラシや体重計などの個人用アイテムに関するものを探してください。これらのハッキングが被害者や顧客に与える影響について考えてみてください。

💁 セキュリティは非常に広範なトピックであり、このレッスンではデバイスをクラウドに接続する際の基本的な部分にしか触れません。データの転送中の変更の監視、デバイスの直接ハッキング、デバイスの設定変更など、他のトピックはカバーされません。IoTハッキングは非常に大きな脅威であり、Azure Defender for IoTのようなツールが開発されています。これらのツールは、コンピュータにあるウイルス対策やセキュリティツールに似ていますが、小型で低消費電力のIoTデバイス向けに設計されています。

暗号化

デバイスがIoTサービスに接続する際、IDを使用して自分自身を識別します。問題は、このIDがクローン化される可能性があることです。ハッカーは、実際のデバイスと同じIDを使用して不正なデバイスを設定し、偽のデータを送信することができます。

有効なデバイスと不正なデバイスの両方が同じIDを使用してテレメトリを送信する可能性があります

これを回避する方法は、送信されるデータをデバイスとクラウドのみが知っている値を使用してスクランブル形式に変換することです。このプロセスは暗号化と呼ばれ、データを暗号化するために使用される値は暗号鍵と呼ばれます。

暗号化が使用されている場合、暗号化されたメッセージのみが受け入れられ、他のメッセージは拒否されます

クラウドサービスは、復号化と呼ばれるプロセスを使用してデータを読み取り可能な形式に戻すことができます。同じ暗号鍵または復号鍵を使用して行います。暗号化されたメッセージが鍵で復号化できない場合、デバイスがハッキングされており、メッセージは拒否されます。

暗号化と復号化の技術は暗号学と呼ばれます。

初期の暗号学

最も初期の暗号学の種類は、3,500年前に遡る置換暗号でした。置換暗号は、ある文字を別の文字に置き換えることを含みます。例えば、シーザー暗号は、アルファベットを定義された量だけシフトすることを含み、暗号化されたメッセージの送信者と受信者だけが何文字シフトするかを知っています。

ヴィジュネル暗号は、テキストを暗号化するために単語を使用し、元のテキストの各文字が異なる量でシフトされるようにすることで、これをさらに進めました。

暗号学は、古代メソポタミアの陶器の釉薬のレシピを保護するため、インドで秘密のラブレターを書くため、または古代エジプトの魔法の呪文を秘密にしておくためなど、さまざまな目的で使用されました。

現代の暗号学

現代の暗号学ははるかに高度であり、初期の方法よりも解読が難しくなっています。現代の暗号学は、データを暗号化するために複雑な数学を使用し、ブルートフォース攻撃が不可能なほど多くの可能な鍵を持っています。

暗号学は、安全な通信のためにさまざまな方法で使用されます。GitHubでこのページを読んでいる場合、ウェブサイトのアドレスがHTTPSで始まっていることに気付くかもしれません。これは、ブラウザとGitHubのウェブサーバー間の通信が暗号化されていることを意味します。誰かがブラウザとGitHub間のインターネットトラフィックを読み取ることができたとしても、データは暗号化されているため、読み取ることはできません。コンピュータは、ハードドライブ上のすべてのデータを暗号化し、誰かがそれを盗んでも、パスワードなしでデータを読み取ることができないようにすることもあります。

🎓 HTTPSはHyperText Transfer Protocol Secureの略です。

残念ながら、すべてが安全というわけではありません。セキュリティがないデバイスもあれば、簡単に解読できる鍵を使用しているデバイスもあります。また、同じタイプのすべてのデバイスが同じ鍵を使用している場合もあります。非常に個人的なIoTデバイスがすべて同じパスワードを使用してWiFiやBluetoothに接続するという報告もあります。自分のデバイスに接続できる場合、他人のデバイスにも接続できる可能性があります。一度接続すると、非常にプライベートなデータにアクセスしたり、デバイスを制御したりすることができます。

💁 現代の暗号学の複雑さと暗号の解読に数十億年かかるという主張にもかかわらず、量子コンピューティングの台頭により、既知のすべての暗号を非常に短時間で解読する可能性が出てきました!

対称鍵と非対称鍵

暗号化には2つのタイプがあります - 対称鍵と非対称鍵です。

対称暗号化は、データを暗号化および復号化するために同じ鍵を使用します。送信者と受信者の両方が同じ鍵を知っている必要があります。これは最も安全性が低いタイプであり、鍵を何らかの方法で共有する必要があります。送信者が受信者に暗号化されたメッセージを送信するには、まず受信者に鍵を送信する必要があるかもしれません。

対称鍵暗号化は、メッセージを暗号化および復号化するために同じ鍵を使用します

鍵が転送中に盗まれたり、送信者や受信者がハッキングされて鍵が見つかったりすると、暗号化が解読される可能性があります。

対称鍵暗号化は、ハッカーが鍵を取得しない限り安全です - そうでない場合、メッセージを傍受して復号化することができます

非対称暗号化は、暗号化鍵と復号化鍵の2つの鍵を使用します。これらは公開鍵/秘密鍵ペアと呼ばれます。公開鍵はメッセージを暗号化するために使用されますが、復号化するためには使用できません。秘密鍵はメッセージを復号化するために使用されますが、暗号化するためには使用できません。

非対称暗号化は、暗号化と復号化に異なる鍵を使用します。暗号化鍵はメッセージ送信者に送信され、受信者が所有する鍵でメッセージを暗号化してから送信します

受信者は公開鍵を共有し、送信者はこれを使用してメッセージを暗号化します。メッセージが送信されると、受信者は秘密鍵を使用してメッセージを復号化します。非対称暗号化は、秘密鍵が受信者によって秘密に保持され、共有されないため、より安全です。公開鍵はメッセージを暗号化するためにのみ使用されるため、誰でも持つことができます。

対称暗号化は非対称暗号化よりも高速ですが、非対称暗号化の方が安全です。一部のシステムでは両方を使用します - 非対称暗号化を使用して対称鍵を暗号化および共有し、対称鍵を使用してすべてのデータを暗号化します。これにより、送信者と受信者の間で対称鍵を共有する際のセキュリティが向上し、データの暗号化および復号化が高速になります。

IoTデバイスのセキュリティ

IoTデバイスは、対称暗号化または非対称暗号化を使用して保護できます。対称暗号化は簡単ですが、セキュリティが低いです。

対称鍵

IoTデバイスをIoT Hubと連携させる際に、接続文字列を使用しました。接続文字列の例は次のとおりです:

HostName=soil-moisture-sensor.azure-devices.net;DeviceId=soil-moisture-sensor;SharedAccessKey=Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=

この接続文字列は、セミコロンで区切られた3つの部分で構成されており、それぞれの部分はキーと値です:

キー説明
HostNamesoil-moisture-sensor.azure-devices.netIoT HubのURL
DeviceIdsoil-moisture-sensorデバイスの一意のID
SharedAccessKeyBhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=デバイスとIoT Hubが共有する対称鍵

この接続文字列の最後の部分であるSharedAccessKeyは、デバイスとIoT Hubが共有する対称鍵です。この鍵はデバイスからクラウドへ、またはクラウドからデバイスへ送信されることはありません。代わりに、送受信されるデータを暗号化するために使用されます。

✅ 実験を行ってみましょう。IoTデバイスに接続する際に接続文字列のSharedAccessKey部分を変更するとどうなると思いますか?試してみてください。

デバイスが最初に接続を試みるとき、共有アクセス署名(SAS)トークンを送信します。このトークンは、IoT HubのURL、アクセス署名の有効期限(通常は現在の時刻から1日)、および署名で構成されます。この署名は、接続文字列の共有アクセス鍵で暗号化されたURLと有効期限で構成されます。

IoT Hubはこの署名を共有アクセス鍵で復号し、復号された値がURLと有効期限と一致する場合、デバイスは接続を許可されます。また、現在の時刻が有効期限前であることを確認し、悪意のあるデバイスが実際のデバイスのSASトークンをキャプチャして使用するのを防ぎます。

これは、送信者が正しいデバイスであることを確認するためのエレガントな方法です。既知のデータを暗号化された形式と復号された形式の両方で送信することにより、サーバーは暗号化されたデータを復号した結果が送信された復号版と一致することを確認することでデバイスを検証できます。一致する場合、送信者と受信者の両方が同じ対称暗号鍵を持っていることが確認されます。

💁 有効期限のため、IoTデバイスは正確な時刻を知る必要があります。通常、NTPサーバーから読み取ります。時刻が正確でない場合、接続は失敗します。

接続後、デバイスからIoT Hubに送信されるすべてのデータ、またはIoT Hubからデバイスに送信されるすべてのデータは、共有アクセス鍵で暗号化されます。

✅ 複数のデバイスが同じ接続文字列を共有するとどうなると思いますか?

💁 この鍵をコードに保存することはセキュリティ上の悪い習慣です。ハッカーがソースコードを入手すると、鍵を取得できます。また、コードをリリースする際に、各デバイスの鍵を更新するために再コンパイルする必要があるため、難しくなります。この鍵をハードウェアセキュリティモジュールから読み込む方が良いです。これは、暗号化された値を保存し、コードで読み取ることができるIoTデバイス上のチップです。

IoTを学ぶ際には、以前のレッスンで行ったように、コードに鍵を入れる方が簡単ですが、この鍵が公開ソースコード管理にチェックインされないようにする必要があります。

デバイスには2つの鍵とそれに対応する2つの接続文字列があります。これにより、最初の鍵が危険にさらされた場合に、1つの鍵から別の鍵に切り替え、最初の鍵を再生成することができます。

X.509証明書

公開鍵/秘密鍵ペアを使用した非対称暗号化を使用する場合、データを送信したい人に公開鍵を提供する必要があります。問題は、鍵の受信者がそれが実際にあなたの公開鍵であることをどのように確信できるかです。鍵を提供する代わりに、信頼できる第三者によって検証された証明書内に公開鍵を提供することができます。これをX.509証明書と呼びます。

X.509証明書は、公開鍵/秘密鍵ペアの公開鍵部分を含むデジタル文書です。通常、認証局(CA)と呼ばれる信頼できる組織の1つによって発行され、CAによってデジタル署名されて、鍵が有効であり、あなたからのものであることを示します。パスポートや運転免許証を発行する国を信頼するように、CAを信頼するため、証明書を信頼し、公開鍵が証明書に記載されている人物からのものであることを信頼します。証明書には費用がかかるため、テスト目的で自分で署名することもできます。

💁 本番リリースには自己署名証明書を使用しないでください。

これらの証明書には、公開鍵の発行者、発行したCAの詳細、有効期限、および公開鍵自体など、いくつかのフィールドが含まれています。証明書を使用する前に、元のCAによって署名されたことを確認することで、証明書を検証することが良い習慣です。

✅ 証明書のフィールドの完全なリストは、MicrosoftのX.509公開鍵証明書の理解チュートリアルで読むことができます。

X.509証明書を使用する場合、送信者と受信者の両方が独自の公開鍵と秘密鍵を持ち、両方とも公開鍵を含むX.509証明書を持ちます。次に、何らかの方法でX.509証明書を交換し、お互いの公開鍵を使用して送信するデータを暗号化し、自分の秘密鍵を使用して受信するデータを復号化します。

公開鍵を共有する代わりに、証明書を共有できます。証明書を使用するユーザーは、署名した認証局に確認することで、それがあなたからのものであることを確認できます。

X.509証明書を使用する大きな利点の1つは、デバイス間で共有できることです。1つの証明書を作成し、それをIoT Hubにアップロードし、すべてのデバイスでこれを使用できます。各デバイスは、IoT Hubから受信するメッセージを復号化するための秘密鍵を知っているだけで済みます。

デバイスがIoT Hubに送信するメッセージを暗号化するために使用する証明書は、Microsoftによって公開されています。これは、多くのAzureサービスが使用する同じ証明書であり、SDKに組み込まれていることもあります。

💁 公開鍵はその名の通り公開されています。Azureの公開鍵はAzureに送信されるデータを暗号化するためにのみ使用でき、復号化には使用できないため、ソースコードを含むどこにでも共有できます。たとえば、Azure IoT C SDKのソースコードで確認できます。

✅ X.509証明書には多くの専門用語があります。X.509証明書の専門用語の一般人向けガイドで、出会うかもしれない用語の定義を読むことができます。

X.509証明書の生成と使用

X.509証明書を生成する手順は次のとおりです:

  1. 公開鍵/秘密鍵ペアを作成します。公開鍵/秘密鍵ペアを生成するために最も広く使用されているアルゴリズムの1つは、Rivest–Shamir–Adleman(RSA)と呼ばれます。

  2. 公開鍵と関連データを署名のために提出します。CAによる署名、または自己署名のいずれかです。

Azure CLIには、IoT Hubで新しいデバイスIDを作成し、自動的に公開鍵/秘密鍵ペアを生成し、自己署名証明書を作成するコマンドがあります。

💁 Azure CLIを使用する代わりに、詳細な手順を確認したい場合は、Microsoft IoT HubドキュメントのOpenSSLを使用して自己署名証明書を作成するチュートリアルで確認できます。

タスク - X.509証明書を使用してデバイスIDを作成する

  1. 次のコマンドを実行して、新しいデバイスIDを登録し、キーと証明書を自動的に生成します:

    az iot hub device-identity create --device-id soil-moisture-sensor-x509 \
    --am x509_thumbprint \
    --output-dir . \
    --hub-name <hub_name>

    <hub_name>を使用したIoT Hubの名前に置き換えます。

    これにより、前のレッスンで作成したデバイスIDと区別するために、soil-moisture-sensor-x509というIDを持つデバイスが作成されます。このコマンドは、現在のディレクトリに2つのファイルも作成します:

    • soil-moisture-sensor-x509-key.pem - このファイルにはデバイスの秘密鍵が含まれています。
    • soil-moisture-sensor-x509-cert.pem - これはデバイスのX.509証明書ファイルです。

    これらのファイルを安全に保管してください!秘密鍵ファイルは公開ソースコード管理にチェックインしないでください。

タスク - デバイスコードでX.509証明書を使用する

X.509証明書を使用してIoTデバイスをクラウドに接続するための関連ガイドを参照してください:


🚀 チャレンジ

リソースグループやIoTハブなどのAzureサービスを作成、管理、削除する方法は複数あります。その一つがAzureポータルです。これは、Azureサービスを管理するためのGUIを提供するWebベースのインターフェースです。

portal.azure.comにアクセスしてポータルを調査してください。ポータルを使用してIoTハブを作成し、それを削除できるか確認してください。

ヒント - ポータルを通じてサービスを作成する際、事前にリソースグループを作成する必要はありません。サービスを作成する際にリソースグループを作成できます。終了したら必ず削除してください!

Azureポータルに関する豊富なドキュメント、チュートリアル、ガイドはAzureポータルドキュメントで見つけることができます。

講義後のクイズ

講義後のクイズ

レビューと自己学習

課題

新しいIoTデバイスを作成する