KC Blog

より安全なAndroidアプリを作成する! Samsung Knox SDKの簡単な導入方法を学ぶ

12 min read
AndroidDev#Android#Debug#Samsung#knox

Samsung Knox SDK はセキュリティソリューションです

さまざまなセキュリティ制御および管理オプションを提供し、企業が機密データやアプリケーションを簡単に保護できるようにします。 開発者はアプリケーションに以下の機能を実装できます:

セキュアコンテナ:企業データやアプリケーションを分離して保護し、不正アクセスを防止します。

VPN:安全なVPN接続を確立し、ネットワークトラフィックやデータを保護します。

暗号化:データを暗号化し、転送中のセキュリティを確保します。

ポリシー管理:パスワードルール、デバイスロック、データ消去などのデバイス設定やポリシーを管理します。

認証:生体認証やスマートカード認証などの強力な認証機能を実現します。

セキュリティアップデート:アプリケーションやオペレーティングシステムを安全に更新し、全体的なセキュリティを向上させます。

この記事では主に

Samsung Knox SDK 導入時の基本的な概念

および遭遇した問題を共有します

前導

  • 現在サポートされているSamsungの携帯電話とバージョン:参考

    • Knoxをサポートしていない場合、公式が提供する推奨方法:参考
    • 各Knoxサービス:参考
  • Knox SDKのダウンロードとインストール

    • 公式サイトに従ってSDKをインストールし、関連するSDKをプロジェクトに導入します
    • 導入時にどのバージョンを使用するかはmapping表を参照してください
    • ライセンスキーを取得する必要があります
      • Knox 2.7以前のバージョンを開発している場合、生成されたライセンスキーは後方互換のキーを「選択」できます
      • ライセンスキーは Development KeyCommercial Key に分かれており、テストまたはリリースに応じて設定できます
      • 関連するapk:関連するapkのみが生成されたライセンスキーを使用できます (バックエンドにはオプションの選択肢があり、関連付けるかどうかを選択できます)
      • 実際のテストでは、Development Key は同じアカウントで1つしか持てません -> ライセンスキーのルールと制限
    • 開発時にライセンスキーをアクティブ化する方法はKnoxのバージョンによって異なります : こちらを参照
    • Knox開発に関する公式のサンプル:参考
    • Knoxライセンス

      • ライセンスの利用可能な権限リスト
      • ライセンスの3つの比較表
      • バックエンドの実際のテストでは、SDKライセンスキーはさらに細分化されています:
        • KPE Development : テスト環境用、キーの有効期間は0.5年
        • KPE Standard: Standard permissionsへのアクセスを許可、10,000,000シート、キーの有効期間は2年
        • KPE Premium: Standard, Premium, and Custom permissionsへのアクセスを許可、10,000,000シート、キーの有効期間は2年
        • KPE DualDAR: Standard, Premium, Custom and DualDAR permissionsへのアクセスを許可、代理店と交渉して年数または永久サブスクリプションを決定
      • 開発権限の宣言:
        • Knox 3.0 は一部の権限を宣言することを提供し、AndroidManifest.xmlでKnox権限を宣言できます。宣言しない場合、デフォルトですべてのKnox権限が有効になります。宣言した場合、宣言された権限のみが使用可能です。参考
    • 現在のネイティブAirDroid Bizで使用されているDevicePolicyManagerとの初期比較 (類似APIのみを先に比較し、使用したいものを議論し、実際の動作をテストする)

      • すべての権限はこちらで確認できます
      • 実際の比較一般的なDevicePolicyManagerとKnoxが提供する機能の参考
    • 参考リンク

Knoxアーキテクチャ開発者ドキュメント

  • Samsung Knoxはwebベースとデバイスベースの2つの方法で使用でき、現在のアーキテクチャは以下の通りです:
    <img src="https://docs.samsungknox.com/dev/common/images/knox-ecosystem.png" style="width: 60%"/ class="prose-img">

ライセンスアクティベーションノート

  • Android 6.0.1 Samsung S6、テストKnox 3.8

    • Samsung開発者バックエンドからKnox 3.8版をダウンロードし、使用方法はknox3.7.1以上を参照、URI解析時に例外が発生

    • knox2.7以下を使用するとjava.lang.RuntimeException: Stub!が発生

      -> 解決方法:supportlib.jarを追加し、gradle dependenciesに追加

      IDEのAdd as library機能を使用する場合、以下に注意: Knox SDKとsupportlibの2つのjarファイルを以下のように変更する必要があり、ランタイムエラーが発生しなくなります

    • 上記が成功した後、ライセンスキーをアクティベートする際に、admin権限を有効にしないとinternal errorが返されます

    • ここに罠があります。ライセンスをアクティベートする際には、Boardcastを使用して結果を受け取る必要があります

      • しかし、現在の公式ドキュメントでは、Knoxのライセンスアクティベーションのブロードキャストアクションは以下のように表示されています

      しかし、旧版のKnox APIレベル19 (Knox 2.6)では、実際にはKnoxは上記のアクションを発行せず、以下のようになります

  • Android 12 Samsung A52s、テストKnox 3.8

    • knox3.7.1 higherknox2.7 lowerの方法を使用してライセンスキーを有効にすることができます。
  • その他の動作

    • 開発者バックエンドで現在ダウンロード可能なKnox SDKは3.3〜3.8です。

      上記のテストケースはすべてKnox 3.8でコンパイル可能ですが、

      一部の動作は対応するバージョンのみをサポートしている可能性があります。

      後にAndroid 12でKnox 3.3をテストしましたが、

      この時にknox3.7.1 higherをアクティブにするとクラッシュします。

      Android 6.0.1でKnox 3.8を使用してknox3.7.1 higherをアクティブにしても同様にクラッシュします。

開発中に遭遇した事例と研究

  • Vpn開発

    • 開発ドキュメントによると、2つのVpnソリューションが提供されています。

      1. 以前研究したネイティブのAndroid Vpn Serviceに似ています。 Knoxはこれを基に関連機能を拡張しています:参考

      2. もう一つはGenericVpnPolicy APIです。

      createVpnProfileでは、対応するJSON形式を提供してvpnプロファイルを設定します。

      異なるJSON形式が異なるモードに対応します。

      参考:vpn JSON形式 -> 現在のKnoxドキュメントと以前の要件に類似しているものには、

      ipsec Hybrid RSA、PSK、xauth RSA、IKE2 PSK、IKE2 RSAなどがあります。

      また、ドキュメントにはKnox api level 35 Deprecatedと記載されています -> Android 12に対応。

  • ロック画面のパスワード

実際の開発でライセンスとKnox権限を有効にする方法の共有

実際にKnoxを有効にする方法は、公式ドキュメントの方法を参照するだけで十分です。

ここでは、私が計画した思考を皆さんに提供します。以下の通りです:

  • 現在、これをdagger2モジュールとしてパッケージ化しています。
  • 構造は以下の図の通りです:

knox_module.png - ExampleKnoxActivityはデモ用で、他のクラスの実装例を含みます。 - その後、KnoxManagerをインジェクトし、KnoxModuleを初期化するだけで使用できます。

  ![knox_inject_01.png](/images/others/knox_inject_01.png)

  ![knox_inject_02.png](/images/others/knox_inject_02.png)

  - `KnoxLicense`にはいくつかの定数とキー値が含まれており、後で変更可能です。将来的にキーをアップロードしない場合も調整可能です。
  - 実際の使用では`KnoxManager`を理解するだけで十分です。
  - 主にKnoxのブロードキャストの登録/解除、ライセンスの有効化/無効化などの機能を追加しました。
    今後は主に`KnoxManager`から関連する機能を追加します。
  - `KnoxLicenseReceiver`は、公式のKnox 3.7以下ではボードキャスト方式のみでアクティベーションの成否を受信します。

  ここではKotlinの特性を利用してパッケージ化しています。

  実際の使用では、knoxManager内のメソッドを使用して登録し、結果を返します。

  ![knox_inject_03.png](/images/others/knox_inject_03.png)

理論的にはKoinをDIとして使用することも可能で、個人的にもKoinが好きです。後ほど、KoinでのDIについての記事を書く予定です。

  • Knoxのパーミッションを追加

    • パーミッション宣言をmanifestに追加 knox_permission.png

    • Knox API 30は新旧パッケージ名の境界線です。

      今回の実験では、Knox API 19では新しいパーミッションリクエストは使用できませんでした。例えば:

      com.samsung.android.knox.permission.KNOX_APP_MGMT

      com.example.supportlibclient.SUPPORT_PERMISSIONを使用して成功しました。

    • ランタイムパーミッション knox_run_time_permission_01.png

  • その他の関連事項

    一部のAPI操作には対応するURIの解析が必要です。ここでは共通のものを取り上げます。

    knox_constant.png