デバイス属性 API

コミュニティグループ報告書ドラフト,

このバージョン:
https://wicg.github.io/WebApiDevice/device_attributes
課題追跡:
GitHub
編集者:
(Google LLC)

概要

本文書は、開発者が管理対象デバイスからデバイス情報(デバイス ID、 シリアル番号、場所など)を照会できるようにする Web プラットフォーム API を定義します。この API は、仮想 デスクトップインフラストラクチャ(VDI)やコンテキストベースの設定などのユースケースにとって非常に有用です。

本文書のステータス

この仕様は、Web Platform Incubator Community Group によって公開されました。 これは W3C 標準ではなく、W3C 標準化過程にもありません。 次の点に注意してください。 W3C Community Contributor License Agreement (CLA) の下では、限定的なオプトアウトがあり、その他の条件が適用されます。 詳細は W3C Community and Business Groups を参照してください。

1. はじめに

Device Attributes API は、デバイス管理者が、UA を実行しているデバイスの特定の 属性へのアクセスを特定のオリジンに許可できるようにします。各オリジンにデバイス管理者が カスタム JSON オブジェクトを渡せるようにする [MANAGED-CONFIG] とは異なり、この API は、管理者が有効にした すべてのオリジンに同じ値の集合を渡すことを想定しています。

2. モデル

2.1. 管理対象デバイス

この API は、エンドユーザーが完全に制御しているのではなく、外部の主体であるデバイス 管理者によって制御されるデバイスで使用されることを想定しています。デバイス管理者には、管理対象デバイスを完全に制御する権限が与えられます。

2.2. 管理対象 Web アプリケーション

この API は、デバイス 管理者に理解され管理されている Web アプリケーションによって使用されることを想定しています。

2.3. 権限制御

Device Attributes API は、名前 "device-attributes" によって識別される強力な機能です。

ほとんどのオペレーティングシステムには、Web ブラウザーなどのアプリケーションやデバイスの オペレーティングシステムの多くの側面を設定するために使用できるポリシーを展開する仕組みがあります。この仕様は、 これらのデバイス属性へアクセスする権限が、そのようなシステムを通じて設定されることを要求します。これらの ポリシーはデバイス 管理者によって制御されます。彼らが必ずしもデバイスユーザーの最善の利益を考慮しているとは限りません。

Chrome ブラウザーを例に取ると、管理対象 Web アプリケーションのステータスは、Google Admin Consoleデバイス管理者により選択され、企業管理対象デバイスに自動的に インストールされる Web アプリケーションに対応するオリジンに付与されます。管理対象 Web アプリケーションについては、デバイス管理者が特定のアプリケーションにアクセスを提供したくない場合、 これらのデバイス属性にアクセスする権限を取り消すことができます。

2.4. 権限ポリシー

この仕様は、トークン文字列 "device-attributes" によって識別されるポリシー制御機能を定義します。

2.5. デバイス属性

この API は、デバイス管理者が デバイス群を管理し、それらのデバイスのプロパティを設定できる管理インフラストラクチャとともに使用されることを想定しています。

2.5.1. 注釈付きアセット ID

組織内のデバイスを一意に識別する、管理者定義の値。

2.5.2. 注釈付きロケーション

組織内の場所を一意に識別する、管理者定義の値。

2.5.3. ディレクトリ ID

組織内のデバイスを一意に識別する、在庫管理システム定義の値。

2.5.4. ホスト名

DHCP 要求中のデバイスのホスト名として使用される、管理者定義の値。

2.5.5. シリアル番号

その製造元によって製造されたデバイスの中で、デバイスを一意に識別する製造元定義の値。

[
  SecureContext,
  Exposed=Window
] interface NavigatorManagedData : EventTarget {
  // デバイス属性 API。
  Promise<DOMString> getAnnotatedAssetId();
  Promise<DOMString> getAnnotatedLocation();
  Promise<DOMString> getDirectoryId();
  Promise<DOMString> getHostname();
  Promise<DOMString> getSerialNumber();
};

このインターフェイス上のメソッドは通常、管理データタスクソース上で作業をキューに入れ、 非同期に完了します。

3.1. getAnnotatedAssetId() メソッド

getAnnotatedAssetId() メソッドの手順は 次のとおりです:

  1. promise新しい promise とします。

  2. 次の手順を並列に実行します:

    1. この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データタスク ソースを用いて、promise を "NotAllowedError" DOMException拒否し、これらの手順を中止します。

    2. annotatedAssetId を、デバイス管理者によって設定された注釈付きアセット ID、または設定されていない場合は undefined とします。

    3. グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promiseannotatedAssetId解決 します。

  3. promise を返します。

3.2. getAnnotatedLocation() メソッド

getAnnotatedLocation() メソッドの 手順は次のとおりです:

  1. promise新しい promise とします。

  2. 次の手順を並列に実行します:

    1. この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promise を "NotAllowedError" DOMException拒否し、これらの手順を中止します。

    2. annotatedLocation を、デバイス管理者によって設定された注釈付きロケーション、または設定されていない場合は undefined とします。

    3. グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promiseannotatedLocation解決 します。

  3. promise を返します。

3.3. getDirectoryId() メソッド

getDirectoryId() メソッドの手順は次のとおりです:

  1. promise新しい promise とします。

  2. 次の手順を並列に実行します:

    1. この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promise を "NotAllowedError" DOMException拒否し、これらの手順を中止します。

    2. directoryId を、ディレクトリ ID、または管理インフラストラクチャによって提供されていない場合は undefined とします。

    3. グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promisedirectoryId解決 します。

  3. promise を返します。

3.4. getHostname() メソッド

getHostname() メソッドの手順は次のとおりです:

  1. promise新しい promise とします。

  2. 次の手順を並列に実行します:

    1. この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promise を "NotAllowedError" DOMException拒否し、これらの手順を中止します。

    2. hostname を、デバイス 管理者によって設定されたホスト名、または設定されていない場合は undefined とします。

    3. グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promisehostname解決 します。

  3. promise を返します。

3.5. getSerialNumber() メソッド

getSerialNumber() メソッドの手順は次のとおりです:

  1. promise新しい promise とします。

  2. 次の手順を並列に実行します:

    1. この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promise を "NotAllowedError" DOMException拒否し、これらの手順を中止します。

    2. serialNumber を、シリアル番号、または利用できない場合は undefined とします。

    3. グローバルタスクをキューに入れることで、関連するグローバルオブジェクトthis のもの)上に、管理データ タスクソースを用いて、promiseserialNumber解決 します。

  3. promise を返します。

4. コード例

オンライン販売システムに依存している小売企業があると仮定します。バックエンドサービスは、 その注釈付きロケーション(国、市、または販売地域)に基づいて、午前中に店舗内デバイスへ 異なる料金表をプッシュし、午後に販売レポートを収集します。

Device Attributes API の助けを借りて、この販売アプリケーションは getAnnotatedLocation() メソッドを使用してデバイスの場所を取得できます。この操作は、API 呼び出しがフィッシングアプリケーション(見た目は似ているが 期待されるものではないアプリケーション)によってトリガーされた場合に失敗します。

// 現在の環境が有効であれば、機密データを要求する。
function successCallback(location) {
  const tariff = backend.requestTariff(location);
  console.log(tariff);
}
 
// 現在の環境が想定外であれば、ワークフローを停止する。
function failureCallback(error) {
  backend.reportFailure(error);
  console.error(error.message);
}
 
function PrepareTariff() {
  navigator.managed.getAnnotatedLocation()
                   .then(successCallback, failureCallback);
}

getAnnotatedAssetId() メソッドを使用することで、デバイスのシリアル番号を含む販売データを報告する、別の類似したコードスニペットを簡単に 書くことができます。

注: Web サイトは、そのデータが改ざん、窃取、 または別の管理対象デバイスで再利用される可能性があると想定するべきです。代替のセキュリティ対策は Web サイト自身によって 講じられるべきです。

function ReportSalesData() {
  navigator.managed.getAnnotatedAssetId.then(reportCallback);
}

5. セキュリティの考慮事項

現代のセキュリティ慣行に従い、これらのメソッドを使用する権限は、オリジンごとにデバイス 管理者によって制御されます。さらに、これらは管理対象デバイス上の安全なコンテキストでのみ利用できます。

6. プライバシーの考慮事項

この API は、すべてのオリジンで同一となるデバイス属性へのアクセスを提供します。(管理対象サイトのオリジンごとの設定については [MANAGED-CONFIG] を 参照してください。)任意に公開された場合、これはトラッキング目的に容易に使用される可能性があります。しかし管理対象環境では、デバイス管理者が、特定の従業員または作業のために マシン群を設定しているため、これらのマシンがアクセスすることを期待されているサイトに対して自らを識別できることが望ましいです。

このインターフェイスを非管理対象デバイスで使用することは非目標です。エンドユーザーがこの情報をサイトへ提供するよう求められることは ありません。どのオリジンにこれらのデバイス属性へのアクセス権を付与するかという判断は、それらが属する組織の権限を与えられた 管理者によって行われます。

不要な情報公開を防ぐため、設定機構は、デバイス管理者が これらの属性へのアクセスを限られたオリジンの集合に付与することを要求します。すべてのオリジンにアクセスを付与すると、そのデバイス上の すべての Web ブラウジングを広範に追跡する仕組みが作られてしまうためです。アクセスが付与されたオリジンは、さらに安全なコンテキストであるため、受動的なネットワーク攻撃者は転送中のこれらの属性を観測できません。

注: [RFC7258] は広範な監視を攻撃として扱いますが、これは 管理対象デバイスには適用されません。そのような場合、管理対象デバイスの実際の所有者はエンドユーザーではなく、 適切な権限を使用してすべてのエンドユーザーを保護することが期待されるデバイス 管理者です。

適合性

文書の 表記規則

適合性要件は、記述的な表明と RFC 2119 用語の組み合わせで表現されます。 本文書の規範的部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” は、RFC 2119 で説明されているように解釈されます。 ただし、読みやすさのため、 この仕様ではこれらの語がすべて大文字で現れるとは限りません。

この仕様のテキストはすべて規範的です。 ただし、非規範的であると明示的に示された節、例、および注を除きます。 [RFC2119]

この仕様の例は、“for example” という語で導入されるか、 規範的テキストから class="example" によって区別されます。 次のようになります:

これは参考情報としての例の一例です。

参考情報の注は “Note” という語で始まり、 規範的テキストから class="note" によって区別されます。 次のようになります:

注、これは参考情報の注です。

索引

この仕様で定義される用語

参照により定義される用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM Standard. リビング標準. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. リビング標準. URL: https://html.spec.whatwg.org/multipage/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. リビング 標準. URL: https://webidl.spec.whatwg.org/

参考情報の参考文献

[MANAGED-CONFIG]
Anatoliy Potapchuk. MANAGED-CONFIG. URL: https://wicg.github.io/WebApiDevice/managed_config
[RFC7258]
S. Farrell; H. Tschofenig. Pervasive Monitoring Is an Attack. 2014年5月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc7258

IDL 索引

[
  SecureContext,
  Exposed=Window
] interface NavigatorManagedData : EventTarget {
  // デバイス属性 API。
  Promise<DOMString> getAnnotatedAssetId();
  Promise<DOMString> getAnnotatedLocation();
  Promise<DOMString> getDirectoryId();
  Promise<DOMString> getHostname();
  Promise<DOMString> getSerialNumber();
};