web-dev-qa-db-ja.com

オンプレミスアプリケーションのライセンス制御

TL; DRサブスクリプションが終了するとアクセスを取り消す、オンプレムアプリケーションの気密なライセンス管理システムをどのように構築しますか?


前提

私はこのアプリケーションをPythonで構築しています。これはクライアントの前提でデプロイする必要があります。このアプリケーションは、統計を吐き出すサービスのように常に実行されます。このアプリケーションはサブスクリプションモデルに基づいています。


考慮事項

  1. アプリケーションがクライアント上に存在するため、IPが損なわれていないことを保証します。
    • Cythonを使用してバイナリを構築することでこれを実現する
  2. サブスクリプションが終了すると、アプリケーションは実行されません。
    • HOTP(HMACベースのOTP)を使用して、各クライアントがシードを実行可能ファイルに焼き込むことを考えています。 HOTPはシードと時間を使用して対称鍵を生成します。したがって、1か月と言う時間枠ごとに、新しいキーを実行可能ファイルに与える必要があります。

質問

  1. これを達成するためのより良い方法はありますか?
  2. アプリケーションはどのように改ざん防止の方法で時間を維持できますか? (OS時間は信頼できないため)。
    または
    ハッキングされないようにタイムスロットの数を安全な方法でどのように保存しますか?
  3. これは常に実行されているサービスなので、1か月のように時間帯の終わりにチェックを強制するにはどうすればよいですか?また、アプリケーションはオンプレミスであるため、シャットダウンできます。

醜い方法の1つは、timer.txtを暗号化して保存することです。これは、別のpythonプロセスによって常に更新されます。より良い方法はありますか?


上記はインターネットを考慮していない

ただし、インターネットが存在していても、ネットワークを監視でき、APIへの呼び出しを同じ名前のローカルサービスにリダイレクトできるため、間違いのないソリューションを保証するものではありません。これは、双方向SSLが必要であることを意味しますか?

1
arvindkgs

ライセンス交付が難しいのは、ライセンス交付を実施するサードパーティ製品がある理由の1つです。この質問のコンテキストでは、ライセンスenforcementについて話しているだけです。 「気密」とはどういう意味か、およびプライベートネットワークでのライセンス強制をサポートするかどうかを定義する必要があります。

Pythonベースのアプリケーションを実行すると、pythonバイトコードが簡単に分解され、強制コードが切断される可能性があるため、すでに不利になっています。適切なソリューションをレイヤーに実装する必要があることを確認します。

  • ステップ1:自動難読化ツール(変数名を表示不可能な文字に変更するなど)これにより、コードが壊れる可能性があります。
  • ステップ2:ライセンスの開始と終了を定義します。この情報はアプリケーションに対してローカルである必要があります
  • ステップ3:ライセンスの適用方法を定義します(ユーザーごと、マシンごと、ユーザーごと/マシンごと)。これは、1に影響します。この情報を保存できる場所と2:ユーザーまたはマシンを識別する方法
  • ステップ4:開始日/有効期限と識別可能な情報を含むライセンストークンを定義します
  • ステップ5:そのトークンを適切なスペース(ユーザーのローミングストレージ、ユーザーのローカルストレージ、マシンのストレージ)に保存し、プログラムの起動時に確認します。ライセンストークンが存在しないか、無効になった場合はエラーになります

Per Userライセンスでは、実行中のユーザーアカウントのみがライセンスの付与と照合されます。

マシンごとのライセンスは、実行中のマシンのみを検証します。これは、PCが非常にモジュール化されている場合は難しい場合があります。

ユーザーごと/マシンごとは、ユーザーとマシンの組み合わせがライセンス付与に対して正しいことを確認する必要があります。同じマシン上の別のユーザーが新しい許可を必要とするのと同じように、別のマシン上の同じユーザーは新しい許可を必要とします。

一部のシナリオ(Microsoft製品など)では、製品IDと有効期限をエンコードするトークンが必要です。トークンが存在するだけで、製品が使用可能になります。

一部のアプリケーションプロバイダーは、中央サーバーに送信される識別子トークンを作成するライセンストークン(RedGateなど)に署名することを望んでおり、そのサーバーは有効期限のある署名済みトークンを送り返します。交換にはサーバーへのアクティブな接続が必要なため、切断されたネットワーク上のユーザーに対して特別な準備を行う必要があります。つまりユーザーは、トークンをファイルとしてプライベートネットワークからパブリックネットワークにコピーし、手動でアップロードして、署名済みトークンをプライベートネットワークにコピーできるようにする必要があります。

一般的な概念は同じです。ライセンス実施(またはDRM)の堅牢性は、そのライセンストークンがどのように生成および検証されるかに依存します。安全なトークンの主な要素は次のとおりです。

  • トークンが改ざんされているかどうかの検出(デジタル署名によりこれが保証されます)
  • ライセンスされた当事者(つまり、ユーザー、マシン)を識別する方法
  • ライセンス条項を特定する方法
  • 時計が改ざんされているかどうかを判断する方法(つまり、マシンの日付を変更する)

次のことを検討する必要があります。

  • 本当にどの程度の保護が必要ですか?トレードオフは、ライセンスを実施するために多くのことを実行するほど、顧客がそれを使用することを望みません-特に、プライベートネットワークに対処する必要がある場合
  • 私が実際にどれだけのビジネスを失っているのですか?ある時点で、ライセンスメカニズムを無効にするために誰かが経験する必要がある努力は、追求するだけの価値はありません。
  • 私のDRMはアプリケーションをサポートする私の能力を無効にしますか?難読化ツールはここでひどいことをする可能性があります。

私はあなたがあなたが「気密」よりも少ない解決策を必要とすることを見つけるであろうと確信しています。既存のDRMツールを調べて、この問題に大規模なエンジニアリングの労力を費やさないように組み込むことができるかどうかを確認する価値があるかもしれません。

1
Berin Loritsch