web-dev-qa-db-ja.com

LUKSマスターキーをSGXエンクレーブに格納する

SGXエンクレーブ内のLUKS暗号化ボリュームにアクセスするためのマスター復号化キーを保存して、システムコールを実行する権限を持つrootユーザーであっても、システム上のどのユーザーもマスターキーにアクセスできないようにすることはできますか?

現在、LUKSは、暗号化されたボリュームに格納されているデータを復号化するために使用されるマスターキーをメモリに格納する必要があります。したがって、rootユーザーはドライブのコンテンツにアクセスできるだけでなく、ドライブのマスターキーにもアクセスできます。

Intel SGXは、ホストOSがエンクレーブ内で実行されたコードやデータにアクセスできないように、マシンがアプリケーションを実行できるエンクレーブを作成できるように設計されています。

SGXエンクレーブを利用してマスターキーを保存し、ボリュームのコンテンツを復号化して、ホストOSがエンクレーブで実行されている復号化プロセスを介してLUKS暗号化ボリュームから復号化されたデータを要求できるが、マスターにアクセスできないか飛び地の中に格納されているキー?

2

LUKSの動作を理解する方法は次のとおりです。

  • LUKSボリュームは単一のキーで暗号化されます。
  • LUKSボリュームにはいくつかのキースロットがあります。
  • 各キースロットには、(から派生した)キーフレーズによって保護された暗号化されたバージョンのキーが格納されます。

次へのアクセスを禁止しますか?

  1. ディスク暗号化を実行するために実際に使用されるキー。
  2. キースロットの暗号化に使用されるパスフレーズ。

...そしてあなたの攻撃モデルは何ですか?システム全体が盗まれた後にディスクにアクセスできないように、ディスクのロックを解除するユーザーがいない状態でシステムを自律的に起動する必要があるか、または一部のユーザー/ sysadminがまだディスクのロックを解除するパスフレーズを提供する必要がありますか?

上記の1の場合:

Linuxでディスク暗号化を実装する暗号化操作は、通常、ソフトウェアでカーネル内のCPU自体によって実行されます。この場合、暗号化を実装するには、CPUがキーにアクセスできる必要があります。通常、別のハードウェアデバイスに暗号化操作を実行するカーネル暗号化ドライバーを実装することが可能です。 SGXベースのエンクレーブを実装して、それを暗号ドライバーとしてカーネルに公開し、エンクレーブ内にキーを隠すことができる場合があります。ただし、カーネル暗号化ドライバーはカーネルモードで実行され、SGXエンクレーブをカーネルモードで起動する方法は見たことがありません。とは言っても、それはすべてソフトウェアにすぎないと思うので、十分なリソースがあれば、それを実装できるかもしれません。あるいは、おそらく、ユーザー空間でエンクレーブを実行し、Fuse/CUSEに似たものを実装して、カーネルがそのユーザー空間アプリケーションを暗号ドライバーのバックエンドとして使用できるようにすることもできます。

上記2の場合:

パスフレーズを使用してLUKSキースロットからディスク暗号化キーを取得することは小さな自己完結型の操作であるため、おそらくcryptsetupアプリケーションを適合させて、SGXエンクレーブ内のコードのその部分を実行できます。これにより、監視なしで暗号操作を実行できます。ただし、エンクレーブは依然としてキースロットのパスフレーズをどこかから取得する必要があります。これは、実際にはカーネルが何らかの方法でパスフレーズを渡さなければならないため、盗まれる可能性があることを意味します。もちろん、SGXエンクレーブと何らかの形式の信頼できる入力デバイスの間に信頼できる(暗号化されたなど)チャネルを設定でき、チャネルを盗聴したり改ざんしたりできない場合、転送できる可能性があります。何も見ることができない状態での飛び地へのパスフレーズ。

全体的に単純な答えはノーだと思います。答えは「はい」で、かなりの努力が必要です。

1
Stephen Warren