開く:cryptsetupメモリ不足(「キースロットを開くことができるメモリが不足しています」)

開く:cryptsetupメモリ不足(「キースロットを開くことができるメモリが不足しています」)

バージョン 2.3.2 の cryptsetup を含む yocto ディストリビューションを開発しています。

1GB RAMのマザーボードでこれらのディストリビューションを実行していて、正しくデバッグされない暗号化パーティションを開こうとすると、「メモリ不足」エラーが発生します。どんなアイデアがありますか?

私のディストリビューションは、3つのパーティションを持つmSDで実行されます。 3番目(30MB)は暗号化されています。

使ったArchLinuxガイドに記載されている手順ext4の代わりにext3を使用したパーティションの暗号化

# cryptsetup -y -v luksFormat /dev/sda2
# cryptsetup open /dev/sda2 cryptroot
# mkfs.ext3 /dev/mapper/cryptroot

ただし、マザーボードのパーティションを開こうとするとエラーが発生します。

cryptsetup --debug open /dev/mmcblk0p3  cryptroot
# cryptsetup 2.3.2 processing "cryptsetup --debug open /dev/mmcblk0p3 cryptroot"
# Running command open.
# Locking memory.
# Installing SIGINT/SIGTERM handler.
# Unblocking interruption on signal.
# Allocating context for crypt device /dev/mmcblk0p3.
# Trying to open and read device /dev/mmcblk0p3 with direct-io.
# Initialising device-mapper backend library.
# Trying to load any crypt type from device /dev/mmcblk0p3.
# Crypto backend (OpenSSL 1.1.1k  25 Mar 2021) initialized in cryptsetup library version 2.3.2.
# Detected kernel Linux 4.1.35-rt41 ppc.
# Loading LUKS2 header (repair disabled).
# Acquiring read lock for device /dev/mmcblk0p3.
# Opening lock resource file /run/cryptsetup/L_179:3
# Verifying lock handle for /dev/mmcblk0p3.
# Device /dev/mmcblk0p3 READ lock taken.
# Trying to read primary LUKS2 header at offset 0x0.
# Opening locked device /dev/mmcblk0p3
# Veryfing locked device handle (bdev)
# LUKS2 header version 2 of size 16384 bytes, checksum sha256.
# Checksum:43e122216ab19330fdfb6d2f9d7b586c4e5189884aef24be884e7159228e9ee5 (on-disk)
# Checksum:43e122216ab19330fdfb6d2f9d7b586c4e5189884aef24be884e7159228e9ee5 (in-memory)
# Trying to read secondary LUKS2 header at offset 0x4000.
# Reusing open ro fd on device /dev/mmcblk0p3
# LUKS2 header version 2 of size 16384 bytes, checksum sha256.
# Checksum:4ed9a44c22fde04c4b59a638c20eba6da3a13e591a6a1cfe7e0fec4437dc14cc (on-disk)
# Checksum:4ed9a44c22fde04c4b59a638c20eba6da3a13e591a6a1cfe7e0fec4437dc14cc (in-memory)
# Device size 32505856, offset 16777216.
# Device /dev/mmcblk0p3 READ lock released.
# Only 1 active CPUs detected, PBKDF threads decreased from 4 to 1.
# Not enough physical memory detected, PBKDF max memory decreased from 1048576kB to 255596kB.
# PBKDF argon2i, time_ms 2000 (iterations 0), max_memory_kb 255596, parallel_threads 1.
# Activating volume cryptroot using token -1.
# Interactive passphrase entry requested.
Enter passphrase for /dev/mmcblk0p3:
# Activating volume cryptroot [keyslot -1] using passphrase.
device-mapper: ioctl: 4.31.0-ioctl (2015-3-12) initialised: [email protected]
# dm version   [ opencount flush ]   [16384] (*1)
# dm versions   [ opencount flush ]   [16384] (*1)
# Detected dm-ioctl version 4.31.0.
# Device-mapper backend running with UDEV support enabled.
# dm status cryptroot  [ opencount noflush ]   [16384] (*1)
# Keyslot 0 priority 1 != 2 (required), skipped.
# Trying to open LUKS2 keyslot 0.
# Keyslot 0 (luks2) open failed with -12.
Not enough available memory to open a keyslot.
# Releasing crypt device /dev/mmcblk0p3 context.
# Releasing device-mapper backend.
# Closing read only fd for /dev/mmcblk0p3.
# Unlocking memory.
Command failed with code -3 (out of memory).

答え1

LUKS2 目的アルゴン2iキー派生機能はメモリハードです。つまり、GPUを使用した無差別攻撃を防止(または少なくとも困難にする)には、デバイスを開くために多くのメモリが必要です。デバイスを開くのに必要なメモリ量を確認できます。以下の行をcryptsetup luksDump /dev/sda2見つけてください。Memory: 755294Keyslots

デバイスを作成するときにcryptsetup使用可能なメモリ量を確認し、それに応じて開くのに必要なメモリ量を調整します。ただし、LUKSデバイスを別のコンピュータで作成する場合(デスクトップでSDカードをフォーマットするなど)、または同じデバイスでも可能です。マシンにはより多くのメモリがあります。現在メモリが不足している可能性があります。この場合、スワップを使用せずにRAMについてのみ話しています。

--pbkdf pbkdf2追加メモリを使用しない「古い」(LUKS1のデフォルト)キー派生関数PBKDF2に切り替えるには、LUKSデバイスを再作成することをお勧めします。または、--pbkdf-memory <num>デフォルトのArgon2iメモリ量を強制的に減らす方法を使用できます。

答え2

Vojtech Trefnyは、Argon2iがあまりにも多くのメモリを必要とするため、これが起こると説明しました。実際、man cryptsetup:

PBKDF2の場合、時間コスト(繰り返し回数)のみが適用されます。 Argon2i / idには、メモリコスト(キー派生プロセス中に必要なメモリ)と並列性コスト(キー派生プロセス中に並列に実行されるスレッド数)もあります。

ただし、十分なメモリがあるハードウェアにアクセスできる限り、デバイスを再作成することは過度になる可能性があります。

代わりに、十分なメモリを持つコンピュータを使用して、次のコマンドを使用して暗号化デバイスにキーを追加するだけですpbkdf2

cryptsetup luksAddKey -S 1 --pbkdf pbkdf2 /dev/sdxy

キースロット 1 が空であると仮定します ( を確認して空のキースロットを見つけることができますcryptsetup luksDump /dev/sdxy)。

次に、パフォーマンスの低いコンピュータで次のコマンドを使用してデバイスのロックを解除します。

cryptsetup luksOpen -S 1 /dev/sdxy name

これは-S 1必須です。そうしないと、高価なキーを使用してもOOMキラーが実行され続けることがあります。

1:最小限のシェルとコアユーティリティ(Debian ISOがこれに代わるもの)を使用して起動可能なUSBを常に維持し、ほとんどのコンピュータでUSBを起動して暗号化されたボリュームにアクセスできることを覚えておいてください。

答え3

最も重要な答えに加えて、ここに入れたいです。より多くのメモリを持つコンピュータを使用すると、次の方法で既存のキーのメモリ要件を減らすことができます。メモリ要件はKB単位です。これは、ディスクにすでにデータがある場合に便利です。

cryptsetup luksConvertKey --key-file /path/to/keyfile --pbkdf-memory=10240 /dev/<device>

答え4

最近購入したVPSを暗号化しようとしたときに同じ問題が発生しました。実際、私の場合、# cryptsetup luksFormat /dev/<Partition>ソルブを実行すると同じ「メモリ不足」が発生し、次のようにパーティションテーブルを再作成しました| /dev/sda1 ( EXT4, BOOT ) | /dev/sda2 ( LUKS, ROOT and SWAP ) | /dev/sda3 ( SWAP ) |

LUKSパーティションを作成するときにいくつかの構成を変更する方法があるかもしれませんが、少しでもセキュリティが低下する可能性があります。

作成されたディスクパーティションテーブル

パーティションテーブル /dev/sda1 /dev/sda2 /dev/sda3
GPT 始める 幸運 交換
左心室容積 該当なし スワップ/ルート 該当なし

だからSWAPをオンにしました/dev/sda3#swapon /dev/sda3)。次に成功コマンドを実行しますcryptsetup luksFormat /dev/sda2

LUKS内部でSWAPを作成し、EXT4 / ROOTを作成することにしました。最初はSWAPの後ろに入れようとしましたが、/dev/sda2LUKSを削除して展開し、SWAPをLUKSパーティションの末尾に移動してからROOTパーティションを増やす必要がありました。 LUKSの先頭にSWAPを配置し、ルートパーティションのみを追加しました。

これから交換しないと、OOMが得られないことがわかります。幸運を作るには変えなければならないと思います。

システムを構成し、次のステップは、残りの空き領域を削除し/dev/sda3て拡張することです。 LVMパーティションを追加します。/dev/sda2/dev/sda3root

関連情報