Linux Unified Key Setup ( LUKS ) は、 2004 年に Clemens Fruhwirth によって作成されたディスク暗号化仕様であり、もともとLinuxを対象としていました。
LUKSは、様々なツールで使用できるプラットフォームに依存しない標準的なオンディスクフォーマットを実装しています。これにより、異なるプログラムやオペレーティングシステム間の互換性と相互運用性が促進され、すべてのプログラムやオペレーティングシステムで安全かつ文書化された方法でパスワード管理が実装されることが保証されます。[1]
LUKSはブロックデバイスの暗号化に使用されます。暗号化されたデバイスの内容は任意であるため、スワップパーティションを含むあらゆるファイルシステムを暗号化できます。[2]暗号化されたボリュームの先頭には暗号化されていないヘッダーがあり、最大8個(LUKS1)または32個(LUKS2)の暗号化キーと、暗号タイプやキーサイズなどの暗号化パラメータを保存できます。[3] [4]
このヘッダーの存在は、LUKSとdm-cryptの大きな違いです。このヘッダーにより、複数の異なるパスフレーズの使用が可能になり、変更や削除も可能になります。このヘッダーが紛失または破損した場合、デバイスは復号できなくなります。[5]
暗号化は多層アプローチで行われます。まず、ブロックデバイスはマスターキーを用いて暗号化されます。このマスターキーは、アクティブなユーザーキーごとに暗号化されます。[6]ユーザーキーは、パスフレーズ、 FIDO2セキュリティキー、TPM、またはスマートカードから生成されます。[7] [8]多層アプローチにより、ユーザーはブロックデバイス全体を再暗号化することなく、パスフレーズを変更できます。キースロットには、ユーザーのパスフレーズやその他の種類のキーを検証するための情報を含めることができます。
LUKSには2つのバージョンがあり、LUKS2はヘッダー破損に対する耐性を備え、デフォルトでArgon2 鍵導出関数を使用するのに対し、LUKS1はPBKDF2を使用します。[9] LUKSの両バージョン間の変換は特定の状況下では可能ですが、Argon2などの一部の機能はLUKS1では利用できない場合があります。[3] LUKS2はメタデータ形式としてJSONを使用します。 [3] [10]
利用可能な暗号化アルゴリズムは、ホストのカーネルサポートによって異なります。Libgcryptはハッシュのバックエンドとして利用でき、すべてのアルゴリズムをサポートしています。[11]デフォルトのアルゴリズムの選択はオペレーティングシステムベンダーに委ねられています。[12] LUKS1はAFsplitterと呼ばれるフォレンジック対策技術を利用しており、安全なデータ消去と保護を可能にしています。[13]
論理ボリューム管理はLUKSと併用することができます。[14]

LUKSの一般的な用途は、ディスク全体の暗号化を提供することです。これは、オペレーティングシステムのインストールのルートパーティションを暗号化することを含み、オペレーティングシステムファイルが不正な改ざんや不正な第三者による読み取りから保護します。[14]
Linuxシステムでは、ブートローダ自体がLUKS(例:GRUB)をサポートしている場合、ブートパーティション( )を暗号化することができます。これはLinuxカーネルの改ざんを防ぐために行われます。ただし、第一段階のブートローダやEFIシステムパーティションは暗号化できません(フルディスク暗号化#ブートキー問題を参照)。[14]/boot
モバイル Linux システムでは、postmarketOS は、タッチ スクリーンを使用してディスク全体暗号化システムのロックを解除できるようにする osk-sdl を開発しました。
systemdを実行しているシステムでは、このコンポーネントを使用して個々のホームディレクトリsystemd-homedを暗号化することができます。[17]
LUKSのリファレンス実装はLinux上で動作し、 cryptsetupの拡張版をベースにしており、ディスク暗号化バックエンドとしてdm-cryptを使用しています。Microsoft Windows では、LUKSで暗号化されたディスクはWindows Subsystem for Linuxを介して使用できます。[18] (以前はLibreCrypt [19]で可能でしたが、現在では根本的なセキュリティホールがあり、[20] [21] 、 FreeOTFE (旧DoxBox)の後継となっています。)
DragonFly BSDはLUKSをサポートしています。[22]
いくつかのLinuxディストリビューションでは、OSインストール時にルートデバイスを暗号化できます。これらのインストーラーには、Calamares [23] 、Ubiquity [24] 、Debian-Installer [ 25]などがあります。
LUKSヘッダーは下位互換性があり、新しいバージョンのLUKSは以前のバージョンのヘッダーを読み取ることができます。[26]
LUKS2ヘッダーには、バイナリ領域とJSON領域、2つ目のバイナリ領域とJSON領域、そしてキースロット領域があります。バイナリ領域とJSON領域は、わずかな違いを伴いながら2回繰り返されます。[10]
バイナリ領域のサイズは常に4kiBです。バイナリ領域とJSON領域のサイズは、16kiBから4MiBまでの2の累乗バイト数で表すことができます。つまり、JSON領域のサイズはそれぞれ12kiBから4092kiBになります。
基本LUKS2 JSONメタデータオブジェクトには、 config、keyslots、digests、segments、tokensの5つのキーがあります。[10]
Config には、LUKS ヘッダーの一般設定と情報、および永続的なマウント オプションが含まれています。
セグメントは、ディスク上のデータを含み、復号可能な領域を表します。また、セグメントが暗号化されるアルゴリズムも表します。
ダイジェストは、どのキースロットにどのセグメントを復号できる暗号化キーが含まれているかを示します。ダイジェストには、キースロットの復号キーのハッシュが含まれており、チェックサムとして機能し、パスワードの正当性を検証します。
キースロットには暗号化されたキーが入っています。暗号化の方法は様々で、パスワード、キーファイル、ハードウェアキーなどの組み合わせによって、含まれているマスターキーを復号化することができます。
トークンオブジェクトは、 LUKS と統合される外部システム用の追加トークンを保持できます。
ユーザーデータ(セグメント)は、大容量のマスターキーと効率的な暗号化アルゴリズムを用いて暗号化されます。マスターキーは、より高価なアルゴリズムと、潜在的に弱いユーザー提供のキーを用いて暗号化され、暗号化されたマスターキーはキースロットに保存されます。これにより、ブルートフォース攻撃によるパスワード推測が遅くなるだけでなく、データセクション全体を再暗号化することなく、復号化方法やパスワードを変更することも可能です。必要なのは、同じマスターキーを異なる方法で暗号化したものをキースロットに書き込むだけです。[10]
インデントと改行が追加された典型的な LUKS2 JSON 領域:
{
"キースロット" : { "0" : { "タイプ" : "luks2" 、"キーサイズ" : 64 、"af" : { "タイプ" : "luks1" 、"ストライプ" : 4000 、"ハッシュ" : "sha256" }, "エリア" : { "タイプ" : "raw" 、"オフセット" : "32768" 、"サイズ" : "258048" 、"暗号化" : "aes-xts-plain64" 、"キーサイズ" : 64 }, "kdf" : { "タイプ" : "argon2id" 、"時間" : 4 、"メモリ" : 1048576 、"CPU" : 4 、"ソルト" : "YOvmrBmgFT7Ehm7ANZrn0quep1fUFisNCv4e+X8+CLk=" } } }, "トークン" : {}, "セグメント" : { "0" : { "タイプ" : "crypt" , "オフセット" : "16777216" , "サイズ" : "dynamic" , "iv_tweak" : "0" , "暗号化" : "aes-xts-plain64" , "セクターサイズ" : 512 } }, "ダイジェスト" : { "0" : { "タイプ" : "pbkdf2" , "キースロット" : [ "0" ], "セグメント" : [ "0" ], "ハッシュ" : "sha256" , "反復回数" : 105703 , 「塩」: 「hrSZ0Sh6t3EVAyeH7XLSH1dEQrRmJwimbjHx85PLS/k=" 、「ダイジェスト」:"tXiDNw8fanGe8QcXewvtzF3AOTOqaIXBmhAGa8Kb42w=" } }, "config" : { "json_size" : "12288" , "keyslots_size" : "16744448" , "flags" : [ "allow-discards" ] } }
キースロットは、2つのバイナリ領域とJSON領域の後にデバイス領域を占めます。上記に示した典型的なケースでは、キースロットは32 kiBから始まり、最大4 MiBまたは16 MiBまで拡張されます。ここでは16 MiBを例に挙げます。
通常、デバイスは単一のセグメントで構成され、オフセットは16MiB、サイズは動的に設定されます。再暗号化時や特殊な構成では、複数のセグメントが存在する可能性があり、それらのセグメントはデバイス全体に隙間や重複なく配置される必要があります。
各セグメントには、それぞれ1つのダイジェストが関連付けられており、ダイジェストには1つ以上のキースロットが関連付けられています。キースロットは、ダイジェストに関連付けられず、他の目的に使用される場合もあります。
キースロット自体はキースロット領域にマッピングされており、上記の例では、ヘッダーの直後の32kiBから始まる252kiBの単一の領域にマッピングされています。この領域は、LUKS1と同様に、アンチフォレンジックストライプによって難読化されています。
ダイジェストのデフォルトアルゴリズムであるpbkdf2と、アンチフォレンジックストライプタイプ「luks1」は、LUKS1と同一です。鍵導出はデフォルトでLUKS1ではサポートされていない強力なアルゴリズムが使用されますが、サポートされているpbkdf2に設定することもできます。[10]
Cryptsetupは、LUKS フロントエンドのリファレンス実装です。
パスを使用してデバイスを暗号化するには/dev/sda1:
# cryptsetup luksFormat /dev/sda1
暗号化されたデバイスのロックを解除するには、マップされたnameデバイス名は次のとおりです。
# cryptsetup open /dev/sda1 名前
LUKSコンテナの再暗号化は、cryptsetupツール自体、またはと呼ばれるレガシーツールのいずれかで行うことができますcryptsetup-reencrypt。これらのツールは、既存の暗号化されていないファイルシステムに暗号化を追加したり、ブロックデバイスから暗号化を削除したりするためにも使用できます。[11] [27]
どちらの方法も構文は似ています。
# cryptsetup /dev/sda1
を再暗号化する # cryptsetup-reencrypt /dev/sda1
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です