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. シリアル番号
その製造元によって製造されたデバイスの中で、デバイスを一意に識別する製造元定義の値。
3.
NavigatorManagedData
インターフェイス
[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() メソッドの手順は
次のとおりです:
-
promise を新しい promise とします。
-
次の手順を並列に実行します:
-
この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データタスク ソースを用いて、promise を "
NotAllowedError"DOMExceptionで拒否し、これらの手順を中止します。 -
annotatedAssetId を、デバイス管理者によって設定された注釈付きアセット ID、または設定されていない場合は
undefinedとします。 -
グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を annotatedAssetId で解決 します。
-
-
promise を返します。
3.2.
getAnnotatedLocation()
メソッド
getAnnotatedLocation() メソッドの
手順は次のとおりです:
-
promise を新しい promise とします。
-
次の手順を並列に実行します:
-
この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を "
NotAllowedError"DOMExceptionで拒否し、これらの手順を中止します。 -
annotatedLocation を、デバイス管理者によって設定された注釈付きロケーション、または設定されていない場合は
undefinedとします。 -
グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を annotatedLocation で解決 します。
-
-
promise を返します。
3.3. getDirectoryId()
メソッド
getDirectoryId() メソッドの手順は次のとおりです:
-
promise を新しい promise とします。
-
次の手順を並列に実行します:
-
この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を "
NotAllowedError"DOMExceptionで拒否し、これらの手順を中止します。 -
directoryId を、ディレクトリ ID、または管理インフラストラクチャによって提供されていない場合は
undefinedとします。 -
グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を directoryId で解決 します。
-
-
promise を返します。
3.4. getHostname()
メソッド
getHostname() メソッドの手順は次のとおりです:
-
promise を新しい promise とします。
-
次の手順を並列に実行します:
-
この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を "
NotAllowedError"DOMExceptionで拒否し、これらの手順を中止します。 -
hostname を、デバイス 管理者によって設定されたホスト名、または設定されていない場合は
undefinedとします。 -
グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を hostname で解決 します。
-
-
promise を返します。
3.5. getSerialNumber()
メソッド
getSerialNumber() メソッドの手順は次のとおりです:
-
promise を新しい promise とします。
-
次の手順を並列に実行します:
-
この API が、デバイス属性へアクセスする権限を持つ管理対象 Web アプリケーションから呼び出されていない場合、グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を "
NotAllowedError"DOMExceptionで拒否し、これらの手順を中止します。 -
グローバルタスクをキューに入れることで、関連するグローバルオブジェクト(this のもの)上に、管理データ タスクソースを用いて、promise を serialNumber で解決 します。
-
-
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 サイト自身によって 講じられるべきです。
5. セキュリティの考慮事項
現代のセキュリティ慣行に従い、これらのメソッドを使用する権限は、オリジンごとにデバイス 管理者によって制御されます。さらに、これらは管理対象デバイス上の安全なコンテキストでのみ利用できます。
6. プライバシーの考慮事項
この API は、すべてのオリジンで同一となるデバイス属性へのアクセスを提供します。(管理対象サイトのオリジンごとの設定については [MANAGED-CONFIG] を 参照してください。)任意に公開された場合、これはトラッキング目的に容易に使用される可能性があります。しかし管理対象環境では、デバイス管理者が、特定の従業員または作業のために マシン群を設定しているため、これらのマシンがアクセスすることを期待されているサイトに対して自らを識別できることが望ましいです。
このインターフェイスを非管理対象デバイスで使用することは非目標です。エンドユーザーがこの情報をサイトへ提供するよう求められることは ありません。どのオリジンにこれらのデバイス属性へのアクセス権を付与するかという判断は、それらが属する組織の権限を与えられた 管理者によって行われます。
不要な情報公開を防ぐため、設定機構は、デバイス管理者が これらの属性へのアクセスを限られたオリジンの集合に付与することを要求します。すべてのオリジンにアクセスを付与すると、そのデバイス上の すべての Web ブラウジングを広範に追跡する仕組みが作られてしまうためです。アクセスが付与されたオリジンは、さらに安全なコンテキストであるため、受動的なネットワーク攻撃者は転送中のこれらの属性を観測できません。
注: [RFC7258] は広範な監視を攻撃として扱いますが、これは 管理対象デバイスには適用されません。そのような場合、管理対象デバイスの実際の所有者はエンドユーザーではなく、 適切な権限を使用してすべてのエンドユーザーを保護することが期待されるデバイス 管理者です。