# 植物を安全に保つ方法 ![このレッスンの概要を示すスケッチノート](../../../../../translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.ja.jpg) > スケッチノート作成者:[Nitya Narasimhan](https://github.com/nitya)。画像をクリックすると拡大表示されます。 ## 講義前のクイズ [講義前のクイズ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/19) ## はじめに これまでのレッスンでは、土壌モニタリングIoTデバイスを作成し、それをクラウドに接続する方法を学びました。しかし、もし競合する農家のハッカーがあなたのIoTデバイスを乗っ取ったらどうなるでしょうか?例えば、土壌の湿度が常に高いと偽のデータを送信して植物に水を与えないようにしたり、逆に水やりシステムを常に作動させて植物を過剰に水やりして枯らし、莫大な水道料金を発生させる可能性があります。 このレッスンでは、IoTデバイスのセキュリティについて学びます。また、このプロジェクトの最後のレッスンとして、クラウドリソースを整理し、潜在的なコストを削減する方法も学びます。 このレッスンで学ぶ内容は以下の通りです: * [なぜIoTデバイスを保護する必要があるのか?](../../../../../2-farm/lessons/6-keep-your-plant-secure) * [暗号技術](../../../../../2-farm/lessons/6-keep-your-plant-secure) * [IoTデバイスを保護する方法](../../../../../2-farm/lessons/6-keep-your-plant-secure) * [X.509証明書の生成と使用](../../../../../2-farm/lessons/6-keep-your-plant-secure) > 🗑 このプロジェクトの最後のレッスンですので、レッスンと課題を完了した後はクラウドサービスを整理することを忘れないでください。課題を完了するためにはサービスが必要ですので、まず課題を完了してください。 > > 必要に応じて、[プロジェクト整理ガイド](../../../clean-up.md)を参照して手順を確認してください。 ## なぜIoTデバイスを保護する必要があるのか? IoTセキュリティとは、予期されたデバイスだけがクラウドIoTサービスに接続してテレメトリを送信できるようにし、クラウドサービスだけがデバイスにコマンドを送信できるようにすることを指します。IoTデータには医療情報やプライベートな情報が含まれることがあるため、アプリケーション全体でセキュリティを考慮し、データ漏洩を防ぐ必要があります。 IoTアプリケーションが安全でない場合、以下のようなリスクがあります: * 偽のデバイスが誤ったデータを送信し、アプリケーションが誤った対応をする可能性があります。例えば、常に高い土壌湿度のデータを送信し、灌漑システムが作動せず植物が枯れることがあります。 * 不正なユーザーがIoTデバイスからデータを読み取ることで、個人情報や重要なビジネスデータが漏洩する可能性があります。 * ハッカーがデバイスを制御するコマンドを送信し、デバイスや接続されたハードウェアに損害を与える可能性があります。 * IoTデバイスに接続することで、ハッカーが追加のネットワークにアクセスし、プライベートなシステムに侵入する可能性があります。 * 悪意のあるユーザーが個人データにアクセスし、それを脅迫に利用する可能性があります。 これらは現実のシナリオであり、頻繁に発生しています。以前のレッスンでいくつかの例を紹介しましたが、以下にさらにいくつかの例を挙げます: * 2018年、ハッカーが魚の水槽の温度計に接続されたオープンWiFiアクセスポイントを利用してカジノのネットワークに侵入し、データを盗みました。[The Hacker News - Casino Gets Hacked Through Its Internet-Connected Fish Tank Thermometer](https://thehackernews.com/2018/04/iot-hacking-thermometer.html) * 2016年、MiraiボットネットがインターネットサービスプロバイダーDynに対してサービス拒否攻撃を行い、インターネットの大部分を停止させました。このボットネットは、デフォルトのユーザー名とパスワードを使用していたDVRやカメラなどのIoTデバイスにマルウェアを接続し、攻撃を開始しました。[The Guardian - DDoS attack that disrupted internet was largest of its kind in history, experts say](https://www.theguardian.com/technology/2016/oct/26/ddos-attack-dyn-mirai-botnet) * Spiral Toysは、CloudPets接続玩具のユーザーのデータベースをインターネット上で公開していました。[Troy Hunt - Data from connected CloudPets teddy bears leaked and ransomed, exposing kids' voice messages](https://www.troyhunt.com/data-from-connected-cloudpets-teddy-bears-leaked-and-ransomed-exposing-kids-voice-messages/) * Stravaは、ランナーが通過した場所をタグ付けし、そのルートを表示することで、見知らぬ人が自宅の場所を特定できるようにしていました。[Kim Komndo - Fitness app could lead a stranger right to your home — change this setting](https://www.komando.com/security-privacy/strava-fitness-app-privacy/755349/) ✅ 調査してみましょう:IoTデバイスのハッキングやデータ漏洩の例をさらに探してみてください。特にインターネット接続された歯ブラシや体重計などの個人アイテムに注目してください。これらのハッキングが被害者や顧客に与える影響について考えてみましょう。 > 💁 セキュリティは非常に広範なトピックであり、このレッスンではデバイスをクラウドに接続する際の基本的な部分にしか触れません。データの転送中の変更の監視、デバイスの直接的なハッキング、デバイス設定の変更などは扱いません。IoTハッキングは非常に深刻な脅威であり、[Azure Defender for IoT](https://azure.microsoft.com/services/azure-defender-for-iot/?WT.mc_id=academic-17441-jabenn)のようなツールが開発されています。これらのツールは、コンピュータにインストールされているウイルス対策やセキュリティツールに似ていますが、小型で低消費電力のIoTデバイス向けに設計されています。 ## 暗号技術 デバイスがIoTサービスに接続する際、IDを使用して自分自身を識別します。しかし、このIDは複製される可能性があります。ハッカーが悪意のあるデバイスを設定し、実際のデバイスと同じIDを使用して偽のデータを送信することができます。 ![有効なデバイスと悪意のあるデバイスが同じIDを使用してテレメトリを送信する可能性があります](../../../../../translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.ja.png) これを防ぐ方法は、送信されるデータをデバイスとクラウドだけが知っている値を使用して暗号化することです。このプロセスは「暗号化」と呼ばれ、データを暗号化するために使用される値は「暗号鍵」と呼ばれます。 ![暗号化が使用される場合、暗号化されたメッセージのみが受け入れられ、その他は拒否されます](../../../../../translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.ja.png) クラウドサービスは、暗号化されたデータを読み取り可能な形式に変換するために「復号化」と呼ばれるプロセスを使用します。この際、暗号化鍵または復号化鍵を使用します。暗号化されたメッセージが鍵によって復号化できない場合、デバイスがハッキングされていると判断され、メッセージは拒否されます。 暗号化と復号化の技術は「暗号技術」と呼ばれます。 ### 初期の暗号技術 最も初期の暗号技術は約3,500年前に遡る置換暗号でした。置換暗号は、ある文字を別の文字に置き換える方法です。例えば、[シーザー暗号](https://wikipedia.org/wiki/Caesar_cipher)はアルファベットを一定の量だけシフトする方法で、暗号化されたメッセージの送信者と受信者だけがシフトする文字数を知っています。 [Vigenère暗号](https://wikipedia.org/wiki/Vigenère_cipher)はさらに進化し、単語を使用してテキストを暗号化する方法で、元のテキストの各文字が異なる量だけシフトされるようになりました。 暗号技術は、古代メソポタミアで陶器の釉薬のレシピを保護したり、インドで秘密の恋文を書いたり、古代エジプトで魔法の呪文を秘密にするなど、さまざまな目的で使用されました。 ### 現代の暗号技術 現代の暗号技術ははるかに高度で、初期の方法よりも解読が困難です。現代の暗号技術は複雑な数学を使用してデータを暗号化し、ブルートフォース攻撃が不可能になるほど多くの鍵の可能性を持っています。 暗号技術は安全な通信のためにさまざまな方法で使用されています。もしこのページをGitHubで読んでいる場合、ウェブサイトのアドレスが*HTTPS*で始まっていることに気づくかもしれません。これは、ブラウザとGitHubのウェブサーバー間の通信が暗号化されていることを意味します。もし誰かがブラウザとGitHub間のインターネットトラフィックを読み取ることができても、暗号化されているためデータを読むことはできません。コンピュータはハードドライブ上のすべてのデータを暗号化することもあり、盗まれた場合でもパスワードがなければデータを読むことはできません。 > 🎓 HTTPSはHyperText Transfer Protocol **Secure**の略です。 残念ながら、すべてが安全というわけではありません。一部のデバイスにはセキュリティがなく、簡単に解読できる鍵を使用しているものもあります。また、同じタイプのすべてのデバイスが同じ鍵を使用している場合もあります。非常に個人的なIoTデバイスがWiFiやBluetoothで接続するためのパスワードがすべて同じであるという事例もあります。自分のデバイスに接続できるなら、他人のデバイスにも接続できる可能性があります。一度接続すると、非常にプライベートなデータにアクセスしたり、デバイスを制御することができます。 > 💁 現代の暗号技術の複雑さと、暗号を解読するのに数十億年かかるという主張にもかかわらず、量子コンピューティングの進化により、既知のすべての暗号を非常に短時間で解読する可能性が生まれています! ### 対称鍵と非対称鍵 暗号化には2つのタイプがあります:対称暗号化と非対称暗号化。 **対称暗号化**は、データを暗号化する鍵と復号化する鍵が同じです。送信者と受信者の両方が同じ鍵を知っている必要があります。この方法は最も安全性が低く、鍵を共有する必要があります。送信者が暗号化されたメッセージを受信者に送るには、まず受信者に鍵を送る必要があるかもしれません。 ![対称鍵暗号化は、同じ鍵を使用してメッセージを暗号化および復号化します](../../../../../translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.ja.png) 鍵が送信中に盗まれたり、送信者や受信者がハッキングされて鍵が見つかった場合、暗号化は解読される可能性があります。 ![対称鍵暗号化は、ハッカーが鍵を取得しない場合にのみ安全です。鍵が盗まれると、メッセージを傍受して復号化することができます](../../../../../translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.ja.png) **非対称暗号化**は、暗号化鍵と復号化鍵の2つの鍵を使用します。これらは公開鍵と秘密鍵のペアとして知られています。公開鍵はメッセージを暗号化するために使用されますが、復号化には使用できません。秘密鍵はメッセージを復号化するために使用されますが、暗号化には使用できません。 ![非対称暗号化は、暗号化と復号化に異なる鍵を使用します。暗号化鍵はメッセージ送信者に送られ、送信者はメッセージを暗号化して受信者に送信します。受信者は自分の鍵で復号化します](../../../../../translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.ja.png) 受信者は公開鍵を共有し、送信者はこれを使用してメッセージを暗号化します。メッセージが送信されると、受信者は秘密鍵を使用して復号化します。非対称暗号化は、秘密鍵が受信者によって秘密に保たれ、共有されないため、より安全です。公開鍵は誰でも持つことができますが、メッセージの暗号化にしか使用できません。 対称暗号化は非対称暗号化よりも高速ですが、非対称暗号化の方が安全です。一部のシステムでは両方を使用します。非対称暗号化を使用して対称鍵を暗号化して共有し、その後、対称鍵を使用してすべてのデータを暗号化します。これにより、送信者と受信者間で対称鍵を安全に共有し、データの暗号化と復号化を高速化することができます。 ## IoTデバイスを保護する方法 IoTデバイスは、対称暗号化または非対称暗号化を使用して保護することができます。対称暗号化は簡単ですが、セキュリティが低いです。 ### 対称鍵 IoTデバイスをIoT Hubと連携させる際、接続文字列を使用しました。接続文字列の例は以下の通りです: ```output HostName=soil-moisture-sensor.azure-devices.net;DeviceId=soil-moisture-sensor;SharedAccessKey=Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0= ``` この接続文字列はセミコロンで区切られた3つの部分で構成されており、それぞれがキーと値のペアになっています: | キー | 値 | 説明 | | --- | ----- | ----------- | | HostName | `soil-moisture-sensor.azure-devices.net` | IoT HubのURL | | DeviceId | `soil-moisture-sensor` | デバイスのユニークID | | SharedAccessKey | `Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=` | デバイスとIoT Hubが共有する対称鍵 | この接続文字列の最後の部分である`SharedAccessKey`は、デバイスとIoT Hubが共有する対称鍵です。この鍵はデバイスからクラウドへ、またはクラウドからデバイスへ送信されることはありません。代わりに、送信または受信されるデータを暗号化するために使用されます。 ✅ 実験してみましょう:IoTデバイスに接続する際に接続文字列の`SharedAccessKey`部分を変更するとどうなると思いますか?試してみてください。 デバイスが最初に接続を試みる際、URL、アクセス署名の有効期限(通常は現在時刻から1日後)、および署名を含む共有アクセス署名(SAS)トークンを送信します。この署名は、URLと有効期限を接続文字列の共有アクセス鍵で暗号化したものです。 IoT Hubはこの署名を共有アクセス鍵で復号化し、復号化された値がURLと有効期限と一致する場合、デバイスの接続を許可します。また、現在時刻が有効期限より前であることを確認し、悪意のあるデバイスが実際のデバイスのSASトークンを捕獲して 💁 IoTデバイスは有効期限の関係で正確な時刻を知る必要があります。通常、[NTP](https://wikipedia.org/wiki/Network_Time_Protocol)サーバーから時刻を取得します。時刻が正確でない場合、接続は失敗します。 接続後、デバイスからIoT Hubへ、またはIoT Hubからデバイスへ送信されるすべてのデータは、共有アクセスキーで暗号化されます。 ✅ 複数のデバイスが同じ接続文字列を共有した場合、何が起こると思いますか? > 💁 このキーをコード内に保存するのはセキュリティ上良くない方法です。ハッカーがソースコードを入手すると、キーを取得される可能性があります。また、コードをリリースする際に、デバイスごとに更新されたキーで再コンパイルする必要があるため、手間が増えます。このキーは、ハードウェアセキュリティモジュール(IoTデバイス上の暗号化された値を保存するチップ)から読み込む方が良いです。 > > IoTを学ぶ際には、以前のレッスンで行ったようにキーをコードに埋め込む方が簡単ですが、このキーが公開されたソースコード管理にチェックインされないように注意する必要があります。 デバイスには2つのキーとそれに対応する2つの接続文字列があります。これにより、キーをローテーション(1つのキーが侵害された場合に別のキーに切り替え、最初のキーを再生成すること)が可能になります。 ### X.509証明書 公開鍵と秘密鍵のペアを使用した非対称暗号化を行う場合、データを送信したい相手に公開鍵を提供する必要があります。しかし、相手がその公開鍵が本当にあなたのものであると確信するにはどうすれば良いでしょうか?鍵を提供する代わりに、信頼できる第三者によって検証された証明書内に公開鍵を含めることができます。この証明書はX.509証明書と呼ばれます。 X.509証明書は、公開鍵と秘密鍵のペアの公開鍵部分を含むデジタル文書です。通常、[認証局](https://wikipedia.org/wiki/Certificate_authority) (CA) と呼ばれる信頼できる組織によって発行され、CAによってデジタル署名されることで、その鍵が有効であり、あなたからのものであることを示します。パスポートや運転免許証を発行国を信頼することで信頼するのと同様に、CAを信頼することで証明書を信頼し、その公開鍵が証明書に記載された発行者のものであると信じることができます。証明書は費用がかかるため、テスト目的で自分自身で署名する「自己署名」を行うこともできます。 > 💁 本番リリースでは自己署名証明書を使用してはいけません。 これらの証明書には、公開鍵の発行者、証明書を発行したCAの詳細、有効期限、公開鍵自体など、いくつかのフィールドが含まれています。証明書を使用する前に、元のCAによって署名されたことを確認することで検証するのが良い習慣です。 ✅ 証明書に含まれるフィールドの完全なリストは、[MicrosoftのX.509公開鍵証明書の理解に関するチュートリアル](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-certificates?WT.mc_id=academic-17441-jabenn#certificate-fields)で読むことができます。 X.509証明書を使用する場合、送信者と受信者の両方がそれぞれの公開鍵と秘密鍵を持ち、さらに公開鍵を含むX.509証明書を持っています。これらの証明書を交換し、相手の公開鍵を使用して送信するデータを暗号化し、自分の秘密鍵を使用して受信したデータを復号化します。 ![公開鍵を共有する代わりに、証明書を共有することができます。証明書の利用者は、証明書を署名した認証局に確認することで、それがあなたからのものであることを検証できます。](../../../../../translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.ja.png) X.509証明書を使用する大きな利点の1つは、デバイス間で共有できることです。1つの証明書を作成し、それをIoT Hubにアップロードしてすべてのデバイスで使用できます。各デバイスは、IoT Hubから受信するメッセージを復号化するための秘密鍵を知っているだけで済みます。 デバイスがIoT Hubに送信するメッセージを暗号化するために使用する証明書は、Microsoftによって公開されています。この証明書は多くのAzureサービスで使用されており、SDKに組み込まれていることもあります。 > 💁 公開鍵はその名の通り「公開」されています。Azureの公開鍵はAzureに送信するデータを暗号化するためだけに使用され、復号化には使用されないため、どこにでも共有できます。例えば、[Azure IoT C SDKのソースコード](https://github.com/Azure/azure-iot-sdk-c/blob/master/certs/certs.c)で確認できます。 ✅ X.509証明書には多くの専門用語があります。[X.509証明書の専門用語に関する初心者向けガイド](https://techcommunity.microsoft.com/t5/internet-of-things/the-layman-s-guide-to-x-509-certificate-jargon/ba-p/2203540?WT.mc_id=academic-17441-jabenn)で、よく出てくる用語の定義を読むことができます。 ## X.509証明書の生成と使用 X.509証明書を生成する手順は以下の通りです: 1. 公開鍵と秘密鍵のペアを作成します。公開鍵と秘密鍵のペアを生成するために最も広く使用されているアルゴリズムの1つは[Rivest–Shamir–Adleman](https://wikipedia.org/wiki/RSA_(cryptosystem))(RSA)です。 1. 公開鍵と関連データを署名のために提出します。これはCAによる署名、または自己署名によるものです。 Azure CLIには、IoT Hubで新しいデバイスIDを作成し、公開鍵と秘密鍵のペアを自動的に生成し、自己署名証明書を作成するコマンドがあります。 > 💁 Azure CLIを使用せずに詳細な手順を確認したい場合は、[Microsoft IoT HubドキュメントのOpenSSLを使用した自己署名証明書の作成に関するチュートリアル](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-self-sign?WT.mc_id=academic-17441-jabenn)を参照してください。 ### タスク - X.509証明書を使用してデバイスIDを作成する 1. 次のコマンドを実行して新しいデバイスIDを登録し、キーと証明書を自動生成します: ```sh az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ --am x509_thumbprint \ --output-dir . \ --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デバイスをクラウドに接続するための関連ガイドを確認してください: * [Arduino - Wio Terminal](wio-terminal-x509.md) * [シングルボードコンピュータ - Raspberry Pi/仮想IoTデバイス](single-board-computer-x509.md) --- ## 🚀 チャレンジ Resource GroupやIoT HubなどのAzureサービスを作成、管理、削除する方法は複数あります。その1つが[Azure Portal](https://portal.azure.com?WT.mc_id=academic-17441-jabenn)です。これはAzureサービスを管理するためのGUIを提供するウェブベースのインターフェースです。 [portal.azure.com](https://portal.azure.com?WT.mc_id=academic-17441-jabenn)にアクセスしてポータルを調査してください。IoT Hubをポータルで作成し、それを削除できるか試してみてください。 **ヒント** - ポータルを通じてサービスを作成する際、事前にResource Groupを作成する必要はありません。サービスを作成する際にResource Groupを作成することができます。作業が終わったら削除することを忘れないでください! Azure Portalに関するドキュメント、チュートリアル、ガイドは[Azureポータルドキュメント](https://docs.microsoft.com/azure/azure-portal/?WT.mc_id=academic-17441-jabenn)で見つけることができます。 ## 講義後のクイズ [講義後のクイズ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/20) ## レビューと自己学習 * [Wikipediaの暗号の歴史ページ](https://wikipedia.org/wiki/History_of_cryptography)で暗号の歴史について調べてください。 * [WikipediaのX.509ページ](https://wikipedia.org/wiki/X.509)でX.509証明書について調べてください。 ## 課題 [新しいIoTデバイスを構築する](assignment.md) **免責事項**: この文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された原文が正式な情報源と見なされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の利用に起因する誤解や誤認について、当社は一切の責任を負いません。