このセクションでは、Fleet Engine の実装に関連する認証と認可のコンセプトについて説明します。Fleet Engine 関数呼び出しを保護するために必要な手順について詳しく説明します。
Google Cloud Console を介して、ラスト ワンマイルのフリート ソリューションが提供する機能を構成できます。これらの API と SDK では、Cloud Console から作成されたサービス アカウントを使用して署名された JSON Web Token(JWT)を使用する必要があります。
概要
Fleet Engine は、認証メカニズムの一部として、低信頼環境からの発信からセキュリティを強化します。低信頼環境にはスマートフォンとブラウザが含まれます。また、Fleet Engine では最小権限の原則を採用しており、タスクの完了に必要な権限のみを呼び出しに付与する必要があります。
低信頼環境からの関数呼び出しを保護するために、Google はコードがバックエンド サーバーにトークンを作成するメカニズムを設計しました。このトークンは完全に信頼できる環境です。各呼び出しには、詳細なセキュリティの説明が含まれます。これは、どの環境からの呼び出しで渡す JWT にも暗号化されます。
認証設計の原則
Fleet Engine の認証フローには、次の設計原則が組み込まれています。
IAM ロールは、呼び出し元に対して許可されるアクティビティのスコープを定義します。たとえば、SuperUser ロールではすべての操作を実行できますが、信頼できないドライバ ロールでは最小限の位置情報の更新のみが許可されます。
IAM ロールはサービス アカウントに関連付けられます。
JWT クレームによって、呼び出し元が操作できるエンティティがさらに制限されます。タスクには、特定の車両や配達車両などがあります。
Fleet Engine に送信されるリクエストには、常に JWT が含まれます。
- JWT はサービス アカウントに関連付けられているため、Fleet Engine に送信されるリクエストは JWT に関連付けられたサービス アカウントに暗黙的に関連付けられます。
適切な JWT をリクエストして Fleet Engine に渡すには、まず、信頼されていない環境で実行されるコードで、完全に信頼できる環境で実行されているコードを呼び出す必要があります。
Fleet Engine では、次のセキュリティ チェックが実行されます。
サービス アカウントに関連付けられた IAM ロールは、呼び出し元が API 呼び出しを発行するための正しい承認を提供します。
リクエストで渡された JWT クレームは、呼び出し元がエンティティを操作するための正しい承認を提供します。
認証フロー
次のシーケンス図に、これらの認証フローの詳細を示します。
フリート管理者がサービス アカウントを作成します。
フリート管理者は、特定の IAM ロールをサービス アカウントに割り当てます。
フリート管理者は、サービス アカウントを使用してバックエンドを構成します。
クライアント アプリがパートナーのバックエンドから JWT をリクエストします。リクエスト元は、ドライバアプリ、コンシューマー アプリ、モニタリング アプリのいずれかです。
Fleet Engine はそれぞれのサービス アカウント用に JWT を発行します。クライアント アプリが JWT を受信します。
クライアント アプリは、設定フェーズで割り当てられた IAM ロールに応じて、JWT を使用して Fleet Engine に接続し、データの読み取りまたは変更を行います。
Cloud プロジェクトの設定
クラウド プロジェクトを設定するには、プロジェクトを作成してからサービス アカウントを作成します。
Google Cloud プロジェクトを作成するには:
- Google Cloud Console を使用して Google Cloud プロジェクトを作成します。
- API とサービス ダッシュボードを使用して、Local Rides and Deliveries API を有効にします。
サービス アカウントと IAM ロール
サービス アカウントは、ユーザーではなく、アプリケーションで使用される特別なアカウントです。通常、サービス アカウントは、ロールに応じて異なる権限セットを付与する JWT の作成に使用されます。不正使用される可能性を減らすには、複数のサービス アカウントを作成し、それぞれに必要最小限のロールを割り当てます。
ラスト ワンマイルのフリート ソリューションでは、次のロールが使用されています。
ロール | 説明 |
---|---|
Fleet Engine Delivery の信頼できる運転手のユーザー
roles/fleetengine.deliveryTrustedDriver |
配送車両とタスクを作成および更新する権限を付与します(配送車両の場所、タスクのステータス、結果を更新するなど)。このロールを持つサービス アカウントによって作成されたトークンは通常、デリバリー ドライバのモバイル デバイスまたはバックエンド サーバーから使用されます。 |
Fleet Engine Delivery の信頼されていないドライバ ユーザー
roles/fleetengine.deliveryUntrustedDriver |
配送車両の位置情報を更新する権限を付与します。このロールを持つサービス アカウントによって作成されたトークンは通常、デリバリー ドライバのモバイル デバイスから使用されます。 |
Fleet Engine Delivery の一般ユーザー
roles/fleetengine.deliveryConsumer |
トラッキング ID を使用してタスクを検索する権限と、タスク情報を読み取ることはできるがタスクの情報を更新する権限は付与しません。通常、このロールを持つサービス アカウントによって作成されたトークンは、配信コンシューマのウェブブラウザで使用されます。 |
Fleet Engine Delivery のスーパー ユーザー
roles/fleetengine.deliverySuperUser |
すべての配信手段とタスクの API に対する権限を付与します。このロールを持つサービス アカウントによって作成されたトークンは、通常、バックエンド サーバーから使用されます。 |
Fleet Engine Delivery フリート リーダー
roles/fleetengine.deliveryFleetReader |
配信車両とタスクを読み取る権限と、トラッキング ID を使用してタスクを検索する権限を付与します。このロールを持つサービス アカウントによって作成されたトークンは通常、配送フリート オペレーターのウェブブラウザから使用されます。 |
企業の IT 部門が管理するデバイスにデリバリー ドライバを提供している組織は、Fleet Engine Trusted Driver ユーザーロールの柔軟性を活かして、Fleet Engine インタラクションの一部またはすべてをモバイルアプリに統合することを選択できます。
個人所有デバイスのポリシーをサポートしている組織は、Fleet Engine Untrusted Driver User ロールの安全性を確保し、モバイルアプリの位置情報だけを Fleet Engine に送信する必要があります。その他のインタラクションはすべて、お客様のバックエンド サーバーから発信してください。
ドライバ SDK とコンシューマ SDK は、これらの標準ロールを中心に構築されています。ただし、任意の権限セットをバンドルできるカスタムロールを作成できます。必要な権限がないと、Driver SDK と Consumer SDK にエラー メッセージが表示されます。そのため、カスタムロールではなく、上に示した標準のロールセットを使用することを強くおすすめします。
サービス アカウントの作成
サービス アカウントは、Google Cloud Console の [IAM & Admin > Service Accounts
] タブで作成できます。[ロール] プルダウン リストから [Fleet Engine] を選択し、サービス アカウントのいずれかにロールを割り当てます。各ロールに関連付けられているアカウントを指定することをおすすめします。たとえば、サービス アカウントにわかりやすい名前を付けます。
便宜上、信頼できないクライアント用の JWT を作成する必要がある場合は、サービス アカウント トークン作成者のロールにユーザーを追加すると、gcloud コマンドライン ツールを使用してトークンを作成できます。
gcloud projects add-iam-policy-binding project-id \ --member=user:my-user@example.com \ --role=roles/iam.serviceAccountTokenCreator
ここで、my-user@example.com
は gcloud での認証に使用するメールアドレス(gcloud auth list
--format='value(account)'
)です。
認可用の JSON Web Token(JWT)の作成
JWT は、Fleet Engine 内で有効期間の短い認証を提供し、承認された車両またはタスクのみをデバイスで変更できるようにします。JWT にはヘッダーとクレーム セクションがあります。ヘッダー セクションには、使用する秘密鍵(サービス アカウントから取得)や暗号化アルゴリズムなどの情報が含まれます。クレーム セクションには、トークンの作成日時、トークンの有効期間、トークンがアクセスを要求するサービス、アクセスを絞り込むその他の認可情報などが含まれています(例: 配達用の車両 ID)。JWT ヘッダー セクションには以下のフィールドがあります。
Field | 説明 |
---|---|
alg | 使用するアルゴリズム。`RS256`。 |
typ | トークンのタイプ。JWT。 |
子供 | サービス アカウントの秘密鍵 ID。この値は、サービス アカウント JSON ファイルの private_key_id フィールドで確認できます。適切なレベルのサービス アカウント キーを使用してください。 |
JWT クレーム セクションには以下のフィールドがあります。
Field | 説明 |
---|---|
iss | サービス アカウントのメールアドレス。 |
sub | サービス アカウントのメールアドレス。 |
AUD | サービス アカウントの SERVICE_NAME(この例では https://fleetengine.googleapis.com/) |
iat | トークンが作成されたタイムスタンプ(1970 年 1 月 1 日 00:00:00 UTC からの経過秒数)。スキューには 10 分かかります。タイムスタンプが過去または未来に近すぎると、サーバーからエラーが報告される可能性があります。 |
exp | トークンが期限切れになるタイムスタンプ(1970 年 1 月 1 日 00:00:00 UTC からの経過秒数)。タイムスタンプが 1 時間以上先の場合、リクエストは失敗します。 |
authorization | ユースケースに応じて、「deliveryvehicleid」、「trackingid」、「taskid」、「taskids」が含まれる場合があります。 |
JWT トークンの作成とは、そのトークンに署名することです。JWT の作成と署名の手順とコードサンプルについては、OAuth を使用しないサービス アカウント承認をご覧ください。その後、生成されたトークンを gRPC 呼び出しや、Fleet Engine へのアクセスに使用するその他のメソッドにアタッチできます。
JWT クレーム
ラスト ワンマイルのフリート ソリューションでは、プライベート クレームを使用します。非公開クレームを使用すると、承認されたクライアントのみが自分のデータにアクセスできるようになります。たとえば、バックエンドで配送ドライバーのモバイル デバイスの JSON ウェブトークンを発行する場合、そのトークンにはドライバーの車両 ID の値を含む deliveryvehicleid
クレームが含まれている必要があります。その後、ドライバーのロールに応じて、トークンは特定の配信車両 ID へのアクセスのみを許可し、他の車両 ID へのアクセスは許可しません。
ラスト ワンマイルのフリート ソリューションでは、次の非公開クレームを使用します。
deliveryvehicleid
- 配送車両ごとの API を呼び出すときに使用します。taskid
- タスクごとの API を呼び出すときに使用します。taskids
-BatchCreateTasksAPI
を呼び出すときに使用します。このクレームは、配列形式である必要があります。配列には、リクエストを完了するために必要なすべてのタスク ID が含まれている必要があります。delivervehicleid
、trackingid
、taskid
クレームは含めないでください。trackingid
-SearchTasksAPI
を呼び出すときに使用します。クレームは、リクエスト内のトラッキング ID と一致する必要があります。delivervehicleid
、taskid
、taskids
クレームは含めないでください。
API をバックエンド サーバーから呼び出す場合は、トークンに適切なクレームを含める必要がありますが、アスタリスク(*)の特別な値を使用して、deliveryvehicleid
、taskid
、trackingid
クレームに使用できます。アスタリスク(「*」)も taskids
クレームで使用できますが、配列内の唯一の要素にする必要があります。
OAuth 2.0 アクセス トークンを使用せずに、JSON を署名なしとして直接署名する場合は、Identity Developer のドキュメントで OAuth を使用せずにサービス アカウント認証(.external})の手順をお読みください。
トークンを gRPC 呼び出しに追加するメカニズムは、呼び出しに使用される言語とフレームワークによって異なります。トークンを HTTP 呼び出しに指定するメカニズムには、署名なしのトークンを含む Authorization ヘッダーを含めます。これは、個々の配送追跡またはフリートのパフォーマンス ユースケースの承認メモに記載されています。
次の例は、バックエンド サーバーからのタスクごとのオペレーションのトークンを示しています。
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_provider_service_account"
}
.
{
"iss": "provider@yourgcpproject.iam.gserviceaccount.com",
"sub": "provider@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"taskid": "*"
}
}
次の例は、バックエンド サーバーからの一括作成タスク オペレーションのトークンを示しています。
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_provider_service_account"
}
.
{
"iss": "provider@yourgcpproject.iam.gserviceaccount.com",
"sub": "provider@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"taskids": ["*"]
}
}
次の例は、バックエンド サーバーから送信される車両ごとのオペレーションのトークンを示しています。
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_provider_service_account"
}
.
{
"iss": "provider@yourgcpproject.iam.gserviceaccount.com",
"sub": "provider@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"deliveryvehicleid": "*"
}
}
次の例は、エンドユーザーの顧客のトークンを示しています。
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_delivery_consumer_service_account"
}
.
{
"iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
"sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"trackingid": "shipment_12345"
}
}
次の例は、ドライバアプリのトークンを示しています。
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_delivery_driver_service_account"
}
.
{
"iss": "driver@yourgcpproject.iam.gserviceaccount.com",
"sub": "driver@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"deliveryvehicleid": "driver_12345"
}
}
- ヘッダーの
kid
フィールドに、サービス アカウントの秘密鍵 ID を指定します。この値は、サービス アカウント JSON ファイルのprivate_key_id
フィールドで確認できます。 iss
フィールドとsub
フィールドには、サービス アカウントのメールアドレスを指定します。この値は、サービス アカウント JSON ファイルのclient_email
フィールドで確認できます。aud
フィールドには https://SERVICE_NAME/ を指定します。iat
フィールドには、トークンが作成されたときのタイムスタンプを 1970 年 1 月 1 日の 00:00:00 UTC からの経過秒数で指定します。スキューには 10 分かかります。タイムスタンプが過去または未来に近すぎると、サーバーからエラーが報告される可能性があります。exp
フィールドには、トークンの有効期限(1970 年 1 月 1 日 00:00:00 UTC からの経過秒数)を指定します。推奨値はiat
+ 3,600 です。
モバイル デバイスまたはエンドユーザーに渡すトークンに署名する場合は、必ず配信ドライバまたはコンシューマ ロールの認証情報ファイルを使用してください。この設定を行わないと、モバイル デバイスやエンドユーザーがアクセスすべきでない情報を変更、表示できます。