ApsaraMQ for MQTT は、トークンベースの認証とデバイスごとの一意の証明書認証という 2 つの認証モードをサポートしています。お使いのセキュリティモデルと認証情報のライフサイクル要件に合ったモードを選択してください。
AccessKey ID と AccessKey secret は、UserName と Password の計算に直接使用されます。これらをクライアント側のコードに埋め込まないでください。これらの認証情報はバックエンドアプリケーションに保存し、サーバー側で UserName と Password を計算して、その結果をクライアントに渡してください。
認証モードの選択
| モード | 最適な用途 | 認証情報の有効期間 | アクセス制御の粒度 |
|---|---|---|---|
| トークンベースの認証 | 一時的でスコープが限定された権限を必要とする、信頼できないクライアントやモバイルクライアント | 一時的 (自動的に失効) | クライアントごと、リソースごと |
| デバイスごとの一意の証明書認証 | 永続的なアクセスを必要とする、IoT 環境内の信頼できるデバイス | 永続的 (ブローカーによる失効が可能) | クライアントごと (クライアント ID にバインド) |
認証の仕組み
MQTT クライアントが接続する際、ApsaraMQ for MQTT は MQTT CONNECT パケット内の UserName フィールドと Password フィールドでクライアントを認証します。どちらのフィールドも、認証モードによって計算方法が異なります。
モード | モード名 | UserName の形式 | Password |
| トークンベース | Token | Token|<AccessKey ID>|<Instance ID> | アップロードされたトークンの内容です。詳細については、「トークンベースの認証」をご参照ください。 |
| デバイスごとの一意の証明書 | DeviceCredential | DeviceCredential|<DeviceAccessKeyId>|<Instance ID> | DeviceAccessKey secret を使用してクライアント ID に署名し、Base64 エンコードされた署名文字列です。詳細については、「デバイスごとの一意の証明書認証」をご参照ください。 |
UserName の例
トークンモード
クライアントの ClientId が GID_Test@@@0001、インスタンス ID が mqtt-xxxxx、AccessKey ID が YYYYY の場合:
Token|YYYYY|mqtt-xxxxxDeviceCredential モード
クライアントの ClientId が GID_Test@@@0001、インスタンス ID が mqtt-xxxxx、DeviceAccessKeyId が YYYYY の場合:
DeviceCredential|YYYYY|mqtt-xxxxxトークンベースの認証
トークンベースの認証は、個々のクライアントに一時的でスコープが限定されたアクセス権を付与します。トークンは、クライアントがアクセスできるリソース、権限レベル、およびアクセスの有効期限を定義します。
トークンベースの認証が適したケース
このモードは、次のような場合に使用します:
アプリケーションに独自のアカウントシステムがあり、ローカルアカウント (部門、デバイス、または個人ユーザー) を個別の MQTT 権限にマッピングする必要がある場合。
Alibaba Cloud RAM システムでは、クライアントごとの権限粒度を実現できない場合。署名認証は Alibaba Cloud アカウントレベルで動作しますが、トークンベースの認証は個々のリソースレベルまでアクセスを制御します。
クライアントがモバイルデバイスや、クラッキングやハイジャックに対して脆弱な他の環境で実行されており、固定された認証情報がセキュリティリスクとなる場合。
権限を一定期間後に自動的に失効させる必要がある場合。
トークンの使用方法
バックエンドはアカウントやデバイスを管理し、権限と有効期限を管理して、クライアントにトークンを配信します:
安全で信頼できる管理ノードからトークンを発行します。
各トークンを対応する MQTT クライアントに配信します。
クライアントはトークンを使用して ApsaraMQ for MQTT ブローカーに対して認証を行います。
トークンのアップロードと管理方法を含む、トークン認証フローの全体像については、「トークンベースの認証」をご参照ください。
デバイスごとの一意の証明書認証
デバイスごとの一意の証明書認証は、各 MQTT クライアントに、特定のクライアント ID にバインドされた独自のユーザー名とパスワードを割り当てます。ブローカーはいつでも任意のデバイスの認証情報を更新または失効させることができ、完全なライフサイクル管理が可能です。
デバイスごとの一意の証明書認証が適したケース
このモードは、次のような場合に使用します:
クライアントが安全で信頼でき、トークンのローテーションよりも永続的な認証が望ましい場合。
リアルタイムのトークン更新が非現実的な IoT デプロイメントに似た環境である場合。
各クライアント ID に認証情報を直接バインドして、トークンのなりすましを防ぐ必要がある場合。
各デバイスが独自の認証情報で独立して認証する必要がある場合。
デバイスアクセス認証情報の使用方法
アプリケーションサーバーは、ApsaraMQ for MQTT ブローカーに対し、MQTT クライアントごとに一意のデバイスアクセス認証情報を要求します。この認証情報には DeviceAccessKeyId が含まれており、クライアントはこれを使用して接続時に UserName と Password を計算します。
認証情報ワークフローと計算ルールの全体像については、「デバイスごとの一意の証明書認証」をご参照ください。
初回接続のための認証情報取得
ApsaraMQ for MQTT インスタンスの購入後、コンソールにはデバイスアクセス資格情報を管理するための UI が提供されていません。RegisterDeviceCredential OpenAPI オペレーションを呼び出して、デバイスアクセス資格情報を登録する必要があります。最初のクライアント接続の接続資格情報を取得するには:
コンソールでグループ ID (形式:
GID_xxx) を作成します。RegisterDeviceCredentialOpenAPI を呼び出し、インスタンス ID (InstanceId) とクライアント ID (ClientId、形式:GroupId@@@DeviceId) を渡します。API から返された
DeviceAccessKeyIdとDeviceAccessKey secretを取得します。デバイスごとの一意の証明書認証のルールに従って、
UserNameとPasswordを計算します。
クライアント ID とデバイスアクセス認証情報は一対一で対応します。クライアント ID を変更した場合は、新しいデバイスアクセス認証情報を登録する必要があります。